blob: c31ea098959d67b356c4e5480af2ba5b439f1bb2 [file] [log] [blame]
Wenzel Jakob6d6fd092015-10-01 17:34:26 +02001import sys
2import os
3import re
4import subprocess
Dean Moldovan1fe59012016-06-01 23:16:13 +02005import difflib
Wenzel Jakob6d6fd092015-10-01 17:34:26 +02006
7remove_unicode_marker = re.compile(r'u(\'[^\']*\')')
8remove_long_marker = re.compile(r'([0-9])L')
Wenzel Jakob607654f2015-10-13 23:58:10 +02009remove_hex = re.compile(r'0x[0-9a-fA-F]+')
Wenzel Jakob6d6fd092015-10-01 17:34:26 +020010shorten_floats = re.compile(r'([1-9][0-9]*\.[0-9]{4})[0-9]*')
11
Wenzel Jakob80c24512016-02-20 20:53:10 +010012relaxed = False
Wenzel Jakob6d6fd092015-10-01 17:34:26 +020013
14def sanitize(lines):
15 lines = lines.split('\n')
16 for i in range(len(lines)):
17 line = lines[i]
18 if line.startswith(" |"):
19 line = ""
20 line = remove_unicode_marker.sub(r'\1', line)
21 line = remove_long_marker.sub(r'\1', line)
Wenzel Jakob3b806d42015-10-11 16:29:35 +020022 line = remove_hex.sub(r'0', line)
Wenzel Jakob6d6fd092015-10-01 17:34:26 +020023 line = shorten_floats.sub(r'\1', line)
24 line = line.replace('__builtin__', 'builtins')
25 line = line.replace('example.', '')
Wenzel Jakob27e8e102016-01-17 22:36:37 +010026 line = line.replace('unicode', 'str')
Wenzel Jakob678d7872016-01-17 22:36:41 +010027 line = line.replace('Example4.EMode', 'EMode')
28 line = line.replace('example.EMode', 'EMode')
Wenzel Jakob6d6fd092015-10-01 17:34:26 +020029 line = line.replace('method of builtins.PyCapsule instance', '')
30 line = line.strip()
Wenzel Jakob80c24512016-02-20 20:53:10 +010031 if relaxed:
Wenzel Jakob607654f2015-10-13 23:58:10 +020032 lower = line.lower()
Wenzel Jakob76269b72015-12-13 11:33:41 +010033 # The precise pattern of allocations and deallocations is dependent on the compiler
34 # and optimization level, so we unfortunately can't reliably check it in this kind of test case
Wenzel Jakobfab881c2015-10-18 17:04:24 +020035 if 'constructor' in lower or 'destructor' in lower \
Wenzel Jakob76269b72015-12-13 11:33:41 +010036 or 'ref' in lower or 'freeing' in lower:
Wenzel Jakob607654f2015-10-13 23:58:10 +020037 line = ""
Wenzel Jakob6d6fd092015-10-01 17:34:26 +020038 lines[i] = line
39
Dean Moldovan1fe59012016-06-01 23:16:13 +020040 return '\n'.join(sorted([l for l in lines if l != ""]))
Wenzel Jakob38bd7112015-07-05 20:05:44 +020041
42path = os.path.dirname(__file__)
43if path != '':
44 os.chdir(path)
45
Wenzel Jakob80c24512016-02-20 20:53:10 +010046if len(sys.argv) < 2:
Wenzel Jakob57b52792016-02-20 21:19:30 +010047 print("Syntax: %s [--relaxed] <test name>" % sys.argv[0])
Wenzel Jakob80c24512016-02-20 20:53:10 +010048 exit(0)
49
Wenzel Jakob57b52792016-02-20 21:19:30 +010050if len(sys.argv) == 3 and sys.argv[1] == '--relaxed':
51 del sys.argv[1]
Wenzel Jakob80c24512016-02-20 20:53:10 +010052 relaxed = True
53
Wenzel Jakob38bd7112015-07-05 20:05:44 +020054name = sys.argv[1]
Wenzel Jakobfab881c2015-10-18 17:04:24 +020055output_bytes = subprocess.check_output([sys.executable, name + ".py"],
56 stderr=subprocess.STDOUT)
57
Wenzel Jakob6d6fd092015-10-01 17:34:26 +020058output = sanitize(output_bytes.decode('utf-8'))
59reference = sanitize(open(name + '.ref', 'r').read())
Wenzel Jakob38bd7112015-07-05 20:05:44 +020060
Wenzel Jakobfab881c2015-10-18 17:04:24 +020061if 'NumPy missing' in output:
62 print('Test "%s" could not be run.' % name)
63 exit(0)
64elif output == reference:
Wenzel Jakob38bd7112015-07-05 20:05:44 +020065 print('Test "%s" succeeded.' % name)
66 exit(0)
67else:
68 print('Test "%s" FAILED!' % name)
Dean Moldovan1fe59012016-06-01 23:16:13 +020069 print('--- output')
70 print('+++ reference')
Wenzel Jakobf57133a2016-07-06 05:43:52 +020071 print(''.join(difflib.ndiff(output.splitlines(True),
72 reference.splitlines(True))))
Wenzel Jakob38bd7112015-07-05 20:05:44 +020073 exit(-1)