Permalink
Switch branches/tags
Find file
Fetching contributors…
Cannot retrieve contributors at this time
469 lines (406 sloc) 7.83 KB
assert('__FILE__') do
file = __FILE__[-9, 9]
assert_equal 'syntax.rb', file
end
assert('__LINE__') do
assert_equal 7, __LINE__
end
assert('super', '11.3.4') do
assert_raise NoMethodError do
super
end
class SuperFoo
def foo
true
end
def bar(*a)
a
end
end
class SuperBar < SuperFoo
def foo
super
end
def bar(*a)
super(*a)
end
end
bar = SuperBar.new
assert_true bar.foo
assert_equal [1,2,3], bar.bar(1,2,3)
end
assert('yield', '11.3.5') do
assert_raise LocalJumpError do
yield
end
assert_raise LocalJumpError do
o = Object.new
def o.foo
yield
end
o.foo
end
end
assert('redo in a for loop (#3275)') do
sum = 0
for i in 1..10
sum += i
i -= 1
if i > 0
redo
end
end
assert_equal 220, sum
end
assert('Abbreviated variable assignment', '11.4.2.3.2') do
a ||= 1
b &&= 1
c = 1
c += 2
assert_equal 1, a
assert_nil b
assert_equal 3, c
end
assert('case expression', '11.5.2.2.4') do
# case-expression-with-expression, one when-clause
x = 0
case "a"
when "a"
x = 1
end
assert_equal 1, x
# case-expression-with-expression, multiple when-clauses
x = 0
case "b"
when "a"
x = 1
when "b"
x = 2
end
assert_equal 2, x
# no matching when-clause
x = 0
case "c"
when "a"
x = 1
when "b"
x = 2
end
assert_equal 0, x
# case-expression-with-expression, one when-clause and one else-clause
a = 0
case "c"
when "a"
x = 1
else
x = 3
end
assert_equal 3, x
# case-expression-without-expression, one when-clause
x = 0
case
when true
x = 1
end
assert_equal 1, x
# case-expression-without-expression, multiple when-clauses
x = 0
case
when 0 == 1
x = 1
when 1 == 1
x = 2
end
assert_equal 2, x
# case-expression-without-expression, one when-clause and one else-clause
x = 0
case
when 0 == 1
x = 1
else
x = 3
end
assert_equal 3, x
# multiple when-arguments
x = 0
case 4
when 1, 3, 5
x = 1
when 2, 4, 6
x = 2
end
assert_equal 2, x
# when-argument with splatting argument
x = :integer
odds = [ 1, 3, 5, 7, 9 ]
evens = [ 2, 4, 6, 8 ]
case 5
when *odds
x = :odd
when *evens
x = :even
end
assert_equal :odd, x
true
end
assert('Nested const reference') do
module Syntax4Const
CONST1 = "hello world"
class Const2
def const1
CONST1
end
end
end
assert_equal "hello world", Syntax4Const::CONST1
assert_equal "hello world", Syntax4Const::Const2.new.const1
end
assert('Abbreviated variable assignment as returns') do
module Syntax4AbbrVarAsgnAsReturns
class A
def b
@c ||= 1
end
end
end
assert_equal 1, Syntax4AbbrVarAsgnAsReturns::A.new.b
end
assert('Splat and multiple assignment') do
*a = *[1,2,3]
b, *c = *[7,8,9]
assert_equal [1,2,3], a
assert_equal 7, b
assert_equal [8,9], c
(a, b), c = [1,2],3
assert_equal [1,2,3], [a,b,c]
(a, b), c = 1,2,3
assert_equal [1,nil,2], [a,b,c]
end
assert('Splat and multiple assignment from variable') do
a = [1, 2, 3]
b, *c = a
assert_equal 1, b
assert_equal [2, 3], c
end
assert('Splat and multiple assignment from variables') do
a = [1, 2, 3]
b = [4, 5, 6, 7]
c, d, *e, f, g = *a, *b
assert_equal 1, c
assert_equal 2, d
assert_equal [3, 4, 5], e
assert_equal 6, f
assert_equal 7, g
end
assert('Splat and multiple assignment in for') do
a = [1, 2, 3, 4, 5, 6, 7]
for b, c, *d, e, f in [a] do
end
assert_equal 1, b
assert_equal 2, c
assert_equal [3, 4, 5], d
assert_equal 6, e
assert_equal 7, f
end
assert('Splat without assignment') do
* = [0]
a, * = [1, 2]
assert_equal 1, a
end
assert('multiple assignment (rest)') do
*a = 0
assert_equal [0], a
end
assert('multiple assignment (rest+post)') do
*a, b = 0, 1, 2
*c, d = 3
assert_equal [0, 1], a
assert_equal 2, b
assert_equal [], c
assert_equal 3, d
end
assert('multiple assignment (nosplat array rhs)') do
a, *b = []
*c, d = [0]
e, *f, g = [1, 2]
assert_nil a
assert_equal [], b
assert_equal [], c
assert_equal 0, d
assert_equal 1, e
assert_equal [], f
assert_equal 2, g
end
assert('multiple assignment (empty array rhs #3236, #3239)') do
a,b,*c = []; assert_equal [nil, nil, []], [a, b, c]
a,b,*c = [1]; assert_equal [1, nil, []], [a, b, c]
a,b,*c = [nil]; assert_equal [nil,nil, []], [a, b, c]
a,b,*c = [[]]; assert_equal [[], nil, []], [a, b, c]
end
assert('Return values of case statements') do
a = [] << case 1
when 3 then 2
when 2 then 2
when 1 then 2
end
b = [] << case 1
when 2 then 2
else
end
def fb
n = 0
Proc.new do
n += 1
case
when n % 15 == 0
else n
end
end
end
assert_equal [2], a
assert_equal [nil], b
assert_equal 1, fb.call
end
assert('Return values of if and case statements') do
true_clause_value =
if true
1
else
case 2
when 3
end
4
end
assert_equal 1, true_clause_value
end
assert('Return values of no expression case statement') do
when_value =
case
when true
1
end
assert_equal 1, when_value
end
assert('splat object in assignment') do
o = Object.new
def o.to_a
nil
end
assert_equal [o], (a = *o)
def o.to_a
1
end
assert_raise(TypeError) { a = *o }
def o.to_a
[2]
end
assert_equal [2], (a = *o)
end
assert('splat object in case statement') do
o = Object.new
def o.to_a
nil
end
a = case o
when *o
1
end
assert_equal 1, a
end
assert('splat in case statement') do
values = [3,5,1,7,8]
testa = [1,2,7]
testb = [5,6]
resulta = []
resultb = []
resultc = []
values.each do |value|
case value
when *testa
resulta << value
when *testb
resultb << value
else
resultc << value
end
end
assert_equal [1,7], resulta
assert_equal [5], resultb
assert_equal [3,8], resultc
end
assert('External command execution.') do
module Kernel
sym = '`'.to_sym
alias_method :old_cmd, sym
results = []
define_method(sym) do |str|
results.push str
str
end
`test` # NOVAL NODE_XSTR
`test dynamic #{sym}` # NOVAL NODE_DXSTR
assert_equal ['test', 'test dynamic `'], results
t = `test` # VAL NODE_XSTR
assert_equal 'test', t
assert_equal ['test', 'test dynamic `', 'test'], results
t = `test dynamic #{sym}` # VAL NODE_DXSTR
assert_equal 'test dynamic `', t
assert_equal ['test', 'test dynamic `', 'test', 'test dynamic `'], results
alias_method sym, :old_cmd
end
true
end
assert('parenthesed do-block in cmdarg') do
class ParenDoBlockCmdArg
def test(block)
block.call
end
end
x = ParenDoBlockCmdArg.new
result = x.test (Proc.new do :ok; end)
assert_equal :ok, result
end
assert('method definition in cmdarg') do
if false
bar def foo; self.each do end end
end
true
end
assert('optional argument in the rhs default expressions') do
class OptArgInRHS
def foo
"method called"
end
def t(foo = foo)
foo
end
def t2(foo = foo())
foo
end
end
o = OptArgInRHS.new
assert_nil(o.t)
assert_equal("method called", o.t2)
end
assert('optional block argument in the rhs default expressions') do
assert_nil(Proc.new {|foo = foo| foo}.call)
end
assert('multiline comments work correctly') do
=begin
this is a comment with nothing after begin and end
=end
=begin this is a comment
this is a comment with extra after =begin
=end
=begin
this is a comment that has =end with spaces after it
=end
=begin this is a comment
this is a comment that has extra after =begin and =end with spaces after it
=end
line = __LINE__
=begin this is a comment
this is a comment that has extra after =begin and =end with tabs after it
=end xxxxxxxxxxxxxxxxxxxxxxxxxx
assert_equal(line + 4, __LINE__)
end