"""Source-bounded regression tests for Shastihayani MD.""" from __future__ import annotations import json from datetime import datetime from pathlib import Path from scripts.shastihayani_dasha import ( calculate_shastihayani_dasha, resolve_shastihayani_28_position, shastihayani_applicability, ) from scripts.source_bounded_child_periods import PYJHORA_PARENT_SEEDED_EQUAL_SPLIT_PROFILE ROOT = Path(__file__).resolve().parents[1] def test_shastihayani_requires_sun_in_lagna_sign() -> None: assert shastihayani_applicability(ascendant_longitude=250.0, sun_longitude=251.0)["applicable"] assert not shastihayani_applicability(ascendant_longitude=250.0, sun_longitude=281.0)["applicable"] def test_shastihayani_blocks_without_explicit_28_nakshatra_group_position() -> None: result = calculate_shastihayani_dasha({ "birth_datetime": "1902-12-23T07:23:00", "ascendant_longitude": 250.0, "sun_longitude": 251.0, }) assert result["execution_status"] == "blocked" assert "shastihayani_group_index" in result["reason"] def test_shastihayani_resolves_abhijit_modified_28_star_position_from_moon_longitude() -> None: uttara_ashadha = resolve_shastihayani_28_position(270.0) abhijit = resolve_shastihayani_28_position(278.0) shravana = resolve_shastihayani_28_position(281.0) assert uttara_ashadha["nakshatra"] == "Uttara Ashadha" assert uttara_ashadha["shastihayani_group_index"] == 5 assert uttara_ashadha["nakshatra_index_within_group"] == 3 assert abhijit["nakshatra"] == "Abhijit" assert abhijit["shastihayani_group_index"] == 6 assert abhijit["nakshatra_index_within_group"] == 0 assert shravana["nakshatra"] == "Shravana" assert shravana["shastihayani_group_index"] == 6 assert shravana["nakshatra_index_within_group"] == 1 def test_shastihayani_can_derive_required_28_star_inputs_from_moon_longitude() -> None: result = calculate_shastihayani_dasha({ "birth_datetime": "1902-12-23T07:23:00", "ascendant_longitude": 250.0, "sun_longitude": 251.0, "moon_longitude": 278.0, }) assert result["execution_status"] == "executed" assert result["starting_lord"] == "Saturn" assert result["shastihayani_group_index"] == 6 assert result["nakshatra_index_within_group"] == 0 assert result["major"][0]["lord"] == "Saturn" def test_shastihayani_expands_ad_pd_only_with_explicit_child_profile() -> None: result = calculate_shastihayani_dasha({ "birth_datetime": "1902-12-23T07:23:00", "ascendant_longitude": 250.0, "sun_longitude": 251.0, "moon_longitude": 278.0, "child_period_profile": PYJHORA_PARENT_SEEDED_EQUAL_SPLIT_PROFILE, }) assert result["execution_status"] == "executed" assert result["period_depth_status"] == "mahadasha_antardasha_pratyantardasha_executed_pyjhora_observed_profile" assert result["child_period_profile"] == PYJHORA_PARENT_SEEDED_EQUAL_SPLIT_PROFILE assert len(result["major"][0]["antardasha"]) == 8 assert len(result["antardasha"]) == 64 assert len(result["pratyantardasha"]) == 512 assert result["major"][0]["antardasha"][0]["lord"] == "Saturn" assert result["major"][0]["antardasha"][0]["pratyantardasha"][0]["lord"] == "Saturn" def test_shastihayani_pl9_standard_table_profile_emits_rows_when_classically_inapplicable() -> None: result = calculate_shastihayani_dasha({ "birth_datetime": "2001-03-04T10:38:00", "ascendant_longitude": 310.0, "sun_longitude": 260.0, "moon_longitude": 249.0, "child_period_profile": PYJHORA_PARENT_SEEDED_EQUAL_SPLIT_PROFILE, "standard_table_profile": "pl9_reports_all_dasha_tables_v1", }) assert result["execution_status"] == "executed" assert result["applicable"] is True assert result["classical_applicability"]["applicable"] is False assert result["standard_table_profile"] == "pl9_reports_all_dasha_tables_v1" assert result["period_depth_status"] == "mahadasha_antardasha_pratyantardasha_executed_pyjhora_observed_profile" assert result["major"] assert result["antardasha"] assert result["pratyantardasha"] def test_shastihayani_replays_charan_singh_moon_balance_pattern() -> None: result = calculate_shastihayani_dasha({ "birth_datetime": datetime(1902, 12, 23, 7, 23), "ascendant_longitude": 250.0, "sun_longitude": 251.0, "shastihayani_group_index": 3, "nakshatra_index_within_group": 2, "nakshatra_fraction_elapsed": 757 / 800, }) assert result["execution_status"] == "executed" assert result["starting_lord"] == "Moon" assert result["major"][0]["lord"] == "Moon" assert result["major"][0]["years"] > 1.5 assert result["major"][0]["years"] < 1.6 assert result["period_depth_status"] == "mahadasha_executed_ad_pd_blocked_pending_row_level_replay" assert "antardasha" not in result["major"][0]