summaryrefslogtreecommitdiff
path: root/test/test_support.ml
blob: 7d7662f29e6362c93b6fd613b61a5d7ab61c0c6b (plain) (blame)
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
(* 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)