diff --git a/services/logic/app/engine/chart.py b/services/logic/app/engine/chart.py index b78656f..c5c4b39 100644 --- a/services/logic/app/engine/chart.py +++ b/services/logic/app/engine/chart.py @@ -97,7 +97,9 @@ def build_chart(engine: EphemerisEngine, moment: ChartMoment, house_system: str asc = H.compute_asc(ramc, eps, moment.lat) mc = H.compute_mc(ramc, eps) system = house_system if house_system in H.SYSTEMS else H.WHOLE_SIGN - cusp_list = H.cusps(asc, mc, system) # tropikalne — geometria domów jest niezmiennicza + # cusps_for, nie cusps: to drugie zna tylko trzy systemy dzielące ekliptykę. + # Systemy egzotyczne dzielą inne koła wielkie i potrzebują pełnego (RAMC, ε, φ). + cusp_list = H.cusps_for(ramc, eps, moment.lat, system) # tropikalne — geometria domów jest niezmiennicza def _cusps_out(cl: list[float]) -> list[dict]: """Cuspy → wiersze pod UI/kosmogram: znak, stopień w znaku, długość, glif.""" @@ -132,7 +134,7 @@ def build_chart(engine: EphemerisEngine, moment: ChartMoment, house_system: str if len(ordered) > 1: result["house_systems"] = [] for s in ordered: - cl = cusp_list if s == system else H.cusps(asc, mc, s) + cl = cusp_list if s == system else H.cusps_for(ramc, eps, moment.lat, s) result["house_systems"].append({"system": s, "cusps": _cusps_out(cl)}) for pdict, obj in zip(result["positions"], positions): pdict.setdefault("houses", {})[s] = H.assign_house(obj.longitude, cl) diff --git a/services/logic/tests/test_chart.py b/services/logic/tests/test_chart.py index 5cd4180..9d30755 100644 --- a/services/logic/tests/test_chart.py +++ b/services/logic/tests/test_chart.py @@ -2,6 +2,9 @@ Waliduje względem astro.com dla horoskopu referencyjnego. """ +import pytest + +from app.engine import houses as H from app.engine.chart import build_chart @@ -66,3 +69,24 @@ def test_unknown_extra_system_is_ignored(own_engine, reference_moment): chart = build_chart(own_engine, reference_moment, "whole_sign", house_systems=["placidus", "equal"]) assert [h["system"] for h in chart["house_systems"]] == ["whole_sign", "equal"] + + +@pytest.mark.parametrize("system", H.SYSTEMS) +def test_every_advertised_system_builds_a_chart(own_engine, reference_moment, system): + """Każdy system z houses.SYSTEMS musi przejść przez build_chart. Pilnuje, + żeby rozszerzenie SYSTEMS bez przepięcia chart.py nie dało 500 przy wyborze + systemu, który jest na liście, ale nie w użytej funkcji.""" + chart = build_chart(own_engine, reference_moment, system) + assert chart["house_system"] == system + assert len(chart["cusps"]) == 12 + assert all(1 <= p["house"] <= 12 for p in chart["positions"]) + + +def test_multiple_systems_side_by_side_cover_all(own_engine, reference_moment): + chart = build_chart(own_engine, reference_moment, H.WHOLE_SIGN, + house_systems=list(H.SYSTEMS)) + blocks = chart["house_systems"] + assert blocks[0]["system"] == H.WHOLE_SIGN # prymarny zawsze pierwszy + assert {b["system"] for b in blocks} == set(H.SYSTEMS) + for p in chart["positions"]: + assert set(p["houses"]) == set(H.SYSTEMS)