FIX: fix double validation (#314)
The old float validation had several bugs. It will recognize strings like "a1.2" and "3.4b" as valid doubles, but will not recognize integers like "1234" as doubles. Also, since an empty string is not falsy in Ruby, it will recognize "Inf" as -Infinity. This commit fixes these issues
This commit is contained in:
parent
6bf3ac7426
commit
1d991c6192
|
@ -153,16 +153,16 @@ module ::DiscourseDataExplorer
|
|||
invalid_format string, e.message
|
||||
end
|
||||
when :double
|
||||
if string =~ /-?\d*(\.\d+)/
|
||||
if string.strip =~ /^-?\d*\.?\d+$/
|
||||
value = Float(string)
|
||||
elsif string =~ /^(-?)Inf(inity)?$/i
|
||||
if $1
|
||||
if $1.present?
|
||||
value = -Float::INFINITY
|
||||
else
|
||||
value = Float::INFINITY
|
||||
end
|
||||
elsif string =~ /^(-?)NaN$/i
|
||||
if $1
|
||||
if $1.present?
|
||||
value = -Float::NAN
|
||||
else
|
||||
value = Float::NAN
|
||||
|
|
|
@ -16,6 +16,26 @@ RSpec.describe DiscourseDataExplorer::Parameter do
|
|||
)
|
||||
end
|
||||
|
||||
describe "double type" do
|
||||
let!(:double_param) { param("double", :double, nil, false) }
|
||||
|
||||
it "raises an error if not a double" do
|
||||
expect { double_param.cast_to_ruby("abcd") }.to raise_error(
|
||||
::DiscourseDataExplorer::ValidationError,
|
||||
)
|
||||
end
|
||||
|
||||
it "returns the float number if it can be a valid double" do
|
||||
expect(double_param.cast_to_ruby("3.14")).to eq(3.14)
|
||||
expect(double_param.cast_to_ruby(".314")).to eq(0.314)
|
||||
expect(double_param.cast_to_ruby("1")).to eq(1.0)
|
||||
expect(double_param.cast_to_ruby("Inf")).to eq(Float::INFINITY)
|
||||
expect(double_param.cast_to_ruby("-Infinity")).to eq(-Float::INFINITY)
|
||||
expect(double_param.cast_to_ruby("-NaN").nan?).to eq(true)
|
||||
expect(double_param.cast_to_ruby("NaN").nan?).to eq(true)
|
||||
end
|
||||
end
|
||||
|
||||
describe "post_id type" do
|
||||
fab!(:post)
|
||||
|
||||
|
|
Loading…
Reference in New Issue