calendar: add Christ the King, last Sunday of October
Deploy / deploy (push) Successful in 51s

A 1925 addition, so nowhere in the Monastic Tridentinum 1617 base this
project otherwise targets -- content sourced from "Monastic Divino
1930" instead, the Monastic-lineage version of the era that actually
carries it. Always wins outright (Duplex I. classis, confirmed live),
commemorating whichever Sunday after Pentecost it displaces -- same
additive-layering shape as applyOctaves/applyMarianSaturday, run last
so nested commemorations (e.g. a Simplex saint already commemorated
under that Sunday) survive underneath it.

Extended the Lauds psalmody-override mechanism (both the psalm groups
and, newly, the chapter/responsory/hymn/versicle bundle) to recognize
named temporal winners as unconditionally override-eligible, not just
duplex-majus+ sanctoral ones -- generalizing what had been a Marian-
Saturday-only special case. Suffrages needed their own explicit check
too: isDoubleOrHigher only ever looks at a sanctoral rank, and a named
temporal winner has no FeastClass to check at all.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-11 14:13:22 -04:00
parent 747a078580
commit 0404642614
13 changed files with 338 additions and 20 deletions
+39
View File
@@ -0,0 +1,39 @@
import { describe, expect, it } from 'vitest';
import { resolveDay } from '../../src/calendar';
import { getDayLabel } from '../../src/calendar/day-label';
// A 1925 addition, not in the Monastic Tridentinum 1617 base this project
// otherwise targets -- content sourced from "Monastic Divino 1930"
// instead. Always wins the last Sunday of October, commemorating
// whichever Sunday after Pentecost it displaces.
describe('Christ the King (applyChristTheKing)', () => {
it('wins outright on the last Sunday of October, commemorating the Sunday it displaces', () => {
const day = resolveDay('2026-10-25'); // last Sunday of October 2026
expect(day.winner).toEqual({ kind: 'temporal', id: 'christ-the-king' });
expect(day.commemorations).toContainEqual({ kind: 'temporal', id: 'post-pentecost-22' });
expect(getDayLabel(day)).toBe('Christ the King');
});
it('preserves a nested commemoration: a Simplex saint already commemorated under the ordinary Sunday stays commemorated', () => {
// Ss. Chrysanthus and Daria, Simplex, land on 2026-10-25 -- already
// commemorated under the Sunday per the ordinary-sunday rule before
// Christ the King further displaces that Sunday itself.
const day = resolveDay('2026-10-25');
expect(day.commemorations).toContainEqual({
kind: 'sanctoral',
id: 'ss-chrysanthus-and-daria',
name: 'Ss. Chrysanthus and Daria, Martyrs',
rank: 'simplex',
});
});
it('does not apply on any other Sunday in October', () => {
const day = resolveDay('2026-10-18');
expect(day.winner).not.toEqual({ kind: 'temporal', id: 'christ-the-king' });
});
it('correctly finds a different last Sunday of October in a year where Oct 31 itself is a Sunday', () => {
const day = resolveDay('2027-10-31'); // 2027-10-31 is a Sunday
expect(day.winner).toEqual({ kind: 'temporal', id: 'christ-the-king' });
});
});
@@ -51,4 +51,35 @@ describe('Lauds psalmody override (duplex-majus+ sanctoral, and Marian Saturday)
const labels = ordo.parts.filter((p) => p.kind === 'preces' && p.label).map((p) => (p.kind === 'preces' ? p.label : undefined));
expect(labels).toEqual(['Of the Holy Apostles Peter and Paul', 'For Peace', 'Salve Regina']);
});
it("substitutes Christ the King's own proper psalmody and office bundle, and omits the suffrages entirely (Duplex I. classis)", () => {
const ordo = resolveOrdo('lauds', '2026-10-25');
const psalmNumbers = ordo.parts
.filter((p) => p.kind === 'psalm')
.map((p) => (p.kind === 'psalm' ? p.psalmNumber : undefined));
expect(psalmNumbers).toEqual([66, 92, 99, 62, 148, 149, 150]);
const ps92 = ordo.parts.find((p) => p.kind === 'psalm' && p.psalmNumber === 92);
expect(ps92?.kind === 'psalm' ? ps92.antiphon?.text.en : undefined).toContain('The God of heaven');
const chapter = ordo.parts.find((p) => p.kind === 'chapter');
expect(chapter?.kind === 'chapter' ? chapter.text.citation?.en : undefined).toBe('Col 1:12-13');
const hymn = ordo.parts.find((p) => p.kind === 'hymn');
expect(hymn?.kind === 'hymn' ? hymn.text.text.la : undefined).toContain('Vexílla Christus ínclita');
const benedictus = ordo.parts.find((p) => p.kind === 'canticle' && p.canticleId === 'benedictus');
expect(benedictus?.kind === 'canticle' ? benedictus.antiphon?.text.en : undefined).toContain(
'He hath made us',
);
// Two extra collects: the commemorated Sunday's own, and the Simplex
// saint already commemorated under that Sunday before Christ the King
// displaced it too -- see tests/calendar/christ-the-king.test.ts.
const collects = ordo.parts.filter((p) => p.kind === 'prayer');
expect(collects.length).toBe(3);
const suffrages = ordo.parts.filter((p) => p.kind === 'preces' && p.label && p.label !== 'Salve Regina');
expect(suffrages).toEqual([]);
});
});