summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gerbonara/gerber/tests/utils.py73
1 files changed, 73 insertions, 0 deletions
diff --git a/gerbonara/gerber/tests/utils.py b/gerbonara/gerber/tests/utils.py
new file mode 100644
index 0000000..ee8fc68
--- /dev/null
+++ b/gerbonara/gerber/tests/utils.py
@@ -0,0 +1,73 @@
+
+import pytest
+import functools
+import tempfile
+import re
+import shutil
+from contextlib import contextmanager
+from pathlib import Path
+
+from PIL import Image
+import pytest
+
+fail_dir = Path('gerbonara_test_failures')
+reference_path = lambda reference: Path(__file__).parent / 'resources' / reference
+to_gerbv_svg_units = lambda val, unit='mm': val*72 if unit == 'inch' else val/25.4*72
+
+def path_test_name(request):
+ """ Create a slug suitable for use in file names from the test's nodeid """
+ module, _, test_name = request.node.nodeid.rpartition('::')
+ _test, _, test_name = test_name.partition('_')
+ test_name, _, _ext = test_name.partition('.')
+ return re.sub(r'[^\w\d]', '_', test_name)
+
+@pytest.fixture
+def print_on_error(request):
+ messages = []
+
+ def register_print(*args, sep=' ', end='\n'):
+ nonlocal messages
+ messages.append(sep.join(str(arg) for arg in args) + end)
+
+ yield register_print
+
+ if request.node.rep_call.failed:
+ for msg in messages:
+ print(msg, end='')
+
+@pytest.fixture
+def tmpfile(request):
+ registered = []
+
+ def register_tempfile(name, suffix):
+ nonlocal registered
+ f = tempfile.NamedTemporaryFile(suffix=suffix)
+ registered.append((name, suffix, f))
+ return Path(f.name)
+
+ yield register_tempfile
+
+ if request.node.rep_call.failed:
+ fail_dir.mkdir(exist_ok=True)
+ test_name = path_test_name(request)
+ for name, suffix, tmp in registered:
+ slug = re.sub(r'[^\w\d]+', '_', name.lower())
+ perm_path = fail_dir / f'failure_{test_name}_{slug}{suffix}'
+ shutil.copy(tmp.name, perm_path)
+ print(f'{name} saved to {perm_path}')
+
+ for _name, _suffix, tmp in registered:
+ tmp.close()
+
+@pytest.fixture
+def reference(request, print_on_error):
+ ref = reference_path(request.param)
+ yield ref
+ print_on_error(f'Reference file: {ref}')
+
+def filter_syntax_warnings(fun):
+ a = pytest.mark.filterwarnings('ignore:Deprecated.*statement found.*:DeprecationWarning')
+ b = pytest.mark.filterwarnings('ignore::SyntaxWarning')
+ return a(b(fun))
+
+