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