summaryrefslogtreecommitdiff
path: root/test/racc
diff options
context:
space:
mode:
authorHiroshi SHIBATA <[email protected]>2023-06-08 10:13:00 +0900
committerHiroshi SHIBATA <[email protected]>2023-06-08 10:13:00 +0900
commita84f2fe8d176a8fa57aa559022a862d568c54e98 (patch)
treecc85fb7b2838a4c646086b3ee8c7830c2023f0f7 /test/racc
parent8a77275709ee36c72dc589fd0d4560ed05ff3b9b (diff)
Manually merge https://github.com/ruby/racc/pull/217
Diffstat (limited to 'test/racc')
-rw-r--r--test/racc/case.rb9
-rw-r--r--test/racc/test_sample.rb80
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