(* 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) (* Mirrors bin/main.ml's [names_of] exactly (Task 9): {!Colitur_naming.Lang.bible} is a total lookup that returns THE KEY on a miss (["luke.abbr"]), so this degrades to the data's own spelling ({!Colitur_citation.Book.default_spelling}) rather than letting a miss render literally. Duplicated here rather than shared, the same call this file's own header already makes for its three loaders: [bin/] and [test/] are separate dune stanzas. *) let names_of lang id form = let key = Colitur_citation.Book.to_string id ^ (match form with `Full -> ".full" | `Abbr -> ".abbr") in let v = Colitur_naming.Lang.bible lang key in if v = key then Colitur_citation.Book.default_spelling id else v (* The [Sigla.t] a real CLI invocation with no --raw and no --sigla-* flags builds (mirrors bin/main.ml's [load_sigla] under those defaults exactly): [lang]'s own [\[sigla\]] section (none shipped yet, so {!Colitur_citation.Render.default_style}), [abbr] books, the Vulgate tradition. Used by test_view.ml/test_render_golden.ml so their golden and shape assertions exercise the SAME rendering path `colitur table`/`emit`/ `publish` do by default, not a stand-in. *) let default_sigla lang = Colitur_citation.Sigla.make ~style: (Colitur_citation.Render.with_book `Abbr (Colitur_citation.Render.style_of_fields (Colitur_naming.Lang.sigla_fields lang))) ~tradition:Colitur_citation.Book.vulgate ~names:(names_of lang)