import moe.eval
import moe.log
import shutil
+import traceback
def configure_test(e, test):
e.cfgs = moe.config.MoeConfigStack(e.cfgs)
def tmpname(e):
return os.path.join(e["TDIR"], e["TEST"] + ".tmp")
-def collect_verdict(e, verdict_file):
- try:
- f = open(verdict_file, "r")
+def collect_tmp_line(tmp_file):
+ if os.path.exists(tmp_file):
+ f = open(tmp_file, "r")
v = f.readline().rstrip("\n")
f.close()
- except IOError, OSError:
+ os.unlink(tmp_file)
+ else:
v = ""
+ return v
+def collect_verdict(e, verdict_file):
+ v = collect_tmp_line(verdict_file)
if len(v) >= 4 and v[0].isalnum and v[1].isalnum and v[2] == ":" and v[3] == " ":
e.test_stat["status"] = v[0:2]
e.log.verbose("Judge's status: %s\n" % v[0:2])
e.test_stat["message"] = v
e.log.verbose("Judge's verdict: %s\n" % v)
- try:
- os.unlink(verdict_file)
- except IOError, OSError:
- pass
+def collect_points(e):
+ p = collect_tmp_line(os.path.join(e["TDIR"], e["TESTCASE_PTS"]))
+ if p != "":
+ e.log.verbose("Judge has supplied points: %s\n" % p)
+ e.test_stat["points"] = p
def setup(e):
pdir = e["PDIR"]
e.log.flush()
rc = os.system(cmd)
collect_verdict(e, verdict_file)
+ collect_points(e)
collect_status(e)
if os.WIFEXITED(rc):
if os.WEXITSTATUS(rc) == 0:
raise moe.MoeError("Judge failure")
def points(e):
- ## FIXME: check $TEST.pts
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)
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
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)