diff options
| author | Lukasz Kasprzak <lukas@labunix.xyz> | 2026-08-19 09:47:41 +0200 |
|---|---|---|
| committer | Lukasz Kasprzak <lukas@labunix.xyz> | 2026-08-19 09:47:41 +0200 |
| commit | 27a8fbdf738f7fdb4c9a42ec99f08855dbed440b (patch) | |
| tree | c72420ac33b55c2c3bc878b250c0f7d8986eb28d /test/test_render_golden.ml | |
| parent | 99172c86c518fdb2104c098b7b7a79e6c13ba8ea (diff) | |
| download | colitur-27a8fbdf738f7fdb4c9a42ec99f08855dbed440b.tar.gz colitur-27a8fbdf738f7fdb4c9a42ec99f08855dbed440b.zip | |
feat(templates): ordo booklet in six flavours, pinned by goldens
LaTeX and groff are the print paths; HTML carries a print stylesheet;
AsciiDoc, Markdown and plain text are the plain-consumer paths.
AsciiDoc and Markdown use flavour none, and say so in a comment: their
metacharacters are context-dependent and escaping them aggressively
produces worse output than not escaping. The consequence is real and
documented -- a feast name containing * renders as emphasis.
Golden tests pin all six byte-for-byte for 2027. They prove the
templates RENDER, not that they TYPESET; compiling needs TeX and groff,
which is Task 13's opt-in make check-templates.
Diffstat (limited to 'test/test_render_golden.ml')
| -rw-r--r-- | test/test_render_golden.ml | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/test/test_render_golden.ml b/test/test_render_golden.ml new file mode 100644 index 0000000..913513a --- /dev/null +++ b/test/test_render_golden.ml @@ -0,0 +1,40 @@ +(* 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" ] + +let suite = + ( "Render/golden", + List.map (fun n -> Alcotest.test_case n `Quick (fun () -> check_golden n)) cases ) |
