diff --git a/tests/test_pancha_mahapurusha_self_conjunction.py b/tests/test_pancha_mahapurusha_self_conjunction.py new file mode 100644 index 00000000..58dd35ef --- /dev/null +++ b/tests/test_pancha_mahapurusha_self_conjunction.py @@ -0,0 +1,54 @@ +"""BUG-1180: a Mahapurusha planet must not count itself as the malefic conjunct with it. + +Before 57782aea ``_has_malefic_aspect`` skipped ``pn == planet_sign`` (a planet name +compared with a sign name, never equal), so Mars and Saturn -- natural malefics -- +always "afflicted" themselves and Ruchaka / Shasha were never valid. The fix passes +the yoga planet and skips it. Fictional placements; no birth data. +""" +from __future__ import annotations + +import sys +from pathlib import Path + +ROOT = Path(__file__).resolve().parents[1] +sys.path.insert(0, str(ROOT / "scripts")) + +from pancha_mahapurusha import _has_malefic_aspect, detect_pancha_mahapurusha # noqa: E402 + + +def _yoga(yogas: list[dict], name: str) -> dict: + return next(item for item in yogas if item["name"] == name) + + +def test_ruchaka_mars_alone_in_own_kendra_is_valid() -> None: + planets = {"Mars": {"sign": "Aries", "house": 1, "degree": 10.0}} + ruchaka = _yoga(detect_pancha_mahapurusha(planets), "Ruchaka Yoga") + assert ruchaka["is_valid"] is True + assert ruchaka["cancellations"] == [] + + +def test_shasha_saturn_exalted_in_kendra_is_valid() -> None: + planets = {"Saturn": {"sign": "Libra", "house": 10, "degree": 200.0}} + shasha = _yoga(detect_pancha_mahapurusha(planets), "Shasha Yoga") + assert shasha["is_valid"] is True + + +def test_another_malefic_in_the_same_sign_still_cancels_and_is_named() -> None: + planets = { + "Mars": {"sign": "Aries", "house": 1, "degree": 10.0}, + "Saturn": {"sign": "Aries", "house": 1, "degree": 12.0}, + } + ruchaka = _yoga(detect_pancha_mahapurusha(planets), "Ruchaka Yoga") + assert ruchaka["is_valid"] is False + assert any("Saturn" in reason and "Mars," not in reason for reason in ruchaka["cancellations"]) + assert _has_malefic_aspect("Aries", planets, "Mars") == ["Saturn"] + + +def test_benefic_yoga_planet_unchanged() -> None: + planets = { + "Jupiter": {"sign": "Cancer", "house": 4, "degree": 95.0}, + "Mars": {"sign": "Cancer", "house": 4, "degree": 100.0}, + } + hamsa = _yoga(detect_pancha_mahapurusha(planets), "Hamsa Yoga") + assert hamsa["is_valid"] is False + assert _has_malefic_aspect("Cancer", planets, "Jupiter") == ["Mars"]