aboutsummaryrefslogtreecommitdiff
path: root/test/test_rubrics_ef.ml
diff options
context:
space:
mode:
authorLukasz Kasprzak <lukas@labunix.xyz>2026-08-22 22:40:07 +0200
committerLukasz Kasprzak <lukas@labunix.xyz>2026-08-22 22:40:07 +0200
commit761ae859d73660bcfaa59581312989cb942e704d (patch)
treeadcf7aa53f104fd753769445ced043946d6f0927 /test/test_rubrics_ef.ml
parent9c96e0afc19925b651e0dfee3bc9182dee72acf0 (diff)
downloadcolitur-761ae859d73660bcfaa59581312989cb942e704d.tar.gz
colitur-761ae859d73660bcfaa59581312989cb942e704d.zip
feat(ef): RG 111(a), the sung-Mass commemoration cap
Item 1 of Phase 3 (celebrant-rubrics-phase1): the "at Low Mass" commemoration-placement rule the design spec recorded as unread. It is not a new rule -- it is the sung/low axis of RG 111, which colitur already implements. RG 111(a) (LT.txt, "Ratio admittendi commemorationes"): a liturgical day of the first class, AND any non-conventual sung Mass regardless of the day's own class, admits at most one commemoration, and only if it is privileged. (b)/(c)/(d), the same rubric's remaining clauses, give the wider caps colitur's admit already computes -- which is exactly the LOW MASS answer. Exposed as Precedence.sung_mass_commemorations, a pure derivation over the existing Low-Mass admitted list (filter to Privileged, keep the first), not a new stored field on Liturgical_day.t: the input list is already validated and privilege-tagged, so a second field would only create a second place for the same fact to drift out of sync with the first, with no new information gained. Liturgical_day.t.commemorations is now documented as the Low Mass set explicitly, removing the ambiguity its .mli previously left unstated. Tested against synthetic Low-Mass sets (none/one/two privileged, already-first, empty) and two real calendar days resolved through the normal Cal.day pipeline: 2026-08-14 (Vigil of the Assumption, an ordinary-only commemoration, dropped at Sung Mass) and 2026-04-25 (the Major Litanies, RG 80/109(f), privileged, kept at both Masses).
Diffstat (limited to 'test/test_rubrics_ef.ml')
-rw-r--r--test/test_rubrics_ef.ml38
1 files changed, 37 insertions, 1 deletions
diff --git a/test/test_rubrics_ef.ml b/test/test_rubrics_ef.ml
index 6679702..d533670 100644
--- a/test/test_rubrics_ef.ml
+++ b/test/test_rubrics_ef.ml
@@ -746,6 +746,38 @@ let test_exhaustive_gloria_domain_sweep () =
Alcotest.(check bool) "the full domain reached a real number of Requiem days" true (black > 1_000)
end
+(* ---- ITEM 1: RG 111(a), the sung-Mass commemoration cap
+ ({!Colitur_kernel.Precedence.sung_mass_commemorations}) -- two real
+ calendar days, one of each shape, resolved through the identical
+ [Cal.day] pipeline every other test in this file uses. See
+ precedence.mli's own citation for the rubric and the reasoning for why
+ this is a derivation over [LD.commemorations] (the Low-Mass admitted
+ set), not a second stored field. ---- *)
+
+module Prec = Colitur_kernel.Precedence
+
+let sung_slugs y m d =
+ List.map
+ (fun (c, _) -> Slug.to_string c.Cel.slug)
+ (Prec.sung_mass_commemorations (day_on y m d).LD.commemorations)
+
+let test_rg111a_ordinary_only_dropped () =
+ (* 2026-08-14: Vigil of the Assumption, commemorating [eusebius-confessor]
+ ORDINARILY (no privileged category applies) -- confirmed via `colitur
+ day 2026`. At Low Mass this is admitted (RG 111(c)); at a
+ non-conventual Sung Mass RG 111(a) admits it not at all. *)
+ Alcotest.(check (list string)) "RG 111(a): an ordinary-only Low-Mass set is empty at Sung Mass" []
+ (sung_slugs 2026 8 14)
+
+let test_rg111a_privileged_kept () =
+ (* 2026-04-25: St Mark, commemorating the Major Litanies -- RG 80/109(f),
+ a PRIVILEGED commemoration (data/ef/adjustments.sexp's own [Add
+ major-litanies]) -- confirmed via `colitur day 2026`. Kept at BOTH Low
+ Mass (RG 111(c), one privileged) and Sung Mass (RG 111(a), the same
+ single privileged commemoration). *)
+ Alcotest.(check (list string)) "RG 111(a): the one privileged commemoration survives at Sung Mass"
+ [ "major-litanies" ] (sung_slugs 2026 4 25)
+
let suite =
( "Rubrics_ef",
[ Alcotest.test_case "475(a): ordinary Sunday" `Quick test_475a_ordinary_sunday;
@@ -819,4 +851,8 @@ let suite =
Alcotest.test_case "domain sanity: every Requiem day has [gloria]=false (sample)" `Quick
test_domain_requiem_implies_no_gloria_sample;
Alcotest.test_case "domain sweep 1583..9999: violet/Requiem invariants, committed not sampled"
- `Slow test_exhaustive_gloria_domain_sweep ] )
+ `Slow test_exhaustive_gloria_domain_sweep;
+ Alcotest.test_case "RG 111(a): an ordinary-only Low-Mass set is empty at Sung Mass" `Quick
+ test_rg111a_ordinary_only_dropped;
+ Alcotest.test_case "RG 111(a): a privileged commemoration survives at Sung Mass" `Quick
+ test_rg111a_privileged_kept ] )