diff options
-rw-r--r-- | numeric.c | 4 | ||||
-rw-r--r-- | test/ruby/test_numeric.rb | 14 | ||||
-rw-r--r-- | test/ruby/test_range.rb | 5 |
3 files changed, 21 insertions, 2 deletions
@@ -2514,9 +2514,9 @@ int ruby_float_step(VALUE from, VALUE to, VALUE step, int excl, int allow_endless) { if (RB_TYPE_P(from, T_FLOAT) || RB_TYPE_P(to, T_FLOAT) || RB_TYPE_P(step, T_FLOAT)) { - double beg = NUM2DBL(from); - double end = (allow_endless && NIL_P(to)) ? HUGE_VAL : NUM2DBL(to); double unit = NUM2DBL(step); + double beg = NUM2DBL(from); + double end = (allow_endless && NIL_P(to)) ? (unit < 0 ? -1 : 1)*HUGE_VAL : NUM2DBL(to); double n = ruby_float_step_size(beg, end, unit, excl); long i; diff --git a/test/ruby/test_numeric.rb b/test/ruby/test_numeric.rb index e48c3448e8..f48bce5411 100644 --- a/test/ruby/test_numeric.rb +++ b/test/ruby/test_numeric.rb @@ -339,6 +339,20 @@ class TestNumeric < Test::Unit::TestCase assert_step [bignum]*4, [bignum, by: 0, to: 0], inf: true end + def test_step_bug15537 + assert_step [10.0, 8.0, 6.0, 4.0, 2.0], [10.0, 1, -2] + assert_step [10.0, 8.0, 6.0, 4.0, 2.0], [10.0, to: 1, by: -2] + assert_step [10.0, 8.0, 6.0, 4.0, 2.0], [10.0, 1, -2] + assert_step [10.0, 8.0, 6.0, 4.0, 2.0], [10, to: 1.0, by: -2] + assert_step [10.0, 8.0, 6.0, 4.0, 2.0], [10, 1.0, -2] + + assert_step [10.0, 9.0, 8.0, 7.0], [10, by: -1.0], inf: true + assert_step [10.0, 9.0, 8.0, 7.0], [10, by: -1.0, to: nil], inf: true + assert_step [10.0, 9.0, 8.0, 7.0], [10, nil, -1.0], inf: true + assert_step [10.0, 9.0, 8.0, 7.0], [10.0, by: -1], inf: true + assert_step [10.0, 9.0, 8.0, 7.0], [10.0, nil, -1], inf: true + end + def test_num2long assert_raise(TypeError) { 1 & nil } assert_raise(TypeError) { 1 & 1.0 } diff --git a/test/ruby/test_range.rb b/test/ruby/test_range.rb index 65f3a8974d..6a2081fcd2 100644 --- a/test/ruby/test_range.rb +++ b/test/ruby/test_range.rb @@ -322,6 +322,11 @@ class TestRange < Test::Unit::TestCase assert_equal(["a", "b", "c"], a) end + def test_step_bug15537 + assert_equal([10.0, 9.0, 8.0, 7.0], (10 ..).step(-1.0).take(4)) + assert_equal([10.0, 9.0, 8.0, 7.0], (10.0 ..).step(-1).take(4)) + end + def test_percent_step aseq = (1..10) % 2 assert_equal(Enumerator::ArithmeticSequence, aseq.class) |