Wenzel Jakob | 6d6fd09 | 2015-10-01 17:34:26 +0200 | [diff] [blame] | 1 | import sys |
| 2 | import os |
| 3 | import re |
| 4 | import subprocess |
Dean Moldovan | 1fe5901 | 2016-06-01 23:16:13 +0200 | [diff] [blame] | 5 | import difflib |
Wenzel Jakob | 6d6fd09 | 2015-10-01 17:34:26 +0200 | [diff] [blame] | 6 | |
| 7 | remove_unicode_marker = re.compile(r'u(\'[^\']*\')') |
| 8 | remove_long_marker = re.compile(r'([0-9])L') |
Wenzel Jakob | 607654f | 2015-10-13 23:58:10 +0200 | [diff] [blame] | 9 | remove_hex = re.compile(r'0x[0-9a-fA-F]+') |
Wenzel Jakob | 6d6fd09 | 2015-10-01 17:34:26 +0200 | [diff] [blame] | 10 | shorten_floats = re.compile(r'([1-9][0-9]*\.[0-9]{4})[0-9]*') |
| 11 | |
Wenzel Jakob | 80c2451 | 2016-02-20 20:53:10 +0100 | [diff] [blame] | 12 | relaxed = False |
Wenzel Jakob | 6d6fd09 | 2015-10-01 17:34:26 +0200 | [diff] [blame] | 13 | |
| 14 | def 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 Jakob | 3b806d4 | 2015-10-11 16:29:35 +0200 | [diff] [blame] | 22 | line = remove_hex.sub(r'0', line) |
Wenzel Jakob | 6d6fd09 | 2015-10-01 17:34:26 +0200 | [diff] [blame] | 23 | line = shorten_floats.sub(r'\1', line) |
| 24 | line = line.replace('__builtin__', 'builtins') |
| 25 | line = line.replace('example.', '') |
Wenzel Jakob | 27e8e10 | 2016-01-17 22:36:37 +0100 | [diff] [blame] | 26 | line = line.replace('unicode', 'str') |
Wenzel Jakob | 678d787 | 2016-01-17 22:36:41 +0100 | [diff] [blame] | 27 | line = line.replace('Example4.EMode', 'EMode') |
| 28 | line = line.replace('example.EMode', 'EMode') |
Wenzel Jakob | 6d6fd09 | 2015-10-01 17:34:26 +0200 | [diff] [blame] | 29 | line = line.replace('method of builtins.PyCapsule instance', '') |
| 30 | line = line.strip() |
Wenzel Jakob | 80c2451 | 2016-02-20 20:53:10 +0100 | [diff] [blame] | 31 | if relaxed: |
Wenzel Jakob | 607654f | 2015-10-13 23:58:10 +0200 | [diff] [blame] | 32 | lower = line.lower() |
Wenzel Jakob | 76269b7 | 2015-12-13 11:33:41 +0100 | [diff] [blame] | 33 | # 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 Jakob | fab881c | 2015-10-18 17:04:24 +0200 | [diff] [blame] | 35 | if 'constructor' in lower or 'destructor' in lower \ |
Wenzel Jakob | 76269b7 | 2015-12-13 11:33:41 +0100 | [diff] [blame] | 36 | or 'ref' in lower or 'freeing' in lower: |
Wenzel Jakob | 607654f | 2015-10-13 23:58:10 +0200 | [diff] [blame] | 37 | line = "" |
Wenzel Jakob | 6d6fd09 | 2015-10-01 17:34:26 +0200 | [diff] [blame] | 38 | lines[i] = line |
| 39 | |
Dean Moldovan | 1fe5901 | 2016-06-01 23:16:13 +0200 | [diff] [blame] | 40 | return '\n'.join(sorted([l for l in lines if l != ""])) |
Wenzel Jakob | 38bd711 | 2015-07-05 20:05:44 +0200 | [diff] [blame] | 41 | |
| 42 | path = os.path.dirname(__file__) |
| 43 | if path != '': |
| 44 | os.chdir(path) |
| 45 | |
Wenzel Jakob | 80c2451 | 2016-02-20 20:53:10 +0100 | [diff] [blame] | 46 | if len(sys.argv) < 2: |
Wenzel Jakob | 57b5279 | 2016-02-20 21:19:30 +0100 | [diff] [blame] | 47 | print("Syntax: %s [--relaxed] <test name>" % sys.argv[0]) |
Wenzel Jakob | 80c2451 | 2016-02-20 20:53:10 +0100 | [diff] [blame] | 48 | exit(0) |
| 49 | |
Wenzel Jakob | 57b5279 | 2016-02-20 21:19:30 +0100 | [diff] [blame] | 50 | if len(sys.argv) == 3 and sys.argv[1] == '--relaxed': |
| 51 | del sys.argv[1] |
Wenzel Jakob | 80c2451 | 2016-02-20 20:53:10 +0100 | [diff] [blame] | 52 | relaxed = True |
| 53 | |
Wenzel Jakob | 38bd711 | 2015-07-05 20:05:44 +0200 | [diff] [blame] | 54 | name = sys.argv[1] |
Wenzel Jakob | fab881c | 2015-10-18 17:04:24 +0200 | [diff] [blame] | 55 | output_bytes = subprocess.check_output([sys.executable, name + ".py"], |
| 56 | stderr=subprocess.STDOUT) |
| 57 | |
Wenzel Jakob | 6d6fd09 | 2015-10-01 17:34:26 +0200 | [diff] [blame] | 58 | output = sanitize(output_bytes.decode('utf-8')) |
| 59 | reference = sanitize(open(name + '.ref', 'r').read()) |
Wenzel Jakob | 38bd711 | 2015-07-05 20:05:44 +0200 | [diff] [blame] | 60 | |
Wenzel Jakob | fab881c | 2015-10-18 17:04:24 +0200 | [diff] [blame] | 61 | if 'NumPy missing' in output: |
| 62 | print('Test "%s" could not be run.' % name) |
| 63 | exit(0) |
| 64 | elif output == reference: |
Wenzel Jakob | 38bd711 | 2015-07-05 20:05:44 +0200 | [diff] [blame] | 65 | print('Test "%s" succeeded.' % name) |
| 66 | exit(0) |
| 67 | else: |
| 68 | print('Test "%s" FAILED!' % name) |
Dean Moldovan | 1fe5901 | 2016-06-01 23:16:13 +0200 | [diff] [blame] | 69 | print('--- output') |
| 70 | print('+++ reference') |
Jason Rhinelander | f23e0b5 | 2016-07-05 16:03:43 -0400 | [diff] [blame] | 71 | print('\n'.join(difflib.ndiff(output.splitlines(), |
| 72 | reference.splitlines()))) |
Wenzel Jakob | 38bd711 | 2015-07-05 20:05:44 +0200 | [diff] [blame] | 73 | exit(-1) |