本命 Bhava Chalit 表仍按中点,默认宫位不变。传了宫头却不声明就拒绝;没传宫头记整宫代理。报告多一行判宫口径。pytest tests/test_kp_cusp_house_assignment.py 3 通过,tests/test_bhava_chalit.py 仍通过。 Co-Authored-By: Grok (agent loop)
59 lines
2.4 KiB
Python
59 lines
2.4 KiB
Python
"""BUG-1319: KP house occupancy is cusp-to-cusp and must be declared.
|
|
|
|
Upstream 0337b77f. Natal Bhava Chalit stays on the sandhi midpoint rule.
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
import os
|
|
import sys
|
|
|
|
import pytest
|
|
|
|
SCRIPTS = os.path.join(os.path.dirname(__file__), "..", "scripts")
|
|
if SCRIPTS not in sys.path:
|
|
sys.path.insert(0, SCRIPTS)
|
|
|
|
from bhava_chalit import BhavaChalitCalculator # noqa: E402
|
|
from kp_system import build_kp_report_pack, calc_kp_analysis # noqa: E402
|
|
|
|
|
|
def test_cusp_to_cusp_differs_from_sandhi_and_default_houses_stay() -> None:
|
|
calc = BhavaChalitCalculator()
|
|
planets = {"Sun": 40.0}
|
|
sandhi = calc.get_bhava_chalit_chart(planets, 15.0, 270.0, "equal")
|
|
explicit = calc.get_bhava_chalit_chart(
|
|
planets, 15.0, 270.0, "equal", house_assignment="sandhi",
|
|
)
|
|
cusp = calc.get_bhava_chalit_chart(
|
|
planets, 15.0, 270.0, "equal", house_assignment="cusp_to_cusp",
|
|
)
|
|
assert sandhi["house_assignment"] == "sandhi"
|
|
assert explicit["planets"]["Sun"]["bhava_house"] == sandhi["planets"]["Sun"]["bhava_house"] == 2
|
|
assert cusp["house_assignment"] == "cusp_to_cusp"
|
|
assert cusp["planets"]["Sun"]["bhava_house"] == 1
|
|
assert cusp["planets"]["Sun"]["bhava_house"] != sandhi["planets"]["Sun"]["bhava_house"]
|
|
|
|
|
|
def test_unknown_house_assignment_is_rejected() -> None:
|
|
calc = BhavaChalitCalculator()
|
|
with pytest.raises(ValueError, match="house_assignment"):
|
|
calc.get_bhava_chalit_chart({"Sun": 10.0}, 15.0, 270.0, "equal", house_assignment="whole")
|
|
|
|
|
|
def test_kp_cusps_require_an_occupancy_basis_and_the_report_names_it() -> None:
|
|
planets = {"Sun": {"sign": "Taurus", "degree": 10.0, "house": 2}}
|
|
cusps = [15.0 + 30.0 * index for index in range(12)]
|
|
with pytest.raises(ValueError, match="house_occupancy_basis"):
|
|
calc_kp_analysis(planets, "Aries", house_cusps=cusps)
|
|
with pytest.raises(ValueError, match="house_occupancy_basis"):
|
|
calc_kp_analysis(planets, "Aries", house_cusps=cusps, house_occupancy_basis="")
|
|
declared = calc_kp_analysis(
|
|
planets, "Aries", house_cusps=cusps, house_occupancy_basis="cusp_to_cusp",
|
|
)
|
|
assert declared["house_occupancy_basis"] == "cusp_to_cusp"
|
|
proxy = calc_kp_analysis(planets, "Aries")
|
|
assert proxy["house_occupancy_basis"] == "whole_sign_proxy"
|
|
markdown = build_kp_report_pack(declared)["exports"]["markdown"]
|
|
assert "House occupancy basis: `cusp_to_cusp`" in markdown
|