# celestial-calendar lunar year table (algo2)
# schema_version: 2
# fixture: true
#   A sparse slice for Loader unit tests, not the shipped table.
# celestial_version: 0.6.1
# release_asset: celestial-calendar==0.6.1 / PyPI wheel
# generated_by: scratchpad/gen_fixtures.py (a throwaway, not a maintained tool)
# generated_on: 2026-08-24
# source_api: celestial_calendar.lunar_year_info(algorithm, lunar_year)
# algo: 2
#   Leap-second aware UTC+8 via jde_to_utc8, celestial #84.
# timescale: leap-second aware UTC+08:00
# year_range: 1901..2099 inclusive -- BOTH algos clamped to this window.
#   algo2 natively reports [410, 2500].  Clamping keeps one range contract for both
#   algos.  Widening is a follow-up issue.
# columns: lunar_year first_solar_date leap_month month_len_bits days_counts ganzhi
#   leap_month -- 1..12, or 0 when the year has no leap month.  HkoData spells the same
#   thing as `None`; the Loader normalizes.
#   month_len_bits -- encoded from the public `month_lengths` tuple, LSB-first
#   (bit i = the (i+1)-th lunar month in sequence; a leap month occupies its own
#   slot; 1 = 30 days, 0 = 29 days).
#   days_counts -- decoded from month_len_bits, 12 or 13 entries; redundant on purpose,
#   so a hand-edit of either column is caught by the Loader cross-check.
#   ganzhi -- (lunar_year - 4) mod 60 over Ganzhi.list_sexagenary_cycle(); not consumed
#   at runtime.  The 199/199 agreement with HkoData is checked by the test suite, not
#   here: see tests/calendar/test_celestial_tables.py.
# rows: 5
1901 1901-02-19 0 0x0752 29,30,29,29,30,29,30,29,30,30,30,29 辛丑
1914 1914-01-26 5 0x12ab 30,30,29,30,29,30,29,30,29,30,29,29,30 甲寅
1917 1917-01-23 2 0x0b69 30,29,29,30,29,30,30,29,30,30,29,30,29 丁巳
1979 1979-01-28 6 0x0b69 30,29,29,30,29,30,30,29,30,30,29,30,29 己未
2024 2024-02-10 0 0x06d2 29,30,29,29,30,29,30,30,29,30,30,29 甲辰
