Files
vu/tests/calendar/vigil-of-christmas-sunday.test.ts
T
will b7b5a63756 Add full Gospel pericopes to Advent/Christmas Sunday Matins readings
Nocturn 3 previously dropped the bare "Et réliqua" Gospel incipit and
kept only the patristic homily, so the Gospel citation and text never
appeared. Authors the full pericope before the homily for advent-1
through advent-4 and christmas-octave-sunday, sourced from the
reference engine's Missale Gospel files. Authoring Advent 4's Gospel
surfaces a genuine second Matins Gospel on the rare Dec-24-as-Advent-4
collision (2023/2028), so the affected test now expects both readings
instead of one.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AGjUyhUZJaSjiniEmnLdak
2026-09-03 17:06:33 -04:00

79 lines
4.2 KiB
TypeScript

import { describe, expect, it } from 'vitest';
import { resolveDay } from '../../src/calendar';
import { resolveOrdo } from '../../src/hours';
// Advent 4's own Sunday lands on Dec 24 (its latest possible date) roughly
// every few years -- 2023 and 2028 are the two nearest examples. Per direct
// instruction (2026-08): the Vigil of Christmas's own identity governs that
// day (matching the reference engine's own rule -- Duplex I classis, never
// displaced even by a privileged Sunday), with Advent 4 itself commemorated
// alongside it -- a deliberate departure from the reference engine's own
// `no commemoratio` for this exact collision, since the Sundays of Advent
// have real standing of their own. See calendar/index.ts's
// applyAdventFourVigilCommemoration and calendar/temporal-id.ts's own
// `vigil-of-christmas` case.
describe('Advent 4 Sunday landing on Dec 24 (the Vigil of Christmas)', () => {
it('2023-12-24: Vigil wins, Advent 4 commemorated', () => {
const day = resolveDay('2023-12-24');
expect(day.weekday).toBe('sunday');
expect(day.winner).toEqual({ kind: 'temporal', id: 'vigil-of-christmas' });
expect(day.commemorations).toEqual([{ kind: 'temporal', id: 'advent-4' }]);
});
it('2028-12-24: same shape, a second real occurrence', () => {
const day = resolveDay('2028-12-24');
expect(day.weekday).toBe('sunday');
expect(day.winner).toEqual({ kind: 'temporal', id: 'vigil-of-christmas' });
expect(day.commemorations).toEqual([{ kind: 'temporal', id: 'advent-4' }]);
});
it("Lauds carries both collects (Vigil's own, then Advent 4's commemorated) and the Vigil's own proper antiphons/Benedictus antiphon", () => {
const lauds = resolveOrdo('lauds', '2023-12-24');
const collects = lauds.parts.filter((p) => p.kind === 'prayer');
expect(collects).toHaveLength(2);
for (const c of collects) {
if (c.kind !== 'prayer') continue;
expect(c.text.status.la).toBe('verified');
expect(c.text.status.en).toBe('verified');
}
expect(collects[0]!.kind === 'prayer' ? collects[0]!.text.text.la : undefined).toContain(
'Deus, qui nos redemptiónis nostræ',
);
expect(collects[1]!.kind === 'prayer' ? collects[1]!.text.text.la : undefined).toContain(
'Excita, quǽsumus, Dómine',
);
const benedictus = lauds.parts.find((p) => p.kind === 'canticle' && p.canticleId === 'benedictus');
expect(benedictus?.kind).toBe('canticle');
if (benedictus?.kind === 'canticle') {
expect(benedictus.antiphon?.text.la).toContain('Oriétur');
expect(benedictus.antiphon?.status.la).toBe('verified');
}
});
it("Matins Nocturn 3 carries the Vigil's own Gospel (Matt 1:18-21, St. Jerome's homily) and, per this project's generous-commemorations design (the same reason Lauds above shows both collects), Advent 4's own commemorated Gospel (Luke 3:1-6, Pope St. Gregory the Great's homily) too -- still using the Sunday's fixed psalm table throughout", () => {
const matins = resolveOrdo('matins', '2023-12-24');
const gospels = matins.parts.filter((p) => p.kind === 'gospel');
expect(gospels).toHaveLength(2);
const vigilGospel = gospels.find((g) => g.kind === 'gospel' && g.text.citation?.la === 'Matt 1:18-21');
expect(vigilGospel?.kind).toBe('gospel');
if (vigilGospel?.kind === 'gospel') {
expect(vigilGospel.text.status.la).toBe('verified');
expect(vigilGospel.homily?.source).toContain('Jerome');
expect(vigilGospel.homily?.text.status.la).toBe('verified');
}
const advent4Gospel = gospels.find((g) => g.kind === 'gospel' && g.text.citation?.la === 'Luc 3:1-6');
expect(advent4Gospel?.kind).toBe('gospel');
if (advent4Gospel?.kind === 'gospel') {
expect(advent4Gospel.text.status.la).toBe('verified');
expect(advent4Gospel.homily?.source).toContain('Gregory');
expect(advent4Gospel.homily?.text.status.la).toBe('verified');
}
// Nocturns 1-2 keep the ordinary Sunday psalm table (Ps 20-31),
// unaffected by which id won -- hours/matins.ts's threeNocturns/
// sundayPsalmNocturn path is keyed by day.weekday, not day.winner.id.
const psalmCount = matins.parts.filter((p) => p.kind === 'psalm').length;
expect(psalmCount).toBeGreaterThan(0);
});
});