..........FF.. [100%] =================================== FAILURES =================================== __ test_required_attachment_failure_optional_omission_and_permission_overflow __ def test_required_attachment_failure_optional_omission_and_permission_overflow(): scene = Scene(3, domain=Box((-5, -3, -5), (30, 50, 30))) scene.place('land', Terrain(scene.domain, constant(0))) policy = RoofDesign(end_hips=(3, 3), ridge_component=RidgeLantern(9), ridge_required=True) before = snapshot(scene) with pytest.raises(ContractError, match='ridge-fit'): scene.place('roof', RoofCover(9, 9, 'deepslate_tile', policy), frame=Frame((0, 3, 0))) assert snapshot(scene) == before scene.place('roof', RoofCover(9, 9, 'deepslate_tile', replace(policy, ridge_required=False)), frame=Frame((0, 3, 0))) assert scene.view.contract('/roof').decisions['omitted_optional_ridge'] scene, port = bare_host() before = snapshot(scene) class Overflow: def capability(self): return Capability('test.ridge-overflow', ('ridge-attachment',)) def negotiate(self, ctx, parameters): return Contract(Box((-5, -12, -10), (5, 8, 12))) def realize(self, ctx, contract): plan = Plan() outside = next(p for p in ctx.view.cells('/host') if not port.region.contains(p)) plan.block(ctx.local(outside), AIR) return plan with pytest.raises(ContractError, match='write-authority|envelope'): > scene.place('overflow', Overflow(), frame=port.frame, bindings=(Binding('/host', 'ridge'),)) test/test_roof_lantern.py:120: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hearth/kernel/scene.py:148: in place candidate._instantiate(path, component, params or {}, frame, tuple(bindings), None, Scope(self.seed).child(key, seed), complete) hearth/kernel/scene.py:249: in _instantiate plan = component.realize(ctx, local) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = .Overflow object at 0x79a451914d40> ctx = Context(path='/overflow', frame=Frame(origin=(5, 12, 10), turn=0), scope=Scope(seed=0, key=('overflow',)), view= outside = next(p for p in ctx.view.cells('/host') if not port.region.contains(p)) ^^^^^^^^^^^^^^ E AttributeError: 'View' object has no attribute 'cells' test/test_roof_lantern.py:115: AttributeError _ test_replace_remove_and_regenerate_restore_skin_without_stale_window_owners __ def test_replace_remove_and_regenerate_restore_skin_without_stale_window_owners(): scene, port = bare_host() before = semantic_digest(scene) scene.place('lightwell', RidgeLantern(7), frame=port.frame, bindings=(Binding('/host', 'ridge'),)) current = scene.cells('/lightwell', True) windows = {n.path for n in scene.nodes.values() if n.path.startswith('/lightwell/')} replaced = set(scene.displaced['/lightwell']) assert replaced and not replaced.intersection(scene.cells('/host')) assert all(scene.view.owner(p) != '/host' for p in replaced) > scene.remove('/lightwell') test/test_roof_lantern.py:133: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hearth/kernel/scene.py:462: in remove trial._check(False) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = , final = False completed_scope = None def _check(self, final, completed_scope=None): errors = validate(self, final, completed_scope) if errors: > raise ValidationError(errors) E hearth.kernel.errors.ValidationError: roof-cover: /host at (5, 12, 10): Weather skin has an uncovered column E roof-cover: /host at (5, 12, 16): Weather skin has an uncovered column hearth/kernel/scene.py:391: ValidationError =========================== short test summary info ============================ FAILED test/test_roof_lantern.py::test_required_attachment_failure_optional_omission_and_permission_overflow FAILED test/test_roof_lantern.py::test_replace_remove_and_regenerate_restore_skin_without_stale_window_owners 2 failed, 12 passed in 15.77s