diff options
author | Hiroshi SHIBATA <[email protected]> | 2023-06-08 10:13:00 +0900 |
---|---|---|
committer | Hiroshi SHIBATA <[email protected]> | 2023-06-08 10:13:00 +0900 |
commit | a84f2fe8d176a8fa57aa559022a862d568c54e98 (patch) | |
tree | cc85fb7b2838a4c646086b3ee8c7830c2023f0f7 /test/racc | |
parent | 8a77275709ee36c72dc589fd0d4560ed05ff3b9b (diff) |
Manually merge https://github.com/ruby/racc/pull/217
Diffstat (limited to 'test/racc')
-rw-r--r-- | test/racc/case.rb | 9 | ||||
-rw-r--r-- | test/racc/test_sample.rb | 80 |
2 files changed, 85 insertions, 4 deletions
diff --git a/test/racc/case.rb b/test/racc/case.rb index ebc30b8288..f44bf5e5ca 100644 --- a/test/racc/case.rb +++ b/test/racc/case.rb @@ -11,6 +11,7 @@ require 'timeout' module Racc class TestCase < Test::Unit::TestCase PROJECT_DIR = File.expand_path(File.join(__dir__, '..')) + SAMPLE_DIR = File.join(PROJECT_DIR, 'sample') test_dir = File.join(PROJECT_DIR, 'test') test_dir = File.join(PROJECT_DIR, 'racc') unless File.exist?(test_dir) @@ -23,6 +24,8 @@ module Racc ASSET_DIR = File.join(TEST_DIR, 'assets') # test grammars REGRESS_DIR = File.join(TEST_DIR, 'regress') # known-good generated outputs + LIB_DIR = File.expand_path("../../lib", __FILE__) + INC = [ File.join(PROJECT_DIR, 'lib'), File.join(PROJECT_DIR, 'ext'), @@ -73,9 +76,8 @@ module Racc end def assert_exec(asset) - lib_path = File.expand_path("../../lib", __FILE__) file = File.basename(asset, '.y') - ruby "-I#{lib_path}", "#{@TAB_DIR}/#{file}" + ruby "-I#{LIB_DIR}", "#{@TAB_DIR}/#{file}" end def strip_version(source) @@ -96,8 +98,7 @@ module Racc end def racc(*arg, **opt) - lib_path = File.expand_path("../../lib", __FILE__) - ruby "-I#{lib_path}", "-S", RACC, *arg, **opt + ruby "-I#{LIB_DIR}", "-S", RACC, *arg, **opt end def ruby(*arg, **opt) diff --git a/test/racc/test_sample.rb b/test/racc/test_sample.rb new file mode 100644 index 0000000000..2c7813f50c --- /dev/null +++ b/test/racc/test_sample.rb @@ -0,0 +1,80 @@ +require File.expand_path('lib/helper', __dir__) + +module Racc + class TestSample < TestCase + # working samples + [ + { + grammar_file: "array.y", + parser_class: :ArrayParser, + testcases: [ + { input: "[1]", expected: ["1"] }, + { input: "[1, 2]", expected: ["1", "2"] }, + ] + }, + { + grammar_file: "array2.y", + parser_class: :ArrayParser2, + testcases: [ + { input: "[1]", expected: ["1"] }, + { input: "[1, 2]", expected: ["1", "2"] }, + ] + }, + { + grammar_file: "calc.y", + parser_class: :Calcp, + testcases: [ + { input: "1", expected: 1 }, + { input: "10", expected: 10 }, + { input: "2 + 1", expected: 3 }, + { input: "2 - 1", expected: 1 }, + { input: "3 * 4", expected: 12 }, + { input: "4 / 2", expected: 2 }, + { input: "3 / 2", expected: 1 }, + { input: "2 + 3 * 4", expected: 14 }, + { input: "(2 + 3) * 4", expected: 20 }, + { input: "2 + (3 * 4)", expected: 14 }, + ] + }, + { + grammar_file: "hash.y", + parser_class: :HashParser, + testcases: [ + { input: "{}", expected: {} }, + { input: "{ a => b }", expected: { "a" => "b" } }, + { input: "{ a => b, 1 => 2 }", expected: { "a" => "b", "1" => "2" } }, + ] + }, + ].each do |data| + define_method "test_#{data[:grammar_file]}" do + outfile = compile_sample(data[:grammar_file]) + + load(outfile) + + parser_class = Object.const_get(data[:parser_class]) + data[:testcases].each do |testcase| + input = testcase[:input] + actual = parser_class.new.parse(input) + expected = testcase[:expected] + assert_equal(expected, actual, "expected #{expected} but got #{actual} when input is #{input}") + end + ensure + remove_const_f(data[:parser_class]) + end + end + + private + + # returns the generated file's path + def compile_sample(yfile) + file = File.basename(yfile, '.y') + out = File.join(@OUT_DIR, file) + ruby "-I#{LIB_DIR}", RACC, File.join(SAMPLE_DIR, yfile), "-o#{out}" + out + end + + def remove_const_f(const_name) + Object.send(:remove_const, const_name) if Object.const_defined?(const_name, false) + end + end +end |