Skip to content

Commit

Permalink
Only define #positive? and #negative? on Ruby 2.2
Browse files Browse the repository at this point in the history
The feature was accepted and added to Ruby 2.3+ so we don't need to
define it again.

See https://bugs.ruby-lang.org/issues/11151
  • Loading branch information
rafaelfranca committed May 19, 2015
1 parent 72959da commit 6c55cff
Show file tree
Hide file tree
Showing 2 changed files with 85 additions and 6 deletions.
7 changes: 7 additions & 0 deletions activesupport/lib/active_support/core_ext/numeric/inquiry.rb
@@ -1,3 +1,4 @@
unless 1.respond_to?(:positive?) # TODO: Remove this file when we drop support to ruby < 2.3
class Numeric class Numeric
# Returns true if the number is positive. # Returns true if the number is positive.
# #
Expand All @@ -17,3 +18,9 @@ def negative?
self < 0 self < 0
end end
end end

class Complex
undef :positive?
undef :negative?
end
end
84 changes: 78 additions & 6 deletions activesupport/test/core_ext/numeric_ext_test.rb
Expand Up @@ -390,15 +390,87 @@ def test_in_milliseconds
assert_equal 10_000, 10.seconds.in_milliseconds assert_equal 10_000, 10.seconds.in_milliseconds
end end


# TODO: Remove positive and negative tests when we drop support to ruby < 2.3
b = 2**64
b *= b until Bignum === b

T_ZERO = b.coerce(0).first
T_ONE = b.coerce(1).first
T_MONE = b.coerce(-1).first

def test_positive def test_positive
assert 1.positive? assert_predicate(1, :positive?)
assert_not 0.positive? assert_not_predicate(0, :positive?)
assert_not -1.positive? assert_not_predicate(-1, :positive?)
assert_predicate(+1.0, :positive?)
assert_not_predicate(+0.0, :positive?)
assert_not_predicate(-0.0, :positive?)
assert_not_predicate(-1.0, :positive?)
assert_predicate(+(0.0.next_float), :positive?)
assert_not_predicate(-(0.0.next_float), :positive?)
assert_predicate(Float::INFINITY, :positive?)
assert_not_predicate(-Float::INFINITY, :positive?)
assert_not_predicate(Float::NAN, :positive?)

a = Class.new(Numeric) do
def >(x); true; end
end.new
assert_predicate(a, :positive?)

a = Class.new(Numeric) do
def >(x); false; end
end.new
assert_not_predicate(a, :positive?)

assert_predicate(1/2r, :positive?)
assert_not_predicate(-1/2r, :positive?)

assert_predicate(T_ONE, :positive?)
assert_not_predicate(T_MONE, :positive?)
assert_not_predicate(T_ZERO, :positive?)

e = assert_raises(NoMethodError) do
Complex(1).positive?
end

assert_match(/positive\?/, e.message)
end end


def test_negative def test_negative
assert(-1.negative?) assert_predicate(-1, :negative?)
assert_not 0.negative? assert_not_predicate(0, :negative?)
assert_not 1.negative? assert_not_predicate(1, :negative?)
assert_predicate(-1.0, :negative?)
assert_not_predicate(-0.0, :negative?)
assert_not_predicate(+0.0, :negative?)
assert_not_predicate(+1.0, :negative?)
assert_predicate(-(0.0.next_float), :negative?)
assert_not_predicate(+(0.0.next_float), :negative?)
assert_predicate(-Float::INFINITY, :negative?)
assert_not_predicate(Float::INFINITY, :negative?)
assert_not_predicate(Float::NAN, :negative?)

a = Class.new(Numeric) do
def <(x); true; end
end.new
assert_predicate(a, :negative?)

a = Class.new(Numeric) do
def <(x); false; end
end.new
assert_not_predicate(a, :negative?)

assert_predicate(-1/2r, :negative?)
assert_not_predicate(1/2r, :negative?)

assert_not_predicate(T_ONE, :negative?)
assert_predicate(T_MONE, :negative?)
assert_not_predicate(T_ZERO, :negative?)

e = assert_raises(NoMethodError) do
Complex(1).negative?
end

assert_match(/negative\?/, e.message)
end end
end end

3 comments on commit 6c55cff

@rafaelfranca
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

cc @dhh

@chancancode
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

❤️

@dhh
Copy link
Member

@dhh dhh commented on 6c55cff May 19, 2015

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Awesome! Happy to see that the path from Active Support incubation to Ruby stable inclusion has shortened so much.

Please sign in to comment.