1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
|
(* 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)
|