Add adapter SDK conformance proofs
This commit is contained in:
parent
85f6629cb1
commit
e6523c0c00
5 changed files with 634 additions and 34 deletions
|
|
@ -248,6 +248,36 @@ class NonLogicIncrementalLoader(IncrementalLoader):
|
|||
return replace(super().extract_source(source), logic=())
|
||||
|
||||
|
||||
class CompleteLogicIncrementalLoader(IncrementalLoader):
|
||||
"""Supply an independent complete Logic oracle alongside the legacy graph oracle."""
|
||||
|
||||
def __init__(self, root: Path, *, mismatched_logic: bool = False) -> None:
|
||||
super().__init__(root)
|
||||
self.mismatched_logic = mismatched_logic
|
||||
|
||||
def load_complete_assembly(self) -> AdapterAssembly:
|
||||
projection = super().load_projection()
|
||||
if "guide.workflow" not in self.sources:
|
||||
return AdapterAssembly(projection)
|
||||
manifest = self.load_manifest()
|
||||
workflow = next(
|
||||
source for source in manifest.sources if source.source_id == "guide.workflow"
|
||||
)
|
||||
logic = self.extract_source(workflow).logic
|
||||
if self.mismatched_logic:
|
||||
current = logic[0]
|
||||
logic = (
|
||||
replace(
|
||||
current,
|
||||
nodes=(
|
||||
current.nodes[0],
|
||||
replace(current.nodes[1], label="Different complete return"),
|
||||
),
|
||||
),
|
||||
)
|
||||
return AdapterAssembly(projection, logic)
|
||||
|
||||
|
||||
class AdapterContractTests(unittest.TestCase):
|
||||
def projection(self, root: Path) -> AdapterProjection:
|
||||
foundation = Node(
|
||||
|
|
@ -782,6 +812,46 @@ class AdapterContractTests(unittest.TestCase):
|
|||
self.assertEqual("ok", equivalent["status"])
|
||||
self.assertEqual(1, equivalent["node_count"])
|
||||
|
||||
def test_logic_equivalence_requires_an_independent_complete_oracle(self) -> None:
|
||||
with tempfile.TemporaryDirectory() as directory:
|
||||
root = Path(directory).resolve()
|
||||
project = AdapterProject(
|
||||
IncrementalLoader(root),
|
||||
cache_root=root / ".cache" / "logic-without-oracle",
|
||||
)
|
||||
|
||||
with self.assertRaises(DocForgeError) as captured:
|
||||
project.verify_incremental_equivalence()
|
||||
|
||||
self.assertEqual("complete_logic_oracle_required", captured.exception.code)
|
||||
|
||||
def test_logic_equivalence_uses_the_complete_assembly_oracle(self) -> None:
|
||||
with tempfile.TemporaryDirectory() as directory:
|
||||
root = Path(directory).resolve()
|
||||
project = AdapterProject(
|
||||
CompleteLogicIncrementalLoader(root),
|
||||
cache_root=root / ".cache" / "logic-oracle",
|
||||
)
|
||||
|
||||
result = project.verify_incremental_equivalence()
|
||||
|
||||
self.assertEqual("ok", result["status"])
|
||||
self.assertEqual(1, result["logic_projection_count"])
|
||||
|
||||
def test_logic_equivalence_reports_exact_mismatch_field(self) -> None:
|
||||
with tempfile.TemporaryDirectory() as directory:
|
||||
root = Path(directory).resolve()
|
||||
project = AdapterProject(
|
||||
CompleteLogicIncrementalLoader(root, mismatched_logic=True),
|
||||
cache_root=root / ".cache" / "logic-mismatch",
|
||||
)
|
||||
|
||||
with self.assertRaises(DocForgeError) as captured:
|
||||
project.verify_incremental_equivalence()
|
||||
|
||||
self.assertEqual("incremental_mismatch", captured.exception.code)
|
||||
self.assertEqual(["logic"], captured.exception.details["fields"])
|
||||
|
||||
def test_incremental_adapter_can_assemble_overlapping_source_evidence(self) -> None:
|
||||
with tempfile.TemporaryDirectory() as directory:
|
||||
root = Path(directory).resolve()
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue