2019-05-13 08:25:22 -04:00
|
|
|
$VERBOSE = true
|
|
|
|
require 'minitest/autorun'
|
|
|
|
require 'racc/static'
|
|
|
|
require 'fileutils'
|
|
|
|
require 'tempfile'
|
|
|
|
require 'timeout'
|
|
|
|
|
|
|
|
module Racc
|
2019-06-02 07:11:24 -04:00
|
|
|
class TestCase < Test::Unit::TestCase
|
2019-05-13 08:25:22 -04:00
|
|
|
PROJECT_DIR = File.expand_path(File.join(File.dirname(__FILE__), '..'))
|
|
|
|
|
2019-05-14 08:18:57 -04:00
|
|
|
test_dir = File.join(PROJECT_DIR, 'test')
|
|
|
|
test_dir = File.join(PROJECT_DIR, 'racc') unless File.exist?(test_dir)
|
2019-06-02 06:56:57 -04:00
|
|
|
TEST_DIR = test_dir
|
|
|
|
TEMP_DIR = Dir.mktmpdir("racc")
|
2019-05-14 08:18:57 -04:00
|
|
|
racc = File.join(PROJECT_DIR, 'bin', 'racc')
|
|
|
|
racc = File.join(PROJECT_DIR, '..', 'libexec', 'racc') unless File.exist?(racc)
|
|
|
|
RACC = racc
|
2019-06-02 06:56:57 -04:00
|
|
|
OUT_DIR = File.join(TEMP_DIR, 'out')
|
|
|
|
TAB_DIR = File.join(TEMP_DIR, 'tab') # generated parsers go here
|
|
|
|
LOG_DIR = File.join(TEMP_DIR, 'log')
|
|
|
|
ERR_DIR = File.join(TEMP_DIR, 'err')
|
|
|
|
ASSET_DIR = File.join(TEST_DIR, 'assets') # test grammars
|
|
|
|
REGRESS_DIR = File.join(TEST_DIR, 'regress') # known-good generated outputs
|
2019-05-13 08:25:22 -04:00
|
|
|
|
|
|
|
INC = [
|
|
|
|
File.join(PROJECT_DIR, 'lib'),
|
|
|
|
File.join(PROJECT_DIR, 'ext'),
|
|
|
|
].join(':')
|
|
|
|
|
|
|
|
def setup
|
|
|
|
[OUT_DIR, TAB_DIR, LOG_DIR, ERR_DIR].each do |dir|
|
|
|
|
FileUtils.mkdir_p(dir)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def teardown
|
|
|
|
[OUT_DIR, TAB_DIR, LOG_DIR, ERR_DIR].each do |dir|
|
|
|
|
FileUtils.rm_rf(dir)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def assert_compile(asset, args = [])
|
|
|
|
file = File.basename(asset, '.y')
|
|
|
|
args = ([args].flatten) + [
|
|
|
|
"#{ASSET_DIR}/#{file}.y",
|
|
|
|
'-Do',
|
|
|
|
"-O#{OUT_DIR}/#{file}",
|
|
|
|
"-o#{TAB_DIR}/#{file}",
|
|
|
|
]
|
2019-06-02 07:11:24 -04:00
|
|
|
racc *args
|
2019-05-13 08:25:22 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
def assert_debugfile(asset, ok)
|
|
|
|
file = File.basename(asset, '.y')
|
|
|
|
Dir.chdir(TEST_DIR) do
|
|
|
|
File.foreach("log/#{file}.y") do |line|
|
|
|
|
line.strip!
|
|
|
|
case line
|
|
|
|
when /sr/ then assert_equal "sr#{ok[0]}", line
|
|
|
|
when /rr/ then assert_equal "rr#{ok[1]}", line
|
|
|
|
when /un/ then assert_equal "un#{ok[2]}", line
|
|
|
|
when /ur/ then assert_equal "ur#{ok[3]}", line
|
|
|
|
when /ex/ then assert_equal "ex#{ok[4]}", line
|
|
|
|
else
|
|
|
|
raise TestFailed, 'racc outputs unknown debug report???'
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def assert_exec(asset)
|
|
|
|
file = File.basename(asset, '.y')
|
2019-06-02 07:11:24 -04:00
|
|
|
ruby("#{TAB_DIR}/#{file}")
|
2019-05-13 08:25:22 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
def strip_version(source)
|
|
|
|
source.sub(/This file is automatically generated by Racc \d+\.\d+\.\d+/, '')
|
|
|
|
end
|
|
|
|
|
|
|
|
def assert_output_unchanged(asset)
|
|
|
|
file = File.basename(asset, '.y')
|
|
|
|
|
|
|
|
expected = File.read("#{REGRESS_DIR}/#{file}")
|
|
|
|
actual = File.read("#{TAB_DIR}/#{file}")
|
|
|
|
result = (strip_version(expected) == strip_version(actual))
|
|
|
|
|
|
|
|
assert(result, "Output of test/assets/#{file}.y differed from " \
|
|
|
|
"expectation. Try compiling it and diff with test/regress/#{file}.")
|
|
|
|
end
|
|
|
|
|
2019-06-02 07:11:24 -04:00
|
|
|
def racc(*arg)
|
|
|
|
ruby "-S", RACC, *arg
|
2019-05-13 08:25:22 -04:00
|
|
|
end
|
|
|
|
|
2019-06-02 07:11:24 -04:00
|
|
|
def ruby(*arg)
|
|
|
|
assert_ruby_status(["-C", TEST_DIR, *arg])
|
2019-05-13 08:25:22 -04:00
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|