diff --git a/lib/rexml/functions.rb b/lib/rexml/functions.rb index 9c226d2cdf..4b46b8e678 100644 --- a/lib/rexml/functions.rb +++ b/lib/rexml/functions.rb @@ -315,18 +315,23 @@ module REXML end end - # UNTESTED - def Functions::boolean( object=nil ) - if object.kind_of? String - if object =~ /\d+/u - return object.to_f != 0 - else - return object.size > 0 - end - elsif object.kind_of? Array - object = object.find{|x| x and true} + def Functions::boolean(object=@@context[:node]) + case object + when true, false + object + when Float + return false if object.zero? + return false if object.nan? + true + when Numeric + not object.zero? + when String + not object.empty? + when Array + not object.empty? + else + object ? true : false end - return object ? true : false end # UNTESTED diff --git a/test/rexml/test_functions_boolean.rb b/test/rexml/test_functions_boolean.rb new file mode 100644 index 0000000000..b3e2117c10 --- /dev/null +++ b/test/rexml/test_functions_boolean.rb @@ -0,0 +1,75 @@ +# frozen_string_literal: false + +require "test/unit" +require "rexml/document" +require "rexml/functions" + +module REXMLTests + class TestFunctionsBoolean < Test::Unit::TestCase + def setup + REXML::Functions.context = nil + end + + def test_true + assert_equal(true, REXML::Functions.boolean(true)) + end + + def test_false + assert_equal(false, REXML::Functions.boolean(false)) + end + + def test_integer_true + assert_equal(true, REXML::Functions.boolean(1)) + end + + def test_integer_positive_zero + assert_equal(false, REXML::Functions.boolean(0)) + end + + def test_integer_negative_zero + assert_equal(false, REXML::Functions.boolean(-0)) + end + + def test_float_true + assert_equal(true, REXML::Functions.boolean(1.1)) + end + + def test_float_positive_zero + assert_equal(false, REXML::Functions.boolean(-0.0)) + end + + def test_float_negative_zero + assert_equal(false, REXML::Functions.boolean(-0.0)) + end + + def test_float_nan + assert_equal(false, REXML::Functions.boolean(Float::NAN)) + end + + def test_string_true + assert_equal(true, REXML::Functions.boolean("content")) + end + + def test_string_empty + assert_equal(false, REXML::Functions.boolean("")) + end + + def test_node_set_true + root = REXML::Document.new("").root + assert_equal(true, REXML::Functions.boolean([root])) + end + + def test_node_set_empty + assert_equal(false, REXML::Functions.boolean([])) + end + + def test_nil + assert_equal(false, REXML::Functions.boolean(nil)) + end + + def test_context + REXML::Functions.context = {node: true} + assert_equal(true, REXML::Functions.boolean()) + end + end +end