"""Rahu / Ketu have no own sign; the main path uses fixed lords (BUG-1211, ruling 甲12). `jyotish_engine._get_dignity_level` no longer calls Rahu in Virgo or Ketu in Pisces "own sign" (nor Aquarius / Scorpio); `yoga_engine.YogaContext` resolves Scorpio to Mars and Aquarius to Saturn on the main path, keeping the stronger co-lord comparison for Jaimini variants (dynamic_co_lords=True) only. """ from __future__ import annotations import pytest from scripts.jyotish_engine import _get_dignity_level from scripts.yoga_engine import YogaContext @pytest.mark.parametrize("planet,sign", [("Rahu", "Virgo"), ("Rahu", "Aquarius"), ("Ketu", "Pisces"), ("Ketu", "Scorpio")]) def test_nodes_are_never_own_sign(planet: str, sign: str) -> None: assert _get_dignity_level(planet, sign) != "OWN_SIGN" planets = {"Sun": {"sign": "Aries", "house": 1}, planet: {"sign": sign, "house": 2}} assert _get_dignity_level(planet, sign, 15.0, planets) != "OWN_SIGN" def test_classical_own_signs_unchanged() -> None: assert _get_dignity_level("Saturn", "Aquarius", 25.0) == "OWN_SIGN" assert _get_dignity_level("Mars", "Scorpio") == "OWN_SIGN" def _context(asc: str) -> YogaContext: # Ketu crowded in Taurus and Rahu with company: the old resolver could pick # Ketu / Rahu as the stronger co-lord of Scorpio / Aquarius. planets = { "Mars": {"sign": "Leo", "house": 1, "degree": 5.0}, "Saturn": {"sign": "Pisces", "house": 2, "degree": 5.0}, "Ketu": {"sign": "Taurus", "house": 3, "degree": 5.0}, "Rahu": {"sign": "Scorpio", "house": 4, "degree": 5.0}, "Sun": {"sign": "Taurus", "house": 5, "degree": 6.0}, "Moon": {"sign": "Taurus", "house": 6, "degree": 7.0}, "Mercury": {"sign": "Scorpio", "house": 7, "degree": 8.0}, "Jupiter": {"sign": "Scorpio", "house": 8, "degree": 9.0}, "Venus": {"sign": "Taurus", "house": 9, "degree": 10.0}, } return YogaContext(planets, asc) @pytest.mark.parametrize("asc", ["Scorpio", "Aquarius", "Leo"]) def test_main_path_lords_are_fixed(asc: str) -> None: ctx = _context(asc) signs = ["Aries", "Taurus", "Gemini", "Cancer", "Leo", "Virgo", "Libra", "Scorpio", "Sagittarius", "Capricorn", "Aquarius", "Pisces"] for house in range(1, 13): sign = signs[(signs.index(asc) + house - 1) % 12] lord = ctx.lord_of_house(house) if sign == "Scorpio": assert lord == "Mars" if sign == "Aquarius": assert lord == "Saturn" assert lord not in ("Rahu", "Ketu") assert not ctx.is_own_sign("Rahu") def test_jaimini_variant_still_available() -> None: ctx = _context("Leo") assert ctx._resolve_sign_lord("Scorpio", dynamic_co_lords=True) in ("Mars", "Ketu") assert ctx._resolve_sign_lord("Scorpio") == "Mars"