@@ -52,6 +52,30 @@ private module ReferenceSpec
52
52
class TestClassWithFinalize
53
53
include FinalizeCounter
54
54
end
55
+
56
+ class NestedErrorTestClass
57
+ @x = RaisesOnInspectAndClone .new
58
+
59
+ def_clone
60
+ end
61
+
62
+ class RaisesOnInspectAndClone
63
+ def inspect (io : IO )
64
+ raise RuntimeError .new(" I'm shy" )
65
+ end
66
+
67
+ def clone
68
+ raise RuntimeError .new(" I'm unique" )
69
+ end
70
+ end
71
+ end
72
+
73
+ private def expect_empty_recursive_hashes
74
+ Fiber .current.exec_recursive_hash.dup.should be_empty
75
+ Fiber .current.exec_recursive_clone_hash.dup.should be_empty
76
+ ensure
77
+ Fiber .current.exec_recursive_clone_hash.clear
78
+ Fiber .current.exec_recursive_hash.clear
55
79
end
56
80
57
81
describe " Reference" do
@@ -71,73 +95,102 @@ describe "Reference" do
71
95
(!Reference .new).should be_false
72
96
end
73
97
74
- it " does inspect" do
75
- r = ReferenceSpec ::TestClass .new(1 , " hello" )
76
- r.inspect.should eq(%( #<ReferenceSpec::TestClass:0x#{ r.object_id.to_s(16 ) } @x=1, @y="hello">) )
77
- end
98
+ describe " #inspect" do
99
+ it " does inspect" do
100
+ r = ReferenceSpec ::TestClass .new(1 , " hello" )
101
+ r.inspect.should eq(%( #<ReferenceSpec::TestClass:0x#{ r.object_id.to_s(16 ) } @x=1, @y="hello">) )
102
+ expect_empty_recursive_hashes
103
+ end
78
104
79
- it " does to_s " do
80
- r = ReferenceSpec :: TestClass .new( 1 , " hello " )
81
- r.to_s.should eq( %( #<ReferenceSpec::TestClass:0x #{ r.object_id.to_s( 16 ) } > ) )
82
- end
105
+ it " does inspect for class " do
106
+ String .inspect.should eq( " String " )
107
+ expect_empty_recursive_hashes
108
+ end
83
109
84
- it " does inspect for class" do
85
- String .inspect.should eq(" String" )
110
+ it " handles error" do
111
+ r = ReferenceSpec ::NestedErrorTestClass .new
112
+ expect_raises RuntimeError , " I'm shy" do
113
+ r.inspect
114
+ end
115
+ expect_empty_recursive_hashes
116
+ end
86
117
end
87
118
88
- it " does to_s for class" do
89
- String .to_s.should eq(" String" )
90
- end
119
+ describe " #to_s" do
120
+ it " does to_s" do
121
+ r = ReferenceSpec ::TestClass .new(1 , " hello" )
122
+ r.to_s.should eq(%( #<ReferenceSpec::TestClass:0x#{ r.object_id.to_s(16 ) } >) )
123
+ end
124
+
125
+ it " does to_s for class" do
126
+ String .to_s.should eq(" String" )
127
+ end
91
128
92
- it " does to_s for class if virtual" do
93
- [ReferenceSpec ::TestClassBase , ReferenceSpec ::TestClassSubclass ].to_s.should eq(" [ReferenceSpec::TestClassBase, ReferenceSpec::TestClassSubclass]" )
129
+ it " does to_s for class if virtual" do
130
+ [ReferenceSpec ::TestClassBase , ReferenceSpec ::TestClassSubclass ].to_s.should eq(" [ReferenceSpec::TestClassBase, ReferenceSpec::TestClassSubclass]" )
131
+ end
94
132
end
95
133
96
134
it " returns itself" do
97
135
x = " hello"
98
136
x.itself.should be(x)
99
137
end
100
138
101
- it " dups" do
102
- original = ReferenceSpec ::DupCloneClass .new
103
- duplicate = original.dup
104
- duplicate.should_not be(original)
105
- duplicate.x.should eq(original.x)
106
- duplicate.y.should be(original.y)
107
- end
139
+ describe " #dup" do
140
+ it " dups" do
141
+ original = ReferenceSpec ::DupCloneClass .new
142
+ duplicate = original.dup
143
+ duplicate.should_not be(original)
144
+ duplicate.x.should eq(original.x)
145
+ duplicate.y.should be(original.y)
146
+ end
108
147
109
- it " can dup class that inherits abstract class" do
110
- original = ReferenceSpec ::Concrete .new(2 ).as(ReferenceSpec ::Abstract )
111
- duplicate = original.dup
112
- duplicate.should be_a(ReferenceSpec ::Concrete )
113
- duplicate.should_not be(original)
114
- duplicate.x.should eq(original.x)
115
- end
148
+ it " can dup class that inherits abstract class" do
149
+ original = ReferenceSpec ::Concrete .new(2 ).as(ReferenceSpec ::Abstract )
150
+ duplicate = original.dup
151
+ duplicate.should be_a(ReferenceSpec ::Concrete )
152
+ duplicate.should_not be(original)
153
+ duplicate.x.should eq(original.x)
154
+ end
116
155
117
- it " clones with def_clone" do
118
- original = ReferenceSpec ::DupCloneClass .new
119
- clone = original.clone
120
- clone.should_not be(original)
121
- clone.x.should eq(original.x)
156
+ it " calls #finalize on #dup'ed objects" do
157
+ obj = ReferenceSpec ::TestClassWithFinalize .new
158
+ assert_finalizes(" dup" ) { obj.dup }
159
+ end
122
160
end
123
161
124
- it " clones with def_clone (recursive type)" do
125
- original = ReferenceSpec ::DupCloneRecursiveClass .new
126
- clone = original.clone
127
- clone.should_not be(original)
128
- clone.x.should eq(original.x)
129
- clone.y.should_not be(original.y)
130
- clone.y.should eq(original.y)
131
- clone.z.should be(clone)
162
+ describe " #clone" do
163
+ it " clones with def_clone" do
164
+ original = ReferenceSpec ::DupCloneClass .new
165
+ clone = original.clone
166
+ clone.should_not be(original)
167
+ clone.x.should eq(original.x)
168
+ expect_empty_recursive_hashes
169
+ end
170
+
171
+ it " clones with def_clone (recursive type)" do
172
+ original = ReferenceSpec ::DupCloneRecursiveClass .new
173
+ clone = original.clone
174
+ clone.should_not be(original)
175
+ clone.x.should eq(original.x)
176
+ clone.y.should_not be(original.y)
177
+ clone.y.should eq(original.y)
178
+ clone.z.should be(clone)
179
+ expect_empty_recursive_hashes
180
+ end
181
+
182
+ it " handles error" do
183
+ r = ReferenceSpec ::NestedErrorTestClass .new
184
+ expect_raises RuntimeError , " I'm unique" do
185
+ r.clone
186
+ end
187
+ expect_empty_recursive_hashes
188
+ end
132
189
end
133
190
134
191
it " pretty_print" do
135
192
ReferenceSpec ::TestClassBase .new.pretty_inspect.should match(/\A #<ReferenceSpec::TestClassBase:0x[0-9a-f] +>\Z / )
136
193
ReferenceSpec ::TestClass .new(42 , " foo" ).pretty_inspect.should match(/\A #<ReferenceSpec::TestClass:0x[0-9a-f] + @x=42, @y="foo">\Z / )
137
- end
138
-
139
- it " calls #finalize on #dup'ed objects" do
140
- obj = ReferenceSpec ::TestClassWithFinalize .new
141
- assert_finalizes(" dup" ) { obj.dup }
194
+ expect_empty_recursive_hashes
142
195
end
143
196
end
0 commit comments