Skip to content

Commit b48f3af

Browse files
committed
xpath number: fix a bug that false is converted to NaN
GitHub: fix #18 It must be 0. Reported by Mirko Budszuhn. Thanks!!!
1 parent 81bc7cd commit b48f3af

File tree

2 files changed

+35
-35
lines changed

2 files changed

+35
-35
lines changed

lib/rexml/functions.rb

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,6 @@ def Functions::count( node_set )
6666
def Functions::id( object )
6767
end
6868

69-
# UNTESTED
7069
def Functions::local_name(node_set=nil)
7170
get_namespace(node_set) do |node|
7271
return node.local_name
@@ -386,25 +385,23 @@ def Functions::compare_language lang1, lang2
386385
#
387386
# an object of a type other than the four basic types is converted to a
388387
# number in a way that is dependent on that type
389-
def Functions::number( object=nil )
390-
object = @@context[:node] unless object
388+
def Functions::number(object=@@context[:node])
391389
case object
392390
when true
393391
Float(1)
394392
when false
395393
Float(0)
396394
when Array
397-
number(string( object ))
395+
number(string(object))
398396
when Numeric
399397
object.to_f
400398
else
401-
str = string( object )
402-
# If XPath ever gets scientific notation...
403-
#if str =~ /^\s*-?(\d*\.?\d+|\d+\.)([Ee]\d*)?\s*$/
404-
if str =~ /^\s*-?(\d*\.?\d+|\d+\.)\s*$/
405-
str.to_f
399+
str = string(object)
400+
case str.strip
401+
when /\A\s*(-?(?:\d+(?:\.\d*)?|\.\d+))\s*\z/
402+
$1.to_f
406403
else
407-
(0.0 / 0.0)
404+
Float::NAN
408405
end
409406
end
410407
end

test/rexml/functions/test_number.rb

Lines changed: 28 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,38 @@
11
# frozen_string_literal: false
2-
require 'rexml/document'
3-
require 'test/unit'
4-
require 'rexml/functions'
2+
3+
require "test/unit"
4+
require "rexml/document"
5+
require "rexml/functions"
56

67
module REXMLTests
7-
class TC_Rexml_Functions_Number < Test::Unit::TestCase
8+
class TestFunctionsNumber < Test::Unit::TestCase
9+
def setup
10+
REXML::Functions.context = nil
11+
end
812

9-
def test_functions_number_int
10-
telem = REXML::Element.new("elem")
11-
telem.text="9"
12-
assert_equal(9, REXML::Functions::number(telem))
13+
def test_true
14+
assert_equal(1, REXML::Functions.number(true))
1315
end
14-
def test_functions_number_float
15-
telem = REXML::Element.new("elem")
16-
telem.text="10.4"
17-
assert_equal(10.4, REXML::Functions::number(telem))
16+
17+
def test_false
18+
assert_equal(0, REXML::Functions.number(false))
1819
end
19-
def test_functions_number_negative_int
20-
telem = REXML::Element.new("elem")
21-
telem.text="-9"
22-
assert_equal(-9, REXML::Functions::number(telem))
20+
21+
def test_numeric
22+
assert_equal(29, REXML::Functions.number(29))
2323
end
24-
def test_functions_number_negative_float
25-
telem = REXML::Element.new("elem")
26-
telem.text="-9.13"
27-
assert_equal(-9.13, REXML::Functions::number(telem))
24+
25+
def test_string_integer
26+
assert_equal(100, REXML::Functions.number("100"))
27+
end
28+
29+
def test_string_float
30+
assert_equal(-9.13, REXML::Functions.number("-9.13"))
31+
end
32+
33+
def test_node_set
34+
root = REXML::Document.new("<root>100</root>").root
35+
assert_equal(100, REXML::Functions.number([root]))
2836
end
29-
#def test_functions_number_scientific_notation
30-
# telem = REXML::Element.new("elem")
31-
# telem.text="9.13E12"
32-
# assert_equal(9.13E12, REXML::Functions::number(telem))
33-
#end
3437
end
3538
end

0 commit comments

Comments
 (0)