run_test.py 2.46 KB
Newer Older
Wenzel Jakob's avatar
Wenzel Jakob committed
1
2
3
4
import sys
import os
import re
import subprocess
5
import difflib
Wenzel Jakob's avatar
Wenzel Jakob committed
6
7
8

remove_unicode_marker = re.compile(r'u(\'[^\']*\')')
remove_long_marker    = re.compile(r'([0-9])L')
Wenzel Jakob's avatar
Wenzel Jakob committed
9
remove_hex            = re.compile(r'0x[0-9a-fA-F]+')
Wenzel Jakob's avatar
Wenzel Jakob committed
10
11
shorten_floats        = re.compile(r'([1-9][0-9]*\.[0-9]{4})[0-9]*')

12
relaxed = False
Wenzel Jakob's avatar
Wenzel Jakob committed
13
14
15
16
17
18
19
20
21

def sanitize(lines):
    lines = lines.split('\n')
    for i in range(len(lines)):
        line = lines[i]
        if line.startswith(" |"):
            line = ""
        line = remove_unicode_marker.sub(r'\1', line)
        line = remove_long_marker.sub(r'\1', line)
22
        line = remove_hex.sub(r'0', line)
Wenzel Jakob's avatar
Wenzel Jakob committed
23
24
25
        line = shorten_floats.sub(r'\1', line)
        line = line.replace('__builtin__', 'builtins')
        line = line.replace('example.', '')
26
        line = line.replace('unicode', 'str')
27
        line = line.replace('ExampleWithEnum.EMode', 'EMode')
28
        line = line.replace('example.EMode', 'EMode')
Wenzel Jakob's avatar
Wenzel Jakob committed
29
30
        line = line.replace('method of builtins.PyCapsule instance', '')
        line = line.strip()
31
        if relaxed:
Wenzel Jakob's avatar
Wenzel Jakob committed
32
            lower = line.lower()
33
34
            # The precise pattern of allocations and deallocations is dependent on the compiler
            # and optimization level, so we unfortunately can't reliably check it in this kind of test case
Wenzel Jakob's avatar
Wenzel Jakob committed
35
            if 'constructor' in lower or 'destructor' in lower \
36
               or 'ref' in lower or 'freeing' in lower:
Wenzel Jakob's avatar
Wenzel Jakob committed
37
                line = ""
Wenzel Jakob's avatar
Wenzel Jakob committed
38
39
        lines[i] = line

40
    return '\n'.join(sorted([l for l in lines if l != ""]))
Wenzel Jakob's avatar
Wenzel Jakob committed
41
42
43
44
45

path = os.path.dirname(__file__)
if path != '':
    os.chdir(path)

46
if len(sys.argv) < 2:
Wenzel Jakob's avatar
Wenzel Jakob committed
47
    print("Syntax: %s [--relaxed] <test name>" % sys.argv[0])
48
49
    exit(0)

Wenzel Jakob's avatar
Wenzel Jakob committed
50
51
if len(sys.argv) == 3 and sys.argv[1] == '--relaxed':
    del sys.argv[1]
52
53
    relaxed = True

Wenzel Jakob's avatar
Wenzel Jakob committed
54
name = sys.argv[1]
55
56
57
58
59
60
61
62
63
try:
    output_bytes = subprocess.check_output([sys.executable, name + ".py"],
                                           stderr=subprocess.STDOUT)
except subprocess.CalledProcessError as e:
    if e.returncode == 99:
        print('Test "%s" could not be run.' % name)
        exit(0)
    else:
        raise
Wenzel Jakob's avatar
Wenzel Jakob committed
64

Wenzel Jakob's avatar
Wenzel Jakob committed
65
66
output    = sanitize(output_bytes.decode('utf-8'))
reference = sanitize(open(name + '.ref', 'r').read())
Wenzel Jakob's avatar
Wenzel Jakob committed
67

68
if output == reference:
Wenzel Jakob's avatar
Wenzel Jakob committed
69
70
71
72
    print('Test "%s" succeeded.' % name)
    exit(0)
else:
    print('Test "%s" FAILED!' % name)
73
74
    print('--- output')
    print('+++ reference')
Wenzel Jakob's avatar
Wenzel Jakob committed
75
76
    print(''.join(difflib.ndiff(output.splitlines(True),
                                reference.splitlines(True))))
Wenzel Jakob's avatar
Wenzel Jakob committed
77
    exit(-1)