diff options
| author | Lukasz Kasprzak <lukas@labunix.xyz> | 2026-08-19 08:27:22 +0200 |
|---|---|---|
| committer | Lukasz Kasprzak <lukas@labunix.xyz> | 2026-08-19 08:27:22 +0200 |
| commit | 5828571fa31a0480838d1ede210002ab50768c64 (patch) | |
| tree | be4bbb946c2e75cdc268f858b0575edbbbbcf401 /test/test_support.ml | |
| parent | da9cf402ceed8102aec1a9d008f8e918a23d39f3 (diff) | |
| download | colitur-5828571fa31a0480838d1ede210002ab50768c64.tar.gz colitur-5828571fa31a0480838d1ede210002ab50768c64.zip | |
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.
Diffstat (limited to 'test/test_support.ml')
| -rw-r--r-- | test/test_support.ml | 65 |
1 files changed, 65 insertions, 0 deletions
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) |
