PageRenderTime 50ms CodeModel.GetById 15ms RepoModel.GetById 1ms app.codeStats 0ms

/test/ruby/test_parse.rb

http://github.com/ruby/ruby
Ruby | 1180 lines | 624 code | 92 blank | 464 comment | 0 complexity | 68043945c38c8d7322db64a7a9dce4f1 MD5 | raw file
Possible License(s): GPL-2.0, BSD-3-Clause, AGPL-3.0
  1. # coding: US-ASCII
  2. # frozen_string_literal: false
  3. require 'test/unit'
  4. require 'stringio'
  5. class TestParse < Test::Unit::TestCase
  6. def setup
  7. @verbose = $VERBOSE
  8. $VERBOSE = nil
  9. end
  10. def teardown
  11. $VERBOSE = @verbose
  12. end
  13. def test_error_line
  14. assert_syntax_error('------,,', /\n\z/, 'Message to pipe should end with a newline')
  15. end
  16. def test_else_without_rescue
  17. assert_syntax_error(<<-END, %r":#{__LINE__+2}: else without rescue"o, [__FILE__, __LINE__+1])
  18. begin
  19. else
  20. 42
  21. end
  22. END
  23. end
  24. def test_alias_backref
  25. assert_syntax_error("#{<<~"begin;"}\n#{<<~'end;'}", /can't make alias/) do
  26. begin;
  27. alias $foo $1
  28. end;
  29. end
  30. end
  31. def test_command_call
  32. t = Object.new
  33. def t.foo(x); x; end
  34. a = false
  35. b = c = d = true
  36. assert_nothing_raised do
  37. eval <<-END, nil, __FILE__, __LINE__+1
  38. a &&= t.foo 42
  39. b &&= t.foo 42
  40. c &&= t.foo nil
  41. d &&= t.foo false
  42. END
  43. end
  44. assert_equal([false, 42, nil, false], [a, b, c, d])
  45. a = 3
  46. assert_nothing_raised { eval("a &= t.foo 5") }
  47. assert_equal(1, a)
  48. a = [nil, nil, true, true]
  49. assert_nothing_raised do
  50. eval <<-END, nil, __FILE__, __LINE__+1
  51. a[0] ||= t.foo 42
  52. a[1] &&= t.foo 42
  53. a[2] ||= t.foo 42
  54. a[3] &&= t.foo 42
  55. END
  56. end
  57. assert_equal([42, nil, true, 42], a)
  58. o = Object.new
  59. class << o
  60. attr_accessor :foo, :bar, :Foo, :Bar, :baz, :qux
  61. end
  62. o.foo = o.Foo = o::baz = nil
  63. o.bar = o.Bar = o::qux = 1
  64. assert_nothing_raised do
  65. eval <<-END, nil, __FILE__, __LINE__+1
  66. o.foo ||= t.foo 42
  67. o.bar &&= t.foo 42
  68. o.Foo ||= t.foo 42
  69. o.Bar &&= t.foo 42
  70. o::baz ||= t.foo 42
  71. o::qux &&= t.foo 42
  72. END
  73. end
  74. assert_equal([42, 42], [o.foo, o.bar])
  75. assert_equal([42, 42], [o.Foo, o.Bar])
  76. assert_equal([42, 42], [o::baz, o::qux])
  77. assert_syntax_error("#{<<~"begin;"}\n#{<<~'end;'}", /Can't set variable/) do
  78. begin;
  79. $1 ||= t.foo 42
  80. end;
  81. end
  82. def t.bar(x); x + yield; end
  83. a = b = nil
  84. assert_nothing_raised do
  85. eval <<-END, nil, __FILE__, __LINE__+1
  86. a = t.bar "foo" do
  87. "bar"
  88. end.gsub "ob", "OB"
  89. b = t.bar "foo" do
  90. "bar"
  91. end::gsub "ob", "OB"
  92. END
  93. end
  94. assert_equal("foOBar", a)
  95. assert_equal("foOBar", b)
  96. a = nil
  97. assert_nothing_raised do
  98. t.instance_eval <<-END, __FILE__, __LINE__+1
  99. a = bar "foo" do "bar" end
  100. END
  101. end
  102. assert_equal("foobar", a)
  103. a = nil
  104. assert_nothing_raised do
  105. eval <<-END, nil, __FILE__, __LINE__+1
  106. a = t::bar "foo" do "bar" end
  107. END
  108. end
  109. assert_equal("foobar", a)
  110. def t.baz(*r)
  111. @baz = r + (block_given? ? [yield] : [])
  112. end
  113. assert_nothing_raised do
  114. t.instance_eval "baz (1), 2"
  115. end
  116. assert_equal([1, 2], t.instance_eval { @baz })
  117. end
  118. def test_mlhs_node
  119. c = Class.new
  120. class << c
  121. attr_accessor :foo, :bar, :Foo, :Bar
  122. FOO = BAR = nil
  123. end
  124. assert_nothing_raised do
  125. eval <<-END, nil, __FILE__, __LINE__+1
  126. c::foo, c::bar = 1, 2
  127. c.Foo, c.Bar = 1, 2
  128. c::FOO, c::BAR = 1, 2
  129. END
  130. end
  131. assert_equal([1, 2], [c::foo, c::bar])
  132. assert_equal([1, 2], [c.Foo, c.Bar])
  133. assert_equal([1, 2], [c::FOO, c::BAR])
  134. end
  135. def test_dynamic_constant_assignment
  136. assert_syntax_error("#{<<~"begin;"}\n#{<<~'end;'}", /dynamic constant/) do
  137. begin;
  138. def foo
  139. self::FOO, self::BAR = 1, 2
  140. ::FOO, ::BAR = 1, 2
  141. end
  142. end;
  143. end
  144. assert_syntax_error("#{<<~"begin;"}\n#{<<~'end;'}", /Can't set variable/) do
  145. begin;
  146. $1, $2 = 1, 2
  147. end;
  148. end
  149. assert_syntax_error("#{<<~"begin;"}\n#{<<~'end;'}", /dynamic constant/) do
  150. begin;
  151. def foo
  152. ::FOO = 1
  153. end
  154. end;
  155. end
  156. c = Class.new
  157. c.freeze
  158. assert_valid_syntax("#{<<~"begin;"}\n#{<<~'end;'}") do
  159. begin;
  160. c::FOO &= 1
  161. ::FOO &= 1
  162. end;
  163. end
  164. assert_syntax_error("#{<<~"begin;"}\n#{<<~'end;'}", /Can't set variable/) do
  165. begin;
  166. $1 &= 1
  167. end;
  168. end
  169. end
  170. def test_class_module
  171. assert_syntax_error("#{<<~"begin;"}\n#{<<~'end;'}", /must be CONSTANT/) do
  172. begin;
  173. class foo; end
  174. end;
  175. end
  176. assert_syntax_error("#{<<~"begin;"}\n#{<<~'end;'}", /in method body/) do
  177. begin;
  178. def foo
  179. class Foo; end
  180. module Bar; end
  181. end
  182. end;
  183. end
  184. assert_valid_syntax("#{<<~"begin;"}\n#{<<~'end;'}") do
  185. begin;
  186. class Foo 1; end
  187. end;
  188. end
  189. end
  190. def test_op_name
  191. o = Object.new
  192. def o.>(x); x; end
  193. def o./(x); x; end
  194. assert_nothing_raised do
  195. o.instance_eval <<-END, __FILE__, __LINE__+1
  196. undef >, /
  197. END
  198. end
  199. end
  200. def test_arg
  201. o = Object.new
  202. class << o
  203. attr_accessor :foo, :bar, :Foo, :Bar, :baz, :qux
  204. end
  205. o.foo = o.Foo = o::baz = nil
  206. o.bar = o.Bar = o::qux = 1
  207. assert_nothing_raised do
  208. eval <<-END, nil, __FILE__, __LINE__+1
  209. o.foo ||= 42
  210. o.bar &&= 42
  211. o.Foo ||= 42
  212. o.Bar &&= 42
  213. o::baz ||= 42
  214. o::qux &&= 42
  215. END
  216. end
  217. assert_equal([42, 42], [o.foo, o.bar])
  218. assert_equal([42, 42], [o.Foo, o.Bar])
  219. assert_equal([42, 42], [o::baz, o::qux])
  220. a = nil
  221. assert_nothing_raised do
  222. eval <<-END, nil, __FILE__, __LINE__+1
  223. a = -2.0 ** 2
  224. END
  225. end
  226. assert_equal(-4.0, a)
  227. end
  228. def test_block_variable
  229. o = Object.new
  230. def o.foo(*r); yield(*r); end
  231. a = nil
  232. assert_nothing_raised do
  233. eval <<-END, nil, __FILE__, __LINE__+1
  234. o.foo 1 do|; a| a = 42 end
  235. END
  236. end
  237. assert_nil(a)
  238. end
  239. def test_bad_arg
  240. assert_syntax_error("#{<<~"begin;"}\n#{<<~'end;'}", /cannot be a constant/) do
  241. begin;
  242. def foo(FOO); end
  243. end;
  244. end
  245. assert_syntax_error("#{<<~"begin;"}\n#{<<~'end;'}", /cannot be an instance variable/) do
  246. begin;
  247. def foo(@foo); end
  248. end;
  249. end
  250. assert_syntax_error("#{<<~"begin;"}\n#{<<~'end;'}", /cannot be a global variable/) do
  251. begin;
  252. def foo($foo); end
  253. end;
  254. end
  255. assert_syntax_error("#{<<~"begin;"}\n#{<<~'end;'}", /cannot be a class variable/) do
  256. begin;
  257. def foo(@@foo); end
  258. end;
  259. end
  260. assert_syntax_error("#{<<~"begin;"}\n#{<<~'end;'}", /cannot be an instance variable/) do
  261. begin;
  262. o.foo {|; @a| @a = 42 }
  263. end;
  264. end
  265. end
  266. def test_do_lambda
  267. a = b = nil
  268. assert_nothing_raised do
  269. eval <<-END, nil, __FILE__, __LINE__+1
  270. a = -> do
  271. b = 42
  272. end
  273. END
  274. end
  275. a.call
  276. assert_equal(42, b)
  277. end
  278. def test_block_call_colon2
  279. o = Object.new
  280. def o.foo(x); x + yield; end
  281. a = b = nil
  282. assert_nothing_raised do
  283. o.instance_eval <<-END, __FILE__, __LINE__+1
  284. a = foo 1 do 42 end.to_s
  285. b = foo 1 do 42 end::to_s
  286. END
  287. end
  288. assert_equal("43", a)
  289. assert_equal("43", b)
  290. end
  291. def test_call_method
  292. a = b = nil
  293. assert_nothing_raised do
  294. eval <<-END, nil, __FILE__, __LINE__+1
  295. a = proc {|x| x + "bar" }.("foo")
  296. b = proc {|x| x + "bar" }::("foo")
  297. END
  298. end
  299. assert_equal("foobar", a)
  300. assert_equal("foobar", b)
  301. end
  302. def test_xstring
  303. assert_raise(Errno::ENOENT) do
  304. eval("``")
  305. end
  306. end
  307. def test_words
  308. assert_equal([], %W( ))
  309. assert_syntax_error('%w[abc', /unterminated list/)
  310. end
  311. def test_dstr
  312. @@foo = 1
  313. assert_equal("foo 1 bar", "foo #@@foo bar")
  314. "1" =~ /(.)/
  315. assert_equal("foo 1 bar", "foo #$1 bar")
  316. assert_equal('foo #@1 bar', eval('"foo #@1 bar"'))
  317. end
  318. def test_dstr_disallowed_variable
  319. bug8375 = '[ruby-core:54885] [Bug #8375]'
  320. %w[@ @. @@ @@1 @@. $ $%].each do |src|
  321. src = '#'+src+' '
  322. str = assert_nothing_raised(SyntaxError, "#{bug8375} #{src.dump}") do
  323. break eval('"'+src+'"')
  324. end
  325. assert_equal(src, str, bug8375)
  326. end
  327. end
  328. def test_dsym
  329. assert_nothing_raised { eval(':""') }
  330. end
  331. def assert_disallowed_variable(type, noname, invalid)
  332. noname.each do |name|
  333. assert_syntax_error("proc{a = #{name} }", "`#{noname[0]}' without identifiers is not allowed as #{type} variable name")
  334. end
  335. invalid.each do |name|
  336. assert_syntax_error("proc {a = #{name} }", "`#{name}' is not allowed as #{type} variable name")
  337. end
  338. end
  339. def test_disallowed_instance_variable
  340. assert_disallowed_variable("an instance", %w[@ @.], %w[])
  341. end
  342. def test_disallowed_class_variable
  343. assert_disallowed_variable("a class", %w[@@ @@.], %w[@@1])
  344. end
  345. def test_disallowed_gloal_variable
  346. assert_disallowed_variable("a global", %w[$], %w[$%])
  347. end
  348. def test_arg2
  349. o = Object.new
  350. assert_nothing_raised do
  351. eval <<-END, nil, __FILE__, __LINE__+1
  352. def o.foo(a=42,*r,z,&b); b.call(r.inject(a*1000+z*100, :+)); end
  353. END
  354. end
  355. assert_equal(-1405, o.foo(1,2,3,4) {|x| -x })
  356. assert_equal(-1302, o.foo(1,2,3) {|x| -x })
  357. assert_equal(-1200, o.foo(1,2) {|x| -x })
  358. assert_equal(-42100, o.foo(1) {|x| -x })
  359. assert_raise(ArgumentError) { o.foo() }
  360. assert_nothing_raised do
  361. eval <<-END, nil, __FILE__, __LINE__+1
  362. def o.foo(a=42,z,&b); b.call(a*1000+z*100); end
  363. END
  364. end
  365. assert_equal(-1200, o.foo(1,2) {|x| -x } )
  366. assert_equal(-42100, o.foo(1) {|x| -x } )
  367. assert_raise(ArgumentError) { o.foo() }
  368. assert_nothing_raised do
  369. eval <<-END, nil, __FILE__, __LINE__+1
  370. def o.foo(*r,z,&b); b.call(r.inject(z*100, :+)); end
  371. END
  372. end
  373. assert_equal(-303, o.foo(1,2,3) {|x| -x } )
  374. assert_equal(-201, o.foo(1,2) {|x| -x } )
  375. assert_equal(-100, o.foo(1) {|x| -x } )
  376. assert_raise(ArgumentError) { o.foo() }
  377. end
  378. def test_duplicate_argument
  379. assert_syntax_error("#{<<~"begin;"}\n#{<<~'end;'}", '') do
  380. begin;
  381. 1.times {|&b?| }
  382. end;
  383. end
  384. assert_syntax_error("#{<<~"begin;"}\n#{<<~'end;'}", /duplicated argument/) do
  385. begin;
  386. 1.times {|a, a|}
  387. end;
  388. end
  389. assert_syntax_error("#{<<~"begin;"}\n#{<<~'end;'}", /duplicated argument/) do
  390. begin;
  391. def foo(a, a); end
  392. end;
  393. end
  394. end
  395. def test_define_singleton_error
  396. assert_syntax_error("#{<<~"begin;"}\n#{<<~'end;'}", /singleton method for literals/) do
  397. begin;
  398. def ("foo").foo; end
  399. end;
  400. end
  401. end
  402. def test_op_asgn1_with_block
  403. t = Object.new
  404. a = []
  405. blk = proc {|x| a << x }
  406. def t.[](_)
  407. yield(:aref)
  408. nil
  409. end
  410. def t.[]=(_, _)
  411. yield(:aset)
  412. end
  413. def t.dummy(_)
  414. end
  415. eval <<-END, nil, __FILE__, __LINE__+1
  416. t[42, &blk] ||= 42
  417. END
  418. assert_equal([:aref, :aset], a)
  419. a.clear
  420. eval <<-END, nil, __FILE__, __LINE__+1
  421. t[42, &blk] ||= t.dummy 42 # command_asgn test
  422. END
  423. assert_equal([:aref, :aset], a)
  424. blk
  425. end
  426. def test_backquote
  427. t = Object.new
  428. assert_nothing_raised do
  429. eval <<-END, nil, __FILE__, __LINE__+1
  430. def t.`(x); "foo" + x + "bar"; end
  431. END
  432. end
  433. a = b = nil
  434. assert_nothing_raised do
  435. eval <<-END, nil, __FILE__, __LINE__+1
  436. a = t.` "zzz"
  437. 1.times {|;z| t.` ("zzz") }
  438. END
  439. t.instance_eval <<-END, __FILE__, __LINE__+1
  440. b = `zzz`
  441. END
  442. end
  443. assert_equal("foozzzbar", a)
  444. assert_equal("foozzzbar", b)
  445. end
  446. def test_carrige_return
  447. assert_equal(2, eval("1 +\r\n1"))
  448. end
  449. def test_string
  450. mesg = 'from the backslash through the invalid char'
  451. e = assert_syntax_error('"\xg1"', /hex escape/)
  452. assert_equal(' ^~'"\n", e.message.lines.last, mesg)
  453. e = assert_syntax_error('"\u{1234"', 'unterminated Unicode escape')
  454. assert_equal(' ^'"\n", e.message.lines.last, mesg)
  455. e = assert_syntax_error('"\u{xxxx}"', 'invalid Unicode escape')
  456. assert_equal(' ^'"\n", e.message.lines.last, mesg)
  457. e = assert_syntax_error('"\u{xxxx', 'Unicode escape')
  458. assert_pattern_list([
  459. /.*: invalid Unicode escape\n.*\n/,
  460. / \^/,
  461. /\n/,
  462. /.*: unterminated Unicode escape\n.*\n/,
  463. / \^/,
  464. /\n/,
  465. /.*: unterminated string.*\n.*\n/,
  466. / \^\n/,
  467. ], e.message)
  468. e = assert_syntax_error('"\M1"', /escape character syntax/)
  469. assert_equal(' ^~~'"\n", e.message.lines.last, mesg)
  470. e = assert_syntax_error('"\C1"', /escape character syntax/)
  471. assert_equal(' ^~~'"\n", e.message.lines.last, mesg)
  472. src = '"\xD0\u{90'"\n""000000000000000000000000"
  473. assert_syntax_error(src, /:#{__LINE__}: unterminated/o)
  474. assert_syntax_error('"\u{100000000}"', /invalid Unicode escape/)
  475. assert_equal("", eval('"\u{}"'))
  476. assert_equal("", eval('"\u{ }"'))
  477. assert_equal("\x81", eval('"\C-\M-a"'))
  478. assert_equal("\177", eval('"\c?"'))
  479. assert_warning(/use \\C-\\s/) {assert_equal("\x00", eval('"\C- "'))}
  480. assert_warning(/use \\M-\\s/) {assert_equal("\xa0", eval('"\M- "'))}
  481. assert_warning(/use \\M-\\C-\\s/) {assert_equal("\x80", eval('"\M-\C- "'))}
  482. assert_warning(/use \\C-\\M-\\s/) {assert_equal("\x80", eval('"\C-\M- "'))}
  483. assert_warning(/use \\t/) {assert_equal("\x09", eval("\"\\C-\t\""))}
  484. assert_warning(/use \\M-\\t/) {assert_equal("\x89", eval("\"\\M-\t\""))}
  485. assert_warning(/use \\M-\\t/) {assert_equal("\x89", eval("\"\\M-\\C-\t\""))}
  486. assert_warning(/use \\M-\\t/) {assert_equal("\x89", eval("\"\\C-\\M-\t\""))}
  487. assert_syntax_error("\"\\C-\x01\"", 'Invalid escape character syntax')
  488. assert_syntax_error("\"\\M-\x01\"", 'Invalid escape character syntax')
  489. assert_syntax_error("\"\\M-\\C-\x01\"", 'Invalid escape character syntax')
  490. assert_syntax_error("\"\\C-\\M-\x01\"", 'Invalid escape character syntax')
  491. end
  492. def test_question
  493. assert_syntax_error('?', /incomplete/)
  494. assert_syntax_error('? ', /unexpected/)
  495. assert_syntax_error("?\n", /unexpected/)
  496. assert_syntax_error("?\t", /unexpected/)
  497. assert_syntax_error("?\v", /unexpected/)
  498. assert_syntax_error("?\r", /unexpected/)
  499. assert_syntax_error("?\f", /unexpected/)
  500. assert_syntax_error(" ?a\x8a".force_encoding("utf-8"), /invalid multibyte/)
  501. assert_equal("\u{1234}", eval("?\u{1234}"))
  502. assert_equal("\u{1234}", eval('?\u{1234}'))
  503. assert_equal("\u{1234}", eval('?\u1234'))
  504. assert_syntax_error('?\u{41 42}', 'Multiple codepoints at single character literal')
  505. e = assert_syntax_error('"#{?\u123}"', 'invalid Unicode escape')
  506. assert_not_match(/end-of-input/, e.message)
  507. assert_warning(/use ?\\C-\\s/) {assert_equal("\x00", eval('?\C- '))}
  508. assert_warning(/use ?\\M-\\s/) {assert_equal("\xa0", eval('?\M- '))}
  509. assert_warning(/use ?\\M-\\C-\\s/) {assert_equal("\x80", eval('?\M-\C- '))}
  510. assert_warning(/use ?\\C-\\M-\\s/) {assert_equal("\x80", eval('?\C-\M- '))}
  511. assert_warning(/use ?\\t/) {assert_equal("\x09", eval("?\\C-\t"))}
  512. assert_warning(/use ?\\M-\\t/) {assert_equal("\x89", eval("?\\M-\t"))}
  513. assert_warning(/use ?\\M-\\t/) {assert_equal("\x89", eval("?\\M-\\C-\t"))}
  514. assert_warning(/use ?\\M-\\t/) {assert_equal("\x89", eval("?\\C-\\M-\t"))}
  515. assert_syntax_error("?\\C-\x01", 'Invalid escape character syntax')
  516. assert_syntax_error("?\\M-\x01", 'Invalid escape character syntax')
  517. assert_syntax_error("?\\M-\\C-\x01", 'Invalid escape character syntax')
  518. assert_syntax_error("?\\C-\\M-\x01", 'Invalid escape character syntax')
  519. end
  520. def test_percent
  521. assert_equal(:foo, eval('%s(foo)'))
  522. assert_syntax_error('%s', /unterminated quoted string/)
  523. assert_syntax_error('%ss', /unknown type/)
  524. assert_syntax_error('%z()', /unknown type/)
  525. end
  526. def test_symbol
  527. bug = '[ruby-dev:41447]'
  528. sym = "foo\0bar".to_sym
  529. assert_nothing_raised(SyntaxError, bug) do
  530. assert_equal(sym, eval(":'foo\0bar'"))
  531. end
  532. assert_nothing_raised(SyntaxError, bug) do
  533. assert_equal(sym, eval(':"foo\u0000bar"'))
  534. end
  535. assert_nothing_raised(SyntaxError, bug) do
  536. assert_equal(sym, eval(':"foo\u{0}bar"'))
  537. end
  538. assert_nothing_raised(SyntaxError) do
  539. assert_equal(:foobar, eval(':"foo\u{}bar"'))
  540. assert_equal(:foobar, eval(':"foo\u{ }bar"'))
  541. end
  542. assert_syntax_error(':@@', /is not allowed/)
  543. assert_syntax_error(':@@1', /is not allowed/)
  544. assert_syntax_error(':@', /is not allowed/)
  545. assert_syntax_error(':@1', /is not allowed/)
  546. end
  547. def test_parse_string
  548. assert_syntax_error("/\n", /unterminated/)
  549. end
  550. def test_here_document
  551. x = nil
  552. assert_syntax_error("<\<FOO\n", /can't find string "FOO"/)
  553. assert_nothing_raised(SyntaxError) do
  554. x = eval %q(
  555. <<FOO
  556. #$
  557. FOO
  558. )
  559. end
  560. assert_equal "\#$\n", x
  561. assert_syntax_error("<\<\"\n", /unterminated here document identifier/)
  562. assert_syntax_error("<<``\n", /can't find string ""/)
  563. assert_syntax_error("<<--\n", /unexpected <</)
  564. assert_nothing_raised(SyntaxError) do
  565. x = eval %q(
  566. <<FOO
  567. #$
  568. foo
  569. FOO
  570. )
  571. end
  572. assert_equal "\#$\nfoo\n", x
  573. assert_nothing_raised do
  574. eval "x = <<""FOO\r\n1\r\nFOO"
  575. end
  576. assert_equal("1\n", x)
  577. end
  578. def test_magic_comment
  579. x = nil
  580. assert_nothing_raised do
  581. eval <<-END, nil, __FILE__, __LINE__+1
  582. # coding = utf-8
  583. x = __ENCODING__
  584. END
  585. end
  586. assert_equal(Encoding.find("UTF-8"), x)
  587. assert_raise(ArgumentError) do
  588. eval <<-END, nil, __FILE__, __LINE__+1
  589. # coding = foobarbazquxquux_dummy_enconding
  590. x = __ENCODING__
  591. END
  592. end
  593. end
  594. def test_utf8_bom
  595. x = nil
  596. assert_nothing_raised do
  597. eval "\xef\xbb\xbf x = __ENCODING__"
  598. end
  599. assert_equal(Encoding.find("UTF-8"), x)
  600. assert_raise(NameError) { eval "\xef" }
  601. end
  602. def test_dot_in_next_line
  603. x = nil
  604. assert_nothing_raised do
  605. eval <<-END, nil, __FILE__, __LINE__+1
  606. x = 1
  607. .to_s
  608. END
  609. end
  610. assert_equal("1", x)
  611. end
  612. def test_pow_asgn
  613. x = 3
  614. assert_nothing_raised { eval("x **= 2") }
  615. assert_equal(9, x)
  616. end
  617. def test_embedded_rd
  618. assert_valid_syntax("=begin\n""=end")
  619. assert_valid_syntax("=begin\n""=end\0")
  620. assert_valid_syntax("=begin\n""=end\C-d")
  621. assert_valid_syntax("=begin\n""=end\C-z")
  622. end
  623. def test_embedded_rd_error
  624. error = 'embedded document meets end of file'
  625. assert_syntax_error("=begin\n", error)
  626. assert_syntax_error("=begin", error)
  627. end
  628. def test_float
  629. assert_equal(1.0/0, eval("1e10000"))
  630. assert_syntax_error('1_E', /trailing `_'/)
  631. assert_syntax_error('1E1E1', /unexpected constant/)
  632. end
  633. def test_global_variable
  634. assert_equal(nil, eval('$-x'))
  635. assert_equal(nil, eval('alias $preserve_last_match $&'))
  636. assert_equal(nil, eval('alias $& $test_parse_foobarbazqux'))
  637. $test_parse_foobarbazqux = nil
  638. assert_equal(nil, $&)
  639. assert_equal(nil, eval('alias $& $preserve_last_match'))
  640. assert_syntax_error('a = $#', /as a global variable name\na = \$\#\n \^~$/)
  641. end
  642. def test_invalid_instance_variable
  643. pattern = /without identifiers is not allowed as an instance variable name/
  644. assert_syntax_error('@%', pattern)
  645. assert_syntax_error('@', pattern)
  646. end
  647. def test_invalid_class_variable
  648. pattern = /without identifiers is not allowed as a class variable name/
  649. assert_syntax_error('@@%', pattern)
  650. assert_syntax_error('@@', pattern)
  651. end
  652. def test_invalid_char
  653. bug10117 = '[ruby-core:64243] [Bug #10117]'
  654. invalid_char = /Invalid char `\\x01'/
  655. x = 1
  656. assert_in_out_err(%W"-e \x01x", "", [], invalid_char, bug10117)
  657. assert_syntax_error("\x01x", invalid_char, bug10117)
  658. assert_equal(nil, eval("\x04x"))
  659. assert_equal 1, x
  660. end
  661. def test_literal_concat
  662. x = "baz"
  663. assert_equal("foobarbaz", eval('"foo" "bar#{x}"'))
  664. assert_equal("baz", x)
  665. end
  666. def test_unassignable
  667. assert_syntax_error(%q(self = 1), /Can't change the value of self/)
  668. assert_syntax_error(%q(nil = 1), /Can't assign to nil/)
  669. assert_syntax_error(%q(true = 1), /Can't assign to true/)
  670. assert_syntax_error(%q(false = 1), /Can't assign to false/)
  671. assert_syntax_error(%q(__FILE__ = 1), /Can't assign to __FILE__/)
  672. assert_syntax_error(%q(__LINE__ = 1), /Can't assign to __LINE__/)
  673. assert_syntax_error(%q(__ENCODING__ = 1), /Can't assign to __ENCODING__/)
  674. assert_syntax_error("def foo; FOO = 1; end", /dynamic constant assignment/)
  675. assert_syntax_error("x, true", /Can't assign to true/)
  676. end
  677. def test_block_dup
  678. assert_syntax_error("foo(&proc{}) {}", /both block arg and actual block/)
  679. end
  680. def test_set_backref
  681. assert_syntax_error("$& = 1", /Can't set variable/)
  682. end
  683. def test_arg_concat
  684. o = Object.new
  685. class << o; self; end.instance_eval do
  686. define_method(:[]=) {|*r, &b| b.call(r) }
  687. end
  688. r = nil
  689. assert_nothing_raised do
  690. eval <<-END, nil, __FILE__, __LINE__+1
  691. o[&proc{|x| r = x }] = 1
  692. END
  693. end
  694. assert_equal([1], r)
  695. end
  696. def test_void_expr_stmts_value
  697. x = 1
  698. useless_use = /useless use/
  699. unused = /unused/
  700. assert_nil assert_warning(useless_use) {eval("x; nil")}
  701. assert_nil assert_warning(useless_use) {eval("1+1; nil")}
  702. assert_nil assert_warning('') {eval("1.+(1); nil")}
  703. assert_nil assert_warning(useless_use) {eval("TestParse; nil")}
  704. assert_nil assert_warning(useless_use) {eval("::TestParse; nil")}
  705. assert_nil assert_warning(useless_use) {eval("x..x; nil")}
  706. assert_nil assert_warning(useless_use) {eval("x...x; nil")}
  707. assert_nil assert_warning(unused) {eval("self; nil")}
  708. assert_nil assert_warning(unused) {eval("nil; nil")}
  709. assert_nil assert_warning(unused) {eval("true; nil")}
  710. assert_nil assert_warning(unused) {eval("false; nil")}
  711. assert_nil assert_warning(useless_use) {eval("defined?(1); nil")}
  712. assert_equal 1, x
  713. assert_syntax_error("1; next; 2", /Invalid next/)
  714. end
  715. def test_assign_in_conditional
  716. assert_nothing_raised do
  717. eval <<-END, nil, __FILE__, __LINE__+1
  718. (x, y = 1, 2) ? 1 : 2
  719. END
  720. end
  721. assert_nothing_raised do
  722. eval <<-END, nil, __FILE__, __LINE__+1
  723. if @x = true
  724. 1
  725. else
  726. 2
  727. end
  728. END
  729. end
  730. end
  731. def test_literal_in_conditional
  732. assert_nothing_raised do
  733. eval <<-END, nil, __FILE__, __LINE__+1
  734. "foo" ? 1 : 2
  735. END
  736. end
  737. assert_nothing_raised do
  738. x = "bar"
  739. eval <<-END, nil, __FILE__, __LINE__+1
  740. /foo#{x}baz/ ? 1 : 2
  741. END
  742. end
  743. assert_nothing_raised do
  744. eval <<-END, nil, __FILE__, __LINE__+1
  745. (true..false) ? 1 : 2
  746. END
  747. end
  748. assert_nothing_raised do
  749. eval <<-END, nil, __FILE__, __LINE__+1
  750. ("foo".."bar") ? 1 : 2
  751. END
  752. end
  753. assert_nothing_raised do
  754. x = "bar"
  755. eval <<-END, nil, __FILE__, __LINE__+1
  756. :"foo#{"x"}baz" ? 1 : 2
  757. END
  758. assert_equal "bar", x
  759. end
  760. end
  761. def test_no_blockarg
  762. assert_syntax_error("yield(&:+)", /block argument should not be given/)
  763. end
  764. def test_method_block_location
  765. bug5614 = '[ruby-core:40936]'
  766. expected = nil
  767. e = assert_raise(NoMethodError) do
  768. 1.times do
  769. expected = __LINE__+1
  770. end.print do
  771. #
  772. end
  773. end
  774. actual = e.backtrace.first[/\A#{Regexp.quote(__FILE__)}:(\d+):/o, 1].to_i
  775. assert_equal(expected, actual, bug5614)
  776. end
  777. def test_no_shadowing_variable_warning
  778. assert_no_warning(/shadowing outer local variable/) {eval("a=1; tap {|a|}")}
  779. end
  780. def test_unused_variable
  781. o = Object.new
  782. assert_warning(/assigned but unused variable/) {o.instance_eval("def foo; a=1; nil; end")}
  783. assert_warning(/assigned but unused variable/) {o.instance_eval("def bar; a=1; a(); end")}
  784. a = "\u{3042}"
  785. assert_warning(/#{a}/) {o.instance_eval("def foo0; #{a}=1; nil; end")}
  786. assert_warning(/assigned but unused variable/) {o.instance_eval("def foo1; tap {a=1; a()}; end")}
  787. assert_warning('') {o.instance_eval("def bar1; a=a=1; nil; end")}
  788. assert_warning(/assigned but unused variable/) {o.instance_eval("def bar2; a, = 1, 2; end")}
  789. assert_warning('') {o.instance_eval("def marg1(a); nil; end")}
  790. assert_warning('') {o.instance_eval("def marg2((a)); nil; end")}
  791. end
  792. def test_named_capture_conflict
  793. a = 1
  794. assert_warning('') {eval("a = 1; /(?<a>)/ =~ ''")}
  795. a = "\u{3042}"
  796. assert_warning('') {eval("#{a} = 1; /(?<#{a}>)/ =~ ''")}
  797. end
  798. def test_rescue_in_command_assignment
  799. bug = '[ruby-core:75621] [Bug #12402]'
  800. all_assertions(bug) do |a|
  801. a.for("lhs = arg") do
  802. v = bug
  803. v = raise(bug) rescue "ok"
  804. assert_equal("ok", v)
  805. end
  806. a.for("lhs op_asgn arg") do
  807. v = 0
  808. v += raise(bug) rescue 1
  809. assert_equal(1, v)
  810. end
  811. a.for("lhs[] op_asgn arg") do
  812. v = [0]
  813. v[0] += raise(bug) rescue 1
  814. assert_equal([1], v)
  815. end
  816. a.for("lhs.m op_asgn arg") do
  817. k = Struct.new(:m)
  818. v = k.new(0)
  819. v.m += raise(bug) rescue 1
  820. assert_equal(k.new(1), v)
  821. end
  822. a.for("lhs::m op_asgn arg") do
  823. k = Struct.new(:m)
  824. v = k.new(0)
  825. v::m += raise(bug) rescue 1
  826. assert_equal(k.new(1), v)
  827. end
  828. a.for("lhs.C op_asgn arg") do
  829. k = Struct.new(:C)
  830. v = k.new(0)
  831. v.C += raise(bug) rescue 1
  832. assert_equal(k.new(1), v)
  833. end
  834. a.for("lhs::C op_asgn arg") do
  835. v = Class.new
  836. v::C ||= raise(bug) rescue 1
  837. assert_equal(1, v::C)
  838. end
  839. a.for("lhs = command") do
  840. v = bug
  841. v = raise bug rescue "ok"
  842. assert_equal("ok", v)
  843. end
  844. a.for("lhs op_asgn command") do
  845. v = 0
  846. v += raise bug rescue 1
  847. assert_equal(1, v)
  848. end
  849. a.for("lhs[] op_asgn command") do
  850. v = [0]
  851. v[0] += raise bug rescue 1
  852. assert_equal([1], v)
  853. end
  854. a.for("lhs.m op_asgn command") do
  855. k = Struct.new(:m)
  856. v = k.new(0)
  857. v.m += raise bug rescue 1
  858. assert_equal(k.new(1), v)
  859. end
  860. a.for("lhs::m op_asgn command") do
  861. k = Struct.new(:m)
  862. v = k.new(0)
  863. v::m += raise bug rescue 1
  864. assert_equal(k.new(1), v)
  865. end
  866. a.for("lhs.C op_asgn command") do
  867. k = Struct.new(:C)
  868. v = k.new(0)
  869. v.C += raise bug rescue 1
  870. assert_equal(k.new(1), v)
  871. end
  872. a.for("lhs::C op_asgn command") do
  873. v = Class.new
  874. v::C ||= raise bug rescue 1
  875. assert_equal(1, v::C)
  876. end
  877. end
  878. end
  879. def test_yyerror_at_eol
  880. assert_syntax_error(" 0b", /\^/)
  881. assert_syntax_error(" 0b\n", /\^/)
  882. end
  883. def test_error_def_in_argument
  884. assert_separately([], "#{<<-"begin;"}\n#{<<~"end;"}")
  885. begin;
  886. assert_syntax_error("def f r:def d; def f 0end", /unexpected/)
  887. end;
  888. assert_syntax_error("def\nf(000)end", /^ \^~~/)
  889. assert_syntax_error("def\nf(&)end", /^ \^/)
  890. end
  891. def test_method_location_in_rescue
  892. bug = '[ruby-core:79388] [Bug #13181]'
  893. obj, line = Object.new, __LINE__+1
  894. def obj.location
  895. #
  896. raise
  897. rescue
  898. caller_locations(1, 1)[0]
  899. end
  900. assert_equal(line, obj.location.lineno, bug)
  901. end
  902. def test_negative_line_number
  903. bug = '[ruby-core:80920] [Bug #13523]'
  904. obj = Object.new
  905. obj.instance_eval("def t(e = false);raise if e; __LINE__;end", "test", -100)
  906. assert_equal(-100, obj.t, bug)
  907. assert_equal(-100, obj.method(:t).source_location[1], bug)
  908. e = assert_raise(RuntimeError) {obj.t(true)}
  909. assert_equal(-100, e.backtrace_locations.first.lineno, bug)
  910. end
  911. def test_file_in_indented_heredoc
  912. name = '[ruby-core:80987] [Bug #13540]' # long enough to be shared
  913. assert_equal(name+"\n", eval("#{<<-"begin;"}\n#{<<-'end;'}", nil, name))
  914. begin;
  915. <<~HEREDOC
  916. #{__FILE__}
  917. HEREDOC
  918. end;
  919. end
  920. def test_unexpected_token_error
  921. assert_syntax_error('"x"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', /unexpected/)
  922. end
  923. def test_unexpected_token_after_numeric
  924. assert_syntax_error('0000xyz', /^ \^~~\Z/)
  925. assert_syntax_error('1.2i1.1', /^ \^~~\Z/)
  926. assert_syntax_error('1.2.3', /^ \^~\Z/)
  927. end
  928. def test_truncated_source_line
  929. e = assert_syntax_error("'0123456789012345678901234567890123456789' abcdefghijklmnopqrstuvwxyz0123456789 0123456789012345678901234567890123456789",
  930. /unexpected local variable or method/)
  931. line = e.message.lines[1]
  932. assert_operator(line, :start_with?, "...")
  933. assert_operator(line, :end_with?, "...\n")
  934. end
  935. def test_unterminated_regexp_error
  936. e = assert_syntax_error("/x", /unterminated regexp meets end of file/)
  937. assert_not_match(/unexpected tSTRING_END/, e.message)
  938. end
  939. def test_lparenarg
  940. o = Struct.new(:x).new
  941. def o.i(x)
  942. self.x = x
  943. end
  944. o.instance_eval {i (-1.3).abs}
  945. assert_equal(1.3, o.x)
  946. o.i(nil)
  947. o.instance_eval {i = 0; i (-1.3).abs; i}
  948. assert_equal(1.3, o.x)
  949. end
  950. def test_serial_comparison
  951. assert_warning(/comparison '<' after/) do
  952. $VERBOSE = true
  953. x = 1
  954. eval("if false; 0 < x < 2; end")
  955. x
  956. end
  957. end
  958. def test_eof
  959. assert_equal(42, eval("42\0""end"))
  960. assert_equal(42, eval("42\C-d""end"))
  961. assert_equal(42, eval("42\C-z""end"))
  962. end
  963. def test_eof_in_def
  964. assert_syntax_error("def m\n\0""end", /unexpected/)
  965. assert_syntax_error("def m\n\C-d""end", /unexpected/)
  966. assert_syntax_error("def m\n\C-z""end", /unexpected/)
  967. end
  968. def test_location_of_invalid_token
  969. assert_syntax_error('class xxx end', /^ \^~~\Z/)
  970. end
  971. def test_whitespace_warning
  972. assert_syntax_error("\\foo", /backslash/)
  973. assert_syntax_error("\\ ", /escaped space/)
  974. assert_syntax_error("\\\t", /escaped horizontal tab/)
  975. assert_syntax_error("\\\f", /escaped form feed/)
  976. assert_syntax_error("\\\r", /escaped carriage return/)
  977. assert_warn(/middle of line/) {eval(" \r ")}
  978. assert_syntax_error("\\\v", /escaped vertical tab/)
  979. end
  980. def test_command_def_cmdarg
  981. assert_valid_syntax("\n#{<<~"begin;"}\n#{<<~'end;'}")
  982. begin;
  983. m def x(); end
  984. 1.tap do end
  985. end;
  986. end
  987. NONASCII_CONSTANTS = [
  988. *%W"\u{00de} \u{00C0}".flat_map {|c| [c, c.encode("iso-8859-15")]},
  989. "\u{1c4}", "\u{1f2}", "\u{1f88}", "\u{370}",
  990. *%W"\u{391} \u{ff21}".flat_map {|c| [c, c.encode("cp932"), c.encode("euc-jp")]},
  991. ]
  992. def assert_nonascii_const
  993. assert_all_assertions_foreach("NONASCII_CONSTANTS", *NONASCII_CONSTANTS) do |n|
  994. m = Module.new
  995. assert_not_operator(m, :const_defined?, n)
  996. assert_raise_with_message(NameError, /uninitialized/) do
  997. m.const_get(n)
  998. end
  999. assert_nil(eval("defined?(m::#{n})"))
  1000. v = yield m, n
  1001. assert_operator(m, :const_defined?, n)
  1002. assert_equal("constant", eval("defined?(m::#{n})"))
  1003. assert_same(v, m.const_get(n))
  1004. m.__send__(:remove_const, n)
  1005. assert_not_operator(m, :const_defined?, n)
  1006. assert_nil(eval("defined?(m::#{n})"))
  1007. end
  1008. end
  1009. def test_nonascii_const_set
  1010. assert_nonascii_const do |m, n|
  1011. m.const_set(n, 42)
  1012. end
  1013. end
  1014. def test_nonascii_constant
  1015. assert_nonascii_const do |m, n|
  1016. m.module_eval("class #{n}; self; end")
  1017. end
  1018. end
  1019. def test_cdmarg_after_command_args_and_tlbrace_arg
  1020. assert_valid_syntax('let () { m(a) do; end }')
  1021. end
  1022. def test_void_value_in_command_rhs
  1023. w = "void value expression"
  1024. ex = assert_syntax_error("x = return 1", w)
  1025. assert_equal(1, ex.message.scan(w).size, "same #{w.inspect} warning should be just once")
  1026. end
  1027. =begin
  1028. def test_past_scope_variable
  1029. assert_warning(/past scope/) {catch {|tag| eval("BEGIN{throw tag}; tap {a = 1}; a")}}
  1030. end
  1031. =end
  1032. end