run_tests.sh 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. #!/bin/sh
  2. # Step-1 regression: M2 -> gen_ssa/*.ssa -> qbe -> cc -> exit code.
  3. # Usage: ./run_tests.sh (from the compiler directory)
  4. pass=0; fail=0
  5. modof() {
  6. sed -n 's/^MODULE \([A-Za-z][A-Za-z0-9]*\).*/\1/p' "tests/$1" | head -n 1
  7. }
  8. expect_run() {
  9. # $1 = test file (no dir), $2 = expected exit code
  10. name="$1"; want="$2"; mod=$(modof "$name")
  11. rm -f "gen_ssa/$mod.ssa" "gen_ssa/$mod.s" "gen_ssa/$mod"
  12. if ./M2 "tests/$name" 2>&1 | grep -q "Parsed correctly"; then :; else
  13. fail=$((fail+1)); echo "FAIL(run): $name rejected"; return
  14. fi
  15. if [ ! -f "gen_ssa/$mod.ssa" ]; then
  16. fail=$((fail+1)); echo "FAIL(run): $name no gen_ssa/$mod.ssa"; return
  17. fi
  18. if ! qbe -o "gen_ssa/$mod.s" "gen_ssa/$mod.ssa" 2> "gen_ssa/$mod.qbeerr"; then
  19. fail=$((fail+1)); echo "FAIL(run): $name qbe:"; cat "gen_ssa/$mod.qbeerr"; return
  20. fi
  21. if ! cc "gen_ssa/$mod.s" -o "gen_ssa/$mod" 2> "gen_ssa/$mod.ccerr"; then
  22. fail=$((fail+1)); echo "FAIL(run): $name cc:"; cat "gen_ssa/$mod.ccerr"; return
  23. fi
  24. timeout 10 "gen_ssa/$mod" > /dev/null 2>&1; got=$?
  25. if [ "$got" = "$want" ]; then
  26. pass=$((pass+1)); echo "PASS(run): $name -> $got"
  27. else
  28. fail=$((fail+1)); echo "FAIL(run): $name got $got want $want"
  29. fi
  30. }
  31. expect_fail() {
  32. # $1 = test file, $2 = message text expected in the .LST
  33. name="$1"; want="$2"
  34. if ./M2 "tests/$name" 2>&1 | grep -q "Incorrect source"; then :; else
  35. fail=$((fail+1)); echo "FAIL(fail): $name accepted"; return
  36. fi
  37. lst="tests/$(basename "$name" .mod).LST"
  38. if grep -q "$want" "$lst" 2>/dev/null; then
  39. pass=$((pass+1)); echo "PASS(fail): $name [$want]"
  40. else
  41. fail=$((fail+1)); echo "FAIL(fail): [$want] not found in $lst"
  42. fi
  43. }
  44. mkdir -p gen_ssa
  45. expect_run t_minimal.mod 0
  46. expect_run t_exit.mod 7
  47. expect_run t_arith.mod 25
  48. expect_run showcase1.mod 50
  49. expect_run t_types.mod 8
  50. expect_run showcase2.mod 71
  51. expect_run t_if.mod 25
  52. expect_run t_while.mod 55
  53. expect_run t_repeat.mod 55
  54. expect_run t_loop.mod 55
  55. expect_run t_for.mod 85
  56. expect_run t_case.mod 103
  57. expect_run t_bool.mod 42
  58. expect_run t_real.mod 31
  59. expect_run showcase3.mod 183
  60. expect_fail t_enumdecl.mod "not supported yet"
  61. expect_fail t_proc.mod "not supported yet"
  62. expect_fail t_forward.mod "not supported yet"
  63. expect_fail t_bad_undecl.mod "undeclared identifier"
  64. expect_fail t_bad_dup.mod "duplicate identifier"
  65. expect_fail t_bad_mismatch.mod "module name mismatch"
  66. expect_fail t_bad_opaque.mod "opaque type outside definition"
  67. expect_fail t_bad_while.mod "BOOLEAN condition required"
  68. expect_fail t_bad_exit.mod "not supported yet"
  69. expect_fail t_bad_return.mod "bad RETURN"
  70. expect_fail t_bad_for.mod "FOR needs integer variable and bounds"
  71. expect_fail t_bad_mixed.mod "incompatible assignment"
  72. expect_fail t_defunit.mod "not supported yet"
  73. expect_fail t_implunit.mod "not supported yet"
  74. expect_fail t_nested.mod "not supported yet"
  75. echo "--- $pass passed, $fail failed ---"
  76. [ "$fail" -eq 0 ]