"""Testy punktów wirtualnych (LOG-02): mean Node, mean Lilith. Referencje dla 30.04.1984 07:35 UT: - astro-seek (notes3): North Node (M) = Gem 8°09'24" = 68.1567° - wyrocznia swisseph (MEAN_NODE / MEAN_APOG, tryb Moshiera): NN = 68.1569°, Lilith = 345.6840° """ import pytest from app.engine.formats import norm360 def _delta_arcmin(a: float, b: float) -> float: return abs(((a - b + 180.0) % 360.0) - 180.0) * 60.0 @pytest.fixture(scope="module") def by_name(own_engine, reference_moment): return {p.name: p for p in own_engine.positions(reference_moment)} def test_mean_node_matches_references(by_name): nn = by_name["North Node"] assert _delta_arcmin(nn.longitude, 68.1567) < 2.0 # astro-seek assert _delta_arcmin(nn.longitude, 68.1569) < 2.0 # swisseph assert nn.sign == "Gemini" def test_nodes_always_retrograde_and_opposed(by_name): nn, sn = by_name["North Node"], by_name["South Node"] assert nn.retrograde and sn.retrograde # mean node zawsze Rx assert _delta_arcmin(sn.longitude, norm360(nn.longitude + 180.0)) < 0.01 assert abs(nn.speed - sn.speed) < 1e-9 # ta sama prędkość def test_mean_lilith_matches_swisseph(by_name): li = by_name["Lilith"] assert _delta_arcmin(li.longitude, 345.6840) < 3.0 # wyrocznia swisseph assert li.sign == "Pisces" assert li.speed > 0 and not li.retrograde # mean Lilith zawsze direct def test_points_join_houses_and_chart(own_engine, reference_moment): from app.engine.chart import build_chart chart = build_chart(own_engine, reference_moment) by = {p["name"]: p for p in chart["positions"]} # NN w Gem -> 12. dom Whole Sign (Asc w Raku); zgodnie z tabelą astro-seek w notes3 assert by["North Node"]["house"] == 12 assert by["Lilith"]["house"] == 9 # Pis -> 9. dom