Add spec support for C tests

This commit is contained in:
Josh Holtrop 2023-08-20 16:38:35 -04:00
parent 9d2b3be20b
commit c7185edef0

View File

@ -11,7 +11,7 @@ describe Propane do
def build_parser(options = {})
options[:name] ||= ""
command = %W[./propane.sh spec/run/testparser#{options[:name]}.propane spec/run/testparser#{options[:name]}.d --log spec/run/testparser#{options[:name]}.log]
command = %W[./propane.sh spec/run/testparser#{options[:name]}.propane spec/run/testparser#{options[:name]}.#{options[:language]} --log spec/run/testparser#{options[:name]}.log]
if (options[:capture])
stdout, stderr, status = Open3.capture3(*command)
Results.new(stdout, stderr, status)
@ -25,9 +25,14 @@ describe Propane do
test_files = Array(test_files)
options[:parsers] ||= [""]
parsers = options[:parsers].map do |name|
"spec/run/testparser#{name}.d"
"spec/run/testparser#{name}.#{options[:language]}"
end
case options[:language]
when "d"
result = system(*%w[ldc2 --unittest -of spec/run/testparser -Ispec], *parsers, *test_files, "spec/testutils.d")
when "c"
result = system(*%w[gcc -o spec/run/testparser -Ispec], *parsers, *test_files)
end
expect(result).to be_truthy
end
@ -69,6 +74,10 @@ describe Propane do
FileUtils.mkdir_p("spec/run")
end
%w[d c].each do |language|
context "#{language.upcase} language" do
it "generates a lexer" do
write_grammar <<EOF
token int /\\d+/;
@ -81,8 +90,8 @@ Foo -> int <<
Foo -> plus <<
>>
EOF
build_parser
compile("spec/test_lexer.d")
build_parser(language: language)
compile("spec/test_lexer.#{language}", language: language)
results = run
expect(results.stderr).to eq ""
expect(results.status).to eq 0
@ -104,8 +113,8 @@ Start -> int <<
$$ = $1;
>>
EOF
build_parser
compile("spec/test_lexer_unknown_character.d")
build_parser(language: language)
compile("spec/test_lexer_unknown_character.#{language}", language: language)
results = run
expect(results.stderr).to eq ""
expect(results.status).to eq 0
@ -124,7 +133,7 @@ E -> B;
B -> zero;
B -> one;
EOF
build_parser
build_parser(language: language)
end
it "generates a parser that does basic math - user guide example" do
@ -179,8 +188,8 @@ E4 -> lparen E1 rparen <<
$$ = $2;
>>
EOF
build_parser
compile("spec/test_basic_math_grammar.d")
build_parser(language: language)
compile("spec/test_basic_math_grammar.#{language}", language: language)
results = run
expect(results.stderr).to eq ""
expect(results.status).to eq 0
@ -193,7 +202,7 @@ Start -> E;
E -> one E;
E -> one;
EOF
build_parser
build_parser(language: language)
end
it "distinguishes between multiple identical rules with lookahead symbol" do
@ -205,8 +214,8 @@ Start -> R2 b;
R1 -> a b;
R2 -> a b;
EOF
build_parser
compile("spec/test_parser_identical_rules_lookahead.d")
build_parser(language: language)
compile("spec/test_parser_identical_rules_lookahead.#{language}", language: language)
results = run
expect(results.status).to eq 0
end
@ -220,8 +229,8 @@ Start -> a R1;
Start -> b R1;
R1 -> b;
EOF
build_parser
compile("spec/test_parser_rule_from_multiple_states.d")
build_parser(language: language)
compile("spec/test_parser_rule_from_multiple_states.#{language}", language: language)
results = run
expect(results.status).to eq 0
end
@ -239,8 +248,8 @@ Start -> Abcs def;
Abcs -> ;
Abcs -> abc Abcs;
EOF
build_parser
compile("spec/test_user_code.d")
build_parser(language: language)
compile("spec/test_user_code.#{language}", language: language)
results = run
expect(results.status).to eq 0
verify_lines(results.stdout, [
@ -263,8 +272,8 @@ token abc;
>>
Start -> abc;
EOF
build_parser
compile("spec/test_pattern.d")
build_parser(language: language)
compile("spec/test_pattern.#{language}", language: language)
results = run
expect(results.status).to eq 0
verify_lines(results.stdout, [
@ -291,8 +300,8 @@ token abc;
>>
Start -> abc;
EOF
build_parser
compile("spec/test_return_token_from_pattern.d")
build_parser(language: language)
compile("spec/test_return_token_from_pattern.#{language}", language: language)
results = run
expect(results.status).to eq 0
verify_lines(results.stdout, [
@ -324,8 +333,8 @@ string: /"/ <<
>>
Start -> abc string def;
EOF
build_parser
compile("spec/test_lexer_modes.d")
build_parser(language: language)
compile("spec/test_lexer_modes.#{language}", language: language)
results = run
expect(results.status).to eq 0
verify_lines(results.stdout, [
@ -355,8 +364,8 @@ B -> b <<
writeln("B!");
>>
EOF
build_parser
compile("spec/test_parser_rule_user_code.d")
build_parser(language: language)
compile("spec/test_parser_rule_user_code.#{language}", language: language)
results = run
expect(results.status).to eq 0
verify_lines(results.stdout, [
@ -380,8 +389,8 @@ As -> As a <<
$$ = $1 + 1u;
>>
EOF
build_parser
compile("spec/test_parsing_lists.d")
build_parser(language: language)
compile("spec/test_parsing_lists.#{language}", language: language)
results = run
expect(results.status).to eq 0
expect(results.stderr).to eq ""
@ -401,7 +410,7 @@ Start -> b E d;
E -> e;
F -> e;
EOF
results = build_parser(capture: true)
results = build_parser(capture: true, language: language)
expect(results.status).to_not eq 0
expect(results.stderr).to match %r{reduce/reduce conflict.*\(E\).*\(F\)}
end
@ -416,8 +425,8 @@ token id /[a-zA-Z_][a-zA-Z0-9_]*/ <<
>>
Start -> id;
EOF
build_parser
compile("spec/test_lexer_match_text.d")
build_parser(language: language)
compile("spec/test_lexer_match_text.#{language}", language: language)
results = run
expect(results.status).to eq 0
verify_lines(results.stdout, [
@ -436,8 +445,8 @@ Start -> word <<
$$ = $1;
>>
EOF
build_parser
compile("spec/test_lexer_result_value.d")
build_parser(language: language)
compile("spec/test_lexer_result_value.#{language}", language: language)
results = run
expect(results.stderr).to eq ""
expect(results.status).to eq 0
@ -451,8 +460,8 @@ drop /\\s+/;
Start -> a num Start;
Start -> a num;
EOF
build_parser
compile("spec/test_error_positions.d")
build_parser(language: language)
compile("spec/test_error_positions.#{language}", language: language)
results = run
expect(results.stderr).to eq ""
expect(results.status).to eq 0
@ -460,8 +469,8 @@ EOF
it "allows creating a JSON parser" do
write_grammar(File.read("spec/json_parser.propane"))
build_parser
compile(["spec/test_parsing_json.d", "spec/json_types.d"])
build_parser(language: language)
compile(["spec/test_parsing_json.#{language}", "spec/json_types.#{language}"], language: language)
end
it "allows generating multiple parsers in the same program" do
@ -472,17 +481,19 @@ token num /\\d+/;
drop /\\s+/;
Start -> a num;
EOF
build_parser(name: "myp1")
build_parser(name: "myp1", language: language)
write_grammar(<<EOF, name: "myp2")
prefix myp2_;
token b;
token c;
Start -> b c b;
EOF
build_parser(name: "myp2")
compile("spec/test_multiple_parsers.d", parsers: %w[myp1 myp2])
build_parser(name: "myp2", language: language)
compile("spec/test_multiple_parsers.#{language}", parsers: %w[myp1 myp2], language: language)
results = run
expect(results.stderr).to eq ""
expect(results.status).to eq 0
end
end
end
end