on f43d2ee help sign in
jibb/tools/type-generic-pattern-test
52 lines 2.4 kB history raw
1#!/usr/bin/env python3
2"""Check recursive pattern coverage, state and arm bounds under eval."""
3from pathlib import Path
4import argparse
5import difflib
6import subprocess
7import sys
8import tempfile
10root = Path(__file__).resolve().parent.parent
11parser = argparse.ArgumentParser(description=__doc__)
12parser.add_argument('--lib', default=str(root / 'jibb-dev/lib/jibb.hoon'))
13parser.add_argument('--update', action='store_true')
14args = parser.parse_args()
15fixture = root / 'tests/type-generic-pattern'
16shared = root / 'tests/type-generic-construction'
17source = (root / 'tests/lib/jibb-generic-pattern.hoon').read_text()
18source = source[source.index('\n|%\n') + 1:]
19reused = ['tree', 'alias', 'tree-no-event']
20names = ['client', 'no-event', 'values', 'poly-values', 'owner', 'owner-bad']
21cords = [item for name in reused
22 for item in ('--cord', f'{name}-text={shared / (name + ".txt")}')]
23cords += [item for name in names
24 for item in ('--cord', f'{name}-text={fixture / (name + ".txt")}')]
25cords += ['--cord', f'prelude={root / "jibb-dev/lib/jibb/prelude.jibb"}',
26 '--cord', f'internal={root / "jibb-dev/lib/jibb/internal.jibb"}']
27bindings = ''.join(f'=/ {name}=wain (to-wain:format {name}-text)\n'
28 for name in reused + names)
29program = ("=/ jibb .\n=/ real-prelude=@t prelude\n"
30 "=/ real-internal=@t internal\n" + bindings +
31 "=/ expected=wain ~\n=/ suite\n" + source +
32 "\n^- @t\n(pattern-output:suite prelude internal " +
33 ' '.join(name + '-text' for name in reused + names) + ")\n")
34with tempfile.TemporaryDirectory(prefix='jibb-generic-pattern-') as tmp:
35 path = Path(tmp) / 'test.hoon'
36 path.write_text(program)
37 result = subprocess.run([str(root / 'tools/hoon'), '--lib', args.lib, '--raw',
38 '-f', str(path), *cords], stdout=subprocess.PIPE)
39if result.returncode:
40 sys.exit(result.returncode)
41expected_path = fixture / 'expected.txt'
42if args.update:
43 expected_path.write_bytes(result.stdout)
44else:
45 expected = expected_path.read_bytes()
46 if result.stdout != expected:
47 sys.stderr.writelines(difflib.unified_diff(
48 expected.decode().splitlines(keepends=True),
49 result.stdout.decode().splitlines(keepends=True),
50 fromfile='expected.txt', tofile='actual'))
51 sys.exit(1)
52print('source-backed generic pattern guards passed')