summaryrefslogtreecommitdiffstats
path: root/web/server/h2o/libh2o/deps/mruby/test/t/syntax.rb
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--web/server/h2o/libh2o/deps/mruby/test/t/syntax.rb468
1 files changed, 468 insertions, 0 deletions
diff --git a/web/server/h2o/libh2o/deps/mruby/test/t/syntax.rb b/web/server/h2o/libh2o/deps/mruby/test/t/syntax.rb
new file mode 100644
index 00000000..29939455
--- /dev/null
+++ b/web/server/h2o/libh2o/deps/mruby/test/t/syntax.rb
@@ -0,0 +1,468 @@
+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