]> mj.ucw.cz Git - eval.git/blob - t/moe/testcase.py
Batch task testing works (sort of)
[eval.git] / t / moe / testcase.py
1 #!/usr/bin/env python
2
3 import os.path
4 import moe
5 import moe.config
6 import moe.eval
7 import moe.log
8 import shutil
9
10 def judge(e):
11     pass
12
13 def configure_test(e, test):
14     e.cfgs = moe.config.MoeConfigStack(e.cfgs)
15     e.test_builtins = moe.config.MoeConfig(type="test-builtins")
16     e.test_builtins.set("TEST", test)
17     e.cfgs.push(e.test_builtins)
18
19     test_cf = os.path.join(e.cfgs["PDIR"], test + ".config")
20     if os.path.exists(test_cf):
21         cfg = moe.config.MoeConfig(name=test_cf, type="test")
22         e.cfgs.push(cfg)
23
24     e.cfgs.apply_overrides("TEST_" + test + "_")
25     ext = e.cfgs["EXT"]
26     if ext != "":
27         e.cfgs.apply_overrides("EXT_" + ext + "_")
28
29     log = moe.log.MoeLog()
30     log.verbosity = e.log.verbosity
31     log.open(os.path.join(e.cfgs["TDIR"], test + ".log"))
32     log.say("Test case %s\n\n" % test)
33     e.log = log
34
35     e.log_config(2, "for the test")
36
37 def setup(e):
38     pdir = e.cfgs["PDIR"]
39     tdir = e.cfgs["TDIR"]
40     inn = e.cfgs["TESTCASE_IN"]
41     out = e.cfgs["TESTCASE_OUT"]
42     ok = e.cfgs["TESTCASE_OK"]
43
44     if os.path.exists(os.path.join(pdir, inn)):
45         moe.util.link_or_copy(os.path.join(pdir, inn), os.path.join(tdir, inn))
46     if os.path.exists(os.path.join(pdir, out)):
47         moe.util.link_or_copy(os.path.join(pdir, out), os.path.join(tdir, ok))
48
49 def judge(e):
50     judge = e.cfgs["OUTPUT_CHECK"]
51     if judge == "":
52         return
53
54     e.log.progress("<check> ")
55     e.log.verbose("Checking output: %s\n" % judge)
56     e.log.flush()
57     rc = os.system(judge)
58     ## FIXME: The judge might want to return a status file
59     if os.WIFEXITED(rc):
60         if os.WEXITSTATUS(rc) == 0:
61             return
62         elif os.WEXITSTATUS(rc) == 1:
63             raise moe.SolutionErr("Wrong answer", "WA")
64     raise moe.MoeErr("Judge failure")
65
66 def run_test(e, test):
67     configure_test(e, test)
68
69     ## FIXME: interactive tasks
70     e.test_pipe.configure(e.cfgs["TESTCASE_HOOKS"])
71     if e.log.verbosity >= 2:
72         e.test_pipe.dump(e.log.log_file, prefix="\t")
73     e.test_pipe.run(e)
74
75     e.log.progress("OK\n")
76
77 def run_tests(e):
78     ## FIXME: output filter
79     e.test_pipe.insert(0, "setup", setup)
80     e.test_pipe.insert(400, "judge", judge)
81
82     for test in e.cfgs["TESTS"].split():
83         e.log.progress("Test %s: " % test)
84         old_cfgs = e.cfgs
85         old_log = e.log
86
87         try:
88             run_test(e, test)
89         except moe.MoeErr, err:
90             e.log.progress("FAILED: %s\n" % err)
91             ## FIXME: write it to the status file
92         except moe.SolutionErr, err:
93             e.log.progress("%s\n" % err)
94         
95         e.cfgs = old_cfgs
96         e.log = old_log