From 4e40ca301cca692361627ac6db06c0f0074636f0 Mon Sep 17 00:00:00 2001 From: Jeremy Evans Date: Wed, 24 Jul 2019 08:03:27 -0700 Subject: [ruby/date] Check for numeric arguments in constructors Previously, the type of these arguments were not checked, leading to NoMethodErrors in some cases, and TypeErrors in other cases, but not showing what field was having the problems. This change makes it so the field with the problem is included in the error message. For the valid_*? methods, this changes them to return false if one of the arguments that should be numeric is not. Fixes Ruby Bug 11935 Fixes Ruby Misc 15298 https://github.com/ruby/date/commit/a2f4b665f8 --- test/date/test_date_new.rb | 50 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) (limited to 'test') diff --git a/test/date/test_date_new.rb b/test/date/test_date_new.rb index d27116b198..2fb9846c9d 100644 --- a/test/date/test_date_new.rb +++ b/test/date/test_date_new.rb @@ -32,6 +32,56 @@ class TestDateNew < Test::Unit::TestCase end end + def test_valid_with_invalid_types + o = Object.new + assert_equal(false, Date.valid_jd?(o)) + assert_equal(false, Date.valid_civil?(o, 1, 1)) + assert_equal(false, Date.valid_civil?(1, o, 1)) + assert_equal(false, Date.valid_civil?(1, 1, o)) + assert_equal(false, Date.valid_ordinal?(o, 1)) + assert_equal(false, Date.valid_ordinal?(1, o)) + assert_equal(false, Date.valid_commercial?(o, 1, 1)) + assert_equal(false, Date.valid_commercial?(1, o, 1)) + assert_equal(false, Date.valid_commercial?(1, 1, o)) + end + + def test_invalid_types + o = Object.new + assert_raise(TypeError) { Date.julian_leap?(o) } + assert_raise(TypeError) { Date.gregorian_leap?(o) } + assert_raise(TypeError) { Date.jd(o) } + assert_raise(TypeError) { Date.new(o) } + assert_raise(TypeError) { Date.new(1, o) } + assert_raise(TypeError) { Date.new(1, 1, o) } + assert_raise(TypeError) { Date.ordinal(o) } + assert_raise(TypeError) { Date.ordinal(1, o) } + assert_raise(TypeError) { Date.commercial(o) } + assert_raise(TypeError) { Date.commercial(1, o) } + assert_raise(TypeError) { Date.commercial(1, 1, o) } + + assert_raise(TypeError) { DateTime.jd(o) } + assert_raise(TypeError) { DateTime.jd(1, o) } + assert_raise(TypeError) { DateTime.jd(1, 1, o) } + assert_raise(TypeError) { DateTime.jd(1, 1, 1, o) } + assert_raise(TypeError) { DateTime.new(o) } + assert_raise(TypeError) { DateTime.new(1, o) } + assert_raise(TypeError) { DateTime.new(1, 1, o) } + assert_raise(TypeError) { DateTime.new(1, 1, 1, o) } + assert_raise(TypeError) { DateTime.new(1, 1, 1, 1, o) } + assert_raise(TypeError) { DateTime.new(1, 1, 1, 1, 1, o) } + assert_raise(TypeError) { DateTime.ordinal(o) } + assert_raise(TypeError) { DateTime.ordinal(1, o) } + assert_raise(TypeError) { DateTime.ordinal(1, 1, o) } + assert_raise(TypeError) { DateTime.ordinal(1, 1, 1, o) } + assert_raise(TypeError) { DateTime.ordinal(1, 1, 1, 1, o) } + assert_raise(TypeError) { DateTime.commercial(o) } + assert_raise(TypeError) { DateTime.commercial(1, o) } + assert_raise(TypeError) { DateTime.commercial(1, 1, o) } + assert_raise(TypeError) { DateTime.commercial(1, 1, 1, o) } + assert_raise(TypeError) { DateTime.commercial(1, 1, 1, 1, o) } + assert_raise(TypeError) { DateTime.commercial(1, 1, 1, 1, 1, o) } + end + def test_ordinal d = Date.ordinal dt = DateTime.ordinal -- cgit v1.2.3