on f43d2ee help sign in
jibb/tools/type-generic-recursion-test
61 lines 3.1 kB history raw
1#!/usr/bin/env python3
2"""Check indexed recursive source identity, aliases and cache 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-recursion'
16source = (root / 'tests/lib/jibb-generic-recursion.hoon').read_text()
17source = source[source.index('\n|%\n') + 1:]
18names = ['tree', 'changed', 'alias', 'client', 'bad-mold', 'bad-constructor',
19 'bad-parameter', 'local-shadow', 'local-distinct', 'local-only',
20 'list-shadow', 'chain', 'bad-match']
21files = ['tree', 'tree-changed', 'alias', 'client', 'bad-mold', 'bad-constructor',
22 'bad-parameter', 'local-shadow', 'local-distinct', 'local-only',
23 'list-shadow', 'chain', 'bad-match']
24cords = [item for name, file in zip(names, files)
25 for item in ('--cord', f'{name}-text={fixture / (file + ".txt")}')]
26cords += ['--cord', f'prelude={root / "jibb-dev/lib/jibb/prelude.jibb"}',
27 '--cord', f'internal={root / "jibb-dev/lib/jibb/internal.jibb"}']
28bindings = ''.join(f'=/ {name}=wain (to-wain:format {name}-text)\n'
29 for name in names)
30program = ("=/ jibb .\n=/ real-prelude=@t prelude\n"
31 "=/ real-internal=@t internal\n" + bindings +
32 "=/ expected=wain ~\n=/ suite\n" + source +
33 "\n^- @t\n=/ invalid=(list [label=@t src=@t])\n"
34 " :~ ['unused mold hole declined' bad-mold-text]\n"
35 " ['invalid constructor declined' bad-constructor-text]\n"
36 " ['invalid matching declined' bad-match-text]\n"
37 " ['nonuniform recursion declined' bad-parameter-text]\n"
38 " ['identical local shadow declined' local-shadow-text]\n"
39 " ['different local shadow declined' local-distinct-text]\n"
40 " ['local recursion declined' local-only-text]\n"
41 " ==\n"
42 "(generic-output:suite prelude internal tree-text changed-text alias-text client-text invalid list-shadow-text chain-text)\n")
43with tempfile.TemporaryDirectory(prefix='jibb-generic-recursion-') as tmp:
44 path = Path(tmp) / 'test.hoon'
45 path.write_text(program)
46 result = subprocess.run([str(root / 'tools/hoon'), '--lib', args.lib, '--raw',
47 '-f', str(path), *cords], stdout=subprocess.PIPE)
48if result.returncode:
49 sys.exit(result.returncode)
50expected_path = fixture / 'expected.txt'
51if args.update:
52 expected_path.write_bytes(result.stdout)
53else:
54 expected = expected_path.read_bytes()
55 if result.stdout != expected:
56 sys.stderr.writelines(difflib.unified_diff(
57 expected.decode().splitlines(keepends=True),
58 result.stdout.decode().splitlines(keepends=True),
59 fromfile='expected.txt', tofile='actual'))
60 sys.exit(1)
61print('source-backed generic recursion guards passed')