* 2022-01-18 [ci skip]
[ruby-80x24.org.git] / test / ruby / test_primitive.rb
blobf1db934000dc23ee5031786bb01d04097af8b4a9
1 # frozen_string_literal: false
2 require 'test/unit'
4 class TestRubyPrimitive < Test::Unit::TestCase
6   def test_not
7     assert_equal false, !true
8     assert_equal true, !false
9     assert_equal true, !nil
10     assert_equal false, !(1+1)
11     assert_equal false, !!nil
12     assert_equal true, !!1
13   end
15   def test_lvar
16     a = 1
17     assert_equal 1, a
18     b = 2
19     assert_equal 1, a
20     a = b = 3
21     assert_equal 3, a
22     assert_equal 3, b
23     a = b = c = 4
24     assert_equal 4, a
25     assert_equal 4, b
26     assert_equal 4, c
27   end
29   C_Setup = -> do
30     remove_const :C if defined? ::TestRubyPrimitive::C
31     remove_const :A if defined? ::TestRubyPrimitive::A
33     C = 1
34     class A
35       Const = 1
36       class B
37         Const = 2
38         class C
39           Const = 3
40           def const
41             Const
42           end
43         end
44       end
45     end
46     (1..2).map {
47       A::B::C::Const
48     }
49   end
51   def test_constant
52     C_Setup.call
54     assert_equal 1, C
55     assert_equal 1, C
56     assert_equal 1, A::Const
57     assert_equal 2, A::B::Const
58     assert_equal 3, A::B::C::Const
59     assert_equal 3, A::B::C.new.const
60     assert_equal 1, ::TestRubyPrimitive::A::Const
61     A::B::C.send(:remove_const, :Const)
62     assert_equal 2, A::B::C.new.const
63     assert_raise(TypeError) {
64       C::CONST
65     }
66   end
68   class A2
69     class B2
70       class C2
71         C = 7
72       end
73     end
74   end
76   def test_constant_cache
77     i = 0
78     while i < 3
79       r = A2::B2::C2::C
80       i += 1
81     end
82     assert_equal 7, r
83   end
85   class A3
86     class B3
87       C = 99
88     end
89   end
90   i = 0
91   while i < 3
92     r = r = A3::B3::C   # cache
93     class A3::B3
94       remove_const :C
95     end
96     A3::B3::C = i ** i
97     i += 1
98   end
100   def test_constant_cache2
101     assert_equal 4, A3::B3::C
102   end
104   class A4
105     Const = 7
106     (1..3).map {
107       $test_ruby_primitive_constant_cache3 = self::Const
108     }
109   end
111   def test_constant_cache3
112     assert_equal 7, $test_ruby_primitive_constant_cache3
113   end
115   class A5
116     Const = 8
117     (1..3).map {
118       $test_ruby_primitive_constant_cache4 = eval('self')::Const
119     }
120   end
122   def test_constatant_cache4
123     assert_equal 8, $test_ruby_primitive_constant_cache4
124   end
126   class A6
127     Const = 0
128     def self.foo
129       self::Const
130     end
131   end
132   class B6 < A6
133     Const = 1
134   end
135   class C6 < B6
136     Const = 2
137   end
138   $test_ruby_primitive_constant_cache5 = [A6.foo, B6.foo, C6.foo]
140   def test_constant_cache5
141     assert_equal [0, 1, 2], $test_ruby_primitive_constant_cache5
142   end
144   def test_gvar
145     $test_ruby_primitive_gvar = 7
146     assert_equal 7, $test_ruby_primitive_gvar
147     assert_equal 7, $test_ruby_primitive_gvar
148     $test_ruby_primitive_gvar = 88
149     assert_equal 88, $test_ruby_primitive_gvar
150     assert_equal 88, $test_ruby_primitive_gvar
151     assert_equal 7, ($test_ruby_primitive_gvar = 7)
152     assert_equal 7, ($test_ruby_primitive_gvar = 7)
153   end
155   A7_Setup = -> do
156     remove_const :A7 if defined? TestRubyPrimitive::A7
158     class A7
159       @@c = 1
160       def m
161         @@c += 1
162       end
163     end
164   end
166   def test_cvar_from_instance_method
167     A7_Setup.call
169     assert_equal 2, A7.new.m
170     assert_equal 3, A7.new.m
171     assert_equal 4, A7.new.m
172   end
174   A8_Setup = -> do
175     remove_const :A8 if defined? TestRubyPrimitive::A8
177     class A8
178       @@c = 1
179       class << self
180         def m
181           @@c += 1
182         end
183       end
184     end
185   end
187   def test_cvar_from_singleton_method
188     A8_Setup.call
190     assert_equal 2, A8.m
191     assert_equal 3, A8.m
192     assert_equal 4, A8.m
193   end
195   A9_Setup = -> do
196     remove_const :A8 if defined? TestRubyPrimitive::A8
198     class A9
199       @@c = 1
200       def self.m
201         @@c += 1
202       end
203     end
204   end
206   def test_cvar_from_singleton_method2
207     A9_Setup.call
209     assert_equal 2, A9.m
210     assert_equal 3, A9.m
211     assert_equal 4, A9.m
212   end
214   class A10
215     attr_accessor :a
216   end
218   def test_opassign
219     i = 0
220     i += 1
221     assert_equal 1, i
223     @iv = 2
224     @iv += 2
225     assert_equal 4, @iv
227     # init @@cv
228     @@cv = nil
230     @@cv ||= 1
231     assert_equal 1, @@cv
232     @@cv &&= 2
233     assert_equal 2, @@cv
234     @@cv ||= 99
235     assert_equal 2, @@cv
237     $gv = 3
238     $gv += 4
239     assert_equal 7, $gv
241     obj = A10.new
242     obj.a = 9
243     obj.a &&= 7
244     assert_equal 7, obj.a
246     obj.a = nil
247     obj.a ||= 2
248     assert_equal 2, obj.a
250     obj.a &&= 3
251     assert_equal 3, obj.a
253     a = []
254     a[0] ||= 3
255     assert_equal 3, a[0]
256     a[0] &&= 7
257     assert_equal 7, a[0]
258     a[0] ||= 3
259     assert_equal 7, a[0]
261     a = [0, 1, nil, 3, 4]
262     a[*[2]] ||= :foo
263     assert_equal [0, 1, :foo, 3, 4], a
264     a[*[1,3]] &&= [:bar]
265     assert_equal [0, :bar, 4], a
266   end
268   def test_opassign_and_or
269     a = 1
270     a ||= 2
271     assert_equal 1, a
272     a = nil
273     a ||= 2
274     assert_equal 2, a
275     a = 1
276     a &&= 3
277     assert_equal 3, a
278     a = nil
279     a &&= 4
280     assert_nil a
282     h = {}
283     h[0] ||= 1
284     assert_equal 1, h[0]
285     h = {}
286     h[0] &&= 1
287     assert_nil h[0]
288     h = {0 => 7}
289     h[0] ||= 1
290     assert_equal 7, h[0]
291     h = {0 => 7}
292     h[0] &&= 1
293     assert_equal 1, h[0]
294   end
296   def test_backref
297     /a(b)(c)d/ =~ 'xyzabcdefgabcdefg'
298     assert_equal 'b', $1
299     assert_equal 'c', $2
300     assert_nil $3
301     assert_instance_of MatchData, $~
302     assert_equal 'abcd', $&
303     assert_equal 'xyz', $`
304     assert_equal 'efgabcdefg', $'
305     assert_equal 'c', $+
307     /(?!)/ =~ 'xyzabcdefgabcdefg'
308     assert_nil $1
309     assert_nil $2
310     assert_nil $3
311     assert_nil $~
312     assert_nil $&
313     assert_nil $`
314     assert_nil $'
315     assert_nil $+
316   end
318   def test_fact
319     assert_equal 306057512216440636035370461297268629388588804173576999416776741259476533176716867465515291422477573349939147888701726368864263907759003154226842927906974559841225476930271954604008012215776252176854255965356903506788725264321896264299365204576448830388909753943489625436053225980776521270822437639449120128678675368305712293681943649956460498166450227716500185176546469340112226034729724066333258583506870150169794168850353752137554910289126407157154830282284937952636580145235233156936482233436799254594095276820608062232812387383880817049600000000000000000000000000000000000000000000000000000000000000000000000000, fact(300)
320   end
322   def fact(n)
323     if n > 1
324       n * fact(n - 1)
325     else
326       1
327     end
328   end
330   def test_mul
331     assert_equal 0, 2 * 0
332     assert_equal 0, 0 * 2
333     assert_equal 4, 2 * 2
334   end
336   class MyNum
337     def /(a)
338       a * 100
339     end
340   end
342   def test_div
343     assert_equal 1, 3 / 2
344     assert_equal 1.5, 3.0 / 2.0
345     assert_equal 300, MyNum.new / 3
346   end
348   class MyArr
349     def length
350       'string'
351     end
352   end
354   def test_length
355     assert_equal 0, [].length
356     assert_equal 1, [1].length
357     assert_equal 2, [1,2].length
358     assert_equal 0, {}.length
359     assert_equal 1, {1=>1}.length
360     assert_equal 2, {1=>1, 2=>2}.length
361     assert_equal 'string', MyArr.new.length
362   end
364   class MyNum2
365     def %(a)
366       a * 100
367     end
368   end
370   def test_mod
371     assert_equal 2, 5 % 3
372     assert_equal 1.0, 3.0 % 2.0
373     assert_equal 300, MyNum2.new % 3
374   end
376   class MyObj
377     def [](*args)
378       args
379     end
381     def []=(*args)
382       args
383     end
384   end
386   def test_aref
387     a = [0,1]
388     assert_equal 0, a[0]
389     assert_equal 1, a[1]
390     assert_nil a[2]
391     h = {0=>0, 1=>1}
392     obj = MyObj.new
393     assert_equal 0, h[0]
394     assert_equal 1, h[1]
395     assert_nil h[2]
396     assert_equal [0], obj[0]
397     assert_equal [0,1], obj[0,1]
398     assert_equal [0,1,2], obj[0,1,2]
399   end
401   def test_aset
402     obj = MyObj.new
403     assert_equal 7, (obj[0] = 7)
404     assert_equal 7, (obj[0,1] = 7)
405     assert_equal 7, (obj[0,1,2] = 7)
406   end
408   class MyObj2
409     def attr=(*args)
410       args
411     end
412   end
414   def test_attr_setter
415     obj = MyObj2.new
416     assert_equal 1, (obj.attr = 1)
417   end
419   def test_list_expand
420     a = []
421     assert_equal [0], [0, *a]
422     a = [1]
423     assert_equal [0,1], [0, *a]
424     a = [1,2]
425     assert_equal [0,1,2], [0, *a]
426     a = [1,2,3]
427     assert_equal [0,1,2,3], [0, *a]
428     #a = [1,2,3]
429     #assert_equal [0,1,2,3,4], [0, *a, 4]
430   end
432   def test_concatarray_ruby_dev_41933
433     bug3658 = '[ruby-dev:41933]'
434     [0, *x=1]
435     assert_equal(1, x, bug3658)
436     [0, *x=1, 2]
437     assert_equal(1, x, bug3658)
438     class << (x = Object.new)
439       attr_accessor :to_a_called
440       def to_a
441         @to_a_called = true
442         [self]
443       end
444     end
445     x.to_a_called = false
446     [0, *x]
447     assert_predicate(x, :to_a_called, bug3658)
448     x.to_a_called = false
449     [0, *x, 2]
450     assert_predicate(x, :to_a_called, bug3658)
451   end