diff options
Diffstat (limited to 'test/test_golden.ml')
| -rw-r--r-- | test/test_golden.ml | 173 |
1 files changed, 131 insertions, 42 deletions
diff --git a/test/test_golden.ml b/test/test_golden.ml index 5292427..1724375 100644 --- a/test/test_golden.ml +++ b/test/test_golden.ml @@ -93,9 +93,19 @@ let fetch y m d = Cal.day Rite_ef.context real_ef_layer (mk y m d) let slug_s (c : V.rank Cel.t) = Slug.to_string c.Cel.slug let rank_s (c : V.rank Cel.t) = V.rank_to_string c.Cel.rank let colour_s (c : V.rank Cel.t) = Colour.to_string c.Cel.colour +let subject_s (c : V.rank Cel.t) = Colitur_kernel.Subject.to_string c.Cel.subject let privilege_s = function Prec.Privileged -> "privileged" | Prec.Ordinary -> "ordinary" -(* The five fields {!Colitur_kernel.Liturgical_day.t} promises are never +(* fix round 1 (coordinator finding 4): [subject] added. Two of the three + original Holy Family pins (2026-01-11, 2024-01-07) were byte-identical + before and after temporal_ef.ml's own fix -- reverting the feature failed + only the 2030-01-13 collision pin, because [describe] omitted the ONE + field the change touches on an ordinary (non-collision) year. Vacuity + flavour #1 ("an assertion already true before the code under test ran"), + not #8 ("promoted from actual output") -- the OTHER nine fields' values + were independently sourced and remain so; only this tenth was missing. + + The five fields {!Colitur_kernel.Liturgical_day.t} promises are never silently lost, folded into one comparable line -- see the file header for why one string, not five checks. *) let describe (day : (V.season, V.rank) LD.t) = @@ -110,11 +120,12 @@ let describe (day : (V.season, V.rank) LD.t) = List.map (fun (c, d) -> Printf.sprintf "%s->%s" (slug_s c) (Date.to_iso8601 d)) day.LD.transferred_out |> List.sort compare |> String.concat "," in - Printf.sprintf "%s %s season=%s week=%s slug=%s rank=%s colour=%s comms=[%s] in=%s out=[%s]" + Printf.sprintf "%s %s season=%s week=%s slug=%s rank=%s colour=%s subject=%s comms=[%s] in=%s out=[%s]" (Date.to_iso8601 day.LD.date) (Date.weekday_to_string t.Temporal.weekday) (V.season_to_string t.Temporal.season) - week (slug_s day.LD.observed) (rank_s day.LD.observed) (colour_s day.LD.observed) comms tin tout + week (slug_s day.LD.observed) (rank_s day.LD.observed) (colour_s day.LD.observed) + (subject_s day.LD.observed) comms tin tout let check ~msg y m d expected = Alcotest.(check string) msg expected (describe (fetch y m d)) @@ -139,11 +150,11 @@ let omitted_has (day : (V.season, V.rank) LD.t) slug = place, not merely that 22 March is white. *) let test_easter_extreme_1598 () = check ~msg:"1598-03-21 Holy Saturday: still Passiontide, violet (RG 128)" 1598 3 21 - "1598-03-21 saturday season=passiontide week=2 slug=ef-passiontide-2-saturday rank=class-1 colour=violet \ + "1598-03-21 saturday season=passiontide week=2 slug=ef-passiontide-2-saturday rank=class-1 colour=violet subject=temporal \ comms=[] in=- out=[]"; check ~msg:"1598-03-22 earliest possible Easter (Gauss-verified): Paschaltide begins, white, class-1" 1598 3 22 - "1598-03-22 sunday season=paschaltide week=1 slug=ef-easter-sunday rank=class-1 colour=white comms=[] in=- \ + "1598-03-22 sunday season=paschaltide week=1 slug=ef-easter-sunday rank=class-1 colour=white subject=temporal comms=[] in=- \ out=[]" (* 1666: latest Gregorian Easter possible, 25 April -- hand-verified via @@ -151,11 +162,11 @@ let test_easter_extreme_1598 () = 25 April). Same citations as 1598 above. *) let test_easter_extreme_1666 () = check ~msg:"1666-04-24 Holy Saturday: still Passiontide, violet (RG 128)" 1666 4 24 - "1666-04-24 saturday season=passiontide week=2 slug=ef-passiontide-2-saturday rank=class-1 colour=violet \ + "1666-04-24 saturday season=passiontide week=2 slug=ef-passiontide-2-saturday rank=class-1 colour=violet subject=temporal \ comms=[] in=- out=[]"; check ~msg:"1666-04-25 latest possible Easter (Gauss-verified): Paschaltide begins, white, class-1" 1666 4 25 - "1666-04-25 sunday season=paschaltide week=1 slug=ef-easter-sunday rank=class-1 colour=white comms=[] in=- \ + "1666-04-25 sunday season=paschaltide week=1 slug=ef-easter-sunday rank=class-1 colour=white subject=temporal comms=[] in=- \ out=[]" (* 2038: the brief's "late modern case" -- Easter also 25 April (Gauss- @@ -180,10 +191,10 @@ let test_easter_extreme_1666 () = though nothing forces that any more). *) let test_easter_extreme_2038_late_modern () = check ~msg:"2038-04-24 Holy Saturday: still Passiontide, violet (RG 128)" 2038 4 24 - "2038-04-24 saturday season=passiontide week=2 slug=ef-passiontide-2-saturday rank=class-1 colour=violet \ + "2038-04-24 saturday season=passiontide week=2 slug=ef-passiontide-2-saturday rank=class-1 colour=violet subject=temporal \ comms=[] in=- out=[]"; check ~msg:"2038-04-25 late-modern instance of the latest possible Easter (Gauss-verified)" 2038 4 25 - "2038-04-25 sunday season=paschaltide week=1 slug=ef-easter-sunday rank=class-1 colour=white comms=[] in=- \ + "2038-04-25 sunday season=paschaltide week=1 slug=ef-easter-sunday rank=class-1 colour=white subject=temporal comms=[] in=- \ out=[]" (* ------------------------------------------------------------------ *) @@ -204,7 +215,7 @@ let test_annunciation_transfer_inside_holy_week_2016 () = actually reaches a live case" for exactly this reason. *) check ~msg:"2016-03-25 Good Friday: Triduum outranks the Annunciation (RG91 entry 2 > 11), no commemoration" 2016 3 25 - "2016-03-25 friday season=passiontide week=2 slug=ef-passiontide-2-friday rank=class-1 colour=violet \ + "2016-03-25 friday season=passiontide week=2 slug=ef-passiontide-2-friday rank=class-1 colour=violet subject=temporal \ comms=[] in=- out=[annunciation-of-the-blessed-virgin-mary->2016-04-04]"; (* The general RG 96 walk from 26 March would still be inside the Triduum, the Easter octave (all I class, entry 2/10) -- carrying the feast PAST @@ -212,7 +223,7 @@ let test_annunciation_transfer_inside_holy_week_2016 () = after Low Sunday = Easter + 8 = 27 Mar + 8 = 4 April. *) check ~msg:"2016-04-04 Easter+8 (Monday after Low Sunday): RG96 Attamen(a) sedes propria fires" 2016 4 4 "2016-04-04 monday season=paschaltide week=2 slug=annunciation-of-the-blessed-virgin-mary rank=class-1 \ - colour=white comms=[] in=annunciation-of-the-blessed-virgin-mary out=[]" + colour=white subject=saint comms=[] in=annunciation-of-the-blessed-virgin-mary out=[]" (* ------------------------------------------------------------------ *) (* 2008: the double transfer (register §4, "cases worth adding"). Easter = @@ -227,7 +238,7 @@ let test_annunciation_joseph_double_transfer_2008 () = I-class feria, band 7, above 11) -- impeded, Transfer-disposed. *) check ~msg:"2008-03-19 Wednesday of Holy Week outranks Joseph (RG91 entry 7 > 11), no commemoration" 2008 3 19 - "2008-03-19 wednesday season=passiontide week=2 slug=ef-passiontide-2-wednesday rank=class-1 colour=violet \ + "2008-03-19 wednesday season=passiontide week=2 slug=ef-passiontide-2-wednesday rank=class-1 colour=violet subject=temporal \ comms=[] in=- out=[joseph-spouse-of-the-bl-virgin-mary->2008-04-01]"; (* Both Joseph and the Annunciation are band 11 (register: neither is Immaculate Conception/Assumption, band 4; both are ordinary universal @@ -255,7 +266,7 @@ let test_annunciation_joseph_double_transfer_2008 () = check ~msg:"2008-03-31 Easter+8: Annunciation's named sedes propria (RG96 Attamen a) claims the day first" 2008 3 31 "2008-03-31 monday season=paschaltide week=2 slug=annunciation-of-the-blessed-virgin-mary rank=class-1 \ - colour=white comms=[] in=annunciation-of-the-blessed-virgin-mary out=[]"; + colour=white subject=saint comms=[] in=annunciation-of-the-blessed-virgin-mary out=[]"; (* Joseph's own general RG96 walk, finding 31 March already claimed (occupant reports Class1 there, still blocking per [is_blocking]), continues one more day to 1 April -- RG 97-98's "in order": the second @@ -264,7 +275,7 @@ let test_annunciation_joseph_double_transfer_2008 () = check ~msg:"2008-04-01: Joseph's RG96 walk continues past the now-claimed 31 March (RG97-98 'in order')" 2008 4 1 "2008-04-01 tuesday season=paschaltide week=2 slug=joseph-spouse-of-the-bl-virgin-mary rank=class-1 \ - colour=white comms=[] in=joseph-spouse-of-the-bl-virgin-mary out=[]" + colour=white subject=saint comms=[] in=joseph-spouse-of-the-bl-virgin-mary out=[]" (* ------------------------------------------------------------------ *) (* RG 96 Attamen (a) is CONDITIONAL ("quando est transferendum post @@ -288,15 +299,15 @@ let test_annunciation_exception_not_triggered_general_walk_suffices () = check ~msg:"2057-03-26: general RG96 walk suffices (target before Easter, 22 Apr) -- no Attamen(a) exception" 2057 3 26 "2057-03-26 monday season=lent week=3 slug=annunciation-of-the-blessed-virgin-mary rank=class-1 \ - colour=white comms=[ef-lent-3-monday:privileged] in=annunciation-of-the-blessed-virgin-mary out=[]"; + colour=white subject=saint comms=[ef-lent-3-monday:privileged] in=annunciation-of-the-blessed-virgin-mary out=[]"; check ~msg:"2007-03-26: general RG96 walk suffices (target before Easter, 8 Apr) -- no Attamen(a) exception" 2007 3 26 "2007-03-26 monday season=passiontide week=1 slug=annunciation-of-the-blessed-virgin-mary rank=class-1 \ - colour=white comms=[ef-passiontide-1-monday:privileged] in=annunciation-of-the-blessed-virgin-mary out=[]"; + colour=white subject=saint comms=[ef-passiontide-1-monday:privileged] in=annunciation-of-the-blessed-virgin-mary out=[]"; check ~msg:"2012-03-26: general RG96 walk suffices (target before Easter, 8 Apr) -- no Attamen(a) exception" 2012 3 26 "2012-03-26 monday season=passiontide week=1 slug=annunciation-of-the-blessed-virgin-mary rank=class-1 \ - colour=white comms=[ef-passiontide-1-monday:privileged] in=annunciation-of-the-blessed-virgin-mary out=[]" + colour=white subject=saint comms=[ef-passiontide-1-monday:privileged] in=annunciation-of-the-blessed-virgin-mary out=[]" (* After Easter: 2016 (already pinned above, Easter+8 = 4 April) and 2024 (Easter 31 March, Easter+8 = 8 April). In both, the general walk would @@ -312,7 +323,7 @@ let test_annunciation_exception_triggered_when_walk_would_cross_easter () = (RG26)" 2024 4 8 "2024-04-08 monday season=paschaltide week=2 slug=annunciation-of-the-blessed-virgin-mary rank=class-1 \ - colour=white comms=[] in=annunciation-of-the-blessed-virgin-mary out=[]" + colour=white subject=saint comms=[] in=annunciation-of-the-blessed-virgin-mary out=[]" (* 2016's own pin (test_annunciation_transfer_inside_holy_week_2016) is the other half of this pair -- not repeated here to avoid asserting the same date twice. *) @@ -330,19 +341,19 @@ let test_annunciation_exception_triggered_when_walk_would_cross_easter () = let test_precious_blood_transfer_2011 () = check ~msg:"2011-07-01: Sacred Heart (RG91 entry 3) outranks the fixed Precious Blood (entry 11) outright" 2011 7 1 - "2011-07-01 friday season=time-after-pentecost week=2 slug=ef-sacred-heart rank=class-1 colour=white \ + "2011-07-01 friday season=time-after-pentecost week=2 slug=ef-sacred-heart rank=class-1 colour=white subject=temporal \ comms=[] in=- out=[precious-blood-of-our-lord-jesus-christ->2011-07-04]"; check ~msg:"2011-07-02: the RG96 walk's first blocked day (Visitation, II class) -- Precious Blood not here" 2011 7 2 "2011-07-02 saturday season=time-after-pentecost week=2 slug=visitation-of-the-blessed-virgin-mary \ - rank=class-2 colour=white comms=[processus-and-martinian:ordinary] in=- out=[]"; + rank=class-2 colour=white subject=saint comms=[processus-and-martinian:ordinary] in=- out=[]"; check ~msg:"2011-07-03: the RG96 walk's second blocked day (an ordinary Sunday, II class) -- still not here" 2011 7 3 "2011-07-03 sunday season=time-after-pentecost week=3 slug=ef-time-after-pentecost-sunday-3 rank=class-2 \ - colour=green comms=[] in=- out=[]"; + colour=green subject=temporal comms=[] in=- out=[]"; check ~msg:"2011-07-04: the first non-I/II-class day (RG96) -- the Precious Blood lands here" 2011 7 4 "2011-07-04 monday season=time-after-pentecost week=3 slug=precious-blood-of-our-lord-jesus-christ \ - rank=class-1 colour=red comms=[] in=precious-blood-of-our-lord-jesus-christ out=[]" + rank=class-1 colour=red subject=lord comms=[] in=precious-blood-of-our-lord-jesus-christ out=[]" (* ------------------------------------------------------------------ *) (* All Souls falling on a Sunday (register §4, RG96 Attamen (b), primary- @@ -357,11 +368,11 @@ let test_all_souls_on_a_sunday_2025 () = check ~msg:"2025-11-02: All Souls yields to the occurring Sunday (RG91 entry 8), no commemoration (RG94)" 2025 11 2 "2025-11-02 sunday season=time-after-pentecost week=21 slug=ef-time-after-pentecost-sunday-21 rank=class-2 \ - colour=green comms=[] in=- out=[commemoration-of-all-souls->2025-11-03]"; + colour=green subject=temporal comms=[] in=- out=[commemoration-of-all-souls->2025-11-03]"; check ~msg:"2025-11-03: All Souls transfers to the following Monday, its sedes propria (RG96 Attamen b)" 2025 11 3 "2025-11-03 monday season=time-after-pentecost week=21 slug=commemoration-of-all-souls rank=class-1 \ - colour=black comms=[] in=commemoration-of-all-souls out=[]" + colour=black subject=saint comms=[] in=commemoration-of-all-souls out=[]" (* ------------------------------------------------------------------ *) (* Christmas falling on a Sunday (RG91 entry 1: Nativity, Easter, Pentecost @@ -375,7 +386,7 @@ let test_all_souls_on_a_sunday_2025 () = let test_christmas_on_a_sunday_2022 () = check ~msg:"2022-12-25 falling on a Sunday: the Nativity (RG91 entry 1) takes the day outright, no contest" 2022 12 25 - "2022-12-25 sunday season=christmastide week=- slug=ef-nativity rank=class-1 colour=white comms=[] in=- \ + "2022-12-25 sunday season=christmastide week=- slug=ef-nativity rank=class-1 colour=white subject=temporal comms=[] in=- \ out=[]" (* ------------------------------------------------------------------ *) @@ -388,18 +399,18 @@ let test_christmas_on_a_sunday_2022 () = confirmed via `date -d`. *) let test_holy_thursday_is_white_2026 () = check ~msg:"2026-04-01 (Wednesday of Holy Week): ordinary Passiontide violet (RG128)" 2026 4 1 - "2026-04-01 wednesday season=passiontide week=2 slug=ef-passiontide-2-wednesday rank=class-1 colour=violet \ + "2026-04-01 wednesday season=passiontide week=2 slug=ef-passiontide-2-wednesday rank=class-1 colour=violet subject=temporal \ comms=[] in=- out=[]"; check ~msg: "2026-04-02 Holy Thursday: white (RG128(b)'s named exception + RG122's affirmative statement), not \ Passiontide's violet" 2026 4 2 - "2026-04-02 thursday season=passiontide week=2 slug=ef-passiontide-2-thursday rank=class-1 colour=white \ + "2026-04-02 thursday season=passiontide week=2 slug=ef-passiontide-2-thursday rank=class-1 colour=white subject=temporal \ comms=[] in=- out=[]"; check ~msg:"2026-04-03 Good Friday: back to violet (RG128) -- Thursday's white is a one-day exception" 2026 4 3 - "2026-04-03 friday season=passiontide week=2 slug=ef-passiontide-2-friday rank=class-1 colour=violet \ + "2026-04-03 friday season=passiontide week=2 slug=ef-passiontide-2-friday rank=class-1 colour=violet subject=temporal \ comms=[] in=- out=[]" (* ------------------------------------------------------------------ *) @@ -419,14 +430,14 @@ let test_ember_ferias_commemorated_when_impeded () = makes it PRIVILEGED, not merely eligible. *) check ~msg:"1900-12-21: Advent Ember Friday, impeded, MUST be commemorated (RG24) and is privileged (RG109e)" 1900 12 21 - "1900-12-21 friday season=advent week=3 slug=thomas rank=class-2 colour=red \ + "1900-12-21 friday season=advent week=3 slug=thomas rank=class-2 colour=red subject=saint \ comms=[ef-advent-ember-fri:privileged] in=- out=[]"; (* 1902-02-22: Lent Ember Saturday (RG91 entry 18, II class) impeded by the Chair of St Peter (II class, universal, entry 16). Same RG24/ RG109(e) mandate. *) check ~msg:"1902-02-22: Lent Ember Saturday, impeded, MUST be commemorated (RG24) and is privileged (RG109e)" 1902 2 22 - "1902-02-22 saturday season=lent week=1 slug=chair-of-st-peter rank=class-2 colour=white \ + "1902-02-22 saturday season=lent week=1 slug=chair-of-st-peter rank=class-2 colour=white subject=saint \ comms=[ef-lent-ember-sat:privileged] in=- out=[]" let test_iv_class_ferias_never_commemorated () = @@ -443,7 +454,7 @@ let test_iv_class_ferias_never_commemorated () = true (omitted_has d1 "ef-time-after-pentecost-8-wednesday"); Alcotest.(check string) "2026-07-22: Mary Magdalene observed, no commemoration (RG26)" - "2026-07-22 wednesday season=time-after-pentecost week=8 slug=mary-magdalene rank=class-3 colour=white \ + "2026-07-22 wednesday season=time-after-pentecost week=8 slug=mary-magdalene rank=class-3 colour=white subject=saint \ comms=[] in=- out=[]" (describe d1); let d2 = fetch 2026 8 10 in @@ -451,7 +462,7 @@ let test_iv_class_ferias_never_commemorated () = true (omitted_has d2 "ef-time-after-pentecost-11-monday"); Alcotest.(check string) "2026-08-10: St Lawrence observed, no commemoration (RG26)" - "2026-08-10 monday season=time-after-pentecost week=11 slug=lawrence rank=class-2 colour=red comms=[] in=- \ + "2026-08-10 monday season=time-after-pentecost week=11 slug=lawrence rank=class-2 colour=red subject=saint comms=[] in=- \ out=[]" (describe d2) @@ -476,7 +487,7 @@ let test_ii_class_sunday_admits_only_ii_class_commemoration () = (omitted_has d2009 "romanus"); Alcotest.(check string) "2009-08-09: the Sunday observed, no commemoration at all (RG111(b) rank floor)" "2009-08-09 sunday season=time-after-pentecost week=10 slug=ef-time-after-pentecost-sunday-10 rank=class-2 \ - colour=green comms=[] in=- out=[]" + colour=green subject=temporal comms=[] in=- out=[]" (describe d2009); let d2026 = fetch 2026 8 9 in Alcotest.(check bool) "2026-08-09: romanus (Class3) is offered and excluded, proving RG111(b) actually fired" @@ -484,7 +495,7 @@ let test_ii_class_sunday_admits_only_ii_class_commemoration () = (omitted_has d2026 "romanus"); Alcotest.(check string) "2026-08-09: the Sunday observed, no commemoration at all (RG111(b) rank floor)" "2026-08-09 sunday season=time-after-pentecost week=11 slug=ef-time-after-pentecost-sunday-11 rank=class-2 \ - colour=green comms=[] in=- out=[]" + colour=green subject=temporal comms=[] in=- out=[]" (describe d2026) (* ------------------------------------------------------------------ *) @@ -549,9 +560,80 @@ let test_rg16a_lord_feast_no_sunday_commemoration_2028 () = et privilegiis\" keeps the day a dominica II classis for RG111(b), so Sixtus (Class3) has no standing \ either, oracle-confirmed" "2028-08-06 sunday season=time-after-pentecost week=9 slug=transfiguration-of-our-lord rank=class-2 \ - colour=white comms=[] in=- out=[]" + colour=white subject=lord comms=[] in=- out=[]" (describe d) +(* Holy Family (RG 17(b), scan-verified, docs/research/rules-register.md + §4/§6.0): "festum S. Familiae Iesu, Mariae, Ioseph, celebrandum dominica + prima post Epiphaniam" -- first Sunday after Epiphany, II class, EVERY + year, taking the Sunday's own place "cum omnibus iuribus et privilegiis" + (RG 17(b)'s own closing clause, the same formula RG 16(a) uses above). + Three shapes, each independently verified against the primary text + BEFORE being typed in here, per this file's own header rule: + + 1. AN ORDINARY YEAR (2026, 11 January): no fixed-date competitor in the + 7-13 January window besides St Hyginus (11 Jan, Class3, + Commemoration_only per data/ef/sanctoral.sexp) -- excluded from the + day's single Sunday slot outright by RG 111(b)'s own rank floor ("de + festo II classis"), the SAME mechanism test_precedence_ef.ml's own + "II-class Sunday admits only a de-festo-II-classis commemoration" pin + already proves for a different date -- so comms=[] is not itself new + ground, only Holy Family's own slug/rank/colour/season are. + `date -d 2026-01-11 +%A` = Sunday, independently confirmed. + 2. THE 13-JANUARY COLLISION (2030, the latest possible date -- Epiphany + itself a Sunday, 6 January): the fixed Commemoration of the Baptism + of the Lord (13 Jan, Class2, subject Lord, data/ef/sanctoral.sexp) + would otherwise contest the day directly, not merely lose a + commemoration slot -- RG 91 entry 14's own "primum mobilia, deinde + fixa" (precedence_ef.ml's own [entry_14_movable_band]) is what keeps + Holy Family observed, and RG 112(a) -- directly confirmed by the Holy + Family Mass propers' own more specific 13-January rubric, both + photographic scans, word for word: "Si festum S. Familiae occurrerit + die 13 ianuarii, Missa dicitur de festo S. Familiae, sine + commemoratione Baptismatis D.N.I.C., et sine commemoratione + dominicae" -- is what keeps comms=[] rather than admitting the + Baptism as an ordinary Class2 commemoration. `date -d 2030-01-13 + +%A` = Sunday, independently confirmed; 2030 is one of the seven + years in the 2005-2050 window this collision occurs (register §6.0's + own list, test_differential.ml's own C15). + 3. THE EARLIEST POSSIBLE DATE (2024, 7 January -- Epiphany a Saturday): + the OTHER end of RG 17(b)'s own 7-13 January range, proving the + window's own boundary, not only its middle and its latest instance. + No fixed-date competitor exists this early in the window either. + `date -d 2024-01-07 +%A` = Sunday, independently confirmed. + + All three: season=christmastide (RG 72-73's own 1-13 January boundary, + unaffected by Holy Family), week=- (Christmastide carries no numbered + weeks at all, [T.week_origin]'s own [None] case -- unaffected by which + Sunday of it this is), slug=ef-time-after-epiphany-sunday-1 (unchanged + from the plain Sunday key this date always carried -- temporal_ef.ml's + own comment on why RG 17(b) does not need a new lectionary key), rank + =class-2, colour=white -- AND, fix round 1 (coordinator finding 4), + subject=lord: the ONE field that actually distinguishes Holy Family from + an ordinary, unnamed Sunday (every other field above was already + identical before temporal_ef.ml's own fix -- [describe] originally + omitted [subject], so two of these three pins would have stayed green + even with the feature fully reverted; see [describe]'s own comment). *) +let test_holy_family_ordinary_year_2026 () = + check ~msg:"2026-01-11: Holy Family, ordinary year -- Hyginus (Class3, Commemoration_only) has no \ + standing for the day's II-class-only Sunday slot" + 2026 1 11 + "2026-01-11 sunday season=christmastide week=- slug=ef-time-after-epiphany-sunday-1 rank=class-2 \ + colour=white subject=lord comms=[] in=- out=[]" + +let test_holy_family_excludes_baptism_2030 () = + check ~msg:"2030-01-13: Holy Family on the latest possible date -- RG91 e14 \"primum mobilia\" keeps it \ + observed over the fixed Baptism, RG112(a) excludes the Baptism entirely, not merely demotes it" + 2030 1 13 + "2030-01-13 sunday season=christmastide week=- slug=ef-time-after-epiphany-sunday-1 rank=class-2 \ + colour=white subject=lord comms=[] in=- out=[]" + +let test_holy_family_earliest_possible_date_2024 () = + check ~msg:"2024-01-07: Holy Family on the earliest possible date (Epiphany a Saturday)" + 2024 1 7 + "2024-01-07 sunday season=christmastide week=- slug=ef-time-after-epiphany-sunday-1 rank=class-2 \ + colour=white subject=lord comms=[] in=- out=[]" + (* 2025-02-02, the other real instance of the SAME pattern -- not a contrasting second direction, per this task's fix round 1 (CRITICAL finding, item 1, reverted; see register §6.0 for the full account). @@ -583,7 +665,7 @@ let test_purification_on_a_sunday_2025 () = commemoration of the Sunday, oracle-confirmed" 2025 2 2 "2025-02-02 sunday season=time-after-epiphany week=4 slug=purification-of-the-blessed-virgin-mary \ - rank=class-2 colour=white comms=[] in=- out=[]" + rank=class-2 colour=white subject=lord comms=[] in=- out=[]" (* ------------------------------------------------------------------ *) (* RG 91 entry 24 ("Festa III classis, in calendario Ecclesiae universae @@ -642,15 +724,15 @@ let test_iii_class_feast_wins_class4_feria () = true (omitted_has d1 "ef-easter-2-wednesday"); Alcotest.(check string) "2008-04-02: Francis of Paola (III class, RG91 entry 24) outranks the class-4 feria" - "2008-04-02 wednesday season=paschaltide week=2 slug=francis-of-paola rank=class-3 colour=white comms=[] \ + "2008-04-02 wednesday season=paschaltide week=2 slug=francis-of-paola rank=class-3 colour=white subject=saint comms=[] \ in=- out=[]" (describe d1); check ~msg:"2008-04-04: Isidore of Seville (III class) outranks the class-4 Paschaltide feria, same shape" 2008 4 4 - "2008-04-04 friday season=paschaltide week=2 slug=isidore-of-seville rank=class-3 colour=white comms=[] in=- \ + "2008-04-04 friday season=paschaltide week=2 slug=isidore-of-seville rank=class-3 colour=white subject=saint comms=[] in=- \ out=[]"; check ~msg:"2008-04-05: Vincent Ferrer (III class) outranks the class-4 Paschaltide feria, same shape" 2008 4 5 - "2008-04-05 saturday season=paschaltide week=2 slug=vincent-ferrer rank=class-3 colour=white comms=[] in=- \ + "2008-04-05 saturday season=paschaltide week=2 slug=vincent-ferrer rank=class-3 colour=white subject=saint comms=[] in=- \ out=[]"; let d4 = fetch 2038 3 6 in Alcotest.(check bool) @@ -660,15 +742,15 @@ let test_iii_class_feast_wins_class4_feria () = Alcotest.(check string) "2038-03-06: Sts Perpetua and Felicity (III class, RG91 entry 24) outrank the class-4 feria; RED per their \ own martyrs' colour, not the season's violet" - "2038-03-06 saturday season=septuagesima week=2 slug=sts-felicitas-perpetua rank=class-3 colour=red comms=[] \ + "2038-03-06 saturday season=septuagesima week=2 slug=sts-felicitas-perpetua rank=class-3 colour=red subject=saint comms=[] \ in=- out=[]" (describe d4); check ~msg:"2038-03-08: John of God (III class) outranks the class-4 Septuagesima feria, same shape" 2038 3 8 - "2038-03-08 monday season=septuagesima week=3 slug=john-of-god rank=class-3 colour=white comms=[] in=- \ + "2038-03-08 monday season=septuagesima week=3 slug=john-of-god rank=class-3 colour=white subject=saint comms=[] in=- \ out=[]"; check ~msg:"2038-03-09: Frances of Rome (III class) outranks the class-4 Septuagesima feria, same shape" 2038 3 9 - "2038-03-09 tuesday season=septuagesima week=3 slug=frances-rome rank=class-3 colour=white comms=[] in=- \ + "2038-03-09 tuesday season=septuagesima week=3 slug=frances-rome rank=class-3 colour=white subject=saint comms=[] in=- \ out=[]" let suite = @@ -704,6 +786,13 @@ let suite = Alcotest.test_case "RG16(a), the Purification (oracle-ruled): observed outright, the Sunday not commemorated (2025-02-02)" `Quick test_purification_on_a_sunday_2025; + Alcotest.test_case "Holy Family (RG17(b)), ordinary year (2026-01-11)" `Quick + test_holy_family_ordinary_year_2026; + Alcotest.test_case + "Holy Family excludes the Baptism entirely on the latest possible date (RG91 e14 + RG112(a), 2030-01-13)" + `Quick test_holy_family_excludes_baptism_2030; + Alcotest.test_case "Holy Family, earliest possible date (2024-01-07)" `Quick + test_holy_family_earliest_possible_date_2024; Alcotest.test_case "ef-rebootstrap: RG91 entry24 (III-class feast) outranks entry28 (class-4 feria) -- the six dates \ deferred since 2038's own Easter-extreme pin (2008-04-02/04/05, 2038-03-06/08/09)" |
