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