summaryrefslogtreecommitdiff
path: root/test/test_temporal_ef.ml
diff options
context:
space:
mode:
authorLukasz Kasprzak <lukas@labunix.xyz>2026-08-13 17:09:27 +0200
committerLukasz Kasprzak <lukas@labunix.xyz>2026-08-13 17:09:27 +0200
commitdce208f57cfeeee0715cf35389d37e7ce98227ae (patch)
tree9870e58df161646d71c2f08e5de7f4eefda1434e /test/test_temporal_ef.ml
parentd5df5e79c731ac7f7f89969c0cafe564fdc6e8ab (diff)
downloadcolitur-dce208f57cfeeee0715cf35389d37e7ce98227ae.tar.gz
colitur-dce208f57cfeeee0715cf35389d37e7ce98227ae.zip
fix(ef): RG 112(d) excludes a same-BVM commemoration (fix round 1, F1)
The BVM Saturday Office is itself "de B. Maria Virg."; RG 112(d) (Caput XVI, "De Commemorationibus") excludes another commemoration whose own oration invokes the SAME BVM's intercession. our-lady-of-mt-carmel (16 July, Commemoration_only) was wrongly admitted as an ordinary commemoration alongside the Office on every 16-July-Saturday -- its own collect explicitly invokes "her" (eius) patronage, and both photographic scans print a rubric anticipating exactly this collision (an either/or of Mass texts, not a joint commemoration). Precedence_ef gains marian_slugs (a closed, hand-verified list of sanctoral slugs that are themselves feasts of the BVM) and is_bvm_office (true for subject = Bvm OR a marian_slugs member -- the disjunction is load-bearing: the Office is identified only by subject, since its own slug is deliberately reused from the ordinary ferial fallback; Mt Carmel is identified only by the list, since its own subject tag is Saint, not Bvm). disposition gains a new branch, checked before the pre-existing Commemoration_only catch-all, since the one live witness is Commemoration_only and that branch's own "always Commemorate" had no exception for this shape. Checked exhaustively against every Marian-named sanctoral entry: only Commemoration_only-status entries can ever reach this branch live (a Feast-status one always wins outright instead of losing). Of the two such entries in the data, only Mt Carmel is reachable -- our-lady-of-ransom (24 September) is provably unreachable: 24 September falling on a Saturday forces 1 September to a Thursday, which by construction makes 24 September the September Ember Saturday, Class2, every time, not a sampled coincidence. Re-measured against the full pre-change binary: the original 75,853-day blast radius is unchanged in total, splitting into 74,633 colour-only + 1,220 colour+comms (16-July Saturdays). Mutation-tested: exactly 3 new tests redden, nothing else.
Diffstat (limited to 'test/test_temporal_ef.ml')
-rw-r--r--test/test_temporal_ef.ml43
1 files changed, 29 insertions, 14 deletions
diff --git a/test/test_temporal_ef.ml b/test/test_temporal_ef.ml
index ff3cc0b..4e97d33 100644
--- a/test/test_temporal_ef.ml
+++ b/test/test_temporal_ef.ml
@@ -507,25 +507,40 @@ let test_colours () =
(6 Jan) is a Tuesday, so the actual first-Sunday-after-Epiphany origin is
11 Jan -- exercising all four sub-stretches of the fix. *)
let test_christmastide_feria_slugs () =
- (* 26 Dec 2026 and 10 Jan 2026 are both SATURDAYS -- ef-bvm-saturday task
- (RG 78, "De sancta Maria in sabbato"): every Christmastide feria
- [christmastide_feria_slug] builds is unconditionally Class4
- ([ferial_rank]'s own catch-all outside Advent/Lent/Passiontide), so on a
- Saturday {!Rite_ef.Temporal_ef.bvm_saturday_names}'s own override fires
- here too -- but per that citation's own "Slug" paragraph, the SLUG is
- deliberately left UNCHANGED (reused from this same "-0-"/"-2-" naming,
- not replaced): only colour/subject/name change. So the slug assertions
- below are unaffected by the fix; what is NEW is the colour/subject
- override on these two specific dates, asserted alongside them. *)
+ (* 26 Dec 2026 is a SATURDAY -- but, fix round 1 (coordinator finding F2),
+ it can NEVER actually hold the BVM Saturday office in the real
+ resolved pipeline: 26/27/28 December are St Stephen/St John/the Holy
+ Innocents (RG 67-70), fixed, unconditional, real data/ef/sanctoral.sexp
+ entries every single year (rank >= Class2), which always outrank a
+ Class4 temporal candidate -- so RG 78's own protasis ("in quibus
+ OCCURRIT Officium de feria IV classis") is never satisfied by ANY day
+ in the 26-28 December stretch, in any year. [T.temporal] itself has no
+ visibility into the sanctoral layer at all (by design -- the temporal
+ candidate is computed independent of what saint's day it is; Precedence
+ decides the winner afterward), so it still unconditionally tags this
+ date [subject = Bvm] -- a genuine, correct fact about [T.temporal]'s
+ own pure computation, but NOT a claim that this shape is ever the real
+ OBSERVED office, and pinning it with RG-78 citation language as if it
+ were would overclaim. Only the SLUG is asserted here (unaffected
+ either way, unconditionally correct); the override demonstration
+ itself uses 3 January and 10 January below instead -- both, checked
+ directly against data/ef/sanctoral.sexp, have no competing entry in
+ any year, so the BVM Saturday office genuinely IS reachable there. *)
Alcotest.(check string) "26 Dec (Sat)" "ef-christmas-0-saturday" (slug_of (d 2026 12 26));
- Alcotest.(check string) "26 Dec (Sat): the BVM Saturday office overrides the season colour (white, RG 120(b))"
- "white" (colour_of (d 2026 12 26));
- Alcotest.(check bool) "26 Dec (Sat): subject Bvm" true (subject_of (d 2026 12 26) = Sub.Bvm);
Alcotest.(check string) "28 Dec (Mon)" "ef-christmas-0-monday" (slug_of (d 2026 12 28));
+ (* 3 Jan 2026 is a SATURDAY, genuinely reachable (data/ef/sanctoral.sexp
+ has no 3 January entry) -- the real demonstration for the "-1-"
+ stretch that 26 December's own Saturday could not honestly provide. *)
+ Alcotest.(check string) "3 Jan (Sat): slug stays the ordinary \"-1-\" naming" "ef-christmas-1-saturday"
+ (slug_of (d 2026 1 3));
+ Alcotest.(check string) "3 Jan (Sat): the BVM Saturday office overrides the season colour (white, RG 120(b))"
+ "white" (colour_of (d 2026 1 3));
+ Alcotest.(check bool) "3 Jan (Sat): subject Bvm" true (subject_of (d 2026 1 3) = Sub.Bvm);
Alcotest.(check string) "2 Jan (Fri)" "ef-christmas-1-friday" (slug_of (d 2026 1 2));
Alcotest.(check string) "5 Jan (Mon)" "ef-christmas-1-monday" (slug_of (d 2026 1 5));
(* 7-10 Jan precede the actual origin Sunday (11 Jan): colitur-only, not
- lectio's "week 1" key, precisely to avoid colliding with 12-13 Jan below. *)
+ lectio's "week 1" key, precisely to avoid colliding with 12-13 Jan below.
+ 10 January is ALSO genuinely reachable (no sanctoral entry that date). *)
Alcotest.(check string) "7 Jan (Wed, before the origin)" "ef-christmas-2-wednesday" (slug_of (d 2026 1 7));
Alcotest.(check string) "10 Jan (Sat, before the origin)" "ef-christmas-2-saturday" (slug_of (d 2026 1 10));
Alcotest.(check bool) "10 Jan (Sat): subject Bvm" true (subject_of (d 2026 1 10) = Sub.Bvm);