mirror of https://github.com/rails/rails
Merge pull request #3725 from marcandre/twz_eql
Fix inconsistencies with Time{WithZone}#{hash,eql?}
This commit is contained in:
commit
a93ee92da2
|
@ -312,4 +312,14 @@ class Time
|
|||
end
|
||||
alias_method :compare_without_coercion, :<=>
|
||||
alias_method :<=>, :compare_with_coercion
|
||||
|
||||
# Layers additional behavior on Time#eql? so that ActiveSupport::TimeWithZone instances
|
||||
# can be eql? to an equivalent Time
|
||||
def eql_with_coercion(other)
|
||||
# if other is an ActiveSupport::TimeWithZone, coerce a Time instance from it so we can do eql? comparison
|
||||
other = other.comparable_time if other.respond_to?(:comparable_time)
|
||||
eql_without_coercion(other)
|
||||
end
|
||||
alias_method :eql_without_coercion, :eql?
|
||||
alias_method :eql?, :eql_with_coercion
|
||||
end
|
||||
|
|
|
@ -203,7 +203,11 @@ module ActiveSupport
|
|||
end
|
||||
|
||||
def eql?(other)
|
||||
utc == other
|
||||
utc.eql?(other)
|
||||
end
|
||||
|
||||
def hash
|
||||
utc.hash
|
||||
end
|
||||
|
||||
def +(other)
|
||||
|
@ -277,7 +281,6 @@ module ActiveSupport
|
|||
def to_i
|
||||
utc.to_i
|
||||
end
|
||||
alias_method :hash, :to_i
|
||||
alias_method :tv_sec, :to_i
|
||||
|
||||
# A TimeWithZone acts like a Time, so just return +self+.
|
||||
|
|
|
@ -744,6 +744,12 @@ class TimeExtCalculationsTest < ActiveSupport::TestCase
|
|||
assert_equal(-1, Time.utc(2000) <=> ActiveSupport::TimeWithZone.new( Time.utc(2000, 1, 1, 0, 0, 1), ActiveSupport::TimeZone['UTC'] ))
|
||||
end
|
||||
|
||||
def test_eql?
|
||||
assert_equal true, Time.utc(2000).eql?( ActiveSupport::TimeWithZone.new(Time.utc(2000), ActiveSupport::TimeZone['UTC']) )
|
||||
assert_equal true, Time.utc(2000).eql?( ActiveSupport::TimeWithZone.new(Time.utc(2000), ActiveSupport::TimeZone["Hawaii"]) )
|
||||
assert_equal false,Time.utc(2000, 1, 1, 0, 0, 1).eql?( ActiveSupport::TimeWithZone.new(Time.utc(2000), ActiveSupport::TimeZone['UTC']) )
|
||||
end
|
||||
|
||||
def test_minus_with_time_with_zone
|
||||
assert_equal 86_400.0, Time.utc(2000, 1, 2) - ActiveSupport::TimeWithZone.new( Time.utc(2000, 1, 1), ActiveSupport::TimeZone['UTC'] )
|
||||
end
|
||||
|
|
|
@ -200,8 +200,15 @@ class TimeWithZoneTest < Test::Unit::TestCase
|
|||
end
|
||||
|
||||
def test_eql?
|
||||
assert @twz.eql?(Time.utc(2000))
|
||||
assert @twz.eql?( ActiveSupport::TimeWithZone.new(Time.utc(2000), ActiveSupport::TimeZone["Hawaii"]) )
|
||||
assert_equal true, @twz.eql?(Time.utc(2000))
|
||||
assert_equal true, @twz.eql?( ActiveSupport::TimeWithZone.new(Time.utc(2000), ActiveSupport::TimeZone["Hawaii"]) )
|
||||
assert_equal false, @twz.eql?( Time.utc(2000, 1, 1, 0, 0, 1) )
|
||||
assert_equal false, @twz.eql?( DateTime.civil(1999, 12, 31, 23, 59, 59) )
|
||||
end
|
||||
|
||||
def test_hash
|
||||
assert_equal Time.utc(2000).hash, @twz.hash
|
||||
assert_equal Time.utc(2000).hash, ActiveSupport::TimeWithZone.new(Time.utc(2000), ActiveSupport::TimeZone["Hawaii"]).hash
|
||||
end
|
||||
|
||||
def test_plus_with_integer
|
||||
|
|
Loading…
Reference in New Issue