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

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

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

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)
21
        line = remove_hex.sub(r'0', line)
Wenzel Jakob's avatar
Wenzel Jakob committed
22
23
24
        line = shorten_floats.sub(r'\1', line)
        line = line.replace('__builtin__', 'builtins')
        line = line.replace('example.', '')
25
        line = line.replace('unicode', 'str')
26
27
        line = line.replace('Example4.EMode', 'EMode')
        line = line.replace('example.EMode', 'EMode')
Wenzel Jakob's avatar
Wenzel Jakob committed
28
29
        line = line.replace('method of builtins.PyCapsule instance', '')
        line = line.strip()
30
        if relaxed:
Wenzel Jakob's avatar
Wenzel Jakob committed
31
            lower = line.lower()
32
33
            # 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
34
            if 'constructor' in lower or 'destructor' in lower \
35
               or 'ref' in lower or 'freeing' in lower:
Wenzel Jakob's avatar
Wenzel Jakob committed
36
                line = ""
Wenzel Jakob's avatar
Wenzel Jakob committed
37
38
39
40
41
42
43
        lines[i] = line

    lines = '\n'.join(sorted([l for l in lines if l != ""]))

    print('==================')
    print(lines)
    return lines
Wenzel Jakob's avatar
Wenzel Jakob committed
44
45
46
47
48

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

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

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

Wenzel Jakob's avatar
Wenzel Jakob committed
57
name = sys.argv[1]
Wenzel Jakob's avatar
Wenzel Jakob committed
58
59
60
output_bytes = subprocess.check_output([sys.executable, name + ".py"],
                                       stderr=subprocess.STDOUT)

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

Wenzel Jakob's avatar
Wenzel Jakob committed
64
65
66
67
if 'NumPy missing' in output:
    print('Test "%s" could not be run.' % name)
    exit(0)
elif output == reference:
Wenzel Jakob's avatar
Wenzel Jakob committed
68
69
70
71
72
    print('Test "%s" succeeded.' % name)
    exit(0)
else:
    print('Test "%s" FAILED!' % name)
    exit(-1)