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)