source: EcnlProtoTool/trunk/mruby-2.1.1/test/t/class.rb@ 439

Last change on this file since 439 was 439, checked in by coas-nagasima, 4 years ago

mrubyを2.1.1に更新

  • Property svn:eol-style set to native
  • Property svn:mime-type set to text/x-ruby;charset=UTF-8
File size: 8.3 KB
Line 
1##
2# Class ISO Test
3
4assert('Class', '15.2.3') do
5 assert_equal(Class, Class.class)
6end
7
8assert('Class#initialize', '15.2.3.3.1') do
9 c = Class.new do
10 def test
11 :test
12 end
13 end.new
14
15 assert_equal(c.test, :test)
16end
17
18assert('Class#initialize_copy', '15.2.3.3.2') do
19 class TestClass
20 attr_accessor :n
21 def initialize(n)
22 @n = n
23 end
24 def initialize_copy(obj)
25 @n = n
26 end
27 end
28
29 c1 = TestClass.new('Foo')
30 c2 = c1.dup
31 c3 = TestClass.new('Bar')
32
33 assert_equal(c1.n, c2.n)
34 assert_not_equal(c1.n, c3.n)
35end
36
37assert('Class#new', '15.2.3.3.3') do
38 assert_raise(TypeError, 'Singleton should raise TypeError') do
39 (class <<"a"; self; end).new
40 end
41
42 class TestClass
43 def initialize args, &block
44 @result = if not args.nil? and block.nil?
45 # only arguments
46 :only_args
47 elsif not args.nil? and not block.nil?
48 # args and block is given
49 :args_and_block
50 else
51 # this should never happen
52 :broken
53 end
54 end
55
56 def result; @result; end
57 end
58
59 assert_equal(:only_args, TestClass.new(:arg).result)
60 # with block doesn't work yet
61end
62
63assert('Class#superclass', '15.2.3.3.4') do
64 class SubClass < String; end
65 assert_equal(String, SubClass.superclass)
66end
67
68# Not ISO specified
69
70assert('Class 1') do
71 class C1; end
72 assert_equal(Class, C1.class)
73end
74
75assert('Class 2') do
76 class C2; end
77 assert_equal(C2, C2.new.class)
78end
79
80assert('Class 3') do
81 class C3; end
82 assert_equal(Class, C3.new.class.class)
83end
84
85assert('Class 4') do
86 class C4_A; end
87 class C4 < C4_A; end
88 assert_equal(Class, C4.class)
89end
90
91assert('Class 5') do
92 class C5_A; end
93 class C5 < C5_A; end
94 assert_equal(C5, C5.new.class)
95end
96
97assert('Class 6') do
98 class C6_A; end
99 class C6 < C6_A; end
100 assert_equal(Class, C6.new.class.class)
101end
102
103assert('Class 7') do
104 class C7_A; end
105 class C7_B; end
106
107 class C7 < C7_A; end
108
109 assert_raise(TypeError) do
110 # Different superclass.
111 class C7 < C7_B; end
112 end
113end
114
115assert('Class 8') do
116 class C8_A; end
117
118 class C8; end # superclass is Object
119
120 assert_raise(TypeError) do
121 # Different superclass.
122 class C8 < C8_A; end
123 end
124end
125
126assert('Class 9') do
127 Class9Const = "a"
128
129 assert_raise(TypeError) do
130 class Class9Const; end
131 end
132end
133
134assert('Class Module 1') do
135 module M; end
136 assert_equal(Module, M.class)
137end
138
139assert('Class Module 2') do
140 module M; end
141 class C; include M; end
142 assert_equal(C, C.new.class)
143end
144
145# nested class
146assert('Class Nested 1') do
147 class A; end
148 class A::B; end
149 assert_equal(A::B, A::B)
150end
151
152assert('Class Nested 2') do
153 class A; end
154 class A::B; end
155 assert_equal(A::B, A::B.new.class)
156end
157
158assert('Class Nested 3') do
159 class A; end
160 class A::B; end
161 assert_equal(Class, A::B.new.class.class)
162end
163
164assert('Class Nested 4') do
165 class A; end
166 class A::B; end
167 class A::B::C; end
168 assert_equal(A::B::C, A::B::C)
169end
170
171assert('Class Nested 5') do
172 class A; end
173 class A::B; end
174 class A::B::C; end
175 assert_equal(Class, A::B::C.class)
176end
177
178assert('Class Nested 6') do
179 class A; end
180 class A::B; end
181 class A::B::C; end
182 assert_equal(A::B::C, A::B::C.new.class)
183end
184
185assert('Class Nested 7') do
186 class A; end
187 class A::B; end
188 class A::B2 < A::B; end
189 assert_equal(A::B2, A::B2)
190end
191
192assert('Class Nested 8') do
193 class A; end
194 class A::B; end
195 class A::B2 < A::B; end
196 assert_equal(Class, A::B2.class)
197end
198
199assert('Class Colon 1') do
200 class A; end
201 A::C = 1
202 assert_equal(1, A::C)
203end
204
205assert('Class Colon 2') do
206 class A; class ::C; end end
207 assert_equal(C, C)
208end
209
210assert('Class Colon 3') do
211 class A; class ::C; end end
212 assert_equal(Class, C.class)
213end
214
215assert('Class Dup 1') do
216 class C; end
217 assert_equal(Class, C.dup.class)
218end
219
220assert('Class Dup 2') do
221 module M; end
222 assert_equal(Module, M.dup.class)
223end
224
225assert('Class.new') do
226 assert_equal(Class, Class.new.class)
227 a = []
228 klass = Class.new do |c|
229 a << c
230 end
231 assert_equal([klass], a)
232end
233
234assert('class to return the last value') do
235 m = class C; :m end
236 assert_equal(m, :m)
237end
238
239assert('class to return nil if body is empty') do
240 assert_nil(class C end)
241 assert_nil(class << self; end)
242end
243
244assert('raise when superclass is not a class') do
245 module FirstModule; end
246 assert_raise(TypeError, 'should raise TypeError') do
247 class FirstClass < FirstModule; end
248 end
249
250 class SecondClass; end
251 assert_raise(TypeError, 'should raise TypeError') do
252 class SecondClass < false; end
253 end
254
255 class ThirdClass; end
256 assert_raise(TypeError, 'should raise TypeError') do
257 class ThirdClass < ThirdClass; end
258 end
259end
260
261assert('Class#inherited') do
262 class Foo
263 @@subclass_name = nil
264 def self.inherited(subclass)
265 @@subclass_name = subclass
266 end
267 def self.subclass_name
268 @@subclass_name
269 end
270 end
271
272 assert_equal(nil, Foo.subclass_name)
273
274 class Bar < Foo
275 end
276
277 assert_equal(Bar, Foo.subclass_name)
278
279 class Baz < Bar
280 end
281
282 assert_equal(Baz, Foo.subclass_name)
283end
284
285assert('singleton tests') do
286 module FooMod
287 def run_foo_mod
288 100
289 end
290 end
291
292 bar = String.new
293
294 baz = class << bar
295 extend FooMod
296 def self.run_baz
297 200
298 end
299 end
300
301 assert_equal :run_baz, baz
302
303 assert_raise(NoMethodError, 'should raise NoMethodError') do
304 bar.run_foo_mod
305 end
306 assert_raise(NoMethodError, 'should raise NoMethodError') do
307 bar.run_baz
308 end
309
310 baz = class << bar
311 extend FooMod
312 def self.run_baz
313 300
314 end
315 self
316 end
317
318 assert_true baz.respond_to? :run_baz
319 assert_true baz.respond_to? :run_foo_mod
320 assert_equal 100, baz.run_foo_mod
321 assert_equal 300, baz.run_baz
322
323 assert_raise(NoMethodError, 'should raise NoMethodError') do
324 bar.run_foo_mod
325 end
326 assert_raise(NoMethodError, 'should raise NoMethodError') do
327 bar.run_baz
328 end
329
330 fv = false
331 class << fv
332 def self.run_false
333 5
334 end
335 end
336
337 nv = nil
338 class << nv
339 def self.run_nil
340 6
341 end
342 end
343
344 tv = true
345 class << tv
346 def self.run_nil
347 7
348 end
349 end
350
351 assert_raise(TypeError, 'should raise TypeError') do
352 num = 1.0
353 class << num
354 def self.run_nil
355 7
356 end
357 end
358 end if Object.const_defined?(:Float)
359
360 o = Object.new
361 sc = class << o; self end
362 o.freeze
363 assert_predicate(sc, :frozen?)
364
365 assert_predicate(class << Object.new.freeze; self end, :frozen?)
366end
367
368assert('clone Class') do
369 class Foo
370 def func
371 true
372 end
373 end
374
375 assert_true(Foo.clone.new.func)
376end
377
378assert('class variable and class << self style class method') do
379 class ClassVariableTest
380 @@class_variable = "value"
381 class << self
382 def class_variable
383 @@class_variable
384 end
385 end
386 end
387
388 assert_equal("value", ClassVariableTest.class_variable)
389end
390
391assert('class variable definition in singleton_class') do
392 class ClassVariableDefinitionInSingletonTest
393 class << self
394 @@class_variable = "value"
395 end
396 def class_variable
397 @@class_variable
398 end
399 end
400
401 assert_equal("value", ClassVariableDefinitionInSingletonTest.new.class_variable)
402end
403
404assert('class variable in module and class << self style class method') do
405 module ClassVariableInModuleTest
406 @@class_variable = "value"
407 class << self
408 def class_variable
409 @@class_variable
410 end
411 end
412 end
413
414 assert_equal("value", ClassVariableInModuleTest.class_variable)
415end
416
417assert('child class/module defined in singleton class get parent constant') do
418 actual = module GetParentConstantTest
419 EXPECT = "value"
420 class << self
421 class CHILD
422 class << self
423 EXPECT
424 end
425 end
426 end
427 end
428 assert_equal("value", actual)
429end
430
431assert('overriding class variable with a module (#3235)') do
432 module ModuleWithCVar
433 @@class_variable = 1
434 end
435 class CVarOverrideTest
436 @@class_variable = 2
437 include ModuleWithCVar
438
439 assert_equal(1, @@class_variable)
440 end
441end
442
443assert('class variable for frozen class/module') do
444 module CVarForFrozenModule
445 freeze
446 assert_raise(FrozenError) { @@cv = 1 }
447 end
448
449 class CVarForFrozenClassA
450 @@a = nil
451 freeze
452 end
453 class CVarForFrozenClassB < CVarForFrozenClassA
454 def a=(v)
455 @@a = v
456 end
457 end
458 b = CVarForFrozenClassB.new
459 assert_raise(FrozenError) { b.a = 1 }
460end
461
462assert('class with non-class/module outer raises TypeError') do
463 assert_raise(TypeError) { class 0::C1; end }
464 assert_raise(TypeError) { class []::C2; end }
465end
Note: See TracBrowser for help on using the repository browser.