#!/usr/bin/env python3 """Check recursive pattern coverage, state and arm bounds under eval.""" from pathlib import Path import argparse import difflib import subprocess import sys import tempfile root = Path(__file__).resolve().parent.parent parser = argparse.ArgumentParser(description=__doc__) parser.add_argument('--lib', default=str(root / 'jibb-dev/lib/jibb.hoon')) parser.add_argument('--update', action='store_true') args = parser.parse_args() fixture = root / 'tests/type-generic-pattern' shared = root / 'tests/type-generic-construction' source = (root / 'tests/lib/jibb-generic-pattern.hoon').read_text() source = source[source.index('\n|%\n') + 1:] reused = ['tree', 'alias', 'tree-no-event'] names = ['client', 'no-event', 'values', 'poly-values', 'owner', 'owner-bad'] cords = [item for name in reused for item in ('--cord', f'{name}-text={shared / (name + ".txt")}')] cords += [item for name in names for item in ('--cord', f'{name}-text={fixture / (name + ".txt")}')] cords += ['--cord', f'prelude={root / "jibb-dev/lib/jibb/prelude.jibb"}', '--cord', f'internal={root / "jibb-dev/lib/jibb/internal.jibb"}'] bindings = ''.join(f'=/ {name}=wain (to-wain:format {name}-text)\n' for name in reused + names) program = ("=/ jibb .\n=/ real-prelude=@t prelude\n" "=/ real-internal=@t internal\n" + bindings + "=/ expected=wain ~\n=/ suite\n" + source + "\n^- @t\n(pattern-output:suite prelude internal " + ' '.join(name + '-text' for name in reused + names) + ")\n") with tempfile.TemporaryDirectory(prefix='jibb-generic-pattern-') as tmp: path = Path(tmp) / 'test.hoon' path.write_text(program) result = subprocess.run([str(root / 'tools/hoon'), '--lib', args.lib, '--raw', '-f', str(path), *cords], stdout=subprocess.PIPE) if result.returncode: sys.exit(result.returncode) expected_path = fixture / 'expected.txt' if args.update: expected_path.write_bytes(result.stdout) else: expected = expected_path.read_bytes() if result.stdout != expected: sys.stderr.writelines(difflib.unified_diff( expected.decode().splitlines(keepends=True), result.stdout.decode().splitlines(keepends=True), fromfile='expected.txt', tofile='actual')) sys.exit(1) print('source-backed generic pattern guards passed')