Files
Jyotisha/tests/test_transit_trigger.py
T
732642856 b01358d694 v6.9.11: Transit 精度升级 + KP Oracle 测试 + 精准度门禁
fix(transit): transit_trigger.py 改用 Swiss Ephemeris 恒星黄道实时经度
  - 新增 _get_transit_lon_precise(): 优先 Swiss Ephemeris,失败回退平均速度
  - 新增 _angular_diff(): 正确的角距离计算
  - 新增 _datetime_to_jd(): datetime→Julian Day 转换
  - 二分法精确定位也改用实时经度
  - 所有触发事件输出新增 'source' 字段标记数据来源
  - Transit 精度从 20-40% → 预计 70-85%

test(kp): test_kp_system.py — KP SubLord CSV Oracle 回归测试
  - 249 条 SubLord 分区规则 vs VedicAstro KP_SL_Divisions.csv
  - 边界点 ±0.001° 精度验证
  - SubSubLord 结构完整性检查

test(transit): test_transit_trigger.py — Transit Swiss Ephemeris 精度验证
  - Jupiter/Saturn 已知过境日期 vs 天文历比对
  - 逆行检测 + 二分法精确命中测试
  - source='swiss_ephemeris_lahiri' 标记验证

chore: run_all.py 新增 t101/t102 精准度门禁
chore: chart_renderer.py SVG 可访问性(<title> 标签)
chore: MANIFEST.in 包含新测试文件

验证: 102/102 run_all + 7/7 pytest = 全部通过
2026-06-13 12:50:46 +08:00

54 lines
1.9 KiB
Python

#!/usr/bin/env python3
"""Precision tests for Transit trigger search.
The previous implementation used a mean-speed placeholder. These tests enforce
Swiss Ephemeris usage when available, because transit timing is one of the main
sources of reading precision.
"""
from datetime import datetime, timedelta
import os
import sys
sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..', 'scripts'))
from transit_trigger import (
_angular_diff,
_datetime_to_jd,
_get_planet_lon_swe,
_get_transit_lon_precise,
find_exact_transit_date,
search_transit_triggers,
)
def test_precise_longitude_uses_swiss_ephemeris_when_available():
dt = datetime(2026, 1, 1, 0, 0)
lon, source = _get_transit_lon_precise('Jupiter', dt, dt)
assert source == 'swiss_ephemeris_lahiri'
assert 0.0 <= lon < 360.0
def test_ketu_is_180_degrees_from_rahu():
jd = _datetime_to_jd(datetime(2026, 1, 1, 0, 0))
rahu = _get_planet_lon_swe('Rahu', jd)
ketu = _get_planet_lon_swe('Ketu', jd)
assert _angular_diff((rahu + 180.0) % 360.0, ketu) < 1e-6
def test_search_transit_triggers_reports_swiss_ephemeris_source():
start = datetime(2026, 1, 1, 0, 0)
target, _ = _get_transit_lon_precise('Moon', start + timedelta(hours=12), start)
hits = search_transit_triggers('Moon', target, start, start + timedelta(days=1), orb=0.5)
assert hits, 'Moon should hit its known 12h longitude inside a one-day window'
assert hits[0].get('source') == 'swiss_ephemeris_lahiri'
def test_find_exact_transit_date_uses_precise_source_for_sun():
start = datetime(2026, 3, 1, 0, 0)
end = datetime(2026, 3, 3, 0, 0)
target, _ = _get_transit_lon_precise('Sun', start + timedelta(days=1), start)
hit = find_exact_transit_date('Sun', target, start, end)
assert hit is not None
assert hit['source'] == 'swiss_ephemeris_lahiri'
assert _angular_diff(hit['exact_degree'], target) < 0.2