* 2022-01-18 [ci skip]
[ruby-80x24.org.git] / test / test_singleton.rb
blobb3c48bb5f5dbc7c1049f5056e4704c9d3e66cbd8
1 # frozen_string_literal: false
2 require 'test/unit'
3 require 'singleton'
5 class TestSingleton < Test::Unit::TestCase
6   class SingletonTest
7     include Singleton
8   end
10   def test_marshal
11     o1 = SingletonTest.instance
12     m = Marshal.dump(o1)
13     o2 = Marshal.load(m)
14     assert_same(o1, o2)
15   end
17   def test_instance_never_changes
18     a = SingletonTest.instance
19     b = SingletonTest.instance
20     assert_same a, b
21   end
23   def test_initialize_raises_exception
24     assert_raise NoMethodError do
25       SingletonTest.new
26     end
27   end
29   def test_allocate_raises_exception
30     assert_raise NoMethodError do
31       SingletonTest.allocate
32     end
33   end
35   def test_clone_raises_exception
36     exception = assert_raise TypeError do
37       SingletonTest.instance.clone
38     end
40     expected = "can't clone instance of singleton TestSingleton::SingletonTest"
42     assert_equal expected, exception.message
43   end
45   def test_dup_raises_exception
46     exception = assert_raise TypeError do
47       SingletonTest.instance.dup
48     end
50     expected = "can't dup instance of singleton TestSingleton::SingletonTest"
52     assert_equal expected, exception.message
53   end
55   def test_include_in_module_raises_exception
56     mod = Module.new
58     exception = assert_raise TypeError do
59       mod.class_eval do
60         include Singleton
61       end
62     end
64     expected = "Inclusion of the OO-Singleton module in module #{mod}"
66     assert_equal expected, exception.message
67   end
69   def test_extending_singleton_raises_exception
70     assert_raise NoMethodError do
71       'foo'.extend Singleton
72     end
73   end
75   def test_inheritance_works_with_overridden_inherited_method
76     super_super_called = false
78     outer = Class.new do
79       define_singleton_method :inherited do |sub|
80         super_super_called = true
81       end
82     end
84     inner = Class.new(outer) do
85       include Singleton
86     end
88     tester = Class.new(inner)
90     assert super_super_called
92     a = tester.instance
93     b = tester.instance
94     assert_same a, b
95   end
97   def test_class_level_cloning_preserves_singleton_behavior
98     klass = SingletonTest.clone
100     a = klass.instance
101     b = klass.instance
102     assert_same a, b
103   end