[前][次][番号順一覧][スレッド一覧]

ruby-changes:72196

From: Jemma <ko1@a...>
Date: Fri, 17 Jun 2022 00:48:20 +0900 (JST)
Subject: [ruby-changes:72196] c49fde351f (master): Adding more clone tests, and adding dup tests

https://git.ruby-lang.org/ruby.git/commit/?id=c49fde351f

From c49fde351fb215d8f9fc2f82893a4469692f2e98 Mon Sep 17 00:00:00 2001
From: Jemma Issroff <jemmaissroff@g...>
Date: Wed, 15 Jun 2022 10:18:17 -0400
Subject: Adding more clone tests, and adding dup tests

---
 test/ruby/test_clone.rb |  46 ++++++++++++++++++++
 test/ruby/test_dup.rb   | 110 ++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 156 insertions(+)
 create mode 100644 test/ruby/test_dup.rb

diff --git a/test/ruby/test_clone.rb b/test/ruby/test_clone.rb
index 321feb07c7..216eaa39d2 100644
--- a/test/ruby/test_clone.rb
+++ b/test/ruby/test_clone.rb
@@ -27,6 +27,52 @@ class TestClone < Test::Unit::TestCase https://github.com/ruby/ruby/blob/trunk/test/ruby/test_clone.rb#L27
     assert_equal([M003, M002, M001], M003.ancestors)
   end
 
+  def test_frozen_properties_retained_on_clone
+    obj = Object.new.freeze
+    cloned_obj = obj.clone
+
+    assert_predicate(obj, :frozen?)
+    assert_predicate(cloned_obj, :frozen?)
+  end
+
+  def test_ivar_retained_on_clone
+    obj = Object.new
+    obj.instance_variable_set(:@a, 1)
+    cloned_obj = obj.clone
+
+    assert_equal(obj.instance_variable_get(:@a), 1)
+    assert_equal(cloned_obj.instance_variable_get(:@a), 1)
+  end
+
+  def test_ivars_retained_on_extended_obj_clone
+    ivars = { :@a => 1, :@b => 2, :@c => 3, :@d => 4 }
+    obj = Object.new
+    ivars.each do |ivar_name, val|
+      obj.instance_variable_set(ivar_name, val)
+    end
+
+    cloned_obj = obj.clone
+
+    ivars.each do |ivar_name, val|
+      assert_equal(obj.instance_variable_get(ivar_name), val)
+      assert_equal(cloned_obj.instance_variable_get(ivar_name), val)
+    end
+  end
+
+  def test_frozen_properties_and_ivars_retained_on_clone_with_ivar
+    obj = Object.new
+    obj.instance_variable_set(:@a, 1)
+    obj.freeze
+
+    cloned_obj = obj.clone
+
+    assert_predicate(obj, :frozen?)
+    assert_equal(obj.instance_variable_get(:@a), 1)
+
+    assert_predicate(cloned_obj, :frozen?)
+    assert_equal(cloned_obj.instance_variable_get(:@a), 1)
+  end
+
   def test_user_flags
     assert_separately([], <<-EOS)
       #
diff --git a/test/ruby/test_dup.rb b/test/ruby/test_dup.rb
new file mode 100644
index 0000000000..75c4fc0339
--- /dev/null
+++ b/test/ruby/test_dup.rb
@@ -0,0 +1,110 @@ https://github.com/ruby/ruby/blob/trunk/test/ruby/test_dup.rb#L1
+# frozen_string_literal: false
+require 'test/unit'
+
+class TestDup < Test::Unit::TestCase
+  module M001; end
+  module M002; end
+  module M003; include M002; end
+  module M002; include M001; end
+  module M003; include M002; end
+
+  def test_dup
+    foo = Object.new
+    def foo.test
+      "test"
+    end
+    bar = foo.dup
+    def bar.test2
+      "test2"
+    end
+
+    assert_equal("test2", bar.test2)
+    assert_raise(NoMethodError) { bar.test }
+    assert_equal("test", foo.test)
+
+    assert_raise(NoMethodError) {foo.test2}
+
+    assert_equal([M003, M002, M001], M003.ancestors)
+  end
+
+  def test_frozen_properties_not_retained_on_dup
+    obj = Object.new.freeze
+    duped_obj = obj.dup
+
+    assert_predicate(obj, :frozen?)
+    refute_predicate(duped_obj, :frozen?)
+  end
+
+  def test_ivar_retained_on_dup
+    obj = Object.new
+    obj.instance_variable_set(:@a, 1)
+    duped_obj = obj.dup
+
+    assert_equal(obj.instance_variable_get(:@a), 1)
+    assert_equal(duped_obj.instance_variable_get(:@a), 1)
+  end
+
+  def test_ivars_retained_on_extended_obj_dup
+    ivars = { :@a => 1, :@b => 2, :@c => 3, :@d => 4 }
+    obj = Object.new
+    ivars.each do |ivar_name, val|
+      obj.instance_variable_set(ivar_name, val)
+    end
+
+    duped_obj = obj.dup
+
+    ivars.each do |ivar_name, val|
+      assert_equal(obj.instance_variable_get(ivar_name), val)
+      assert_equal(duped_obj.instance_variable_get(ivar_name), val)
+    end
+  end
+
+  def test_frozen_properties_not_retained_on_dup_with_ivar
+    obj = Object.new
+    obj.instance_variable_set(:@a, 1)
+    obj.freeze
+
+    duped_obj = obj.dup
+
+    assert_predicate(obj, :frozen?)
+    assert_equal(obj.instance_variable_get(:@a), 1)
+
+    refute_predicate(duped_obj, :frozen?)
+    assert_equal(duped_obj.instance_variable_get(:@a), 1)
+  end
+
+  def test_user_flags
+    assert_separately([], <<-EOS)
+      #
+      class Array
+        undef initialize_copy
+        def initialize_copy(*); end
+      end
+      x = [1, 2, 3].dup
+      assert_equal [], x, '[Bug #14847]'
+    EOS
+
+    assert_separately([], <<-EOS)
+      #
+      class Array
+        undef initialize_copy
+        def initialize_copy(*); end
+      end
+      x = [1,2,3,4,5,6,7][1..-2].dup
+      x.push(1,1,1,1,1)
+      assert_equal [1, 1, 1, 1, 1], x, '[Bug #14847]'
+    EOS
+
+    assert_separately([], <<-EOS)
+      #
+      class Hash
+        undef initialize_copy
+        def initialize_copy(*); end
+      end
+      h = {}
+      h.default_proc = proc { raise }
+      h = h.dup
+      assert_equal nil, h[:not_exist], '[Bug #14847]'
+    EOS
+  end
+end
-- 
cgit v1.2.1


--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]