1
0
Fork 0
mirror of https://github.com/rails/rails.git synced 2022-11-09 12:12:34 -05:00

Define the Duration#instance_of? method

Since Duration is extending from ProxyObject which extends itself from
BasicObject, the Duration object doesn't respond to the #instance_of?
method. Thus, the #method_missing hook get triggered, delegating the
method to its `value` attribute.

However, Rubinius' #eql? definition relies on #instance_of?, thus this
will equal to true with a Fixnum (since its `value` attribute is a
Fixnum) while it should not.

The previous behavior was wrong anyway, no matter the implementation.
This commit is contained in:
Robin Dupret 2014-08-17 16:31:00 +02:00
parent b30b99c615
commit eb73d7dafa
3 changed files with 16 additions and 2 deletions

View file

@ -1,6 +1,11 @@
* Add the `Duration#instance_of?` method that was previously delegated to the
internal `value` attribute.
*Robin Dupret*
* Fix rounding errors with #travel_to by resetting the usec on any passed time to zero, so we only travel
with per-second precision, not anything deeper than that.
*DHH*
* Fix ActiveSupport::TestCase not to order users' test cases by default.

View file

@ -35,10 +35,14 @@ module ActiveSupport
end
def is_a?(klass) #:nodoc:
Duration == klass || value.is_a?(klass)
instance_of?(klass) || value.is_a?(klass)
end
alias :kind_of? :is_a?
def instance_of?(klass) # :nodoc:
Duration == klass
end
# Returns +true+ if +other+ is also a Duration instance with the
# same +value+, or if <tt>other == value</tt>.
def ==(other)

View file

@ -41,6 +41,11 @@ class DurationTest < ActiveSupport::TestCase
assert !1.eql?(1.second)
end
def test_instance_of
assert !1.minute.instance_of?(Fixnum)
assert !2.days.instance_of?(Fixnum)
end
def test_inspect
assert_equal '0 seconds', 0.seconds.inspect
assert_equal '1 month', 1.month.inspect