mirror of
https://github.com/migatu/astrololo.git
synced 2026-07-14 21:38:37 +00:00
e69c0714b9
Pierwszy increment implementacji warstwy logicznej (ścieżka A). LOG-24: interfejs EphemerisEngine z dwoma backendami — SkyfieldEngine (własny, permisywny: Skyfield MIT + dane JPL public domain) oraz RemoteEngine (klient izolowanej usługi swisseph). Fabryka + leniwa inicjalizacja; endpointy /chart/positions i /chart/compare. LOG-01: pozycje obiektów (długość/szerokość ekliptyczna, prędkość, kierunek, formaty: w znaku / absolutny / dziesiętny). LOG-25/28: harness porównawczy (compare.py) z progami tolerancji oraz wspólny kontrakt parzystości; pełen zestaw testów. LOG-27: services/engine-swisseph — osobna, opcjonalna usługa AGPL (pyswisseph, tryb Moshiera), licencjonowana osobno, w compose pod profilem "comparison"; nie wchodzi do zamkniętego produktu. Walidacja: SkyfieldEngine zgadza się ze Swiss Ephemeris co do ~1" dla wszystkich 10 obiektów na horoskopie referencyjnym (30.04.1984, Warszawa); 12 testów przechodzi (silnik B pomijany gdy nieskonfigurowany). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
36 lines
1.3 KiB
Python
36 lines
1.3 KiB
Python
"""Testy harnessu porównawczego (LOG-25) — bez efemeryd."""
|
|
from app.engine.compare import compare_positions
|
|
from app.engine.models import ObjectPosition
|
|
|
|
|
|
def test_identical_positions_have_zero_diff():
|
|
a = [ObjectPosition("Sun", 40.0, 0.0, 0.95, False)]
|
|
report = compare_positions(a, a, lon_tol_arcsec=1.0)
|
|
assert report.ok
|
|
assert report.max_arcsec == 0.0
|
|
|
|
|
|
def test_offset_beyond_tolerance_is_flagged():
|
|
a = [ObjectPosition("Sun", 40.0, 0.0, 0.95, False)]
|
|
b = [ObjectPosition("Sun", 40.1, 0.0, 0.95, False)] # 0.1° = 360"
|
|
report = compare_positions(a, b, lon_tol_arcsec=120.0)
|
|
assert not report.ok
|
|
assert report.diffs[0].over_tolerance
|
|
assert abs(abs(report.diffs[0].delta_arcsec) - 360.0) < 1.0
|
|
|
|
|
|
def test_retrograde_mismatch_is_flagged():
|
|
a = [ObjectPosition("Mars", 234.0, 0.0, -0.2, True)]
|
|
b = [ObjectPosition("Mars", 234.0, 0.0, 0.2, False)]
|
|
report = compare_positions(a, b, lon_tol_arcsec=120.0)
|
|
assert not report.ok
|
|
assert report.diffs[0].speed_sign_mismatch
|
|
|
|
|
|
def test_wraparound_delta_is_small():
|
|
a = [ObjectPosition("Sun", 359.99, 0.0, 1.0, False)]
|
|
b = [ObjectPosition("Sun", 0.01, 0.0, 1.0, False)]
|
|
report = compare_positions(a, b, lon_tol_arcsec=120.0)
|
|
assert report.ok # 0.02° ≈ 72" < 120"
|
|
assert abs(report.diffs[0].delta_arcsec) < 80.0
|