summaryrefslogtreecommitdiff
path: root/test/ruby/test_parse.rb
diff options
context:
space:
mode:
Diffstat (limited to 'test/ruby/test_parse.rb')
-rw-r--r--test/ruby/test_parse.rb523
1 files changed, 228 insertions, 295 deletions
diff --git a/test/ruby/test_parse.rb b/test/ruby/test_parse.rb
index 1e909bce1b..b725634a38 100644
--- a/test/ruby/test_parse.rb
+++ b/test/ruby/test_parse.rb
@@ -13,24 +13,21 @@ class TestParse < Test::Unit::TestCase
$VERBOSE = @verbose
end
- def test_error_line
- assert_syntax_error('------,,', /\n\z/, 'Message to pipe should end with a newline')
- end
-
def test_else_without_rescue
- assert_syntax_error(<<-END, %r":#{__LINE__+2}: else without rescue"o, [__FILE__, __LINE__+1])
+ x = eval <<-END, nil, __FILE__, __LINE__+1
begin
else
42
end
END
+ assert_equal(42, x)
end
def test_alias_backref
- assert_syntax_error("#{<<~"begin;"}\n#{<<~'end;'}", /can't make alias/) do
- begin;
+ assert_raise(SyntaxError) do
+ eval <<-END, nil, __FILE__, __LINE__+1
alias $foo $1
- end;
+ END
end
end
@@ -85,10 +82,10 @@ class TestParse < Test::Unit::TestCase
assert_equal([42, 42], [o.Foo, o.Bar])
assert_equal([42, 42], [o::baz, o::qux])
- assert_syntax_error("#{<<~"begin;"}\n#{<<~'end;'}", /Can't set variable/) do
- begin;
+ assert_raise(SyntaxError) do
+ eval <<-END, nil, __FILE__, __LINE__+1
$1 ||= t.foo 42
- end;
+ END
end
def t.bar(x); x + yield; end
@@ -153,65 +150,67 @@ class TestParse < Test::Unit::TestCase
end
def test_dynamic_constant_assignment
- assert_syntax_error("#{<<~"begin;"}\n#{<<~'end;'}", /dynamic constant/) do
- begin;
+ assert_raise(SyntaxError) do
+ Object.new.instance_eval <<-END, __FILE__, __LINE__+1
def foo
self::FOO, self::BAR = 1, 2
::FOO, ::BAR = 1, 2
end
- end;
+ END
end
- assert_syntax_error("#{<<~"begin;"}\n#{<<~'end;'}", /Can't set variable/) do
- begin;
+ assert_raise(SyntaxError) do
+ eval <<-END, nil, __FILE__, __LINE__+1
$1, $2 = 1, 2
- end;
+ END
end
- assert_syntax_error("#{<<~"begin;"}\n#{<<~'end;'}", /dynamic constant/) do
- begin;
+ assert_raise(SyntaxError) do
+ Object.new.instance_eval <<-END, __FILE__, __LINE__+1
def foo
::FOO = 1
end
- end;
+ END
end
c = Class.new
c.freeze
- assert_valid_syntax("#{<<~"begin;"}\n#{<<~'end;'}") do
- begin;
+ assert_nothing_raised(SyntaxError) do
+ eval <<-END, nil, __FILE__, __LINE__+1
+ if false
c::FOO &= 1
::FOO &= 1
- end;
+ end
+ END
end
- assert_syntax_error("#{<<~"begin;"}\n#{<<~'end;'}", /Can't set variable/) do
- begin;
+ assert_raise(SyntaxError) do
+ eval <<-END, nil, __FILE__, __LINE__+1
$1 &= 1
- end;
+ END
end
end
def test_class_module
- assert_syntax_error("#{<<~"begin;"}\n#{<<~'end;'}", /must be CONSTANT/) do
- begin;
+ assert_raise(SyntaxError) do
+ eval <<-END, nil, __FILE__, __LINE__+1
class foo; end
- end;
+ END
end
- assert_syntax_error("#{<<~"begin;"}\n#{<<~'end;'}", /in method body/) do
- begin;
+ assert_raise(SyntaxError) do
+ eval <<-END, nil, __FILE__, __LINE__+1
def foo
class Foo; end
module Bar; end
end
- end;
+ END
end
- assert_valid_syntax("#{<<~"begin;"}\n#{<<~'end;'}") do
- begin;
+ assert_nothing_raised(SyntaxError) do
+ eval <<-END, nil, __FILE__, __LINE__+1
class Foo 1; end
- end;
+ END
end
end
@@ -271,34 +270,37 @@ class TestParse < Test::Unit::TestCase
end
def test_bad_arg
- assert_syntax_error("#{<<~"begin;"}\n#{<<~'end;'}", /cannot be a constant/) do
- begin;
+ assert_raise(SyntaxError) do
+ eval <<-END, nil, __FILE__, __LINE__+1
def foo(FOO); end
- end;
+ END
end
- assert_syntax_error("#{<<~"begin;"}\n#{<<~'end;'}", /cannot be an instance variable/) do
- begin;
+ assert_raise(SyntaxError) do
+ eval <<-END, nil, __FILE__, __LINE__+1
def foo(@foo); end
- end;
+ END
end
- assert_syntax_error("#{<<~"begin;"}\n#{<<~'end;'}", /cannot be a global variable/) do
- begin;
+ assert_raise(SyntaxError) do
+ eval <<-END, nil, __FILE__, __LINE__+1
def foo($foo); end
- end;
+ END
end
- assert_syntax_error("#{<<~"begin;"}\n#{<<~'end;'}", /cannot be a class variable/) do
- begin;
+ assert_raise(SyntaxError) do
+ eval <<-END, nil, __FILE__, __LINE__+1
def foo(@@foo); end
- end;
+ END
end
- assert_syntax_error("#{<<~"begin;"}\n#{<<~'end;'}", /cannot be an instance variable/) do
- begin;
- o.foo {|; @a| @a = 42 }
- end;
+ o = Object.new
+ def o.foo(*r); yield(*r); end
+
+ assert_raise(SyntaxError) do
+ eval <<-END, nil, __FILE__, __LINE__+1
+ o.foo 1 {|; @a| @a = 42 }
+ END
end
end
@@ -350,7 +352,6 @@ class TestParse < Test::Unit::TestCase
def test_words
assert_equal([], %W( ))
- assert_syntax_error('%w[abc', /unterminated list/)
end
def test_dstr
@@ -358,12 +359,11 @@ class TestParse < Test::Unit::TestCase
assert_equal("foo 1 bar", "foo #@@foo bar")
"1" =~ /(.)/
assert_equal("foo 1 bar", "foo #$1 bar")
- assert_equal('foo #@1 bar', eval('"foo #@1 bar"'))
end
def test_dstr_disallowed_variable
bug8375 = '[ruby-core:54885] [Bug #8375]'
- %w[@ @. @@ @@1 @@. $ $%].each do |src|
+ %w[@ @1 @. @@ @@1 @@. $ $%].each do |src|
src = '#'+src+' '
str = assert_nothing_raised(SyntaxError, "#{bug8375} #{src.dump}") do
break eval('"'+src+'"')
@@ -376,25 +376,23 @@ class TestParse < Test::Unit::TestCase
assert_nothing_raised { eval(':""') }
end
- def assert_disallowed_variable(type, noname, invalid)
- noname.each do |name|
- assert_syntax_error("proc{a = #{name} }", "`#{noname[0]}' without identifiers is not allowed as #{type} variable name")
- end
+ def assert_disallowed_variable(type, noname, *invalid)
+ assert_syntax_error(noname, "`#{noname}' without identifiers is not allowed as #{type} variable name")
invalid.each do |name|
- assert_syntax_error("proc {a = #{name} }", "`#{name}' is not allowed as #{type} variable name")
+ assert_syntax_error(name, "`#{name}' is not allowed as #{type} variable name")
end
end
def test_disallowed_instance_variable
- assert_disallowed_variable("an instance", %w[@ @.], %w[])
+ assert_disallowed_variable("an instance", *%w[@ @1 @.])
end
def test_disallowed_class_variable
- assert_disallowed_variable("a class", %w[@@ @@.], %w[@@1])
+ assert_disallowed_variable("a class", *%w[@@ @@1 @@.])
end
def test_disallowed_gloal_variable
- assert_disallowed_variable("a global", %w[$], %w[$%])
+ assert_disallowed_variable("a global", *%w[$ $%])
end
def test_arg2
@@ -432,56 +430,31 @@ class TestParse < Test::Unit::TestCase
end
def test_duplicate_argument
- assert_syntax_error("#{<<~"begin;"}\n#{<<~'end;'}", '') do
- begin;
+ assert_raise(SyntaxError) do
+ eval <<-END, nil, __FILE__, __LINE__+1
1.times {|&b?| }
- end;
+ END
end
- assert_syntax_error("#{<<~"begin;"}\n#{<<~'end;'}", /duplicated argument/) do
- begin;
+ assert_raise(SyntaxError) do
+ eval <<-END, nil, __FILE__, __LINE__+1
1.times {|a, a|}
- end;
+ END
end
- assert_syntax_error("#{<<~"begin;"}\n#{<<~'end;'}", /duplicated argument/) do
- begin;
+ assert_raise(SyntaxError) do
+ eval <<-END, nil, __FILE__, __LINE__+1
def foo(a, a); end
- end;
+ END
end
end
def test_define_singleton_error
- assert_syntax_error("#{<<~"begin;"}\n#{<<~'end;'}", /singleton method for literals/) do
- begin;
+ assert_raise(SyntaxError) do
+ eval <<-END, nil, __FILE__, __LINE__+1
def ("foo").foo; end
- end;
- end
- end
-
- def test_op_asgn1_with_block
- t = Object.new
- a = []
- blk = proc {|x| a << x }
- def t.[](_)
- yield(:aref)
- nil
- end
- def t.[]=(_, _)
- yield(:aset)
- end
- def t.dummy(_)
+ END
end
- eval <<-END, nil, __FILE__, __LINE__+1
- t[42, &blk] ||= 42
- END
- assert_equal([:aref, :aset], a)
- a.clear
- eval <<-END, nil, __FILE__, __LINE__+1
- t[42, &blk] ||= t.dummy 42 # command_asgn test
- END
- assert_equal([:aref, :aset], a)
- blk
end
def test_backquote
@@ -514,13 +487,13 @@ class TestParse < Test::Unit::TestCase
mesg = 'from the backslash through the invalid char'
e = assert_syntax_error('"\xg1"', /hex escape/)
- assert_equal(' ^~'"\n", e.message.lines.last, mesg)
+ assert_equal(' ^', e.message.lines.last, mesg)
e = assert_syntax_error('"\u{1234"', 'unterminated Unicode escape')
- assert_equal(' ^'"\n", e.message.lines.last, mesg)
+ assert_equal(' ^', e.message.lines.last, mesg)
e = assert_syntax_error('"\u{xxxx}"', 'invalid Unicode escape')
- assert_equal(' ^'"\n", e.message.lines.last, mesg)
+ assert_equal(' ^', e.message.lines.last, mesg)
e = assert_syntax_error('"\u{xxxx', 'Unicode escape')
assert_pattern_list([
@@ -531,14 +504,14 @@ class TestParse < Test::Unit::TestCase
/ \^/,
/\n/,
/.*: unterminated string.*\n.*\n/,
- / \^\n/,
+ / \^/,
], e.message)
e = assert_syntax_error('"\M1"', /escape character syntax/)
- assert_equal(' ^~~'"\n", e.message.lines.last, mesg)
+ assert_equal(' ^~~', e.message.lines.last, mesg)
e = assert_syntax_error('"\C1"', /escape character syntax/)
- assert_equal(' ^~~'"\n", e.message.lines.last, mesg)
+ assert_equal(' ^~~', e.message.lines.last, mesg)
src = '"\xD0\u{90'"\n""000000000000000000000000"
assert_syntax_error(src, /:#{__LINE__}: unterminated/o)
@@ -549,56 +522,27 @@ class TestParse < Test::Unit::TestCase
assert_equal("\x81", eval('"\C-\M-a"'))
assert_equal("\177", eval('"\c?"'))
-
- assert_warning(/use \\C-\\s/) {assert_equal("\x00", eval('"\C- "'))}
- assert_warning(/use \\M-\\s/) {assert_equal("\xa0", eval('"\M- "'))}
- assert_warning(/use \\M-\\C-\\s/) {assert_equal("\x80", eval('"\M-\C- "'))}
- assert_warning(/use \\C-\\M-\\s/) {assert_equal("\x80", eval('"\C-\M- "'))}
- assert_warning(/use \\t/) {assert_equal("\x09", eval("\"\\C-\t\""))}
- assert_warning(/use \\M-\\t/) {assert_equal("\x89", eval("\"\\M-\t\""))}
- assert_warning(/use \\M-\\t/) {assert_equal("\x89", eval("\"\\M-\\C-\t\""))}
- assert_warning(/use \\M-\\t/) {assert_equal("\x89", eval("\"\\C-\\M-\t\""))}
- assert_syntax_error("\"\\C-\x01\"", 'Invalid escape character syntax')
- assert_syntax_error("\"\\M-\x01\"", 'Invalid escape character syntax')
- assert_syntax_error("\"\\M-\\C-\x01\"", 'Invalid escape character syntax')
- assert_syntax_error("\"\\C-\\M-\x01\"", 'Invalid escape character syntax')
end
def test_question
- assert_syntax_error('?', /incomplete/)
- assert_syntax_error('? ', /unexpected/)
- assert_syntax_error("?\n", /unexpected/)
- assert_syntax_error("?\t", /unexpected/)
- assert_syntax_error("?\v", /unexpected/)
- assert_syntax_error("?\r", /unexpected/)
- assert_syntax_error("?\f", /unexpected/)
- assert_syntax_error(" ?a\x8a".force_encoding("utf-8"), /invalid multibyte/)
+ assert_raise(SyntaxError) { eval('?') }
+ assert_raise(SyntaxError) { eval('? ') }
+ assert_raise(SyntaxError) { eval("?\n") }
+ assert_raise(SyntaxError) { eval("?\t") }
+ assert_raise(SyntaxError) { eval("?\v") }
+ assert_raise(SyntaxError) { eval("?\r") }
+ assert_raise(SyntaxError) { eval("?\f") }
+ assert_raise(SyntaxError) { eval("?\f") }
+ assert_raise(SyntaxError) { eval(" ?a\x8a".force_encoding("utf-8")) }
assert_equal("\u{1234}", eval("?\u{1234}"))
assert_equal("\u{1234}", eval('?\u{1234}'))
- assert_equal("\u{1234}", eval('?\u1234'))
- assert_syntax_error('?\u{41 42}', 'Multiple codepoints at single character literal')
- e = assert_syntax_error('"#{?\u123}"', 'invalid Unicode escape')
- assert_not_match(/end-of-input/, e.message)
-
- assert_warning(/use ?\\C-\\s/) {assert_equal("\x00", eval('?\C- '))}
- assert_warning(/use ?\\M-\\s/) {assert_equal("\xa0", eval('?\M- '))}
- assert_warning(/use ?\\M-\\C-\\s/) {assert_equal("\x80", eval('?\M-\C- '))}
- assert_warning(/use ?\\C-\\M-\\s/) {assert_equal("\x80", eval('?\C-\M- '))}
- assert_warning(/use ?\\t/) {assert_equal("\x09", eval("?\\C-\t"))}
- assert_warning(/use ?\\M-\\t/) {assert_equal("\x89", eval("?\\M-\t"))}
- assert_warning(/use ?\\M-\\t/) {assert_equal("\x89", eval("?\\M-\\C-\t"))}
- assert_warning(/use ?\\M-\\t/) {assert_equal("\x89", eval("?\\C-\\M-\t"))}
- assert_syntax_error("?\\C-\x01", 'Invalid escape character syntax')
- assert_syntax_error("?\\M-\x01", 'Invalid escape character syntax')
- assert_syntax_error("?\\M-\\C-\x01", 'Invalid escape character syntax')
- assert_syntax_error("?\\C-\\M-\x01", 'Invalid escape character syntax')
end
def test_percent
assert_equal(:foo, eval('%s(foo)'))
- assert_syntax_error('%s', /unterminated quoted string/)
- assert_syntax_error('%ss', /unknown type/)
- assert_syntax_error('%z()', /unknown type/)
+ assert_raise(SyntaxError) { eval('%s') }
+ assert_raise(SyntaxError) { eval('%ss') }
+ assert_raise(SyntaxError) { eval('%z()') }
end
def test_symbol
@@ -617,21 +561,24 @@ class TestParse < Test::Unit::TestCase
assert_equal(:foobar, eval(':"foo\u{}bar"'))
assert_equal(:foobar, eval(':"foo\u{ }bar"'))
end
-
- assert_syntax_error(':@@', /is not allowed/)
- assert_syntax_error(':@@1', /is not allowed/)
- assert_syntax_error(':@', /is not allowed/)
- assert_syntax_error(':@1', /is not allowed/)
end
def test_parse_string
- assert_syntax_error("/\n", /unterminated/)
+ assert_raise(SyntaxError) do
+ eval <<-END, nil, __FILE__, __LINE__+1
+/
+ END
+ end
end
def test_here_document
x = nil
- assert_syntax_error("<\<FOO\n", /can't find string "FOO"/)
+ assert_raise(SyntaxError) do
+ eval %Q(
+<\<FOO
+ )
+ end
assert_nothing_raised(SyntaxError) do
x = eval %q(
@@ -642,11 +589,23 @@ FOO
end
assert_equal "\#$\n", x
- assert_syntax_error("<\<\"\n", /unterminated here document identifier/)
+ assert_raise(SyntaxError) do
+ eval %Q(
+<\<\"
+ )
+ end
- assert_syntax_error("<<``\n", /can't find string ""/)
+ assert_raise(SyntaxError) do
+ eval %q(
+<<``
+ )
+ end
- assert_syntax_error("<<--\n", /unexpected <</)
+ assert_raise(SyntaxError) do
+ eval %q(
+<<--
+ )
+ end
assert_nothing_raised(SyntaxError) do
x = eval %q(
@@ -709,22 +668,17 @@ x = __ENCODING__
end
def test_embedded_rd
- assert_valid_syntax("=begin\n""=end")
- assert_valid_syntax("=begin\n""=end\0")
- assert_valid_syntax("=begin\n""=end\C-d")
- assert_valid_syntax("=begin\n""=end\C-z")
- end
-
- def test_embedded_rd_error
- error = 'embedded document meets end of file'
- assert_syntax_error("=begin\n", error)
- assert_syntax_error("=begin", error)
+ assert_raise(SyntaxError) do
+ eval <<-END, nil, __FILE__, __LINE__+1
+=begin
+ END
+ end
end
def test_float
assert_equal(1.0/0, eval("1e10000"))
- assert_syntax_error('1_E', /trailing `_'/)
- assert_syntax_error('1E1E1', /unexpected constant/)
+ assert_raise(SyntaxError) { eval('1_E') }
+ assert_raise(SyntaxError) { eval('1E1E1') }
end
def test_global_variable
@@ -734,19 +688,17 @@ x = __ENCODING__
$test_parse_foobarbazqux = nil
assert_equal(nil, $&)
assert_equal(nil, eval('alias $& $preserve_last_match'))
- assert_syntax_error('a = $#', /as a global variable name\na = \$\#\n \^~$/)
+ assert_raise(SyntaxError) { eval('$#') }
end
def test_invalid_instance_variable
- pattern = /without identifiers is not allowed as an instance variable name/
- assert_syntax_error('@%', pattern)
- assert_syntax_error('@', pattern)
+ assert_raise(SyntaxError) { eval('@#') }
+ assert_raise(SyntaxError) { eval('@') }
end
def test_invalid_class_variable
- pattern = /without identifiers is not allowed as a class variable name/
- assert_syntax_error('@@%', pattern)
- assert_syntax_error('@@', pattern)
+ assert_raise(SyntaxError) { eval('@@1') }
+ assert_raise(SyntaxError) { eval('@@') }
end
def test_invalid_char
@@ -766,23 +718,56 @@ x = __ENCODING__
end
def test_unassignable
- assert_syntax_error(%q(self = 1), /Can't change the value of self/)
- assert_syntax_error(%q(nil = 1), /Can't assign to nil/)
- assert_syntax_error(%q(true = 1), /Can't assign to true/)
- assert_syntax_error(%q(false = 1), /Can't assign to false/)
- assert_syntax_error(%q(__FILE__ = 1), /Can't assign to __FILE__/)
- assert_syntax_error(%q(__LINE__ = 1), /Can't assign to __LINE__/)
- assert_syntax_error(%q(__ENCODING__ = 1), /Can't assign to __ENCODING__/)
- assert_syntax_error("def foo; FOO = 1; end", /dynamic constant assignment/)
- assert_syntax_error("x, true", /Can't assign to true/)
+ assert_raise(SyntaxError) do
+ eval %q(self = 1)
+ end
+ assert_raise(SyntaxError) do
+ eval %q(nil = 1)
+ end
+ assert_raise(SyntaxError) do
+ eval %q(true = 1)
+ end
+ assert_raise(SyntaxError) do
+ eval %q(false = 1)
+ end
+ assert_raise(SyntaxError) do
+ eval %q(__FILE__ = 1)
+ end
+ assert_raise(SyntaxError) do
+ eval %q(__LINE__ = 1)
+ end
+ assert_raise(SyntaxError) do
+ eval %q(__ENCODING__ = 1)
+ end
+ assert_raise(SyntaxError) do
+ eval <<-END, nil, __FILE__, __LINE__+1
+ def foo
+ FOO = 1
+ end
+ END
+ end
+ assert_raise(SyntaxError) do
+ eval "#{<<~"begin;"}\n#{<<~'end;'}", nil, __FILE__, __LINE__+1
+ begin;
+ x, true
+ end;
+ end
end
def test_block_dup
- assert_syntax_error("foo(&proc{}) {}", /both block arg and actual block/)
+ assert_raise(SyntaxError) do
+ eval <<-END, nil, __FILE__, __LINE__+1
+ foo(&proc{}) {}
+ END
+ end
end
def test_set_backref
- assert_syntax_error("$& = 1", /Can't set variable/)
+ assert_raise(SyntaxError) do
+ eval <<-END, nil, __FILE__, __LINE__+1
+ $& = 1
+ END
+ end
end
def test_arg_concat
@@ -800,24 +785,32 @@ x = __ENCODING__
end
def test_void_expr_stmts_value
+ # This test checks if void contexts are warned correctly.
+ # Thus, warnings MUST NOT be suppressed.
+ $VERBOSE = true
+ stderr = $stderr
+ $stderr = StringIO.new("")
x = 1
- useless_use = /useless use/
- unused = /unused/
- assert_nil assert_warning(useless_use) {eval("x; nil")}
- assert_nil assert_warning(useless_use) {eval("1+1; nil")}
- assert_nil assert_warning('') {eval("1.+(1); nil")}
- assert_nil assert_warning(useless_use) {eval("TestParse; nil")}
- assert_nil assert_warning(useless_use) {eval("::TestParse; nil")}
- assert_nil assert_warning(useless_use) {eval("x..x; nil")}
- assert_nil assert_warning(useless_use) {eval("x...x; nil")}
- assert_nil assert_warning(unused) {eval("self; nil")}
- assert_nil assert_warning(unused) {eval("nil; nil")}
- assert_nil assert_warning(unused) {eval("true; nil")}
- assert_nil assert_warning(unused) {eval("false; nil")}
- assert_nil assert_warning(useless_use) {eval("defined?(1); nil")}
+ assert_nil eval("x; nil")
+ assert_nil eval("1+1; nil")
+ assert_nil eval("1.+(1); nil")
+ assert_nil eval("TestParse; nil")
+ assert_nil eval("::TestParse; nil")
+ assert_nil eval("x..x; nil")
+ assert_nil eval("x...x; nil")
+ assert_nil eval("self; nil")
+ assert_nil eval("nil; nil")
+ assert_nil eval("true; nil")
+ assert_nil eval("false; nil")
+ assert_nil eval("defined?(1); nil")
assert_equal 1, x
- assert_syntax_error("1; next; 2", /Invalid next/)
+ assert_raise(SyntaxError) do
+ eval %q(1; next; 2)
+ end
+
+ assert_equal(13, $stderr.string.lines.to_a.size)
+ $stderr = stderr
end
def test_assign_in_conditional
@@ -874,7 +867,11 @@ x = __ENCODING__
end
def test_no_blockarg
- assert_syntax_error("yield(&:+)", /block argument should not be given/)
+ assert_raise(SyntaxError) do
+ eval <<-END, nil, __FILE__, __LINE__+1
+ yield(&:+)
+ END
+ end
end
def test_method_block_location
@@ -891,8 +888,10 @@ x = __ENCODING__
assert_equal(expected, actual, bug5614)
end
- def test_no_shadowing_variable_warning
- assert_no_warning(/shadowing outer local variable/) {eval("a=1; tap {|a|}")}
+ def test_shadowing_variable
+ assert_warning(/shadowing outer local variable/) {eval("a=1; tap {|a|}")}
+ a = "\u{3042}"
+ assert_warning(/#{a}/o) {eval("#{a}=1; tap {|#{a}|}")}
end
def test_unused_variable
@@ -900,12 +899,10 @@ x = __ENCODING__
assert_warning(/assigned but unused variable/) {o.instance_eval("def foo; a=1; nil; end")}
assert_warning(/assigned but unused variable/) {o.instance_eval("def bar; a=1; a(); end")}
a = "\u{3042}"
- assert_warning(/#{a}/) {o.instance_eval("def foo0; #{a}=1; nil; end")}
- assert_warning(/assigned but unused variable/) {o.instance_eval("def foo1; tap {a=1; a()}; end")}
- assert_warning('') {o.instance_eval("def bar1; a=a=1; nil; end")}
- assert_warning(/assigned but unused variable/) {o.instance_eval("def bar2; a, = 1, 2; end")}
- assert_warning('') {o.instance_eval("def marg1(a); nil; end")}
- assert_warning('') {o.instance_eval("def marg2((a)); nil; end")}
+ assert_warning(/#{a}/) {o.instance_eval("def foo; #{a}=1; nil; end")}
+ o = Object.new
+ assert_warning(/assigned but unused variable/) {o.instance_eval("def foo; tap {a=1; a()}; end")}
+ assert_warning('') {o.instance_eval("def bar; a=a=1; nil; end")}
end
def test_named_capture_conflict
@@ -1046,26 +1043,35 @@ x = __ENCODING__
end
def test_unexpected_token_error
- assert_syntax_error('"x"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', /unexpected/)
+ assert_raise(SyntaxError) do
+ eval('"x"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx')
+ end
end
def test_unexpected_token_after_numeric
- assert_syntax_error('0000xyz', /^ \^~~\Z/)
- assert_syntax_error('1.2i1.1', /^ \^~~\Z/)
- assert_syntax_error('1.2.3', /^ \^~\Z/)
+ assert_raise_with_message(SyntaxError, /^ \^~~\z/) do
+ eval('0000xyz')
+ end
+ assert_raise_with_message(SyntaxError, /^ \^~~\z/) do
+ eval('1.2i1.1')
+ end
end
def test_truncated_source_line
- e = assert_syntax_error("'0123456789012345678901234567890123456789' abcdefghijklmnopqrstuvwxyz0123456789 0123456789012345678901234567890123456789",
- /unexpected local variable or method/)
+ e = assert_raise_with_message(SyntaxError, /unexpected tIDENTIFIER/) do
+ eval("'0123456789012345678901234567890123456789' abcdefghijklmnopqrstuvwxyz0123456789 0123456789012345678901234567890123456789")
+ end
line = e.message.lines[1]
assert_operator(line, :start_with?, "...")
assert_operator(line, :end_with?, "...\n")
end
def test_unterminated_regexp_error
- e = assert_syntax_error("/x", /unterminated regexp meets end of file/)
- assert_not_match(/unexpected tSTRING_END/, e.message)
+ e = assert_raise(SyntaxError) do
+ eval("/x")
+ end.message
+ assert_match(/unterminated regexp meets end of file/, e)
+ assert_not_match(/unexpected tSTRING_END/, e)
end
def test_lparenarg
@@ -1075,8 +1081,7 @@ x = __ENCODING__
end
o.instance_eval {i (-1.3).abs}
assert_equal(1.3, o.x)
- o.i(nil)
- o.instance_eval {i = 0; i (-1.3).abs; i}
+ o.instance_eval {i = 0; i (-1.3).abs}
assert_equal(1.3, o.x)
end
@@ -1085,85 +1090,13 @@ x = __ENCODING__
$VERBOSE = true
x = 1
eval("if false; 0 < x < 2; end")
- x
end
end
- def test_eof
- assert_equal(42, eval("42\0""end"))
- assert_equal(42, eval("42\C-d""end"))
- assert_equal(42, eval("42\C-z""end"))
- end
-
def test_eof_in_def
- assert_syntax_error("def m\n\0""end", /unexpected/)
- assert_syntax_error("def m\n\C-d""end", /unexpected/)
- assert_syntax_error("def m\n\C-z""end", /unexpected/)
- end
-
- def test_location_of_invalid_token
- assert_syntax_error('class xxx end', /^ \^~~\Z/)
- end
-
- def test_whitespace_warning
- assert_syntax_error("\\foo", /backslash/)
- assert_syntax_error("\\ ", /escaped space/)
- assert_syntax_error("\\\t", /escaped horizontal tab/)
- assert_syntax_error("\\\f", /escaped form feed/)
- assert_syntax_error("\\\r", /escaped carriage return/)
- assert_warn(/middle of line/) {eval(" \r ")}
- assert_syntax_error("\\\v", /escaped vertical tab/)
- end
-
- def test_command_def_cmdarg
- assert_valid_syntax("\n#{<<~"begin;"}\n#{<<~'end;'}")
- begin;
- m def x(); end
- 1.tap do end
- end;
- end
-
- NONASCII_CONSTANTS = [
- *%W"\u{00de} \u{00C0}".flat_map {|c| [c, c.encode("iso-8859-15")]},
- "\u{1c4}", "\u{1f2}", "\u{1f88}", "\u{370}",
- *%W"\u{391} \u{ff21}".flat_map {|c| [c, c.encode("cp932"), c.encode("euc-jp")]},
- ]
-
- def assert_nonascii_const
- assert_all_assertions_foreach("NONASCII_CONSTANTS", *NONASCII_CONSTANTS) do |n|
- m = Module.new
- assert_not_operator(m, :const_defined?, n)
- assert_raise_with_message(NameError, /uninitialized/) do
- m.const_get(n)
- end
- assert_nil(eval("defined?(m::#{n})"))
-
- v = yield m, n
-
- assert_operator(m, :const_defined?, n)
- assert_equal("constant", eval("defined?(m::#{n})"))
- assert_same(v, m.const_get(n))
-
- m.__send__(:remove_const, n)
- assert_not_operator(m, :const_defined?, n)
- assert_nil(eval("defined?(m::#{n})"))
- end
- end
-
- def test_nonascii_const_set
- assert_nonascii_const do |m, n|
- m.const_set(n, 42)
- end
- end
-
- def test_nonascii_constant
- assert_nonascii_const do |m, n|
- m.module_eval("class #{n}; self; end")
- end
- end
-
- def test_cdmarg_after_command_args_and_tlbrace_arg
- assert_valid_syntax('let () { m(a) do; end }')
+ assert_raise(SyntaxError) { eval("def m\n\0""end") }
+ assert_raise(SyntaxError) { eval("def m\n\C-d""end") }
+ assert_raise(SyntaxError) { eval("def m\n\C-z""end") }
end
def test_void_value_in_command_rhs