зеркало из https://github.com/github/ruby.git
586 строки
8.0 KiB
Ruby
586 строки
8.0 KiB
Ruby
|
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
|
||
|
|