From 96546bb63bd5f1b24f5126e7a3314580bc59584f Mon Sep 17 00:00:00 2001
From: Jason Weathered <jason@jasoncodes.com>
Date: Sun, 17 Apr 2011 21:10:02 +1000
Subject: Fix marshal round-tripping of fractional seconds (Time#subsec).

---
 activesupport/lib/active_support/core_ext/time/marshal.rb | 1 +
 activesupport/test/core_ext/time_ext_test.rb              | 7 +++++++
 2 files changed, 8 insertions(+)

(limited to 'activesupport')

diff --git a/activesupport/lib/active_support/core_ext/time/marshal.rb b/activesupport/lib/active_support/core_ext/time/marshal.rb
index 1a4d918ce7..457d3f5b62 100644
--- a/activesupport/lib/active_support/core_ext/time/marshal.rb
+++ b/activesupport/lib/active_support/core_ext/time/marshal.rb
@@ -37,6 +37,7 @@ if Time.local(2010).zone != Marshal.load(Marshal.dump(Time.local(2010))).zone
         time.instance_eval do
           if zone = defined?(@_zone) && remove_instance_variable('@_zone')
             ary = to_a
+            ary[0] += subsec if ary[0] == sec
             ary[-1] = zone
             utc? ? Time.utc(*ary) : Time.local(*ary)
           else
diff --git a/activesupport/test/core_ext/time_ext_test.rb b/activesupport/test/core_ext/time_ext_test.rb
index 53d497013a..44e02109b1 100644
--- a/activesupport/test/core_ext/time_ext_test.rb
+++ b/activesupport/test/core_ext/time_ext_test.rb
@@ -808,4 +808,11 @@ class TimeExtMarshalingTest < Test::Unit::TestCase
     assert_equal t.zone, unmarshaled.zone
     assert_equal t, unmarshaled
   end
+
+  def test_marshalling_preserves_fractional_seconds
+    t = Time.parse('00:00:00.500')
+    unmarshaled = Marshal.load(Marshal.dump(t))
+    assert_equal t.to_f, unmarshaled.to_f
+    assert_equal t, unmarshaled
+  end
 end
-- 
cgit v1.2.3