summaryrefslogtreecommitdiff
path: root/test/ruby
diff options
context:
space:
mode:
Diffstat (limited to 'test/ruby')
-rw-r--r--test/ruby/test_array.rb30
1 files changed, 30 insertions, 0 deletions
diff --git a/test/ruby/test_array.rb b/test/ruby/test_array.rb
index fb50f581fe..0a9ba90564 100644
--- a/test/ruby/test_array.rb
+++ b/test/ruby/test_array.rb
@@ -1663,6 +1663,36 @@ class TestArray < Test::Unit::TestCase
assert_equal([1, 2, 3, 4], a)
end
+ def test_freeze_inside_sort!
+ array = [1, 2, 3, 4, 5]
+ frozen_array = nil
+ assert_raise(FrozenError) do
+ array.sort! do |a, b|
+ array.freeze if a == 3
+ frozen_array ||= array.map.to_a if array.frozen?
+ 1
+ end
+ end
+ assert_equal(frozen_array, array)
+
+ object = Object.new
+ array = [1, 2, 3, 4, 5]
+ object.define_singleton_method(:>){|_| array.freeze; true}
+ assert_raise(FrozenError) do
+ array.sort! do |a, b|
+ object
+ end
+ end
+
+ object = Object.new
+ array = [object, object]
+ object.define_singleton_method(:>){|_| array.freeze; true}
+ object.define_singleton_method(:<=>){|o| object}
+ assert_raise(FrozenError) do
+ array.sort!
+ end
+ end
+
def test_sort_with_callcc
need_continuation
n = 1000