Files
Jyotisha/tests/test_dasha_master_children.py
T

145 lines
5.9 KiB
Python

"""T5: sourced dasha children are copied into the master pack and rendered."""
from __future__ import annotations
from datetime import datetime
from scripts.annual_native.dasha_children import (
attach_kalachakra_simplified_children,
enrich_master_family,
)
from scripts.ashtottari_dasha import calculate_ashtottari_dasha
from scripts.jyotish_engine import _native_dasha_master_families
from scripts.kalachakra_dasha import calculate_kalachakra_dasha
from scripts.pl9_reader_export import render_pl9_parity_markdown
from scripts.yogini_dasha import calculate_yogini_dasha
def _major_view(row: dict) -> tuple:
return (
row.get("lord") or row.get("planet") or row.get("rashi") or row.get("sign"),
row.get("rashi") or row.get("sign"),
row.get("years"),
row.get("start_date") or row.get("start"),
row.get("end_date") or row.get("end"),
)
def _applicable_ashtottari() -> dict:
for index in range(27):
result = calculate_ashtottari_dasha({
"moon_nakshatra_index": index,
"is_shukla_paksha": True,
"moon_longitude": index * (360.0 / 27.0) + 1.0,
"birth_datetime": datetime(1990, 1, 1, 12, 0),
})
if result.get("major"):
return result
raise AssertionError("no applicable Ashtottari fixture")
def test_kalachakra_children_hang_on_existing_majors() -> None:
source = calculate_kalachakra_dasha({
"moon_nakshatra_index": 0,
"moon_pada": 1,
"birth_datetime": datetime(1990, 6, 15, 10, 30),
})
before = [_major_view(row) for row in source["major"]]
enriched, antardasha, pratyantar = attach_kalachakra_simplified_children(
source["major"], source["total_cycle"],
)
assert [_major_view(row) for row in source["major"]] == before
assert "antardasha" not in source["major"][0]
assert [_major_view(row) for row in enriched] == before
assert antardasha and pratyantar
assert enriched[0]["antardasha"][-1]["end_date"] == enriched[0]["end_date"]
assert enriched[0]["antardasha"][0]["model"] == "simplified"
assert enriched[0]["antardasha"][0]["pratyantardasha"]
def test_master_pack_keeps_sourced_children_and_leaves_modules_alone() -> None:
ashtottari = _applicable_ashtottari()
yogini = calculate_yogini_dasha({
"birth_datetime": datetime(1990, 6, 15, 10, 30),
"moon_longitude": 10.0,
"as_of": datetime(2020, 1, 1),
})
kalachakra = calculate_kalachakra_dasha({
"moon_nakshatra_index": 0,
"moon_pada": 1,
"birth_datetime": datetime(1990, 6, 15, 10, 30),
})
narayana = {
"mahadasha_sequence": [{
"sign": "Aries", "lord": "Mars", "years": 7,
"start_age": 0, "end_age": 7, "period_key": "md-0",
}],
"dense_boundaries": [{
"level": "AD", "sign": "Taurus", "lord": "Venus",
"duration_years": 1, "start_age": 0, "end_age": 1,
"parent_md": "Aries", "parent_period_key": "md-0",
}],
}
tribhagi = {"major": [{
"lord": "Sun", "years": 1,
"start_date": "2000-01-01T00:00:00", "end_date": "2001-01-01T00:00:00",
}]}
families = _native_dasha_master_families({
"ashtottari_dasha": ashtottari,
"yogini_dasha": yogini,
"kalachakra_dasha": kalachakra,
"narayana_dasha": narayana,
"tribhagi_dasha": tribhagi,
"dasha": {"timeline": [{"lord": "Sun", "start": "2000-01-01", "end": "2006-01-01"}]},
})
assert families["ashtottari"]["periods"][0]["antardasha"]
assert families["yogini"]["periods"][0]["antardasha"]
assert families["kala_chakra"]["periods"][0]["antardasha"][0]["pratyantardasha"]
assert families["narayana"]["periods"][0]["antardasha"][0]["sign"] == "Taurus"
assert "antardasha" not in tribhagi["major"][0]
assert "antardasha" not in yogini["major"][0]
assert "antardasha" not in kalachakra["major"][0]
assert "antardasha" not in narayana["mahadasha_sequence"][0]
assert [_major_view(row) for row in families["kala_chakra"]["periods"]] == [
_major_view(row) for row in kalachakra["major"]
]
assert families["vimshottari"]["periods"][0]["lord"] == "Sun"
assert "antardasha" not in families["vimshottari"]["periods"][0]
def test_missing_child_rule_and_kalachakra_model_are_labeled() -> None:
packet = {
"report_language": "zh",
"worksheets": {"timing_and_predictive_systems": {"dasha_master_pack": {"families": {
"tribhagi": {"periods": [{
"lord": "Sun", "years": 1,
"start_date": "2000-01-01T00:00:00", "end_date": "2001-01-01T00:00:00",
}]},
"kala_chakra": {"periods": [{
"lord": "Sun", "rashi": "Aries", "years": 7,
"start_date": "2000-01-01T00:00:00", "end_date": "2007-01-01T00:00:00",
"antardasha": [{
"lord": "Moon", "rashi": "Cancer", "parent_rashi": "Aries",
"start_date": "2000-01-01T00:00:00", "end_date": "2001-01-01T00:00:00",
"pratyantardasha": [{
"lord": "Mars", "rashi": "Aries",
"start_date": "2000-01-01T00:00:00", "end_date": "2000-02-01T00:00:00",
}],
}],
}]},
}}}},
}
chinese = render_pl9_parity_markdown(packet)
assert "本体系未提供子运" in chinese
assert "简化模型" in chinese
assert "次小运" in chinese
english = render_pl9_parity_markdown({**packet, "report_language": "en"})
assert "This system does not provide sub-periods." in english
assert "Simplified model" in english
def test_enrich_does_not_invent_children_for_vimshottari() -> None:
rows = enrich_master_family("vimshottari", {"timeline": []}, [{"lord": "Sun", "years": 6}])
assert rows == [{"lord": "Sun", "years": 6}]
assert "antardasha" not in rows[0]