80f4f935be
Deploy / deploy (push) Successful in 1m6s
Finding of the Holy Cross (May 3), the Transfiguration (Aug 6), the Exaltation of the Holy Cross (Sep 14), and Dedication of the Basilica of the Most Holy Savior (Nov 9, the Lateran) were all excluded under the same stale "fixed feast of the Lord, not modeled" note that turned out wrong for Our Lady of the Snows. All four have real, complete content in the reference engine. Presentation of the BVM (Nov 21) was excluded under the equivalent "fixed BVM feast" note and is added the same way. - finding-of-the-holy-cross: fully proprium, own collect/antiphon/Matins throughout; now correctly outranks ss-alexander-eventius-theodulus-and-juvenal, matching what that saint's own file already documented as the live reality. - transfiguration: same proprium shape. Its subordinate saints (Ss. Xystus/Felicissimus/Agapitus) stay excluded -- blocked by the real, separate octave/subordination-rendering gap, not by an unmodeled Transfiguration. - exaltation-of-the-holy-cross: reuses the Finding of the Holy Cross's content wholesale (ex Sancti/05-03) -- collect/antiphon via a cross-id `propers` pointer, Matins nocturn-readings duplicated (no cross-id lookup exists for that mechanism). - dedication-of-the-basilica-of-the-most-holy-savior: reuses the existing Common-of-a-Dedication (collect-c8, benedictus-antiphon- common-of-a-dedication), real unique Nocturn 2 vita of her own. Her secondary, St. Theodore, stays excluded for the same octave/subordination reason as above. - presentation-of-the-bvm: real unique collect of her own; her Benedictus antiphon is a substituted Common reference (truncate-and-add-alleluia edit specific to this feast), authored as her own file. Also: our-lady-of-the-snows.yml was missing its own Nocturn 3 (she defers to Commune/C11's own Gospel-incipit-plus-Bede-homily, same as Presentation of the BVM) -- added. Test updates (not regressions): three tests had fixed proof dates colliding with the newly-added feasts, updated to reflect the new, correct behavior. npm test (365 tests) and tsc --noEmit both pass. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
64 lines
2.6 KiB
TypeScript
64 lines
2.6 KiB
TypeScript
import { describe, expect, it } from 'vitest';
|
|
import { resolveDay } from '../../src/calendar';
|
|
import { getDayCollect } from '../../src/hours/resolve-common';
|
|
|
|
// Clean per-annum years for these dates (no Sunday collision, and clear of
|
|
// the movable Ascension/Pentecost/Trinity-adjacent observances that usually
|
|
// overshadow several of them) — see data/calendar/saints/*.yml for
|
|
// per-saint source detail.
|
|
describe('May sanctoral pull (first pass)', () => {
|
|
it('Ss. Philip and James win outright with a real proper collect and antiphon', () => {
|
|
const day = resolveDay('2029-05-01');
|
|
expect(day.winner).toEqual({
|
|
kind: 'sanctoral',
|
|
id: 'ss-philip-and-james',
|
|
name: 'Ss. Philip and James, Apostles',
|
|
rank: 'duplex-2-classis',
|
|
});
|
|
expect(getDayCollect(day).status.en).toBe('verified');
|
|
});
|
|
|
|
it('genuinely unwinnable stubs correctly lose to their real competitor, now that both are modeled', () => {
|
|
// Ss. Alexander/Eventius/Theodulus/Juvenal always lose to the Finding
|
|
// of the Holy Cross (May 3) in real practice — both are now modeled
|
|
// (see finding-of-the-holy-cross.yml), so the collision engine
|
|
// correctly demotes the stub to a commemoration instead of letting it
|
|
// win by default.
|
|
const may3 = resolveDay('2033-05-03');
|
|
expect(may3.winner).toEqual({
|
|
kind: 'sanctoral',
|
|
id: 'finding-of-the-holy-cross',
|
|
name: 'The Finding of the Holy Cross',
|
|
rank: 'duplex-2-classis',
|
|
});
|
|
expect(may3.commemorations).toEqual([
|
|
{
|
|
kind: 'sanctoral',
|
|
id: 'ss-alexander-eventius-theodulus-and-juvenal',
|
|
name: 'Ss. Alexander I, Eventius, and Theodulus, Martyrs, and Juvenal, Bishop and Confessor',
|
|
rank: 'simplex',
|
|
},
|
|
]);
|
|
|
|
// St. Pudentiana always loses to St. Peter Celestine (May 19, also fixed-date) —
|
|
// this one *is* modeled (both are real sanctoral records), so it
|
|
// resolves correctly.
|
|
const may19 = resolveDay('2038-05-19');
|
|
expect(may19.winner).toEqual({
|
|
kind: 'sanctoral',
|
|
id: 'st-peter-celestine',
|
|
name: 'St. Peter Celestine, Pope and Confessor',
|
|
rank: 'duplex',
|
|
});
|
|
expect(may19.commemorations).toEqual([
|
|
{ kind: 'sanctoral', id: 'st-pudentiana', name: 'St. Pudentiana, Virgin', rank: 'simplex' },
|
|
]);
|
|
});
|
|
|
|
it('a saint with no proper collect of his own resolves via the Common of an Abbot instead', () => {
|
|
const day = resolveDay('2038-05-22'); // St. Romanus, Abbot
|
|
expect(day.winner).toEqual({ kind: 'sanctoral', id: 'st-romanus-abbot', name: 'St. Romanus, Abbot', rank: 'duplex' });
|
|
expect(getDayCollect(day).status.en).toBe('verified');
|
|
});
|
|
});
|