2021-09-14 08:38:11 -04:00
|
|
|
require File.expand_path(File.join(__dir__, 'case'))
|
2019-05-13 08:25:22 -04:00
|
|
|
|
|
|
|
module Racc
|
|
|
|
class TestRaccCommand < TestCase
|
|
|
|
def test_syntax_y
|
|
|
|
assert_compile 'syntax.y', '-v'
|
|
|
|
assert_debugfile 'syntax.y', [0,0,0,0,0]
|
|
|
|
end
|
|
|
|
|
|
|
|
def test_percent_y
|
|
|
|
assert_compile 'percent.y'
|
|
|
|
assert_debugfile 'percent.y', []
|
|
|
|
assert_exec 'percent.y'
|
|
|
|
end
|
|
|
|
|
|
|
|
def test_scan_y
|
|
|
|
assert_compile 'scan.y'
|
|
|
|
assert_debugfile 'scan.y', []
|
|
|
|
assert_exec 'scan.y'
|
|
|
|
end
|
|
|
|
|
|
|
|
def test_newsyn_y
|
|
|
|
assert_compile 'newsyn.y'
|
|
|
|
assert_debugfile 'newsyn.y', []
|
|
|
|
end
|
|
|
|
|
|
|
|
def test_normal_y
|
|
|
|
assert_compile 'normal.y'
|
|
|
|
assert_debugfile 'normal.y', []
|
|
|
|
|
|
|
|
assert_compile 'normal.y', '-vg'
|
|
|
|
assert_debugfile 'normal.y', []
|
|
|
|
end
|
|
|
|
|
|
|
|
def test_chk_y
|
|
|
|
assert_compile 'chk.y', '-vg'
|
|
|
|
assert_debugfile 'chk.y', []
|
|
|
|
assert_exec 'chk.y'
|
|
|
|
|
|
|
|
assert_compile 'chk.y', '--line-convert-all'
|
|
|
|
assert_debugfile 'chk.y', []
|
|
|
|
assert_exec 'chk.y'
|
|
|
|
end
|
|
|
|
|
|
|
|
def test_echk_y
|
|
|
|
assert_compile 'echk.y', '-E'
|
|
|
|
assert_debugfile 'echk.y', []
|
|
|
|
assert_exec 'echk.y'
|
|
|
|
end
|
|
|
|
|
|
|
|
def test_err_y
|
|
|
|
assert_compile 'err.y'
|
|
|
|
assert_debugfile 'err.y', []
|
|
|
|
assert_exec 'err.y'
|
|
|
|
end
|
|
|
|
|
|
|
|
def test_mailp_y
|
|
|
|
assert_compile 'mailp.y'
|
|
|
|
assert_debugfile 'mailp.y', []
|
|
|
|
end
|
|
|
|
|
|
|
|
def test_conf_y
|
|
|
|
assert_compile 'conf.y', '-v'
|
|
|
|
assert_debugfile 'conf.y', [4,1,1,2]
|
|
|
|
end
|
|
|
|
|
|
|
|
def test_rrconf_y
|
|
|
|
assert_compile 'rrconf.y'
|
|
|
|
assert_debugfile 'rrconf.y', [1,1,0,0]
|
|
|
|
end
|
|
|
|
|
|
|
|
def test_useless_y
|
|
|
|
assert_compile 'useless.y'
|
|
|
|
assert_debugfile 'useless.y', [0,0,1,2]
|
|
|
|
end
|
|
|
|
|
|
|
|
def test_opt_y
|
|
|
|
assert_compile 'opt.y'
|
|
|
|
assert_debugfile 'opt.y', []
|
|
|
|
assert_exec 'opt.y'
|
|
|
|
end
|
|
|
|
|
|
|
|
def test_yyerr_y
|
|
|
|
assert_compile 'yyerr.y'
|
|
|
|
assert_debugfile 'yyerr.y', []
|
|
|
|
assert_exec 'yyerr.y'
|
|
|
|
end
|
|
|
|
|
|
|
|
def test_recv_y
|
|
|
|
assert_compile 'recv.y'
|
|
|
|
assert_debugfile 'recv.y', [5,10,1,4]
|
|
|
|
end
|
|
|
|
|
|
|
|
def test_ichk_y
|
|
|
|
assert_compile 'ichk.y'
|
|
|
|
assert_debugfile 'ichk.y', []
|
|
|
|
assert_exec 'ichk.y'
|
|
|
|
end
|
|
|
|
|
|
|
|
def test_intp_y
|
|
|
|
assert_compile 'intp.y'
|
|
|
|
assert_debugfile 'intp.y', []
|
|
|
|
assert_exec 'intp.y'
|
|
|
|
end
|
|
|
|
|
|
|
|
def test_expect_y
|
|
|
|
assert_compile 'expect.y'
|
|
|
|
assert_debugfile 'expect.y', [1,0,0,0,1]
|
|
|
|
end
|
|
|
|
|
|
|
|
def test_nullbug1_y
|
|
|
|
assert_compile 'nullbug1.y'
|
|
|
|
assert_debugfile 'nullbug1.y', [0,0,0,0]
|
|
|
|
end
|
|
|
|
|
|
|
|
def test_nullbug2_y
|
|
|
|
assert_compile 'nullbug2.y'
|
|
|
|
assert_debugfile 'nullbug2.y', [0,0,0,0]
|
|
|
|
end
|
|
|
|
|
|
|
|
def test_firstline_y
|
|
|
|
assert_compile 'firstline.y'
|
|
|
|
assert_debugfile 'firstline.y', []
|
|
|
|
end
|
|
|
|
|
|
|
|
def test_nonass_y
|
|
|
|
assert_compile 'nonass.y'
|
|
|
|
assert_debugfile 'nonass.y', []
|
|
|
|
assert_exec 'nonass.y'
|
|
|
|
end
|
|
|
|
|
|
|
|
def test_digraph_y
|
|
|
|
assert_compile 'digraph.y'
|
|
|
|
assert_debugfile 'digraph.y', []
|
|
|
|
assert_exec 'digraph.y'
|
|
|
|
end
|
|
|
|
|
|
|
|
def test_noend_y
|
|
|
|
assert_compile 'noend.y'
|
|
|
|
assert_debugfile 'noend.y', []
|
|
|
|
end
|
|
|
|
|
|
|
|
def test_norule_y
|
2019-10-30 08:38:55 -04:00
|
|
|
assert_raise(Test::Unit::AssertionFailedError) {
|
2019-05-13 08:25:22 -04:00
|
|
|
assert_compile 'norule.y'
|
|
|
|
}
|
|
|
|
end
|
|
|
|
|
|
|
|
def test_unterm_y
|
2019-10-30 08:38:55 -04:00
|
|
|
assert_raise(Test::Unit::AssertionFailedError) {
|
2019-05-13 08:25:22 -04:00
|
|
|
assert_compile 'unterm.y'
|
|
|
|
}
|
|
|
|
end
|
|
|
|
|
|
|
|
# Regression test for a problem where error recovery at EOF would cause
|
|
|
|
# a Racc-generated parser to go into an infinite loop (on some grammars)
|
|
|
|
def test_error_recovery_y
|
|
|
|
assert_compile 'error_recovery.y'
|
|
|
|
Timeout.timeout(10) do
|
|
|
|
assert_exec 'error_recovery.y'
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
# .y files from `parser` gem
|
|
|
|
|
|
|
|
def test_ruby18
|
2019-06-19 10:10:40 -04:00
|
|
|
assert_compile 'ruby18.y', [], timeout: 60
|
2019-05-13 08:25:22 -04:00
|
|
|
assert_debugfile 'ruby18.y', []
|
2019-10-30 08:38:55 -04:00
|
|
|
assert_output_unchanged 'ruby18.y'
|
2019-05-13 08:25:22 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
def test_ruby22
|
2019-06-19 10:10:40 -04:00
|
|
|
assert_compile 'ruby22.y', [], timeout: 60
|
2019-05-13 08:25:22 -04:00
|
|
|
assert_debugfile 'ruby22.y', []
|
2019-10-30 08:38:55 -04:00
|
|
|
assert_output_unchanged 'ruby22.y'
|
2019-05-13 08:25:22 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
# .y file from csspool gem
|
|
|
|
|
|
|
|
def test_csspool
|
|
|
|
assert_compile 'csspool.y'
|
|
|
|
assert_debugfile 'csspool.y', [5, 3]
|
2019-10-30 08:38:55 -04:00
|
|
|
assert_output_unchanged 'csspool.y'
|
2019-05-13 08:25:22 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
# .y file from opal gem
|
|
|
|
|
|
|
|
def test_opal
|
2019-06-19 10:10:40 -04:00
|
|
|
assert_compile 'opal.y', [], timeout: 60
|
2019-05-13 08:25:22 -04:00
|
|
|
assert_debugfile 'opal.y', []
|
2019-10-30 08:38:55 -04:00
|
|
|
assert_output_unchanged 'opal.y'
|
2019-05-13 08:25:22 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
# .y file from journey gem
|
|
|
|
|
|
|
|
def test_journey
|
|
|
|
assert_compile 'journey.y'
|
|
|
|
assert_debugfile 'journey.y', []
|
2019-10-30 08:38:55 -04:00
|
|
|
assert_output_unchanged 'journey.y'
|
2019-05-13 08:25:22 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
# .y file from nokogiri gem
|
|
|
|
|
|
|
|
def test_nokogiri_css
|
|
|
|
assert_compile 'nokogiri-css.y'
|
|
|
|
assert_debugfile 'nokogiri-css.y', [0, 1]
|
2019-10-30 08:38:55 -04:00
|
|
|
assert_output_unchanged 'nokogiri-css.y'
|
2019-05-13 08:25:22 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
# .y file from edtf-ruby gem
|
|
|
|
|
|
|
|
def test_edtf
|
|
|
|
assert_compile 'edtf.y'
|
|
|
|
assert_debugfile 'edtf.y', [0, 0, 0, 0, 0]
|
2019-10-30 08:38:55 -04:00
|
|
|
assert_output_unchanged 'edtf.y'
|
2019-05-13 08:25:22 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
# .y file from namae gem
|
|
|
|
|
|
|
|
def test_namae
|
|
|
|
assert_compile 'namae.y'
|
|
|
|
assert_debugfile 'namae.y', [0, 0, 0, 0, 0]
|
2019-10-30 08:38:55 -04:00
|
|
|
assert_output_unchanged 'namae.y'
|
2019-05-13 08:25:22 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
# .y file from liquor gem
|
|
|
|
|
|
|
|
def test_liquor
|
|
|
|
assert_compile 'liquor.y'
|
|
|
|
assert_debugfile 'liquor.y', [0, 0, 0, 0, 15]
|
2019-10-30 08:38:55 -04:00
|
|
|
assert_output_unchanged 'liquor.y'
|
2019-05-13 08:25:22 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
# .y file from nasl gem
|
|
|
|
|
|
|
|
def test_nasl
|
|
|
|
assert_compile 'nasl.y'
|
|
|
|
assert_debugfile 'nasl.y', [0, 0, 0, 0, 1]
|
2019-10-30 08:38:55 -04:00
|
|
|
assert_output_unchanged 'nasl.y'
|
2019-05-13 08:25:22 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
# .y file from riml gem
|
|
|
|
|
|
|
|
def test_riml
|
|
|
|
assert_compile 'riml.y'
|
|
|
|
assert_debugfile 'riml.y', [289, 0, 0, 0]
|
2019-10-30 08:38:55 -04:00
|
|
|
assert_output_unchanged 'riml.y'
|
2019-05-13 08:25:22 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
# .y file from ruby-php-serialization gem
|
|
|
|
|
|
|
|
def test_php_serialization
|
|
|
|
assert_compile 'php_serialization.y'
|
|
|
|
assert_debugfile 'php_serialization.y', [0, 0, 0, 0]
|
2019-10-30 08:38:55 -04:00
|
|
|
assert_output_unchanged 'php_serialization.y'
|
2019-05-13 08:25:22 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
# .y file from huia language implementation
|
|
|
|
|
|
|
|
def test_huia
|
|
|
|
assert_compile 'huia.y'
|
|
|
|
assert_debugfile 'huia.y', [285, 0, 0, 0]
|
2019-10-30 08:38:55 -04:00
|
|
|
assert_output_unchanged 'huia.y'
|
2019-05-13 08:25:22 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
# .y file from cast gem
|
|
|
|
|
|
|
|
def test_cast
|
|
|
|
assert_compile 'cast.y'
|
|
|
|
assert_debugfile 'cast.y', [0, 0, 0, 0, 1]
|
2019-10-30 08:38:55 -04:00
|
|
|
assert_output_unchanged 'cast.y'
|
2019-05-13 08:25:22 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
# .y file from cadenza gem
|
|
|
|
|
|
|
|
def test_cadenza
|
|
|
|
assert_compile 'cadenza.y'
|
|
|
|
assert_debugfile 'cadenza.y', [0, 0, 0, 0, 37]
|
2019-10-30 08:38:55 -04:00
|
|
|
assert_output_unchanged 'cadenza.y'
|
2019-05-13 08:25:22 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
# .y file from mediacloth gem
|
|
|
|
|
|
|
|
def test_mediacloth
|
|
|
|
assert_compile 'mediacloth.y'
|
|
|
|
assert_debugfile 'mediacloth.y', [0, 0, 0, 0]
|
2019-10-30 08:38:55 -04:00
|
|
|
assert_output_unchanged 'mediacloth.y'
|
2019-05-13 08:25:22 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
# .y file from twowaysql gem
|
|
|
|
|
|
|
|
def test_twowaysql
|
|
|
|
assert_compile 'twowaysql.y'
|
|
|
|
assert_debugfile 'twowaysql.y', [4, 0, 0, 0]
|
2019-10-30 08:38:55 -04:00
|
|
|
assert_output_unchanged 'twowaysql.y'
|
2019-05-13 08:25:22 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
# .y file from machete gem
|
|
|
|
|
|
|
|
def test_machete
|
|
|
|
assert_compile 'machete.y'
|
|
|
|
assert_debugfile 'machete.y', [0, 0, 0, 0]
|
2019-10-30 08:38:55 -04:00
|
|
|
assert_output_unchanged 'machete.y'
|
2019-05-13 08:25:22 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
# .y file from mof gem
|
|
|
|
|
|
|
|
def test_mof
|
|
|
|
assert_compile 'mof.y'
|
|
|
|
assert_debugfile 'mof.y', [7, 4, 0, 0]
|
2019-10-30 08:38:55 -04:00
|
|
|
assert_output_unchanged 'mof.y'
|
2019-05-13 08:25:22 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
# .y file from tp_plus gem
|
|
|
|
|
|
|
|
def test_tp_plus
|
|
|
|
assert_compile 'tp_plus.y'
|
|
|
|
assert_debugfile 'tp_plus.y', [21, 0, 0, 0]
|
2019-10-30 08:38:55 -04:00
|
|
|
assert_output_unchanged 'tp_plus.y'
|
2019-05-13 08:25:22 -04:00
|
|
|
end
|
2020-08-13 21:50:16 -04:00
|
|
|
|
|
|
|
def test_ifelse
|
2020-11-10 07:12:35 -05:00
|
|
|
omit if RUBY_PLATFORM =~ /java/
|
|
|
|
|
2020-08-13 21:50:16 -04:00
|
|
|
stderr = nil
|
|
|
|
racc "-o#{@TAB_DIR}/ifelse", "#{ASSET_DIR}/ifelse.y", stdout_filter: ->(s) { stderr = s }
|
2020-09-28 22:58:04 -04:00
|
|
|
stderr = stderr.lines[1..-1].join if RUBY_PLATFORM.match?(/java/)
|
2020-08-13 21:50:16 -04:00
|
|
|
assert_equal(<<~STDERR, stderr)
|
|
|
|
1 useless nonterminals:
|
|
|
|
dummy
|
|
|
|
2 useless rules:
|
|
|
|
#4 (dummy)
|
|
|
|
#5 (dummy)
|
|
|
|
1 shift/reduce conflicts
|
|
|
|
Turn on logging with "-v" and check ".output" file for details
|
|
|
|
STDERR
|
|
|
|
end
|
2019-05-13 08:25:22 -04:00
|
|
|
end
|
|
|
|
end
|