diff options
Diffstat (limited to 'tests/test_kernel_models.py')
| -rw-r--r-- | tests/test_kernel_models.py | 67 |
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", ) |
