From 5828571fa31a0480838d1ede210002ab50768c64 Mon Sep 17 00:00:00 2001 From: Lukasz Kasprzak Date: Wed, 19 Aug 2026 08:27:22 +0200 Subject: feat(render): the view model Shapes a civil year of resolved days into the value a template renders against. This layer is why the engine can stay logic-less: a month grid needs leading blank cells, week bucketing and an in-month test, and a logic-less template can compute none of it. Both weeks and days are offered at every level -- the booklet walks days, the grid walks weeks -- so the two artefacts cannot drift. Colours are six booleans, not hex: hex bakes a presentation policy into the engine, and LaTeX, groff and HTML each want a different colour expression. Asserted: exactly one of the six is true on every day of a whole year, so a template keying off them can never get none or two. Padding cells carry every field a real day carries, empty, so a template never hits a missing key mid-grid. --- test/test_support.ml | 65 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 test/test_support.ml (limited to 'test/test_support.ml') diff --git a/test/test_support.ml b/test/test_support.ml new file mode 100644 index 0000000..7d7662f --- /dev/null +++ b/test/test_support.ml @@ -0,0 +1,65 @@ +(* Loaders for the real EF data (data/ef/*.sexp), extracted from + bin/main.ml's [load_ef_layer]/[load_ef_lectionary]/[load_ef_commons] + (bin/main.ml:154, :193, :206) and simplified to what the test suite + needs: no [~user_overlays], no COLITUR_DATA_DIR/installed-prefix + indirection (that machinery exists so the CLI finds its data next to + wherever it was installed or built -- tests always run from test/, where + test/dune already declares the four data/ef/*.sexp paths as [deps]). + Reading them via the same "../data/ef/..." relative paths test_calendar.ml, + test_rite_ef.ml and test_lectionary_ef.ml already use, not [bin/]'s own + [data_dir ()]. + + Deliberately NOT shared as a library with bin/main.ml: [bin/] and [test/] + are separate dune stanzas, and three small loaders duplicated here is + cheaper than a new library built just to serve them. bin/main.ml is not + changed to use this module -- the CLI keeps its own copy, already pinned + by test/cli.t. *) + +let sanctoral_path = "../data/ef/sanctoral.sexp" +let adjustments_path = "../data/ef/adjustments.sexp" +let lectionary_path = "../data/ef/lectionary.sexp" +let commons_path = "../data/ef/commons.sexp" + +(* Mirrors bin/main.ml's [load_ef_layer]: the shipped sanctoral layer with + the shipped adjustments overlay merged on top (RG 110's 30 June + companion, the Major Litanies, Barbara, Rogation Wednesday -- see + adjustments.sexp's own header). No user overlays: the test suite always + wants the plain shipped calendar. Diagnostics are discarded rather than + surfaced -- the shipped overlay is asserted elsewhere (test_overlay.ml, + the "check" path) to merge clean; a test that wants to see them can + still call {!Colitur_kernel.Overlay.merge} directly. *) +let load_ef_layer () = + match Colitur_kernel.Layer.load Rite_ef.Vocab_ef.rank_of_sexp sanctoral_path with + | Error e -> Error (Printf.sprintf "failed to load %s: %s" sanctoral_path e) + | Ok layer -> ( + match Colitur_kernel.Overlay.load Rite_ef.Vocab_ef.rank_of_sexp adjustments_path with + | Error e -> Error (Printf.sprintf "failed to load %s: %s" adjustments_path e) + | Ok overlay -> + let layer, _diagnostics = Colitur_kernel.Overlay.merge layer [ overlay ] in + Ok layer) + +(* Mirrors bin/main.ml's [load_ef_lectionary]. *) +let load_ef_lectionary () = + match Colitur_kernel.Lectionary.load lectionary_path with + | Error e -> Error (Printf.sprintf "failed to load %s: %s" lectionary_path e) + | Ok l -> Ok l + +(* Mirrors bin/main.ml's [load_ef_commons]. *) +let load_ef_commons () = + match Rite_ef.Lectionary_ef.Commons.load commons_path with + | Error e -> Error (Printf.sprintf "failed to load %s: %s" commons_path e) + | Ok c -> Ok c + +(* Assembles [Rite_ef.context] the way bin/main.ml:328 does, over the real + shipped lectionary and Commons. Raises on a load failure rather than + returning a [result]: the four data files are declared [deps] in + test/dune, so a failure here means the test tree itself is broken, the + same condition test_calendar.ml's and test_rite_ef.ml's own + module-level loaders already treat as fatal. *) +let ef_context () = + match load_ef_lectionary () with + | Error e -> failwith e + | Ok lectionary -> ( + match load_ef_commons () with + | Error e -> failwith e + | Ok commons -> Rite_ef.context ~lectionary ~commons) -- cgit v1.3