From cb60039ab219d0f469f159399a96ec016a034f66 Mon Sep 17 00:00:00 2001 From: Will Estes Date: Mon, 31 Aug 2026 08:23:08 -0400 Subject: [PATCH] Fix Sept sanctoral test for Raymond's new semiduplex rank Raymond's rank deflation (a1ed3d2) changes cascading behavior in years where Aug 31 is a Sunday: he now loses to the Sunday outright (needs duplex+ to win, per Divino Afflatu's ordinary-sunday threshold) and transfers forward onto Sept 1, winning the collision there over St. Giles. Move the original clean-year Giles test to 2026 and add a new test documenting the 2025 transfer/collision case explicitly. Co-Authored-By: Claude Sonnet 5 Claude-Session: https://claude.ai/code/session_013g7AsSvMD9oazR17f3BxLz --- tests/calendar/september-sanctoral.test.ts | 26 ++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/tests/calendar/september-sanctoral.test.ts b/tests/calendar/september-sanctoral.test.ts index bb4595b..e67cdfc 100644 --- a/tests/calendar/september-sanctoral.test.ts +++ b/tests/calendar/september-sanctoral.test.ts @@ -3,16 +3,38 @@ import { resolveDay } from '../../src/calendar'; import { getDayCollect } from '../../src/hours/resolve-common'; // Clean per-annum years for these dates (no Sunday collision) — see -// data/calendar/saints/*.yml for per-saint source detail. +// data/calendar/saints/*.yml for per-saint source detail. Exception: +// the Sept 1 collision test deliberately uses 2025 *because* Aug 31 +// falls on Sunday that year — see its own comment. describe('September sanctoral pull (first pass)', () => { it('St. Giles wins outright at Simplex over a genuinely unwinnable stub', () => { - const day = resolveDay('2025-09-01'); + // 2025-09-01 no longer qualifies as a clean year for this: Aug 31, + // 2025 is a Sunday, and St. Raymond Nonnatus (semiduplex as of the + // rank-deflation fix) loses outright to an ordinary Sunday and + // transfers forward onto Sept 1, winning there instead of Giles + // (semiduplex > simplex) -- see the collision test below. + const day = resolveDay('2026-09-01'); expect(day.winner).toEqual({ kind: 'sanctoral', id: 'st-giles', name: 'St. Giles, Abbot', nameLa: 'Sanctus Ægidius, Abbas', rank: 'simplex' }); expect(day.commemorations).toEqual([ { kind: 'sanctoral', id: 'ss-twelve-brothers', name: 'Ss. Twelve Brothers, Martyrs', nameLa: 'Duodecim Fratres, Martyres', rank: 'simplex' }, ]); }); + it('in a year where Aug 31 falls on Sunday, St. Raymond Nonnatus (semiduplex) loses outright to the Sunday, transfers forward onto Sept 1, and wins the collision there over both native Simplex candidates', () => { + const day = resolveDay('2025-09-01'); + expect(day.winner).toEqual({ + kind: 'sanctoral', + id: 'st-raymond-nonnatus', + name: 'St. Raymond Nonnatus, Confessor', + nameLa: 'Sanctus Raymundus Nonnatus, Confessor', + rank: 'semiduplex', + }); + expect(day.commemorations).toEqual([ + { kind: 'sanctoral', id: 'ss-twelve-brothers', name: 'Ss. Twelve Brothers, Martyrs', nameLa: 'Duodecim Fratres, Martyres', rank: 'simplex' }, + { kind: 'sanctoral', id: 'st-giles', name: 'St. Giles, Abbot', nameLa: 'Sanctus Ægidius, Abbas', rank: 'simplex' }, + ]); + }); + it('the Nativity of the BVM wins outright with a real proper collect and antiphon, commemorating a real secondary saint blocked by its own day (not its octave)', () => { const day = resolveDay('2025-09-08'); expect(day.winner).toEqual({