Ton

Форк
0
/
run_tests.py 
110 строк · 3.6 Кб
1
import os
2
import os.path
3
import subprocess
4
import sys
5
import tempfile
6

7

8
def getenv(name, default=None):
9
    if name in os.environ:
10
        return os.environ[name]
11
    if default is None:
12
        print("Environment variable", name, "is not set", file=sys.stderr)
13
        exit(1)
14
    return default
15

16

17
FUNC_EXECUTABLE = getenv("FUNC_EXECUTABLE", "func")
18
FIFT_EXECUTABLE = getenv("FIFT_EXECUTABLE", "fift")
19
TMP_DIR = tempfile.mkdtemp()
20
COMPILED_FIF = os.path.join(TMP_DIR, "compiled.fif")
21
RUNNER_FIF = os.path.join(TMP_DIR, "runner.fif")
22

23
if len(sys.argv) != 2:
24
    print("Usage : run_tests.py tests_dir", file=sys.stderr)
25
    exit(1)
26
TESTS_DIR = sys.argv[1]
27

28

29
class ExecutionError(Exception):
30
    pass
31

32

33
def compile_func(f):
34
    res = subprocess.run([FUNC_EXECUTABLE, "-o", COMPILED_FIF, "-SPA", f], capture_output=True, timeout=10)
35
    if res.returncode != 0:
36
        raise ExecutionError(str(res.stderr, "utf-8"))
37

38

39
def run_runner():
40
    res = subprocess.run([FIFT_EXECUTABLE, RUNNER_FIF], capture_output=True, timeout=10)
41
    if res.returncode != 0:
42
        raise ExecutionError(str(res.stderr, "utf-8"))
43
    s = str(res.stdout, "utf-8")
44
    s = [x.strip() for x in s.split("\n")]
45
    return [x for x in s if x != ""]
46

47

48
tests = [s for s in os.listdir(TESTS_DIR) if s.endswith(".fc")]
49
tests.sort()
50
print("Found", len(tests), "tests", file=sys.stderr)
51
for ti, tf in enumerate(tests):
52
    print("Running test %d/%d: %s" % (ti + 1, len(tests), tf), file=sys.stderr)
53
    tf = os.path.join(TESTS_DIR, tf)
54
    try:
55
        compile_func(tf)
56
    except ExecutionError as e:
57
        print(file=sys.stderr)
58
        print("Compilation error", file=sys.stderr)
59
        print(e, file=sys.stderr)
60
        exit(2)
61
    with open(tf, "r") as fd:
62
        lines = fd.readlines()
63
    cases = []
64
    for s in lines:
65
        s = [x.strip() for x in s.split("|")]
66
        if len(s) == 4 and s[0].strip() == "TESTCASE":
67
            cases.append(s[1:])
68
    if len(cases) == 0:
69
        print(file=sys.stderr)
70
        print("Error: no test cases", file=sys.stderr)
71
        exit(2)
72

73
    # preprocess arithmetics in input
74
    for i in range(len(cases)):
75
        inputs = cases[i][1].split(" ")
76
        processed_inputs = ""
77
        for in_arg in inputs:
78
            if "x{" in in_arg:
79
                processed_inputs += in_arg
80
                continue
81
            # filter and execute
82
            # is it safe enough?
83
            filtered_in = "".join(filter(lambda x: x in "0x123456789()+-*/<>", in_arg))
84
            if filtered_in:
85
                processed_inputs += str(eval(filtered_in)) + " "
86
        cases[i][1] = processed_inputs.strip()
87

88
    with open(RUNNER_FIF, "w") as f:
89
        print("\"%s\" include <s constant code" % COMPILED_FIF, file=f)
90
        for function, test_in, _ in cases:
91
            print(test_in, function, "code 1 runvmx abort\"exitcode is not 0\" .s cr { drop } depth 1- times", file=f)
92
    try:
93
        func_out = run_runner()
94
        if len(func_out) != len(cases):
95
            raise ExecutionError("Unexpected number of lines")
96
        for i in range(len(func_out)):
97
            if func_out[i] != cases[i][2]:
98
                raise ExecutionError("Error on case %d: expected '%s', found '%s'" % (i + 1, cases[i][2], func_out[i]))
99
    except ExecutionError as e:
100
        print(file=sys.stderr)
101
        print("Error:", file=sys.stderr)
102
        print(e, file=sys.stderr)
103
        print(file=sys.stderr)
104
        print("Compiled:", file=sys.stderr)
105
        with open(COMPILED_FIF, "r") as f:
106
            print(f.read(), file=sys.stderr)
107
        exit(2)
108
    print("  OK, %d cases" % len(cases), file=sys.stderr)
109

110
print("Done", file=sys.stderr)

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.