diff --git a/lib/timecop/time_extensions.rb b/lib/timecop/time_extensions.rb index 553e0fa..bb52ec1 100644 --- a/lib/timecop/time_extensions.rb +++ b/lib/timecop/time_extensions.rb @@ -45,36 +45,31 @@ def today_with_mock_date alias_method :strptime_without_mock_date, :strptime def strptime_with_mock_date(str = '-4712-01-01', fmt = '%F', start = Date::ITALY) - unless start == Date::ITALY - raise ArgumentError, "Timecop's #{self}::#{__method__} only " + - "supports Date::ITALY for the start argument." - end - #If date is not valid the following line raises - Date.strptime_without_mock_date(str, fmt) + Date.strptime_without_mock_date(str, fmt, start) d = Date._strptime(str, fmt) now = Time.now.to_date year = d[:year] || now.year mon = d[:mon] || now.mon if d.keys == [:year] - Date.new(year) + Date.new(year, 1, 1, start) elsif d[:mday] - Date.new(year, mon, d[:mday]) + Date.new(year, mon, d[:mday], start) elsif d[:wday] - Date.new(year, mon, now.mday) + (d[:wday] - now.wday) + Date.new(year, mon, now.mday, start) + (d[:wday] - now.wday) elsif d[:yday] - Date.new(year).next_day(d[:yday] - 1) + Date.new(year, 1, 1, start).next_day(d[:yday] - 1) elsif d[:cwyear] && d[:cweek] if d[:cwday] - Date.commercial(d[:cwyear], d[:cweek], d[:cwday]) + Date.commercial(d[:cwyear], d[:cweek], d[:cwday], start) else - Date.commercial(d[:cwyear], d[:cweek]) + Date.commercial(d[:cwyear], d[:cweek], 1, start) end elsif d[:seconds] Time.at(d[:seconds]).to_date else - Date.new(year, mon) + Date.new(year, mon, 1, start) end end diff --git a/test/date_strptime_scenarios.rb b/test/date_strptime_scenarios.rb index 9f2229f..8899af7 100644 --- a/test/date_strptime_scenarios.rb +++ b/test/date_strptime_scenarios.rb @@ -47,6 +47,18 @@ def test_date_strptime_with_invalid_date assert_raises(ArgumentError) { Date.strptime('', '%Y-%m-%d') } end + def test_date_strptime_with_gregorian + assert_equal Date.strptime('1999-04-01', '%Y-%m-%d', Date::GREGORIAN), Date.new(1999, 4, 1) + end + + def test_date_strptime_with_gregorian_non_leap + assert(!Date.strptime('1000-04-01', '%Y-%m-%d', Date::GREGORIAN).leap?) + end + + def test_date_strptime_with_julian_leap + assert(Date.strptime('1000-04-01', '%Y-%m-%d', Date::JULIAN).leap?) + end + def test_ancient_strptime ancient = Date.strptime('11-01-08', '%Y-%m-%d').strftime assert_equal '0011-01-08', ancient # Failed before fix to strptime_with_mock_date