aboutsummaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
Diffstat (limited to 'test')
-rw-r--r--test/test_differential.ml18
-rw-r--r--test/test_lectionary_ef.ml10
-rw-r--r--test/test_oracle.ml37
-rw-r--r--test/test_precedence_ef.ml28
-rw-r--r--test/test_sanctoral_ef.ml8
5 files changed, 99 insertions, 2 deletions
diff --git a/test/test_differential.ml b/test/test_differential.ml
index 849bde4..25a690d 100644
--- a/test/test_differential.ml
+++ b/test/test_differential.ml
@@ -912,6 +912,19 @@ let good_friday_slug = "ef-passiontide-2-friday"
Paschaltide and is correctly white already. *)
let violet_vigil_slugs = [ "vigil-of-st-lawrence"; "vigil-of-the-assumption" ]
+(* C38 (ef-sanctoral-status): `ubaldus` (16 May) and `didacus` (13 November)
+ were promoted from Commemoration_only to Feast on the Missal's own
+ universal calendarium, which ranks both "III classis" outright. lectio
+ inherits the Commemoration_only status from missalemeum, so where colitur
+ now observes the saint, lectio still observes the feria -- hence the slug,
+ rank and both citations differ together. Two exact shapes, not one:
+ 16 May falls in Paschaltide, whose ferial colour is ALREADY white, so no
+ colour difference arises there; 13 November is Time after Pentecost, green,
+ so the white confessor changes it. Both shapes are spelled out rather than
+ collapsed into a subset check, so a colour difference appearing on 16 May
+ (or vanishing on 13 November) would surface as unexplained. *)
+let promoted_feast_slugs = [ "ubaldus"; "didacus" ]
+
(* C26 (task 8, fix round 2, coordinator review, Important): Passion
week's own real Tuesday Mass (tools/bootstrap_lectionary.ml's own
[passion_tuesday_entry] comment has the full Missal citation and both
@@ -1294,6 +1307,11 @@ let layer_c_reason (l : row) (c : row) diffs =
else if String.equal c.slug good_friday_slug && diffs = [ First_f; Gospel_f; Colour_f ] then
Some "C36"
else if List.mem c.slug violet_vigil_slugs && diffs = [ Colour_f ] then Some "C37"
+ else if
+ List.mem c.slug promoted_feast_slugs
+ && (diffs = [ Slug_f; Rank; First_f; Gospel_f ]
+ || diffs = [ Slug_f; Rank; First_f; Gospel_f; Colour_f ])
+ then Some "C38"
else if List.mem c.slug holy_week_slugs && diffs = [ First_f; Gospel_f ] then Some "C23"
else if String.equal c.slug passion_tuesday_slug && diffs = [ First_f; Gospel_f ] then Some "C26"
else if String.equal c.slug advent_ember_sat_slug && diffs = [ First_f; Gospel_f ] then Some "C27"
diff --git a/test/test_lectionary_ef.ml b/test/test_lectionary_ef.ml
index a5a0f6e..d56d187 100644
--- a/test/test_lectionary_ef.ml
+++ b/test/test_lectionary_ef.ml
@@ -442,11 +442,21 @@ let test_step4_assignment_table () =
Alcotest.(check (list (pair string string)))
"the Commons assignment table, exactly"
[ ("benedict", "common-of-abbots");
+ ("didacus", "common-of-a-confessor-not-a-bishop-2");
("frances-rome", "common-of-non-virgins-2");
("gregory-the-great", "common-of-supreme-pontiffs");
("isidore-of-seville", "common-of-doctors");
("patrick", "common-of-a-confessor-bishop-1");
+ (* ef-sanctoral-status: ubaldus and didacus were promoted from
+ Commemoration_only to Feast on the Missal's own universal
+ calendarium, which ranks both "III classis" outright with no
+ commemoration rubric. Each takes its Mass from a Common with only
+ its own Oratio proper, per its own rubric at its own date, so
+ neither needed a proper authored -- only an assignment. ubaldus
+ shares patrick's Common exactly ("Missa Statuit, de Communi
+ Confessoris Pontificis I loco"). *)
("sts-felicitas-perpetua", "common-of-non-virgins-1");
+ ("ubaldus", "common-of-a-confessor-bishop-1");
("vincent-ferrer", "common-of-a-confessor-not-a-bishop-1") ]
assigned
diff --git a/test/test_oracle.ml b/test/test_oracle.ml
index 129c43b..7ee3848 100644
--- a/test/test_oracle.ml
+++ b/test/test_oracle.ml
@@ -1334,6 +1334,20 @@ let m25_dates = [ "2026-03-09"; "2026-03-24"; "2027-03-01"; "2027-03-16" ]
fix seen from the lectio side, and register 6.20 on the shared lineage.
Spans all three oracle windows. 2026-08-09 is absent because it is a
Sunday that year and the vigil never occurs; checked with `date -d`. *)
+(* M30 (ef-sanctoral-status) -- `ubaldus` (16 May) and `didacus` (13 Nov),
+ promoted from Commemoration_only to Feast on the Missal's own universal
+ calendarium ("III classis" outright, no commemoration rubric, and a Mass
+ entry of their own in the Proprium). missalemeum keeps them as
+ commemorations, so on these days colitur observes the SAINT where the
+ oracle observes the feria: rank, observed identity and both citations
+ differ together, and the commemoration colitur used to emit is gone.
+ Colour differs only on 13 November, where the ferial green gives way to
+ the confessor's white; 16 May is in Paschaltide, already white. The same
+ population as C38 in the lectio differential -- and, as there, the oracle
+ here is colitur's own discarded ancestor rather than an independent
+ witness (register 6.20). *)
+let m30_dates = [ "2026-05-16"; "2026-11-13"; "2027-11-13" ]
+
let m29_dates =
[ "2026-08-14"; "2027-08-09"; "2027-08-14"; "2035-08-09"; "2035-08-14"; "2038-08-09";
"2038-08-14" ]
@@ -1493,6 +1507,11 @@ let layer_m_reason (c : colitur_row) (o : oracle_row) diffs =
&& subset diffs [ Observed_identity_unresolved; First_mismatch; Gospel_mismatch ]
then Some "M27"
else if List.mem c.c_date m29_dates && subset diffs [ Colour_f ] then Some "M29"
+ else if List.mem c.c_date m30_dates
+ && subset diffs
+ [ Rank; Colour_f; Comm_presence; Comm_count; Observed_identity_mismatch;
+ Comm_identity_unresolved; First_mismatch; Gospel_mismatch ]
+ then Some "M30"
else None
(* ---------------------------------------------------------------------- *)
@@ -1844,7 +1863,19 @@ let classify_2038 (c : colitur_row) (o : oracle_row) diffs =
nh = 0 || at 0
in
let first_is s = match c.c_first with Some f -> contains f s | None -> false in
- if contains title "Mass of the B. V. M." then Some "BVM-SATURDAY-MASS (M26 shape 1)"
+ (* ef-sanctoral-status: `didacus`, promoted to Feast on the Missal's own
+ calendarium. 13 November 2038 is a SATURDAY, so before the promotion the
+ day kept RG 78's votive Office of the BVM (nothing else occupied it) and
+ after it the III-class feast does. Classified here explicitly, ahead of
+ every other branch, because without it the day falls through to the
+ BVM-Saturday branch and is labelled as the very office the promotion
+ REMOVED -- a label that would read as "still a BVM Saturday" and hide the
+ real cause. Same population as M30 in the 2026-2027 window and C38 in the
+ lectio differential. 16 May 2038 is a Sunday, so `ubaldus` is impeded and
+ never reaches this window at all. *)
+ if c.c_date = "2038-11-13" then
+ Some "PROMOTED-FEAST-RG-CALENDARIUM (M30, colitur; see C38)"
+ else if contains title "Mass of the B. V. M." then Some "BVM-SATURDAY-MASS (M26 shape 1)"
else if first_is "Col 1:12-20" then Some "CHRIST-THE-KING-WEEK (M26 shape 2b)"
else if diffs = [ Colour_f ] && List.mem c.c_observed_slug m21_2038_slugs then Some "COLOUR (M21)"
else if first_is "Judith" then Some "JUDITH (M28, register 6.6)"
@@ -2069,6 +2100,10 @@ let test_2038_class_counts () =
Paschaltide. 2 of 2 possible -- neither 9 nor 14 August 2038 is a
Sunday, so both vigils are actually observed that year. *)
("VIGIL-COLOUR-RG128 (M29, colitur; see C37)", 2);
+ (* ef-sanctoral-status: 13 November 2038 is a Saturday, so the
+ promoted `didacus` displaces RG 78's BVM Office there. 1 of 2
+ possible: 16 May 2038 is a Sunday and `ubaldus` is impeded. *)
+ ("PROMOTED-FEAST-RG-CALENDARIUM (M30, colitur; see C38)", 1);
("COMM-NAME-FORM (same entity, different English name)", 2);
("COMM-ONLY-TIE-BREAK (RG-under-determined convention -- register 6.16)", 1);
("JOSEPH-ANNUNCIATION-TRANSFER-ORDER (C14's own collision)", 2);
diff --git a/test/test_precedence_ef.ml b/test/test_precedence_ef.ml
index 790dab6..3f3e070 100644
--- a/test/test_precedence_ef.ml
+++ b/test/test_precedence_ef.ml
@@ -1170,12 +1170,40 @@ let unrelated_comm_synth =
contest; it adds Paul regardless. *)
let lent_feria_synth = (cand ~origin:P.Temporal ~rank:V.Class3 "ef-lent-2-monday-synth", P.Privileged, 180)
+(* RG 113 sentence ONE (docs/research/rules-register.md §6.26):
+ "Commemoratio de Tempore fit primo loco." The commemoration OF THE SEASON
+ is made in the first place; the second sentence's table order governs the
+ OTHERS. Every other candidate in this table is [origin = P.Temporal] by
+ [cand]'s own default, so the rule is an identity on them and no existing
+ row's expectation moves; these two candidates exist to make a MIXED-origin
+ row possible, which is the only shape that can witness it.
+
+ This file's [admit_cases] is the ONLY place in the whole suite that
+ asserts commemoration ORDER -- the differential never compares
+ commemorations, the oracle sorts both sides into a multiset, and
+ test_golden.ml's own [describe] deliberately sorts its comms field. So a
+ row here is the only thing standing between this rule and a silent
+ regression. *)
+let sanctoral_hi =
+ { (cand ~rank:V.Class2 "ef-sanctoral-hi") with P.origin = P.Sanctoral }
+
+let seasonal_lo = cand ~rank:V.Class3 "ef-seasonal-lo"
+
let admit_cases =
[ (* RG 111 (§4): "I class: none save one privileged." *)
( "I-class day, only an ordinary commemoration due -> none admitted",
observed_class1, observed_class1,
[ po ordinary_hi P.Ordinary ],
[] );
+ (* RG 113 s1: the de Tempore commemoration leads, even though the
+ sanctoral one outranks it on RG 91's table (Class2 beats Class3) and
+ would therefore come first under sentence TWO alone. Both slots of a
+ III-class day are filled, so this row tests ORDER, not selection. *)
+ ( "III-class day, seasonal + sanctoral both admitted -> the SEASONAL one \
+ first (RG 113 s1), despite the sanctoral one's higher table position",
+ observed_class3, observed_class3,
+ [ po sanctoral_hi P.Ordinary; po seasonal_lo P.Ordinary ],
+ [ "ef-seasonal-lo"; "ef-sanctoral-hi" ] );
( "I-class day, ordinary + privileged both due -> only the privileged \
one, regardless of the ordinary one's higher dignity",
observed_class1, observed_class1,
diff --git a/test/test_sanctoral_ef.ml b/test/test_sanctoral_ef.ml
index ebf96dc..5c46edf 100644
--- a/test/test_sanctoral_ef.ml
+++ b/test/test_sanctoral_ef.ml
@@ -47,7 +47,13 @@ let test_load_and_counts () =
let commemoration_only =
List.filter (fun e -> e.L.cel.Cel.status = Cel.Commemoration_only) l.L.entries
in
- Alcotest.(check int) "104 Commemoration_only" 104 (List.length commemoration_only);
+ (* 102, not 104: ef-sanctoral-status promoted `ubaldus` (16 May) and
+ `didacus` (13 November) to Feast. Both are ranked "III classis" outright
+ in the Missal's own universal calendarium, with no commemoration rubric,
+ and both have their own Mass entry in the Proprium taking its readings
+ from a Common. They were the ONLY two defects found by auditing all 290
+ fixed-date entries against that calendarium -- see the register. *)
+ Alcotest.(check int) "102 Commemoration_only" 102 (List.length commemoration_only);
let class1 = List.filter (fun e -> e.L.cel.Cel.rank = V.Class1) l.L.entries in
Alcotest.(check int) "12 Class1" 12 (List.length class1);
let temporal_subjects = List.filter (fun e -> e.L.cel.Cel.subject = Sub.Temporal) l.L.entries in