diff options
author | Kouhei Yanagita <yanagi@shakenbu.org> | 2023-10-13 15:02:23 +0900 |
---|---|---|
committer | Jeremy Evans <code@jeremyevans.net> | 2024-04-10 07:28:07 -0700 |
commit | 9f6deaa6888a423720b4b127b5314f0ad26cc2e6 (patch) | |
tree | 0545536f0c556825b6ffa5fdd1c884a33c48982e /test/ruby | |
parent | f9f25d0ed001ae7c7a335c32fb3c5f0895709b9b (diff) |
[Misc #18984] Raise TypeError from Range#size if the range is not iterable
Diffstat (limited to 'test/ruby')
-rw-r--r-- | test/ruby/test_range.rb | 50 |
1 files changed, 31 insertions, 19 deletions
diff --git a/test/ruby/test_range.rb b/test/ruby/test_range.rb index 2aa69dc6a4..84b3b205f0 100644 --- a/test/ruby/test_range.rb +++ b/test/ruby/test_range.rb @@ -983,26 +983,38 @@ class TestRange < Test::Unit::TestCase end def test_size - assert_equal 42, (1..42).size - assert_equal 41, (1...42).size - assert_equal 6, (1...6.3).size - assert_equal 5, (1.1...6).size - assert_equal 3, (1..3r).size - assert_equal 2, (1...3r).size - assert_equal 3, (1..3.1r).size - assert_equal 3, (1...3.1r).size - assert_equal 42, (1..42).each.size + Enumerator.product([:to_i, :to_f, :to_r].repeated_permutation(2), [1, 10], [5, 5.5], [true, false]) do |(m1, m2), beg, ende, exclude_end| + r = Range.new(beg.send(m1), ende.send(m2), exclude_end) + iterable = true + yielded = [] + begin + r.each { yielded << _1 } + rescue TypeError + iterable = false + end + + if iterable + assert_equal(yielded.size, r.size, "failed on #{r}") + assert_equal(yielded.size, r.each.size, "failed on #{r}") + else + assert_raise(TypeError, "failed on #{r}") { r.size } + assert_raise(TypeError, "failed on #{r}") { r.each.size } + end + end + assert_nil ("a"..."z").size - assert_nil ("a"...).size - assert_nil (..."z").size # [Bug #18983] - assert_nil (nil...nil).size # [Bug #18983] - - assert_equal Float::INFINITY, (1...).size - assert_equal Float::INFINITY, (1.0...).size - assert_equal Float::INFINITY, (...1).size - assert_equal Float::INFINITY, (...1.0).size - assert_nil ("a"...).size - assert_nil (..."z").size + + assert_equal Float::INFINITY, (1..).size + assert_raise(TypeError) { (1.0..).size } + assert_raise(TypeError) { (1r..).size } + assert_nil ("a"..).size + + assert_raise(TypeError) { (..1).size } + assert_raise(TypeError) { (..1.0).size } + assert_raise(TypeError) { (..1r).size } + assert_raise(TypeError) { (..'z').size } + + assert_raise(TypeError) { (nil...nil).size } end def test_bsearch_typechecks_return_values |