aboutsummaryrefslogtreecommitdiff
path: root/test/test_litcal_of.ml
diff options
context:
space:
mode:
Diffstat (limited to 'test/test_litcal_of.ml')
-rw-r--r--test/test_litcal_of.ml43
1 files changed, 41 insertions, 2 deletions
diff --git a/test/test_litcal_of.ml b/test/test_litcal_of.ml
index 6a638a7..9dfc5ba 100644
--- a/test/test_litcal_of.ml
+++ b/test/test_litcal_of.ml
@@ -640,6 +640,44 @@ let is_l7_2033_tie_identity (l : litcal_row) =
exact date shape) -- NOT fixed here, per this task's own brief. *)
let is_l8_l9_joseph_2035 (l : litcal_row) = String.equal l.event_key "StJoseph" && String.equal l.date "2035-03-17"
+(* L10 -- W3 (of-known-wrongs, 2026-08-26). Precedence_of.band now gives the
+ two SHIPPED movable BVM obligatory memorials (Mary, Mother of the Church,
+ event_key "MaryMotherChurch"; the Immaculate Heart of Mary, event_key
+ "ImmaculateHeart") a sub-rank of 95 -- strictly between Tabula entries 9
+ and 10, never the ordinary 100 -- so a real collision with a FIXED
+ obligatory memorial (e.g. 2011-06-13, Mater Ecclesiae vs Anthony of
+ Padua) resolves in the Marian memorial's favour instead of falling to
+ Colitur_kernel.Precedence.resolve's own alphabetical tie-break. See
+ Rite_of.Precedence_of.movable_bvm_memorials's own comment for the primary
+ source (the CDWDS's own 24 March 2018 Notification) and the full
+ reasoning.
+
+ litcal's own [grade_lcl] text is coarser than this: EVERY
+ Memoria_obligatoria reads "Memorial", with no way to represent colitur's
+ own finer sub-rank -- so [expected_bands]'s [100;110] bucket cannot match
+ 95. This is a genuine, cited REPRESENTATIONAL gap in litcal's own
+ vocabulary, not a computational disagreement: the IDENTITY axis (which
+ day is actually observed) is untouched by this fix and stays unexplained
+ here on purpose -- [test_identity_matches_or_is_explained] needed no new
+ entry, confirmed by running it after this fix with no change.
+
+ Fires on every fixture row naming either event_key where colitur's own
+ band is exactly 95 -- ANY date that entity is observed, not only an
+ actual collision date, because the sub-rank is unconditional (see
+ [movable_bvm_memorials]'s own comment for why: neither entity's date
+ range can ever reach a Tabula 1-9 day, so 95 is always safe and never
+ needs a live-collision guard). 15 rows over this fixture's 12 years,
+ measured directly against a real `dune test` run, not guessed:
+ MaryMotherChurch in 11 of 12 years (2033's own occurrence is a DIFFERENT,
+ already-explained shape, band 30 not 95 -- not this entity's date at
+ all that year; see L6) and ImmaculateHeart in 4 (the other 8 years'
+ ImmaculateHeart-window rows are excluded upstream by litcal's own
+ "optional memorial" grade quirk, [expected_bands]'s [None] case above,
+ or by L6/L7's own 2033 tie). *)
+let is_l10_movable_bvm_subrank (l : litcal_row) band =
+ (String.equal l.event_key "MaryMotherChurch" || String.equal l.event_key "ImmaculateHeart")
+ && band = 95
+
let test_grade_matches_or_is_explained () =
let litcal = litcal_rows () in
let allow_list = load_allow_list () in
@@ -663,6 +701,7 @@ let test_grade_matches_or_is_explained () =
else if is_l5_mary_magdalene l then bump "L5"
else if is_l6_2033_tie_grade l then bump "L6"
else if is_l8_l9_joseph_2035 l then bump "L8"
+ else if is_l10_movable_bvm_subrank l band then bump "L10"
else
unexplained :=
Printf.sprintf "%s: colitur band=%d, litcal grade=%S (event_key=%S, expected one of [%s])" l.date band
@@ -679,7 +718,7 @@ let test_grade_matches_or_is_explained () =
match List.assoc_opt id by_id with
| None -> Alcotest.failf "allow-list entry %s is used by the comparator but not declared in %s" id allow_list_path
| Some e -> Alcotest.(check int) (Printf.sprintf "%s expected_rows (grade)" id) e.expected_rows actual)
- [ "L4"; "L5"; "L6"; "L8" ]
+ [ "L4"; "L5"; "L6"; "L8"; "L10" ]
(* The complement, mirroring [test_unwitnessed_ordinary_time_is_counted]:
every row [expected_bands] returns [None] for, classified by which of
@@ -796,7 +835,7 @@ let test_no_holy_family_2033_divergence () =
(* [is_holy_family_2033]'s own header. *)
(* ---------------------------------------------------------------------- *)
-let recognized_allow_ids = [ "L1"; "L4"; "L5"; "L6"; "L7"; "L8"; "L9" ]
+let recognized_allow_ids = [ "L1"; "L4"; "L5"; "L6"; "L7"; "L8"; "L9"; "L10" ]
let test_allow_list_has_no_orphan_entries () =
let allow_list = load_allow_list () in