aboutsummaryrefslogtreecommitdiff
path: root/test/test_render_golden.ml
blob: bca7158afb073e9a77d45eb06b821547b810f550 (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
(* Pins the six shipped ordo booklet templates, one per flavour, under
   templates/ef/, against a byte-for-byte golden render of 2027. These are
   the templates a real user ships with colitur, rendered through the same
   Template.render_string / View.of_days path colitur table uses -- so a
   change to the view shape, the escaping rules, or the templates themselves
   that alters output is caught here, not only in test_view.ml's shape
   assertions. *)

module T = Colitur_render.Template
module E = Colitur_render.Escape

let render_template path year =
  let ic = open_in_bin path in
  let src = really_input_string ic (in_channel_length ic) in
  close_in ic;
  let ext =
    match String.rindex_opt path '.' with
    | Some i -> String.sub path i (String.length path - i)
    | None -> ""
  in
  let flavour = match E.of_extension ext with Some f -> f | None -> Alcotest.failf "flavour for %s" ext in
  let v = Test_view.view_of year in
  match T.render_string ~flavour src v with Ok s -> s | Error e -> Alcotest.failf "%s: %s" path e

let read path =
  let ic = open_in_bin path in
  let s = really_input_string ic (in_channel_length ic) in
  close_in ic;
  s

let check_golden name =
  let got = render_template ("../templates/ef/" ^ name) 2027 in
  let want = read ("golden/" ^ Filename.remove_extension name ^ "-2027" ^ Filename.extension name) in
  Alcotest.(check string) name want got

let cases =
  [ "ordo.tex"; "ordo.ms"; "ordo.html"; "ordo.adoc"; "ordo.md"; "ordo.txt"; "ordo.typ";
    "grid.tex"; "grid.ms"; "grid.html"; "grid.typ" ]

let suite =
  ( "Render/golden",
    List.map (fun n -> Alcotest.test_case n `Quick (fun () -> check_golden n)) cases )