From cca19532c5f71e1bdc0b4947b2fcddd181f27781 Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Thu, 3 Jan 2019 11:34:35 +0900 Subject: Remove `Kernel#class_defined?` which is not available in CRuby; #3829 --- test/t/integer.rb | 54 ++++++++++++++++++++++++++---------------------------- 1 file changed, 26 insertions(+), 28 deletions(-) (limited to 'test/t/integer.rb') diff --git a/test/t/integer.rb b/test/t/integer.rb index cea97a1e6..c37641e9f 100644 --- a/test/t/integer.rb +++ b/test/t/integer.rb @@ -7,10 +7,10 @@ end assert('Integer#+', '15.2.8.3.1') do a = 1+1 - b = 1+1.0 if class_defined?("Float") + b = 1+1.0 if Object.const_defined?(:Float) assert_equal 2, a - assert_equal 2.0, b if class_defined?("Float") + assert_equal 2.0, b if Object.const_defined?(:Float) assert_raise(TypeError){ 0+nil } assert_raise(TypeError){ 1+nil } @@ -18,40 +18,38 @@ assert('Integer#+', '15.2.8.3.1') do c = Mrbtest::FIXNUM_MAX + 1 d = Mrbtest::FIXNUM_MAX.__send__(:+, 1) - if class_defined?("Float") - e = Mrbtest::FIXNUM_MAX + 1.0 - assert_equal Float, c.class - assert_equal Float, d.class - assert_float e, c - assert_float e, d - end + skip unless Object.const_defined?(:Float) + e = Mrbtest::FIXNUM_MAX + 1.0 + assert_equal Float, c.class + assert_equal Float, d.class + assert_float e, c + assert_float e, d end assert('Integer#-', '15.2.8.3.2') do a = 2-1 - b = 2-1.0 if class_defined?("Float") + b = 2-1.0 if Object.const_defined?(:Float) assert_equal 1, a - assert_equal 1.0, b if class_defined?("Float") + assert_equal 1.0, b if Object.const_defined?(:Float) c = Mrbtest::FIXNUM_MIN - 1 d = Mrbtest::FIXNUM_MIN.__send__(:-, 1) - if class_defined?("Float") - e = Mrbtest::FIXNUM_MIN - 1.0 - assert_equal Float, c.class - assert_equal Float, d.class - assert_float e, c - assert_float e, d - end + skip unless Object.const_defined?(:Float) + e = Mrbtest::FIXNUM_MIN - 1.0 + assert_equal Float, c.class + assert_equal Float, d.class + assert_float e, c + assert_float e, d end assert('Integer#*', '15.2.8.3.3') do a = 1*1 - b = 1*1.0 if class_defined?("Float") + b = 1*1.0 if Object.const_defined?(:Float) assert_equal 1, a - assert_equal 1.0, b if class_defined?("Float") + assert_equal 1.0, b if Object.const_defined?(:Float) assert_raise(TypeError){ 0*nil } assert_raise(TypeError){ 1*nil } @@ -59,13 +57,12 @@ assert('Integer#*', '15.2.8.3.3') do c = Mrbtest::FIXNUM_MAX * 2 d = Mrbtest::FIXNUM_MAX.__send__(:*, 2) - if class_defined?("Float") - e = Mrbtest::FIXNUM_MAX * 2.0 - assert_equal Float, c.class - assert_equal Float, d.class - assert_float e, c - assert_float e, d - end + skip unless Object.const_defined?(:Float) + e = Mrbtest::FIXNUM_MAX * 2.0 + assert_equal Float, c.class + assert_equal Float, d.class + assert_float e, c + assert_float e, d end assert('Integer#/', '15.2.8.3.4') do @@ -226,8 +223,9 @@ assert('Integer#times', '15.2.8.3.22') do end assert('Integer#to_f', '15.2.8.3.23') do + skip unless Object.const_defined?(:Float) assert_equal 1.0, 1.to_f -end if class_defined?("Float") +end assert('Integer#to_i', '15.2.8.3.24') do assert_equal 1, 1.to_i -- cgit v1.2.3 From de5da4b7f6615610ee5935754ae76e71870380aa Mon Sep 17 00:00:00 2001 From: KOBAYASHI Shuji Date: Tue, 15 Jan 2019 21:41:54 +0900 Subject: Fix coercing for first step counter in `Numeric#step` Before: a=[]; 7.step(4, -3.0) { |c| a << c }; p a #=> [7, 4.0] After / Ruby: a=[]; 7.step(4, -3.0) { |c| a << c }; p a #=> [7.0, 4.0] --- mrblib/numeric.rb | 11 +++++++++-- test/t/integer.rb | 16 ---------------- test/t/numeric.rb | 32 ++++++++++++++++++++++++++++++++ 3 files changed, 41 insertions(+), 18 deletions(-) (limited to 'test/t/integer.rb') diff --git a/mrblib/numeric.rb b/mrblib/numeric.rb index a2eb9c450..dfdaf9da8 100644 --- a/mrblib/numeric.rb +++ b/mrblib/numeric.rb @@ -104,11 +104,18 @@ module Integral raise ArgumentError, "step can't be 0" if step == 0 return to_enum(:step, num, step) unless block - i = if Object.const_defined?(:Float) && num.kind_of?(Float) then self.to_f else self end + i = self + if Object.const_defined?(:Float) && + (kind_of?(Float) || num.kind_of?(Float) || step.kind_of?(Float)) + i = i.to_f + num = num.to_f unless num == nil + step = step.to_f + end + if num == nil while true block.call(i) - i+=step + i += step end return self end diff --git a/test/t/integer.rb b/test/t/integer.rb index c37641e9f..4ab49eb0a 100644 --- a/test/t/integer.rb +++ b/test/t/integer.rb @@ -257,19 +257,3 @@ assert('Integer#divmod', '15.2.8.3.30') do assert_equal [-2, -1], 25.divmod(-13) assert_equal [ 1, -6], -13.divmod(-7) end - -# Not ISO specified - -assert('Integer#step') do - a = [] - b = [] - 1.step(3) do |i| - a << i - end - 1.step(6, 2) do |i| - b << i - end - - assert_equal [1, 2, 3], a - assert_equal [1, 3, 5], b -end diff --git a/test/t/numeric.rb b/test/t/numeric.rb index 9d6dc22cc..f58194fe5 100644 --- a/test/t/numeric.rb +++ b/test/t/numeric.rb @@ -42,3 +42,35 @@ end assert('Numeric#**') do assert_equal 8.0, 2.0**3 end + +assert('Numeric#step') do + assert_step = ->(exp, receiver, args) do + inf = !args[0] + act = [] + ret = receiver.step(*args) do |i| + act << i + break if inf && exp.size == act.size + end + expr = "#{receiver.inspect}.step(#{args.map(&:inspect).join(', ')})" + msg = "#{expr}: counters" + diff = assertion_diff(exp, act) + assert_true exp.map{|v|[v,v.class]} == act.map{|v|[v,v.class]}, msg, diff + assert_same receiver, ret, "#{expr}: return value" unless inf + end + + assert_raise(ArgumentError) { 1.step(2, 0) { break } } + assert_step.([2, 3, 4], 2, [4]) + assert_step.([10, 8, 6, 4, 2], 10, [1, -2]) + assert_step.([], 2, [1, 3]) + assert_step.([], -2, [-1, -3]) + assert_step.([10, 11, 12, 13], 10, []) + assert_step.([10, 7, 4], 10, [nil, -3]) + + skip unless Object.const_defined?(:Float) + assert_raise(ArgumentError) { 1.step(2, 0.0) { break } } + assert_step.([2.0, 3.0, 4.0], 2, [4.0]) + assert_step.([7.0, 4.0, 1.0, -2.0], 7, [-4, -3.0]) + assert_step.([2.0, 3.0, 4.0], 2.0, [4]) + assert_step.([10.0, 11.0, 12.0, 13.0], 10.0, []) + assert_step.([10.0, 7.0, 4.0], 10, [nil, -3.0]) +end -- cgit v1.2.3