require 'yarvtest/yarvtest' # test of basic instruction class TestBIN < YarvTestBase def test_literal ae %q(true) ae %q(false) ae %q(nil) ae %q(1234) ae %q(:sym) ae %q(123456789012345678901234567890) ae %q(1.234) ae %q(0x12) ae %q(0b0101001) ae %q(1_2_3) # 123 end def test_self ae %q(self) end def test_string ae %q('str') end def test_dstring ae %q( "1+1 = #{1+1}" ) ae %q{ i = 10 "#{i} ** #{i} = #{i ** i}" } ae %q{ s = "str" s.__id__ == "#{s}".__id__ } end def test_dsym ae %q{ :"a#{1+2}c" } end def test_xstr ae %q(`echo hoge`) ae %q(hoge = 'huga'; `echo #{hoge}`) end def test_regexp ae %q{ /test/ =~ 'test' } ae %q{ /test/ =~ 'tes' } ae %q{ r = /test/; l = 'test' r =~ l } ae %q{ r = /testx/; l = 'test' r =~ l } ae %q{ i = 10 /test#{i}/ =~ 'test10' } ae %q{ i = 10 /test#{i}/ =~ 'test20' } ae %q{ :sym =~ /sym/ } ae %q{ sym = :sym sym =~ /sym/ } ae %q{ reg = /sym/ :sym =~ reg } end def test_array ae %q([]) ae %q([1,2,3]) ae %q([1+1,2+2,3+3]) ae %q([0][0]+=3) ae %q([0][0]-=3) end def test_array_access ae %q(ary = [1,2,3]; ary[1]) ae %q(ary = [1,2,3]; ary[1] = 10) ae %q(ary = Array.new(10, 100); ary[3]) end def test_hash ae %q({}) ae %q({1 => 2}) ae %q({"str" => "val", "str2" => "valval"}) ae %q({1 => 2, 1=>3}) end def test_range ae %q((1..2)) ae %q((1...2)) ae %q(((1+1)..(2+2))) ae %q(((1+1)...(2+2))) end def test_not ae %q(!true) ae %q(!nil) ae %q(!false) ae %q(!(1+1)) ae %q(!!nil) ae %q(!!1) end # var def test_local ae %q(a = 1) ae %q(a = 1; b = 2; a) ae %q(a = b = 3) ae %q(a = b = 3; a) ae %q(a = b = c = 4) ae %q(a = b = c = 4; c) end def test_constant ae %q(C = 1; C) ae %q(C = 1; $a = []; 2.times{$a << ::C}; $a) ae %q( class A class B class C Const = 1 end end end (1..2).map{ A::B::C::Const } ) do remove_const :A end ae %q( class A class B Const = 1 class C (1..2).map{ Const } end end end ) do remove_const :A end ae %q( class A Const = 1 class B class C (1..2).map{ Const } end end end ) do remove_const :A end ae %q( Const = 1 class A class B class C (1..2).map{ Const } end end end ) do remove_const :A remove_const :Const end ae %q{ C = 1 begin C::D rescue TypeError :ok else :ng end } end def test_constant2 ae %q{ class A class B C = 10 end end i = 0 while i<3 i+=1 r = A::B::C end r } do remove_const :A end ae %q{ class A class B C = 10 end end i = 0 while i<3 i+=1 r = A::B::C class A::B remove_const :C end A::B::C = i**i end r } do remove_const :A end ae %q{ class C Const = 1 (1..3).map{ self::Const } end } ae %q{ class C Const = 1 (1..3).map{ eval('self')::Const } end } ae %q{ class C Const = 0 def self.foo() self::Const end end class D < C Const = 1 end class E < C Const = 2 end [C.foo, D.foo, E.foo] } end def test_gvar ae %q( $g1 = 1 ) ae %q( $g2 = 2 $g2 ) end def test_cvar ae %q{ class C @@c = 1 def m @@c += 1 end end C.new.m } do remove_const :C end end def test_cvar_from_singleton ae %q{ class C @@c=1 class << self def m @@c += 1 end end end C.m } do remove_const :C end end def test_cvar_from_singleton2 ae %q{ class C @@c = 1 def self.m @@c += 1 end end C.m } do remove_const :C end end def test_op_asgin2 ae %q{ class C attr_accessor :a end r = [] o = C.new o.a &&= 1 r << o.a o.a ||= 2 r << o.a o.a &&= 3 r << o.a r } do remove_const :C end ae %q{ @@x ||= 1 } ae %q{ @@x = 0 @@x ||= 1 } end def test_op_assgin_and_or ae %q{ r = [] a = 1 ; a ||= 2; r << a a = nil; a ||= 2; r << a a = 1 ; a &&= 2; r << a a = nil; a &&= 2; r << a r } ae %q{ a = {} a[0] ||= 1 } ae %q{ a = {} a[0] &&= 1 } ae %q{ a = {0 => 10} a[0] ||= 1 } ae %q{ a = {0 => 10} a[0] &&= 1 } end def test_backref ae %q{ /a(b)(c)d/ =~ 'xyzabcdefgabcdefg' [$1, $2, $3, $~.class, $&, $`, $', $+] } ae %q{ def m /a(b)(c)d/ =~ 'xyzabcdefgabcdefg' [$1, $2, $3, $~.class, $&, $`, $', $+] end m } end def test_fact ae %q{ def fact(n) if(n > 1) n * fact(n-1) else 1 end end fact(300) } end def test_mul ae %q{ 2*0 } ae %q{ 0*2 } ae %q{ 2*2 } end def test_div ae %q{ 3/2 } ae %q{ 3.0/2.0 } ae %q{ class C def /(a) a * 100 end end C.new/3 } do remove_const :C end end def test_length ae %q{ [].length } ae %q{ [1, 2].length } ae %q{ {}.length } ae %q{ {:a => 1, :b => 2}.length } ae %q{ class C def length 'hoge' end end C.new.length } do remove_const :C end end def test_mod ae %q{ 3%2 } ae %q{ 3.0%2.0 } ae %q{ class C def % (a) a * 100 end end C.new%3 } do remove_const :C end end def test_attr_set ae %q{ o = Object.new def o.[]=(*args) args end [o[]=:x, o[0]=:x, o[0, 1]=:x, o[0, 1, 2]=:x] } ae %q{ o = Object.new def o.foo=(*args) args end o.foo = :x } ae %q{ $r = [] class C def [](*args) $r << [:ref, args] args.size end def []=(*args) $r << [:set, args] args.size end end o = C.new ary = [:x, :y] o[1] = 2 o[1, 2] = 3 o[1, 2, *ary] = 3 o[1, 2, *ary, 3] = 4 $r } end def test_aref_aset ae %q{ a = [] a << 0 a[1] = 1 a[2] = 2 a[3] = a[1] + a[2] } ae %q{ a = {} a[1] = 1 a[2] = 2 a[3] = a[1] + a[2] a.sort } ae %q{ class C attr_reader :a, :b def [](a) @a = a end def []=(a, b) @b = [a, b] end end c = C.new c[3] c[4] = 5 [c.a, c.b] } do remove_const :C end end def test_array_concat ae %q{ ary = [] [:x, *ary] } #ae %q{ # ary = 1 # [:x, *ary] #} ae %q{ ary = [1, 2] [:x, *ary] } end end