"""Do not collapse a directed dispositor cycle into an arbitrary terminal.""" import ast from pathlib import Path def resolver(): # Isolate the pure function without importing the large CLI and adapters. source = Path(__file__).parents[1] / 'scripts/jyotish_engine.py' tree = ast.parse(source.read_text()) node = next(n for n in tree.body if isinstance(n, ast.FunctionDef) and n.name == 'final_dispositor_from_chain') namespace = {} exec(compile(ast.Module(body=[node], type_ignores=[]), str(source), 'exec'), namespace) return namespace[node.name] def chain(*names): return [{'planet':a,'dispositor':b} for a,b in zip(names,names[1:])] def test_cycle_rotation_and_leading_planet(): f = resolver() expected = 'Cycle: Jupiter -> Mercury -> Jupiter' assert f(chain('Mercury','Jupiter','Mercury')) == expected assert f(chain('Jupiter','Mercury','Jupiter')) == expected assert f(chain('Venus','Jupiter','Mercury','Jupiter')) == expected def test_terminal_and_incomplete_are_distinct(): f = resolver() assert f(chain('Sun','Mars','Saturn','Saturn')) == 'Saturn' assert f(chain('Sun','Mars')) is None assert f([]) is None assert f(chain('Sun','Mars') + chain('Venus','Venus')) is None def test_three_body_cycle_preserves_direction(): assert resolver()(chain('Sun','Mars','Moon','Sun')) == 'Cycle: Mars -> Moon -> Sun -> Mars'