mirror of
https://github.com/pybind/pybind11.git
synced 2024-11-22 21:25:13 +00:00
68 lines
2.2 KiB
Python
Executable File
68 lines
2.2 KiB
Python
Executable File
import sys
|
|
import os
|
|
import re
|
|
import subprocess
|
|
import difflib
|
|
|
|
remove_unicode_marker = re.compile(r'u(\'[^\']*\')')
|
|
remove_long_marker = re.compile(r'([0-9])L')
|
|
remove_hex = re.compile(r'0x[0-9a-fA-F]+')
|
|
shorten_floats = re.compile(r'([1-9][0-9]*\.[0-9]{4})[0-9]*')
|
|
|
|
def sanitize(lines):
|
|
lines = lines.split('\n')
|
|
for i in range(len(lines)):
|
|
line = lines[i]
|
|
if line.startswith(" |"):
|
|
line = ""
|
|
if line.startswith("### "):
|
|
# Constructor/destructor output. Useful for example, but unreliable across compilers;
|
|
# testing of proper construction/destruction occurs with ConstructorStats mechanism instead
|
|
line = ""
|
|
line = remove_unicode_marker.sub(r'\1', line)
|
|
line = remove_long_marker.sub(r'\1', line)
|
|
line = remove_hex.sub(r'0', line)
|
|
line = shorten_floats.sub(r'\1', line)
|
|
line = line.replace('__builtin__', 'builtins')
|
|
line = line.replace('example.', '')
|
|
line = line.replace('unicode', 'str')
|
|
line = line.replace('ExampleWithEnum.EMode', 'EMode')
|
|
line = line.replace('example.EMode', 'EMode')
|
|
line = line.replace('method of builtins.PyCapsule instance', '')
|
|
line = line.strip()
|
|
lines[i] = line
|
|
|
|
return '\n'.join(sorted([l for l in lines if l != ""]))
|
|
|
|
path = os.path.dirname(__file__)
|
|
if path != '':
|
|
os.chdir(path)
|
|
|
|
if len(sys.argv) < 2:
|
|
print("Syntax: %s <test name>" % sys.argv[0])
|
|
exit(0)
|
|
|
|
name = sys.argv[1]
|
|
try:
|
|
output_bytes = subprocess.check_output([sys.executable, "-u", name + ".py"],
|
|
stderr=subprocess.STDOUT)
|
|
except subprocess.CalledProcessError as exc:
|
|
print('Test `{}` failed:\n{}\n'.format(name, '-' * 50))
|
|
print(exc.output.decode())
|
|
print('-' * 50)
|
|
sys.exit(1)
|
|
|
|
output = sanitize(output_bytes.decode('utf-8'))
|
|
reference = sanitize(open(name + '.ref', 'r').read())
|
|
|
|
if output == reference:
|
|
print('Test "%s" succeeded.' % name)
|
|
exit(0)
|
|
else:
|
|
print('Test "%s" FAILED!' % name)
|
|
print('--- output')
|
|
print('+++ reference')
|
|
print(''.join(difflib.ndiff(output.splitlines(True),
|
|
reference.splitlines(True))))
|
|
exit(-1)
|