diff --git a/src/data/propers/common/ss-chrysanthus-and-daria-collect.yml b/src/data/propers/common/ss-chrysanthus-and-daria-collect.yml new file mode 100644 index 0000000..7f11b42 --- /dev/null +++ b/src/data/propers/common/ss-chrysanthus-and-daria-collect.yml @@ -0,0 +1,17 @@ +# Verified against Divinum Officium (Monastic Tridentinum 1617) — read +# directly from the reference engine's own real-date output (2027-10-25). +id: ss-chrysanthus-and-daria-collect +text: + la: | + Orémus. + Beatórum Mártyrum tuórum, Dómine, Chrysánthi et Daríæ, quǽsumus, adsit nobis orátio: ut, quos venerámur obséquio, eórum pium júgiter experiámur auxílium. + Per Dóminum nostrum Jesum Christum, Fílium tuum: qui tecum vivit et regnat in unitáte Spíritus Sancti, Deus, per ómnia sǽcula sæculórum. + ℟. Amen. + en: | + Let us pray. + Lord, may Your holy Martyrs Chrysanthus and Daria assist us by their prayers. We offer them our homage; may we always experience their loving aid. + Through Jesus Christ, thy Son our Lord, Who liveth and reigneth with thee, in the unity of the Holy Ghost, God, world without end. + ℟. Amen. +status: + la: verified + en: verified diff --git a/src/data/propers/common/ss-simon-and-jude-collect.yml b/src/data/propers/common/ss-simon-and-jude-collect.yml new file mode 100644 index 0000000..6019aa3 --- /dev/null +++ b/src/data/propers/common/ss-simon-and-jude-collect.yml @@ -0,0 +1,17 @@ +# Verified against Divinum Officium (Monastic Tridentinum 1617) — read +# directly from the reference engine's own real-date output (2025-10-28). +id: ss-simon-and-jude-collect +text: + la: | + Orémus. + Deus, qui nos per beátos Apóstolos tuos Simónem et Judam ad agnitiónem tui nóminis veníre tribuísti: da nobis eórum glóriam sempitérnam et proficiéndo celebráre, et celebrándo profícere. + Per Dóminum nostrum Jesum Christum, Fílium tuum: qui tecum vivit et regnat in unitáte Spíritus Sancti, Deus, per ómnia sǽcula sæculórum. + ℟. Amen. + en: | + Let us pray. + O God, Who didst use thine holy Apostles Simon and Jude to make known unto us thy Name, grant unto us so to profit by their doctrine as to do honour to their everlasting glory, and so to honour that glory as to gain profit to ourselves. + Through Jesus Christ, thy Son our Lord, Who liveth and reigneth with thee, in the unity of the Holy Ghost, God, world without end. + ℟. Amen. +status: + la: verified + en: verified diff --git a/src/data/propers/common/st-callistus-collect.yml b/src/data/propers/common/st-callistus-collect.yml new file mode 100644 index 0000000..796948c --- /dev/null +++ b/src/data/propers/common/st-callistus-collect.yml @@ -0,0 +1,17 @@ +# Verified against Divinum Officium (Monastic Tridentinum 1617) — read +# directly from the reference engine's own real-date output (2025-10-14). +id: st-callistus-collect +text: + la: | + Orémus. + Deus, qui nos cónspicis ex nostra infirmitáte defícere: ad amórem tuum nos misericórditer per Sanctórum tuórum exémpla restáura. + Per Dóminum nostrum Jesum Christum, Fílium tuum: qui tecum vivit et regnat in unitáte Spíritus Sancti, Deus, per ómnia sǽcula sæculórum. + ℟. Amen. + en: | + Let us pray. + O God, Who seest that in our own weakness we do continually fall, make, in thy mercy, the examples of thy holy children a mean whereby to renew in us the love of thyself. + Through Jesus Christ, thy Son our Lord, Who liveth and reigneth with thee, in the unity of the Holy Ghost, God, world without end. + ℟. Amen. +status: + la: verified + en: verified diff --git a/src/data/propers/common/st-francis-collect.yml b/src/data/propers/common/st-francis-collect.yml new file mode 100644 index 0000000..2ee37b4 --- /dev/null +++ b/src/data/propers/common/st-francis-collect.yml @@ -0,0 +1,17 @@ +# Verified against Divinum Officium (Monastic Tridentinum 1617) — read +# directly from the reference engine's own real-date output (2025-10-04). +id: st-francis-collect +text: + la: | + Orémus. + Deus, qui Ecclésiam tuam beáti Francísci méritis fœtu novæ prolis amplíficas: tríbue nobis; ex ejus imitatióne, terréna despícere, et cæléstium donórum semper participatióne gaudére. + Per Dóminum nostrum Jesum Christum, Fílium tuum: qui tecum vivit et regnat in unitáte Spíritus Sancti, Deus, per ómnia sǽcula sæculórum. + ℟. Amen. + en: | + Let us pray. + O God, Who didst use the worthy deeds of thy blessed servant Francis as a mean whereby to make thy Church again the mother of children, grant that we like him may set little price by earthly things, and attain unto a portion of those good things which Thou givest in heaven. + Through Jesus Christ, thy Son our Lord, Who liveth and reigneth with thee, in the unity of the Holy Ghost, God, world without end. + ℟. Amen. +status: + la: verified + en: verified diff --git a/src/data/propers/common/st-luke-collect.yml b/src/data/propers/common/st-luke-collect.yml new file mode 100644 index 0000000..16d8841 --- /dev/null +++ b/src/data/propers/common/st-luke-collect.yml @@ -0,0 +1,17 @@ +# Verified against Divinum Officium (Monastic Tridentinum 1617) — read +# directly from the reference engine's own real-date output (2025-10-18). +id: st-luke-collect +text: + la: | + Orémus. + Intervéniat pro nobis, quǽsumus, Dómine, sanctus tuus Lucas Evangelísta: qui crucis mortificatiónem júgiter in suo córpore, pro tui nóminis honóre, portávit. + Per Dóminum nostrum Jesum Christum, Fílium tuum: qui tecum vivit et regnat in unitáte Spíritus Sancti, Deus, per ómnia sǽcula sæculórum. + ℟. Amen. + en: | + Let us pray. + O Lord, we beseech thee, that Luke, thy holy Evangelist, who for the honor of thy name bore continually in his body the suffering of the cross, may intercede in our behalf. + Through Jesus Christ, thy Son our Lord, Who liveth and reigneth with thee, in the unity of the Holy Ghost, God, world without end. + ℟. Amen. +status: + la: verified + en: verified diff --git a/src/data/propers/common/vigil-of-all-saints-collect.yml b/src/data/propers/common/vigil-of-all-saints-collect.yml new file mode 100644 index 0000000..8fe569e --- /dev/null +++ b/src/data/propers/common/vigil-of-all-saints-collect.yml @@ -0,0 +1,17 @@ +# Verified against Divinum Officium (Monastic Tridentinum 1617) — read +# directly from the reference engine's own real-date output (2025-10-31). +id: vigil-of-all-saints-collect +text: + la: | + Orémus. + Dómine, Deus noster, multíplica super nos grátiam tuam: et, quorum prævenimus gloriósa solemnia, tríbue subsequi in sancta professióne lætítiam. + Per Dóminum nostrum Jesum Christum, Fílium tuum: qui tecum vivit et regnat in unitáte Spíritus Sancti, Deus, per ómnia sǽcula sæculórum. + ℟. Amen. + en: | + Let us pray. + Pour forth abundantly upon us of thy mercy, O Lord our God, and grant us grace to follow in their joy in their holy testifying all thy blessed servants the Eve of whose glorious and solemn Commemoration we are keeping. + Through Jesus Christ, thy Son our Lord, Who liveth and reigneth with thee, in the unity of the Holy Ghost, God, world without end. + ℟. Amen. +status: + la: verified + en: verified diff --git a/src/data/propers/common/vigil-of-ss-simon-and-jude-collect.yml b/src/data/propers/common/vigil-of-ss-simon-and-jude-collect.yml new file mode 100644 index 0000000..a9ee19b --- /dev/null +++ b/src/data/propers/common/vigil-of-ss-simon-and-jude-collect.yml @@ -0,0 +1,17 @@ +# Verified against Divinum Officium (Monastic Tridentinum 1617) — read +# directly from the reference engine's own real-date output (2025-10-27). +id: vigil-of-ss-simon-and-jude-collect +text: + la: | + Orémus. + Concede, quǽsumus, omnípotens Deus: ut, sicut Apostolórum tuórum Simónis et Judæ gloriósa natalícia prævenimus; sic ad tua benefícia promerenda, majestátem tuam pro nobis ipsi præveniant. + Per Dóminum nostrum Jesum Christum, Fílium tuum: qui tecum vivit et regnat in unitáte Spíritus Sancti, Deus, per ómnia sǽcula sæculórum. + ℟. Amen. + en: | + Let us pray. + Almighty God, grant, we beseech thee, that as we are preventing thine Apostles Simon and Jude, their glorious birth-day, so the same may prevent thy Majesty to win thy good things for us. + Through Jesus Christ, thy Son our Lord, Who liveth and reigneth with thee, in the unity of the Holy Ghost, God, world without end. + ℟. Amen. +status: + la: verified + en: verified diff --git a/tests/calendar/october-sanctoral.test.ts b/tests/calendar/october-sanctoral.test.ts new file mode 100644 index 0000000..1c191fd --- /dev/null +++ b/tests/calendar/october-sanctoral.test.ts @@ -0,0 +1,89 @@ +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) — see +// data/calendar/saints/*.yml for per-saint source detail. +describe('October sanctoral pull (first pass)', () => { + it('a monastic-calendar-specific addition (Ss. Placid and Companions, St. Benedict\'s own disciple) wins outright at Duplex II. classis', () => { + const day = resolveDay('2026-10-05'); + expect(day.winner).toEqual({ + kind: 'sanctoral', + id: 'ss-placid-and-companions', + name: 'Ss. Placid and Companions, Martyrs', + rank: 'duplex-2-classis', + }); + expect(day.commemorations).toEqual([]); + }); + + it('a monastic-calendar-specific reassignment (St. Justina) displaces what the base Tridentine table gives to St. Marcus, Pope', () => { + const day = resolveDay('2025-10-07'); + expect(day.winner).toEqual({ + kind: 'sanctoral', + id: 'st-justina', + name: 'St. Justina, Virgin and Martyr', + rank: 'duplex', + }); + expect(day.commemorations).toEqual([ + { kind: 'sanctoral', id: 'st-marcus', name: 'St. Marcus, Pope and Confessor', rank: 'simplex' }, + ]); + }); + + it('St. Gall, a monastic-calendar-specific addition, wins outright at Duplex, alone', () => { + const day = resolveDay('2025-10-16'); + expect(day.winner).toEqual({ + kind: 'sanctoral', + id: 'st-gall', + name: 'St. Gall, Abbot', + rank: 'duplex', + }); + expect(day.commemorations).toEqual([]); + }); + + it('St. Luke wins outright at Duplex II. classis with a real proper collect, alone', () => { + const day = resolveDay('2025-10-18'); + expect(day.winner).toEqual({ + kind: 'sanctoral', + id: 'st-luke', + name: 'St. Luke, Evangelist', + rank: 'duplex-2-classis', + }); + expect(getDayCollect(day).status.en).toBe('verified'); + }); + + it('Ss. Simon and Jude win outright at Duplex II. classis with a real proper collect, distinct from their own Vigil the day before', () => { + const vigil = resolveDay('2025-10-27'); + const day = resolveDay('2025-10-28'); + expect(vigil.winner).toEqual({ + kind: 'sanctoral', + id: 'vigil-of-ss-simon-and-jude', + name: 'Vigil of Ss. Simon and Jude', + rank: 'vigil', + }); + expect(day.winner).toEqual({ + kind: 'sanctoral', + id: 'ss-simon-and-jude', + name: 'Ss. Simon and Jude, Apostles', + rank: 'duplex-2-classis', + }); + expect(getDayCollect(day).status.en).toBe('verified'); + }); + + it('the Vigil of All Saints resolves distinctly from All Saints itself the next day', () => { + const vigil = resolveDay('2025-10-31'); + const day = resolveDay('2025-11-01'); + expect(vigil.winner).toEqual({ + kind: 'sanctoral', + id: 'vigil-of-all-saints', + name: 'Vigil of All Saints', + rank: 'vigil', + }); + expect(getDayCollect(vigil).status.en).toBe('verified'); + expect(day.winner).toEqual({ + kind: 'sanctoral', + id: 'all-saints', + name: 'All Saints', + rank: 'duplex-1-classis', + }); + }); +}); diff --git a/tests/calendar/weekday.test.ts b/tests/calendar/weekday.test.ts index 83663e1..8bba222 100644 --- a/tests/calendar/weekday.test.ts +++ b/tests/calendar/weekday.test.ts @@ -37,9 +37,12 @@ describe('resolveDay', () => { // winning by the Vigil of St. Lawrence, itself impeded by the Sunday // and transferred away — see tests/calendar/transfer.test.ts, and // confirmed against the live reference engine, which shows the same - // commemoration despite the vigil's own absence that day). - const day = resolveDay('2026-10-04'); - expect(day.date).toBe('2026-10-04'); + // commemoration despite the vigil's own absence that day). Also not + // 2026-10-04 (moved here from there): since the October pull, that + // date is St. Francis's own day (Duplex), which wins outright even on + // an ordinary Sunday. + const day = resolveDay('2026-11-15'); + expect(day.date).toBe('2026-11-15'); expect(day.weekday).toBe('sunday'); expect(day.winner.kind).toBe('temporal'); expect(day.commemorations).toEqual([]); diff --git a/tests/hours/prime.test.ts b/tests/hours/prime.test.ts index 49673d4..2e82ab8 100644 --- a/tests/hours/prime.test.ts +++ b/tests/hours/prime.test.ts @@ -1,14 +1,17 @@ import { describe, expect, it } from 'vitest'; import { resolveOrdo } from '../../src/hours'; -// 2026-10-05 is a Monday, and (as of the pre-1955 sanctoral pull reaching -// October) still ordinary/ferial — the Monastic 1617 distribution gives -// Monday three whole psalms (1, 2, 6), the first of which (Psalm 1) has -// real sample content in data/psalms/001.yml, so these tests can check -// real verse data without needing every psalm authored. Already had to -// move once (from a June Monday that got real sanctoral content) — if a -// future month's pull lands here too, it'll need to move again. -const MONDAY = '2026-10-05'; +// 2026-11-16 is a Monday, and (as of the pre-1955 sanctoral pull reaching +// October, with November/December still unpulled) still ordinary/ferial — +// the Monastic 1617 distribution gives Monday three whole psalms (1, 2, +// 6), the first of which (Psalm 1) has real sample content in +// data/psalms/001.yml, so these tests can check real verse data without +// needing every psalm authored. Already had to move twice (first from a +// June Monday, then from an October Monday that got real sanctoral +// content — Ss. Placid and Companions, see +// data/calendar/saints/ss-placid-and-companions.yml) — if November's own +// pull lands here too, it'll need to move again. +const MONDAY = '2026-11-16'; const SUNDAY = '2026-08-09'; describe('resolveOrdo("prime", ...)', () => {