aboutsummaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
Diffstat (limited to 'test')
-rw-r--r--test/test_differential.ml10
-rw-r--r--test/test_golden.ml31
-rw-r--r--test/test_oracle.ml31
3 files changed, 71 insertions, 1 deletions
diff --git a/test/test_differential.ml b/test/test_differential.ml
index c121d91..849bde4 100644
--- a/test/test_differential.ml
+++ b/test/test_differential.ml
@@ -903,6 +903,15 @@ let holy_week_slugs =
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
@@ -1284,6 +1293,7 @@ let layer_c_reason (l : row) (c : row) diffs =
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 876e3de..33ca362 100644
--- a/test/test_golden.ml
+++ b/test/test_golden.ml
@@ -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);