diff options
| author | Jean Boussier <jean.boussier@gmail.com> | 2021-09-18 15:34:15 +0200 |
|---|---|---|
| committer | Jean Boussier <jean.boussier@gmail.com> | 2021-10-05 18:34:56 +0200 |
| commit | afcbb501ac17ba2ad5370ada5fd26e8dda9a5aaa (patch) | |
| tree | 7316e197ec1f1097b334ad587ee58a58d9961b3f /test/ruby | |
| parent | 279b2b5b600f0bb16f7ebb08aa4a299cf7b023a8 (diff) | |
marshal.c Marshal.load accepts a freeze: true option.
Fixes [Feature #18148]
When set, all the loaded objects are returned as frozen.
If a proc is provided, it is called with the objects already frozen.
Diffstat (limited to 'test/ruby')
| -rw-r--r-- | test/ruby/test_marshal.rb | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/test/ruby/test_marshal.rb b/test/ruby/test_marshal.rb index 4f25344bf6..19f41de27e 100644 --- a/test/ruby/test_marshal.rb +++ b/test/ruby/test_marshal.rb @@ -889,4 +889,42 @@ class TestMarshal < Test::Unit::TestCase def test_hash_default_compared_by_identity _test_hash_compared_by_identity(Hash.new(true)) end + + class TestMarshalFreeze < Test::Unit::TestCase + include MarshalTestLib + + def encode(o) + Marshal.dump(o) + end + + def decode(s) + Marshal.load(s, freeze: true) + end + + def test_return_objects_are_frozen + source = ["foo", {}, /foo/, 1..2] + objects = decode(encode(source)) + assert_equal source, objects + assert_predicate objects, :frozen? + objects.each do |obj| + assert_predicate obj, :frozen? + end + end + + def test_proc_returned_object_are_not_frozen + source = ["foo", {}, /foo/, 1..2] + objects = Marshal.load(encode(source), ->(o) { o.dup }, freeze: true) + assert_equal source, objects + refute_predicate objects, :frozen? + objects.each do |obj| + refute_predicate obj, :frozen? + end + end + + def test_modules_and_classes_are_not_frozen + objects = Marshal.load(encode([Object, Kernel]), freeze: true) + refute_predicate Object, :frozen? + refute_predicate Kernel, :frozen? + end + end end |
