summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorLukasz Kasprzak <lukas@labunix.xyz>2026-08-18 11:43:13 +0200
committerLukasz Kasprzak <lukas@labunix.xyz>2026-08-18 11:43:13 +0200
commit9a34f7d8a60ef390a98011ad7ee7cbd2ad4a3f4e (patch)
tree3b3d4140d0b3feb005a1bf36b52458b662944e3c /test
parentcb07b035170eb22e0cff30be6449c74af897cda1 (diff)
parent0281a846ac7c22d22990a6664a37205930a94b7d (diff)
downloadcolitur-9a34f7d8a60ef390a98011ad7ee7cbd2ad4a3f4e.tar.gz
colitur-9a34f7d8a60ef390a98011ad7ee7cbd2ad4a3f4e.zip
merge: EF rubrical corrections from O'Connell and a published 1962 Ordo
Three colour fixes, each argued from the Missal and each invisible to every validation layer that shares colitur's own data lineage.
Diffstat (limited to 'test')
-rw-r--r--test/test_differential.ml22
-rw-r--r--test/test_golden.ml35
-rw-r--r--test/test_oracle.ml31
3 files changed, 85 insertions, 3 deletions
diff --git a/test/test_differential.ml b/test/test_differential.ml
index c9173d6..849bde4 100644
--- a/test/test_differential.ml
+++ b/test/test_differential.ml
@@ -893,6 +893,25 @@ let holy_week_slugs =
[ "ef-passiontide-2-monday"; "ef-passiontide-2-tuesday"; "ef-passiontide-2-wednesday";
"ef-passiontide-2-thursday"; "ef-passiontide-2-friday"; "ef-passiontide-2-saturday" ]
+(* C36 (ef-oconnell-rubrics): Good Friday alone, split out of C23's own
+ six-slug population because its diff SET grew a third member. RG 128(b)
+ excepts "Actione liturgica feria VI in Passione et Morte Domini usque ad
+ Communionem exclusive" from Passiontide's violet and RG 132 assigns black
+ there -- recorded in register §3b as an acknowledged gap since Task 16 and
+ closed on this branch. lectio, which has no Holy Week propers at all (C23's
+ own note), keeps showing Passion week's violet, so colour now differs on
+ this ONE of C23's six days in addition to the two citation fields. *)
+let good_friday_slug = "ef-passiontide-2-friday"
+
+(* C37 (ef-oconnell-rubrics): RG 128 gives violet to "II/III-class vigils
+ outside Paschaltide". These two carried Red and White respectively --
+ inherited from lectio, which inherited them from missalemeum, which is
+ generated from Divinum Officium. All three agree with each other and
+ disagree with the Missal, so no layer sharing that lineage could see it.
+ The Ascension's vigil is NOT here: it is the one II-class vigil INSIDE
+ Paschaltide and is correctly white already. *)
+let violet_vigil_slugs = [ "vigil-of-st-lawrence"; "vigil-of-the-assumption" ]
+
(* 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
@@ -1272,6 +1291,9 @@ let layer_c_reason (l : row) (c : row) diffs =
and now RG 309(a)'s Mass for it, which answers before step 3's walkback
is reached. They still differ from lectio, but for C17's cause, and are
filed there. See data/ef/expected-divergences.sexp's own closure note. *)
+ 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 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_golden.ml b/test/test_golden.ml
index a073c52..33ca362 100644
--- a/test/test_golden.ml
+++ b/test/test_golden.ml
@@ -329,7 +329,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 subject=lord \
+ "2016-03-25 friday season=passiontide week=2 slug=ef-passiontide-2-friday rank=class-1 colour=black subject=lord \
name_la=Feria VI in Passione et Morte Domini 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
@@ -524,7 +524,7 @@ let test_holy_thursday_is_white_2026 () =
name_la=Feria V in Cena Domini 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 subject=lord \
+ "2026-04-03 friday season=passiontide week=2 slug=ef-passiontide-2-friday rank=class-1 colour=black subject=lord \
name_la=Feria VI in Passione et Morte Domini comms=[] in=- out=[]"
(* ------------------------------------------------------------------ *)
@@ -1315,9 +1315,38 @@ let test_rogation_wednesday_yields_to_a_feast_2026 () =
"2026-05-13 wednesday season=paschaltide week=6 slug=ef-ascension-vigil rank=class-2 colour=white \
subject=temporal name_la=- comms=[robert-bellarmine:ordinary] in=- out=[]"
+(* RG 128, transcribed in docs/research/rules-register.md §3b: violet is used
+ for "II/III-class vigils outside Paschaltide". Two of colitur's five vigils
+ disagreed with that rule until the ef-oconnell-rubrics branch -- the
+ Assumption's (II class, 14 August) was White and St Lawrence's (III class,
+ 9 August) was Red. Both are outside Paschaltide, so both are violet.
+
+ O'Connell, The Celebration of Mass 4th ed. (1964), section 4(c) states the
+ same rule and its footnote 169 names the sole exception -- "the only vigil
+ of II class within Eastertide is that of the Ascension and its colour is
+ white" -- which colitur already emits correctly (ef-ascension-vigil, white,
+ pinned by the two Rogation Wednesday cases just above).
+
+ Pinned in years where each vigil is actually OBSERVED rather than impeded:
+ 9 August 2025 is a Saturday and 14 August 2025 a Thursday, both checked
+ with `date -d`. In 2026, 9 August is a Sunday and the vigil never appears. *)
+let test_vigil_of_st_lawrence_is_violet_2025 () =
+ check ~msg:"RG 128: III-class vigil outside Paschaltide is violet, not red" 2025 8 9
+ "2025-08-09 saturday season=time-after-pentecost week=8 slug=vigil-of-st-lawrence \
+ rank=class-3 colour=violet subject=saint name_la=- comms=[romanus:ordinary] in=- out=[]"
+
+let test_vigil_of_the_assumption_is_violet_2025 () =
+ check ~msg:"RG 128: II-class vigil outside Paschaltide is violet, not white" 2025 8 14
+ "2025-08-14 thursday season=time-after-pentecost week=9 slug=vigil-of-the-assumption \
+ rank=class-2 colour=violet subject=saint name_la=- comms=[eusebius-confessor:ordinary] in=- out=[]"
+
let suite =
( "golden pins (known-tricky years)",
- [ Alcotest.test_case "Easter extreme: 1598 earliest (22 Mar, Gauss-verified)" `Quick
+ [ Alcotest.test_case "RG128: St Lawrence's vigil is violet (2025)" `Quick
+ test_vigil_of_st_lawrence_is_violet_2025;
+ Alcotest.test_case "RG128: the Assumption's vigil is violet (2025)" `Quick
+ test_vigil_of_the_assumption_is_violet_2025;
+ Alcotest.test_case "Easter extreme: 1598 earliest (22 Mar, Gauss-verified)" `Quick
test_easter_extreme_1598;
Alcotest.test_case "Easter extreme: 1666 latest (25 Apr, Gauss-verified)" `Quick
test_easter_extreme_1666;
diff --git a/test/test_oracle.ml b/test/test_oracle.ml
index 5177716..129c43b 100644
--- a/test/test_oracle.ml
+++ b/test/test_oracle.ml
@@ -1323,6 +1323,21 @@ let m25_dates = [ "2026-03-09"; "2026-03-24"; "2027-03-01"; "2027-03-16" ]
to distinguish this population from a genuinely new, unrelated
citation bug on some other Time-after-Pentecost feria): the SAME
discipline this file's own header names for every other entry here. *)
+(* M29 (ef-oconnell-rubrics) -- RG 128: violet for "vigils of II and III
+ class outside Paschaltide". The Vigil of St Lawrence (9 August, III class)
+ and the Vigil of the Assumption (14 August, II class) both qualify;
+ missalemeum keeps red and white respectively, as lectio and colitur also
+ did before this branch, because all three descend from Divinum Officium's
+ data files. This is the one divergence class in the file where the oracle
+ is not an independent witness against colitur at all -- it is colitur's own
+ discarded ancestor. See data/ef/expected-divergences.sexp's C37, the same
+ 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`. *)
+let m29_dates =
+ [ "2026-08-14"; "2027-08-09"; "2027-08-14"; "2035-08-09"; "2035-08-14"; "2038-08-09";
+ "2038-08-14" ]
+
let m26_dates =
[ "2026-01-03"; "2026-01-10"; "2026-02-14"; "2026-06-02"; "2026-06-03"; "2026-06-20"; "2026-06-27";
"2026-07-04";
@@ -1477,6 +1492,7 @@ let layer_m_reason (c : colitur_row) (o : oracle_row) diffs =
List.mem c.c_date m27_dates
&& 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 None
(* ---------------------------------------------------------------------- *)
@@ -1919,6 +1935,17 @@ let classify_2038 (c : colitur_row) (o : oracle_row) diffs =
Some "IMPEDED-SUNDAY-COMM (M8's rule, RG 109(a)/111(a))"
else if List.mem Comm_identity_unresolved diffs then
Some "COMM-IDENTITY-UNRESOLVED (temporal-origin, no English name -- M15's limit)"
+ (* RG 128 -- the two vigils of II/III class outside Paschaltide whose
+ colour this branch (ef-oconnell-rubrics) corrected from the values
+ inherited via lectio from missalemeum's own Divinum Officium data.
+ Same population as M29 in the 2026-2027 window and C37 in the lectio
+ differential; named here in this window's own vocabulary. Gated on the
+ exact date and colour alone, so any other divergence on these days
+ would still surface. *)
+ else if
+ List.mem c.c_date [ "2035-08-09"; "2035-08-14"; "2038-08-09"; "2038-08-14" ]
+ && diffs = [ Colour_f ]
+ then Some "VIGIL-COLOUR-RG128 (M29, colitur; see C37)"
else None
(* COMMEMORATIONS join the live-window comparison (2026-08-18).
@@ -2038,6 +2065,10 @@ let test_2038_class_counts () =
("CHRIST-THE-KING-WEEK (M26 shape 2b)", 2);
("CHRISTMAS-MULTI-MASS (M27)", 1);
("COLOUR (M21)", 7);
+ (* RG 128, ef-oconnell-rubrics: the two vigils of II/III class outside
+ 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);
("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);