summaryrefslogtreecommitdiff
path: root/tests/test_kernel_models.py
diff options
context:
space:
mode:
Diffstat (limited to 'tests/test_kernel_models.py')
-rw-r--r--tests/test_kernel_models.py67
1 files changed, 65 insertions, 2 deletions
diff --git a/tests/test_kernel_models.py b/tests/test_kernel_models.py
index 864d6d5..0dc653d 100644
--- a/tests/test_kernel_models.py
+++ b/tests/test_kernel_models.py
@@ -40,7 +40,7 @@ def test_replacement_must_reference_a_real_dag_node() -> None:
{
"changes": [
{
- "slot_id": "s1",
+ "slot_id": "slot1",
"source_node_id": "n9",
"description": "constant",
"original_value": "1",
@@ -56,6 +56,70 @@ def test_replacement_must_reference_a_real_dag_node() -> None:
replacements.validate_against(branched_dag())
+def test_replacement_must_target_a_source_leaf() -> None:
+ replacements = ReplacementPlan.model_validate(
+ {
+ "changes": [
+ {
+ "slot_id": "slot1",
+ "source_node_id": "n2",
+ "description": "derived value",
+ "original_value": "1",
+ "replacement_value": "2",
+ "guard_condition": "positive",
+ "guard_justification": "2 is positive",
+ }
+ ],
+ "closure_statement": "No undeclared changes.",
+ }
+ )
+ with pytest.raises(ValueError, match="must target source leaf nodes.*n2"):
+ replacements.validate_against(branched_dag())
+
+
+def test_replacement_slot_id_matches_release_schema() -> None:
+ with pytest.raises(ValueError, match="must be slot1, slot2"):
+ ReplacementPlan.model_validate(
+ {
+ "changes": [
+ {
+ "slot_id": "s1",
+ "source_node_id": "n1",
+ "description": "constant",
+ "original_value": "1",
+ "replacement_value": "2",
+ "guard_condition": "positive",
+ "guard_justification": "2 is positive",
+ }
+ ],
+ "closure_statement": "No undeclared changes.",
+ }
+ )
+
+
+def test_replacement_repair_preserves_slot_and_leaf_identity() -> None:
+ previous = ReplacementPlan.model_validate(
+ {
+ "changes": [
+ {
+ "slot_id": "slot1",
+ "source_node_id": "n1",
+ "description": "constant",
+ "original_value": "1",
+ "replacement_value": "2",
+ "guard_condition": "positive",
+ "guard_justification": "2 is positive",
+ }
+ ],
+ "closure_statement": "No undeclared changes.",
+ }
+ )
+ changed_target = previous.model_copy(deep=True)
+ changed_target.changes[0].source_node_id = "n2"
+ with pytest.raises(ValueError, match="preserve replacement slot IDs"):
+ changed_target.validate_repair_of(previous)
+
+
def test_diffusion_preserves_dependencies_and_methods() -> None:
dag = branched_dag()
methods = MethodPlan.model_validate(
@@ -130,7 +194,6 @@ def test_accept_verdict_normalizes_explicit_none_sentinel() -> None:
verdict = JudgeVerdict(
verdict="accept",
step_by_step_check="n1 valid",
- replacement_check="s1 valid",
blocking_issues="None detected.",
patch_suggestion="N/A",
)