diff options
Diffstat (limited to 'yarvtest/test_bin.rb')
-rw-r--r-- | yarvtest/test_bin.rb | 585 |
1 files changed, 585 insertions, 0 deletions
diff --git a/yarvtest/test_bin.rb b/yarvtest/test_bin.rb new file mode 100644 index 0000000000..5f587b5a8c --- /dev/null +++ b/yarvtest/test_bin.rb @@ -0,0 +1,585 @@ +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 + |