Skip to content

Commit 41928ab

Browse files
Copilotfermga
andcommitted
Add integration tests for physics-based grammar derivation
Co-authored-by: fermga <203334638+fermga@users.noreply.github.com>
1 parent 89b1acf commit 41928ab

File tree

1 file changed

+129
-0
lines changed

1 file changed

+129
-0
lines changed
Lines changed: 129 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,129 @@
1+
"""Integration test demonstrating physics-based operator derivation.
2+
3+
This test shows that the grammar validation uses operators derived from
4+
TNFR physical principles rather than arbitrary lists.
5+
"""
6+
7+
import pytest
8+
9+
from tnfr.config.operator_names import (
10+
EMISSION,
11+
RECEPTION,
12+
COHERENCE,
13+
TRANSITION,
14+
SILENCE,
15+
RECURSIVITY,
16+
validate_physics_derivation,
17+
)
18+
from tnfr.config.physics_derivation import (
19+
derive_start_operators_from_physics,
20+
derive_end_operators_from_physics,
21+
)
22+
from tnfr.operators.grammar import validate_sequence
23+
24+
25+
def test_physics_derived_operators_are_used_by_grammar():
26+
"""Grammar validation uses physics-derived start/end operators."""
27+
# Get physics-derived operators
28+
physics_start = derive_start_operators_from_physics()
29+
physics_end = derive_end_operators_from_physics()
30+
31+
# Verify they match what the validation expects
32+
validation = validate_physics_derivation()
33+
assert validation["start_operators_valid"], (
34+
f"Start operators mismatch: {validation['discrepancies']}"
35+
)
36+
assert validation["end_operators_valid"], (
37+
f"End operators mismatch: {validation['discrepancies']}"
38+
)
39+
40+
# Test that EMISSION (physics-derived start) works
41+
assert EMISSION in physics_start
42+
result = validate_sequence([EMISSION, RECEPTION, COHERENCE, SILENCE])
43+
assert result.passed
44+
45+
# Test that TRANSITION (NEW physics-derived start) works
46+
assert TRANSITION in physics_start
47+
result = validate_sequence([TRANSITION, RECEPTION, COHERENCE, SILENCE])
48+
assert result.passed
49+
50+
# Test that SILENCE (physics-derived end) works
51+
assert SILENCE in physics_end
52+
result = validate_sequence([EMISSION, RECEPTION, COHERENCE, SILENCE])
53+
assert result.passed
54+
55+
# Test that RECURSIVITY (physics-derived start AND end) works
56+
assert RECURSIVITY in physics_start
57+
assert RECURSIVITY in physics_end
58+
result = validate_sequence([RECURSIVITY, RECEPTION, COHERENCE, RECURSIVITY])
59+
assert result.passed
60+
61+
62+
def test_non_physics_operators_are_rejected_as_starts():
63+
"""Operators that can't generate/activate EPI are rejected as starts."""
64+
physics_start = derive_start_operators_from_physics()
65+
66+
# RECEPTION cannot start (needs external source + existing EPI)
67+
assert RECEPTION not in physics_start
68+
result = validate_sequence([RECEPTION, COHERENCE, SILENCE])
69+
assert not result.passed
70+
assert "must start" in result.message.lower()
71+
72+
# COHERENCE cannot start (stabilizes existing, can't create)
73+
assert COHERENCE not in physics_start
74+
result = validate_sequence([COHERENCE, SILENCE])
75+
assert not result.passed
76+
assert "must start" in result.message.lower()
77+
78+
79+
def test_physics_derivation_linked_to_nodal_equation():
80+
"""Verify derivation is based on nodal equation ∂EPI/∂t = νf · ΔNFR."""
81+
from tnfr.config.physics_derivation import (
82+
can_generate_epi_from_null,
83+
can_stabilize_reorganization,
84+
)
85+
86+
# EMISSION generates EPI: creates νf > 0 and ΔNFR > 0
87+
# From ∂EPI/∂t = νf · ΔNFR, this produces ∂EPI/∂t > 0
88+
assert can_generate_epi_from_null(EMISSION)
89+
90+
# SILENCE stabilizes: forces νf → 0
91+
# From ∂EPI/∂t = νf · ΔNFR, this produces ∂EPI/∂t → 0
92+
assert can_stabilize_reorganization(SILENCE)
93+
94+
95+
def test_transition_added_as_physics_derived_start():
96+
"""TRANSITION was added as start operator based on physics derivation."""
97+
physics_start = derive_start_operators_from_physics()
98+
99+
# TRANSITION can activate latent EPI (phase activation)
100+
assert TRANSITION in physics_start
101+
102+
# Verify it works in actual grammar validation
103+
result = validate_sequence([TRANSITION, RECEPTION, COHERENCE, SILENCE])
104+
assert result.passed, f"TRANSITION start failed: {result.message}"
105+
106+
# This is the key difference: previously TRANSITION wasn't a valid
107+
# start operator. Now it is, because physics derivation shows it can
108+
# activate nodes from another phase.
109+
110+
111+
def test_backward_compatibility_maintained():
112+
"""Original start operators (EMISSION, RECURSIVITY) still work."""
113+
physics_start = derive_start_operators_from_physics()
114+
115+
# Original operators still present
116+
assert EMISSION in physics_start
117+
assert RECURSIVITY in physics_start
118+
119+
# Original sequences still valid
120+
result1 = validate_sequence([EMISSION, RECEPTION, COHERENCE, SILENCE])
121+
assert result1.passed
122+
123+
result2 = validate_sequence([RECURSIVITY, RECEPTION, COHERENCE, SILENCE])
124+
assert result2.passed
125+
126+
127+
if __name__ == "__main__":
128+
# Run tests with verbose output
129+
pytest.main([__file__, "-v", "--tb=short"])

0 commit comments

Comments
 (0)