The name of the initial branch for new projects is now "main" instead of "master". Existing projects remain unchanged. More information: https://doku.lrz.de/display/PUBLIC/GitLab

tst_Arithmetic_grammar.py 2.78 KB
Newer Older
eckhart's avatar
eckhart committed
1 2 3 4 5 6 7 8 9 10
#!/usr/bin/python3

"""tst_Arithmetic_grammar.py - runs the unit tests for the Arithmetic-grammar
"""

import os
import sys

LOGGING = False

11
sys.path.extend(['../../', '../', './'])
eckhart's avatar
eckhart committed
12 13 14 15 16 17 18

scriptpath = os.path.dirname(__file__)


try:
    from DHParser import dsl
    import DHParser.log
19
    from DHParser import testing, create_test_templates, CONFIG_PRESET
eckhart's avatar
eckhart committed
20 21 22 23 24 25
except ModuleNotFoundError:
    print('Could not import DHParser. Please adjust sys.path in file '
          '"%s" manually' % __file__)
    sys.exit(1)


26
CONFIG_PRESET['ast_serialization'] = "S-expression"
27
CONFIG_PRESET['test_parallelization'] = False
28

eckhart's avatar
eckhart committed
29
def recompile_grammar(grammar_src, force):
30 31 32 33 34 35
    grammar_tests_dir = os.path.join(scriptpath, 'grammar_tests')
    if not os.path.exists(grammar_tests_dir) \
            or not any(os.path.isfile(os.path.join(grammar_tests_dir, entry))
                       for entry in os.listdir(grammar_tests_dir)):
        print('No grammar-tests found, generating test templates.')
        create_test_templates(grammar_src, grammar_tests_dir)
eckhart's avatar
eckhart committed
36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
    with DHParser.log.logging(LOGGING):
        # recompiles Grammar only if it has changed
        name = os.path.splitext(os.path.basename(grammar_src))[0]
        if not dsl.recompile_grammar(grammar_src, force=force):
            print('\nErrors while recompiling "{}":'.format(grammar_src) +
                  '\n--------------------------------------\n\n')
            with open('{}_ebnf_ERRORS.txt'.format(name)) as f:
                print(f.read())
            sys.exit(1)


def run_grammar_tests(glob_pattern):
    with DHParser.log.logging(LOGGING):
        error_report = testing.grammar_suite(
            os.path.join(scriptpath, 'grammar_tests'),
            get_grammar, get_transformer,
            fn_patterns=[glob_pattern], report=True, verbose=True)
    return error_report


if __name__ == '__main__':
    argv = sys.argv[:]
    if len(argv) > 1 and sys.argv[1] == "--debug":
        LOGGING = True
        del argv[1]
    if (len(argv) >= 2 and (argv[1].endswith('.ebnf') or
        os.path.splitext(argv[1])[1].lower() in testing.TEST_READERS.keys())):
        # if called with a single filename that is either an EBNF file or a known
        # test file type then use the given argument
        arg = argv[1]
    else:
        # otherwise run all tests in the test directory
        arg = '*_test_*.ini'
    if arg.endswith('.ebnf'):
        recompile_grammar(arg, force=True)
    else:
        recompile_grammar(os.path.join(scriptpath, 'Arithmetic.ebnf'),
                          force=False)
        sys.path.append('.')
        from ArithmeticCompiler import get_grammar, get_transformer
        error_report = run_grammar_tests(glob_pattern=arg)
        if error_report:
            print('\n')
            print(error_report)
            sys.exit(1)
        print('ready.\n')