#!/usr/bin/env python3 """Check source-backed empty molds and uninhabited union cases 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-empty' source = (root / 'tests/lib/jibb-empty.hoon').read_text() source = source[source.index('\n|%\n') + 1:] names = ['good', 'overlap', 'dead', 'missing', 'standard-good', 'list-dead', 'unit-dead', 'late-cap', 'list-live', 'list-open', 'face-source'] 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"}'] if not args.update: cords += ['--cord', f'expected-text={fixture / "expected.txt"}'] bindings = ''.join(f'=/ {name}=wain (to-wain:format {name}-text)\n' for name in names) program = ('=/ jibb .\n=/ real-prelude=@t prelude\n' '=/ real-internal=@t internal\n' + bindings + ('=/ expected=wain ~\n' if args.update else '=/ expected=wain (to-wain:format expected-text)\n') + '=/ suite\n' + source + '\n=/ output=@t (empty-output:suite prelude internal ' + ' '.join(name + '-text' for name in names) + ')\n' + ('output\n' if args.update else "=/ actual-test=tang test-empty:suite\n?~ actual-test output\n'BAD ship test arm'\n")) with tempfile.TemporaryDirectory(prefix='jibb-empty-') 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) if any(line.startswith(b'BAD ') or line.endswith(b': BAD') for line in result.stdout.splitlines()): sys.stderr.write('empty-mold guard assertion failed:\n') sys.stderr.buffer.write(result.stdout) sys.exit(1) 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 empty-mold guards passed')