summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/set.rb5
-rw-r--r--test/test_set.rb39
2 files changed, 44 insertions, 0 deletions
diff --git a/lib/set.rb b/lib/set.rb
index 009721381b..292a00adf9 100644
--- a/lib/set.rb
+++ b/lib/set.rb
@@ -723,6 +723,11 @@ class SortedSet < Set
(@keys = @hash.keys).sort! unless @keys
@keys
end
+
+ def freeze
+ to_a
+ super
+ end
END
end
module_eval {
diff --git a/test/test_set.rb b/test/test_set.rb
index daae12723d..33802410af 100644
--- a/test/test_set.rb
+++ b/test/test_set.rb
@@ -829,6 +829,45 @@ class TC_SortedSet < Test::Unit::TestCase
set << 42
assert_equal(7, e.size)
end
+
+ def test_freeze
+ orig = set = SortedSet[3,2,1]
+ assert_equal false, set.frozen?
+ set << 4
+ assert_same orig, set.freeze
+ assert_equal true, set.frozen?
+ assert_raise(RuntimeError) {
+ set << 5
+ }
+ assert_equal 4, set.size
+
+ # https://bugs.ruby-lang.org/issues/12091
+ assert_nothing_raised {
+ assert_equal [1,2,3,4], set.to_a
+ }
+ end
+
+ def test_freeze_dup
+ set1 = SortedSet[1,2,3]
+ set1.freeze
+ set2 = set1.dup
+
+ assert_not_predicate set2, :frozen?
+ assert_nothing_raised {
+ set2.add 4
+ }
+ end
+
+ def test_freeze_clone
+ set1 = SortedSet[1,2,3]
+ set1.freeze
+ set2 = set1.clone
+
+ assert_predicate set2, :frozen?
+ assert_raise(RuntimeError) {
+ set2.add 5
+ }
+ end
end
class TC_Enumerable < Test::Unit::TestCase