]> mj.ucw.cz Git - eval.git/blobdiff - t/moe/testcase.py
Writing status uses dump
[eval.git] / t / moe / testcase.py
index d1184d30a8faf218a1c3e0fb4bcca3c44b8ddb98..36d335b7f72e7360b534e6f6a0e76cbcf16fc820 100644 (file)
@@ -6,6 +6,7 @@ import moe.config
 import moe.eval
 import moe.log
 import shutil
+import traceback
 
 def configure_test(e, test):
     e.cfgs = moe.config.MoeConfigStack(e.cfgs)
@@ -117,6 +118,42 @@ def points(e):
     if e.test_stat["points"] is None:
        e.test_stat["points"] = e["POINTS_PER_TEST"]
 
+def filter(e):
+    cmd = e["OUTPUT_FILTER"]
+    if cmd == "":
+       return
+
+    os.rename(os.path.join(e["TDIR"], e["TESTCASE_OUT"]), os.path.join(e["TDIR"], e["TESTCASE_RAW"]))
+    e.log.progress("<filter> ")
+    e.log.verbose("Filtering output: %s\n" % cmd)
+    e.log.flush()
+    rc = os.system(cmd)
+    if os.WIFEXITED(rc) and os.WEXITSTATUS(rc) == 0:
+       if not os.path.exists(os.path.join(e["TDIR"], e["TESTCASE_OUT"])):
+           raise moe.MoeError("Filter has generated no output")
+    else:
+       raise moe.MoeError("Filter failure")
+
+def syntax(e):
+    cmd = e["SYNTAX_CHECK"]
+    if cmd == "":
+       return
+    verdict_file = tmpname(e)
+    cmd = "exec 2>%s ; %s" % (verdict_file,cmd)
+
+    e.log.progress("<syntax> ")
+    e.log.verbose("Checking syntax: %s\n" % cmd)
+    e.log.flush()
+    rc = os.system(cmd)
+    collect_verdict(e, verdict_file)
+    collect_status(e)
+    if os.WIFEXITED(rc):
+       if os.WEXITSTATUS(rc) == 0:
+           return
+       elif os.WEXITSTATUS(rc) == 1:
+           raise moe.TestError("Wrong syntax", "SY")
+    raise moe.MoeError("Syntax checker failure")
+
 def run_test(e, test):
     configure_test(e, test)
 
@@ -131,6 +168,11 @@ def wrap_run_test(e, test):
        run_test(e, test)
     except moe.MoeError, err:
        raise moe.TestError(err, "XX")
+    except Exception:
+       if e["DEBUG"]:
+           moe.log.fatal_exception()
+       traceback.print_exc(file = e.log.log_file)
+       raise moe.TestError("Internal exception", "XX")
 
 def conclude_test(e):
     stat = e.test_stat
@@ -155,11 +197,11 @@ def conclude_test(e):
     e.log.say(msg)
 
 def run_tests(e):
-    ## FIXME: output filter
-    ## FIXME: syntax checks
     e.test_pipe.insert(0, "setup", setup)
-    e.test_pipe.insert(400, "judge", judge)
-    e.test_pipe.insert(500, "points", points)
+    e.test_pipe.insert(400, "filter", filter)
+    e.test_pipe.insert(500, "syntax", syntax)
+    e.test_pipe.insert(600, "judge", judge)
+    e.test_pipe.insert(700, "points", points)
 
     for test in e["TESTS"].split():
        e.log.progress("Test %s: " % test)