mirror of
https://github.com/migatu/astrololo.git
synced 2026-07-14 13:34:38 +00:00
166b438f83
Aspekty: - engine/aspects.py: aspekty główne (conj/sex/sq/tri/opp) z orbami (bonus dla luminarzy), separacja z obsługą zawinięcia. Applying/sep na później. - build_chart zwraca listę aspektów; /chart/positions je udostępnia; widok Horoskop pokazuje tabelę aspektów. Bogatsze sygnifikatory: - trzecia faseta "w aspekcie": dla każdego aspektu głównego obiektu filtruje rekordy po tokenie aspektu + drugiej planety ([conj + [Mo). Cookbook komplet: znak + dom + aspekt. Dopieszczenie wyników: - ODSIEWANIE DUPLIKATÓW: duplikat = ten sam sygnifikator ORAZ ten sam opis (po normalizacji). Dedup wewnątrz fasety, działa też na wynikach z wielu baz. - _facet_samples przyjmuje wiele tokenów (AND); dedup + istniejące odsiewanie szumu. Zweryfikowano na realnym main_base.xlsx (30.04.1984): 16 aspektów zgodnych z astro.com (Sun conj Moon 9.59°, Sun opp Saturn 3.17°); faseta aspektu daje bogate trafienia (Sun koniunkcja z Moon 84, opozycja z Saturn 43); dedup obniżył duplikaty (Sun w znaku 46->44). 36 testów przechodzi. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
36 lines
1.3 KiB
Python
36 lines
1.3 KiB
Python
"""Testy aspektów (LOG-06) — czysta matematyka."""
|
|
from app.engine.aspects import find_aspects, separation
|
|
|
|
|
|
def test_separation_wraparound():
|
|
assert separation(10, 350) == 20
|
|
assert separation(0, 180) == 180
|
|
assert separation(0, 90) == 90
|
|
|
|
|
|
def test_conjunction_and_opposition():
|
|
pos = [
|
|
{"name": "Sun", "decimal": 10.0},
|
|
{"name": "Moon", "decimal": 12.0}, # 2° od Słońca -> koniunkcja
|
|
{"name": "Mars", "decimal": 190.0}, # 180° od Słońca -> opozycja
|
|
]
|
|
pairs = {(a["obj1"], a["obj2"], a["aspect"]) for a in find_aspects(pos)}
|
|
assert ("Sun", "Moon", "conjunction") in pairs
|
|
assert ("Sun", "Mars", "opposition") in pairs
|
|
|
|
|
|
def test_orb_limit_excludes_wide():
|
|
pos = [{"name": "Mercury", "decimal": 0.0}, {"name": "Venus", "decimal": 100.0}]
|
|
assert find_aspects(pos, orb=8.0, luminary_bonus=0.0) == []
|
|
|
|
|
|
def test_luminary_bonus_widens_orb():
|
|
# 99.5° -> 9.5° od kwadratury; z bonusem luminarza (8+2) mieści się
|
|
pos = [{"name": "Sun", "decimal": 0.0}, {"name": "Saturn", "decimal": 99.5}]
|
|
assert any(a["aspect"] == "square" for a in find_aspects(pos))
|
|
|
|
|
|
def test_one_aspect_per_pair():
|
|
pos = [{"name": "Sun", "decimal": 0.0}, {"name": "Moon", "decimal": 2.0}]
|
|
assert len(find_aspects(pos)) == 1
|