"""农历/节气/节日引擎测试。""" from datetime import date from app.modules.time_sense.lunar import ( Shichen, get_day_period, get_festivals, get_shichen, get_solar_term, solar_to_lunar, ) def test_solar_to_lunar_spring_festival_2026(): # 2026-02-17 是农历丙午年正月初一(春节) result = solar_to_lunar(date(2026, 2, 17)) assert result.year_ganzhi == "丙午" assert result.month == 1 assert result.day == 1 assert result.is_leap_month is False def test_solar_to_lunar_leap_month_recognized(): # 农历闰月标记:取一个已知闰月日期(如 2025 农历闰六月初一 ≈ 2025-07-25) result = solar_to_lunar(date(2025, 7, 25)) assert result.month == 6 assert result.is_leap_month is True def test_get_shichen_zi(): # 子时:23 点与 0 点都属子 assert get_shichen(23).name == "子" assert get_shichen(0).name == "子" def test_get_shichen_wu(): assert get_shichen(12).name == "午" def test_get_day_period_deep_night(): assert get_day_period(2) == "凌晨" assert get_day_period(23) == "深夜" def test_get_solar_term_returns_current_or_nearest(): # 立春通常在 2/3-2/5;2026 年立春为 2/4 info = get_solar_term(date(2026, 2, 4)) assert info.current_name == "立春" def test_get_solar_term_cross_year_next_in_chinese(): # 2026-12-25 跨年带入项,下一节气小寒在 getJieQiTable() 中以 XIAO_HAN 出现 info = get_solar_term(date(2026, 12, 25)) assert info.next_name == "小寒" assert info.current_name is None def test_get_solar_term_non_term_day_current_none(): _ALL_JIEQI_CN = { "立春", "雨水", "惊蛰", "春分", "清明", "谷雨", "立夏", "小满", "芒种", "夏至", "小暑", "大暑", "立秋", "处暑", "白露", "秋分", "寒露", "霜降", "立冬", "小雪", "大雪", "冬至", "小寒", "大寒", } info = get_solar_term(date(2026, 7, 15)) assert info.current_name is None assert info.next_name in _ALL_JIEQI_CN assert info.days_to_next > 0 def test_get_festivals_spring_festival(): festivals = get_festivals(date(2026, 2, 17)) names = [f.name for f in festivals] assert "春节" in names def test_shichen_model_has_range(): s = Shichen(name="子", start_hour=23, end_hour=1) assert s.name == "子" assert s.start_hour == 23