cli.py 2.96 KB
Newer Older
Johannes Bechberger's avatar
Johannes Bechberger committed
1
import logging
2
import os
Johannes Bechberger's avatar
Johannes Bechberger committed
3
4
from pprint import pprint
import sys
5
6
7
from os.path import dirname
sys.path.append(dirname(__file__))
import util.utils
Johannes Bechberger's avatar
Johannes Bechberger committed
8
import argparse
9
from environment import TestMode, Environment, TEST_MODES
Johannes Bechberger's avatar
Johannes Bechberger committed
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
from mjtest.test.tests import TestSuite

# adapted from http://stackoverflow.com/a/8527629
class LogLevelChoices(argparse.Action):
    CHOICES = ["error", "warn", "info", "debug"]
    def __call__(self, parser, namespace, values, option_string=None):
        if values:
            for value in values:
                if value not in self.CHOICES:
                    message = ("invalid choice: {0!r} (choose from {1})"
                               .format(value,
                                       ', '.join([repr(action)
                                                  for action in self.CHOICES])))

                    raise argparse.ArgumentError(self, message)
            setattr(namespace, self.dest, values)

if True:#__name__ == '__main__':
    parser = argparse.ArgumentParser(description="MiniJava test runner", add_help=True)
    parser.add_argument("mode",
                        choices=TEST_MODES,
                        help="What do you want to test?")
32
33
34
35
36
    if os.getenv("MJ_RUN", None) is None:
        parser.add_argument("mj_run",
                            metavar="MJ_RUN",
                            help="Command to run your MiniJava implementation, e.g. `mj/run`, "
                                 "can be omitted by assigning the environment variable MJ_RUN")
Johannes Bechberger's avatar
Johannes Bechberger committed
37
38
39
40
41
42
43
44
45
46
47
48
49
50
    parser.add_argument("--tmp_dir", action="store_const", default="", const="tmp_dir",
                        help="Used temporary directory")
    parser.add_argument("--test_dir", action="store_const", default="", const="test_dir",
                        help="Directory that contains all test cases, default is the 'tests' directory")
    parser.add_argument("--only_incorrect_tests", action="store_true", default=False,
                        help="Only run the tests that were incorrect the last run")
    parser.add_argument("--parallel", action="store_true", default=False,
                        help="Run the tests in parallel")
    parser.add_argument("--timeout", action="store_const", default=30, const="timeout",
                        help="Abort a program after TIMEOUT seconds")
    parser.add_argument("--report_dir", action="store_const", default="", const="report_dir",
                        help="Directory to store the reports in, default is 'reports'")
    parser.add_argument("--log_level", action=LogLevelChoices, default="warn", const="log_level",
                        help="Logging level (error, warn, info or debug)")
51
52
53
54
    args = vars(parser.parse_args())
    if os.getenv("MJ_RUN", None) is not None:
        args["mj_run"] = os.getenv("MJ_RUN")
    suite = TestSuite(Environment(**args))
Johannes Bechberger's avatar
Johannes Bechberger committed
55
56
57
58
59
60
61
62
63
64
    ret = None
    try:
        ret = suite.run()
    finally:
        suite.env.clean_up()
        suite.store()
    if ret is None or ret:
        sys.exit(1)
    else:
        sys.exit(0)