Spaces:
Paused
Paused
| """Tests for the CGAE core engine.""" | |
| import pytest | |
| from cgae_engine.gate import GateFunction, RobustnessVector, Tier, TierThresholds | |
| class TestRobustnessVector: | |
| def test_valid_vector(self): | |
| r = RobustnessVector(cc=0.5, er=0.6, as_=0.7, ih=0.8) | |
| assert r.cc == 0.5 | |
| assert r.weakest == 0.5 | |
| def test_out_of_range_raises(self): | |
| with pytest.raises(ValueError): | |
| RobustnessVector(cc=1.5, er=0.5, as_=0.5, ih=0.5) | |
| def test_primary_dimensions(self): | |
| r = RobustnessVector(cc=0.3, er=0.5, as_=0.4, ih=0.9) | |
| assert r.primary == (0.3, 0.5, 0.4) | |
| assert r.weakest == 0.3 | |
| class TestGateFunction: | |
| def setup_method(self): | |
| self.gate = GateFunction() | |
| def test_zero_robustness_gives_t0(self): | |
| r = RobustnessVector(cc=0.0, er=0.0, as_=0.0, ih=0.0) | |
| assert self.gate.evaluate(r) == Tier.T0 | |
| def test_low_ih_forces_t0(self): | |
| r = RobustnessVector(cc=0.9, er=0.9, as_=0.9, ih=0.3) | |
| assert self.gate.evaluate(r) == Tier.T0 | |
| def test_weakest_link(self): | |
| # High CC and ER but low AS should be gated by AS | |
| r = RobustnessVector(cc=0.9, er=0.9, as_=0.3, ih=0.9) | |
| tier = self.gate.evaluate(r) | |
| assert tier == Tier.T1 # AS=0.3 >= 0.25 (T1 threshold) | |
| def test_t5_requires_all_high(self): | |
| r = RobustnessVector(cc=0.95, er=0.95, as_=0.90, ih=0.95) | |
| assert self.gate.evaluate(r) == Tier.T5 | |
| def test_evaluate_with_detail(self): | |
| r = RobustnessVector(cc=0.72, er=0.68, as_=0.55, ih=0.82) | |
| d = self.gate.evaluate_with_detail(r) | |
| assert "tier" in d | |
| assert "binding_dimension" in d | |
| assert d["ih_pass"] is True | |
| def test_chain_tier(self): | |
| r1 = RobustnessVector(cc=0.9, er=0.9, as_=0.9, ih=0.9) | |
| r2 = RobustnessVector(cc=0.4, er=0.4, as_=0.3, ih=0.6) | |
| chain = self.gate.chain_tier([r1, r2]) | |
| assert chain <= self.gate.evaluate(r1) | |
| assert chain == self.gate.evaluate(r2) | |
| def test_budget_ceiling_increases_with_tier(self): | |
| ceilings = [self.gate.budget_ceiling(Tier(i)) for i in range(6)] | |
| for i in range(1, 6): | |
| assert ceilings[i] > ceilings[i - 1] | |
| class TestTierThresholds: | |
| def test_default_thresholds_valid(self): | |
| t = TierThresholds() | |
| assert len(t.cc) == 6 | |
| assert t.cc[0] == 0.0 | |
| def test_non_increasing_raises(self): | |
| with pytest.raises(ValueError): | |
| TierThresholds(cc=[0.0, 0.5, 0.4, 0.6, 0.8, 0.9]) | |