"""Tests for QSVAPS data models.""" import pytest from qsvaps.models import ( Plan, PlanAction, PlanConstraint, ResourceConstraint, ConstraintType, FailureWitness, VerificationResult, VariableMapping, ) class TestPlanAction: def test_basic_creation(self): action = PlanAction(name="fetch", description="Fetch data") assert action.name == "fetch" assert action.description == "Fetch data" assert action.can_fail is True assert action.fallback is None assert action.resources == [] def test_with_resources(self): action = PlanAction( name="process", resources=["gpu", "memory"], can_fail=False, ) assert action.resources == ["gpu", "memory"] assert action.can_fail is False def test_with_fallback(self): action = PlanAction(name="main", fallback="backup") assert action.fallback == "backup" class TestPlan: def test_basic_plan(self): plan = Plan( name="Test Plan", actions=[ PlanAction(name="a"), PlanAction(name="b"), ], dependencies=[("a", "b")], ) assert len(plan.actions) == 2 assert plan.action_names == ["a", "b"] def test_get_action(self): plan = Plan( name="Test", actions=[PlanAction(name="x"), PlanAction(name="y")], ) assert plan.get_action("x").name == "x" assert plan.get_action("z") is None def test_get_action_index(self): plan = Plan( name="Test", actions=[PlanAction(name="a"), PlanAction(name="b")], ) assert plan.get_action_index("a") == 0 assert plan.get_action_index("b") == 1 assert plan.get_action_index("c") == -1 class TestVariableMapping: def test_num_variables(self): vm = VariableMapping( variables={"s_a": 0, "s_b": 1}, descriptions={"s_a": "A succeeds", "s_b": "B succeeds"}, ) assert vm.num_variables == 2 def test_get_var_name(self): vm = VariableMapping(variables={"s_a": 0, "s_b": 1}) assert vm.get_var_name(0) == "s_a" assert vm.get_var_name(1) == "s_b" assert vm.get_var_name(99) == "x99" def test_get_description(self): vm = VariableMapping( variables={"s_a": 0}, descriptions={"s_a": "Action A succeeds"}, ) assert vm.get_description(0) == "Action A succeeds" class TestFailureWitness: def test_creation(self): constraint = PlanConstraint( expression="x0", description="A must succeed", constraint_type=ConstraintType.COMPLETION, ) witness = FailureWitness( assignment={"s_a": False}, violated_constraints=[constraint], bitstring="0", measurement_count=42, explanation="A failed", ) assert witness.measurement_count == 42 assert len(witness.violated_constraints) == 1 class TestVerificationResult: def test_safe_result(self): plan = Plan(name="Safe", actions=[]) result = VerificationResult( plan=plan, is_safe=True, witnesses=[], num_variables=3, num_violations=0, total_states=8, grover_iterations=0, ) assert result.is_safe assert result.num_violations == 0