aboutsummaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorLukasz Kasprzak <lukas@labunix.xyz>2026-08-21 12:19:43 +0200
committerLukasz Kasprzak <lukas@labunix.xyz>2026-08-21 12:19:43 +0200
commit055deaedd6bc1acb770bd96b7da8f985ab0f4f0b (patch)
tree6b453cd7a8fcaa7f8e4e257fa46c6a720778e8f4 /test
parentaaf3dc5ba55d46b6b318bb761305013f4c533b26 (diff)
downloadcolitur-055deaedd6bc1acb770bd96b7da8f985ab0f4f0b.tar.gz
colitur-055deaedd6bc1acb770bd96b7da8f985ab0f4f0b.zip
feat(config): flavour is settable, and an INI overlay is diagnosed
The escaping flavour was the one rendering setting with no config key, so a template whose extension says nothing needed the flag every run. Unset still means infer, which config --show reports as (infer) rather than (none). Backfills the 0.8.0 and 0.9.0 changelog entries. Both were tagged by hand rather than through 'make release', which is precisely the guard that would have refused a release with no changelog line.
Diffstat (limited to 'test')
-rw-r--r--test/cli.t19
-rw-r--r--test/test_config.ml19
2 files changed, 38 insertions, 0 deletions
diff --git a/test/cli.t b/test/cli.t
index b2c2263..2e9a0e2 100644
--- a/test/cli.t
+++ b/test/cli.t
@@ -1270,6 +1270,20 @@ slug the engine can produce over 2020-2045:
partial.ini: 1 of 725 celebrations named, 724 missing, 0 unknown
partial.ini: 0 of 104 book names, 104 missing
+`flavour` decides how a template's output is ESCAPED. It is normally inferred
+from the template's own extension, so the key exists for the template whose
+extension says nothing -- and getting it wrong yields malformed output rather
+than ugly output, which is why there is no silent fallback:
+
+ $ printf '{{#days}}{{name}}\n{{/days}}' > t.noext
+ $ colitur table --year 2027 --template t.noext
+ colitur: cannot infer a flavour from ".noext"; pass --flavour latex|typst|groff|html|xml|ics|none
+ [2]
+
+ $ mkdir -p xdg-fl/colitur && printf '[defaults]\nflavour = html\n' > xdg-fl/colitur/config.ini
+ $ XDG_CONFIG_HOME=xdg-fl colitur table --year 2027 --template t.noext | head -1
+ In Octava Nativitatis Domini
+
An INI overlay handed to `--overlay` is DIAGNOSED, not left to fail inside the
sexp reader. The INI form is a source format that `colitur convert` turns into
the S-expression one; feeding it directly otherwise produced "more than one
@@ -1322,6 +1336,7 @@ literally either):
lang la (default)
template (none) (default)
format (none) (default)
+ flavour (infer) (default)
sigla_style la (default)
sigla_book abbr (default)
sigla_tradition vulgate (default)
@@ -1336,6 +1351,7 @@ listed one line per effective entry instead:
lang fr (flag)
template (none) (default)
format (none) (default)
+ flavour (infer) (default)
sigla_style fr (default)
sigla_book abbr (default)
sigla_tradition vulgate (default)
@@ -1354,6 +1370,7 @@ differently from a misspelled key inside a recognised one:
lang en (config)
template (none) (default)
format (none) (default)
+ flavour (infer) (default)
sigla_style en (default)
sigla_book abbr (default)
sigla_tradition vulgate (default)
@@ -1374,6 +1391,7 @@ the config file the earlier examples left behind:
lang la (default)
template (none) (default)
format (none) (default)
+ flavour (infer) (default)
sigla_style pl (flag)
sigla_book full (flag)
sigla_tradition modern (flag)
@@ -1410,6 +1428,7 @@ sidesteps that same non-portability:
lang la (default)
template (none) (default)
format (none) (default)
+ flavour (infer) (default)
sigla_style la (default)
sigla_book abbr (default)
sigla_tradition nonsense (flag)
diff --git a/test/test_config.ml b/test/test_config.ml
index d348d9b..1dc1382 100644
--- a/test/test_config.ml
+++ b/test/test_config.ml
@@ -105,6 +105,23 @@ let test_two_defaults_blocks_report_no_unknown_sections () =
(* Task 8: sigla_style/sigla_book/sigla_tradition read the same way
lang/template/format do, in the same [\[defaults\]] section -- no new
section, and every key recognised (so [unknown_keys] stays empty). *)
+(* The escaping flavour is usually inferred from the template's extension, so
+ this key exists for the template whose extension says nothing. Getting it
+ wrong yields malformed output rather than ugly output, which is why there
+ is no silent fallback and why it is worth being settable rather than
+ passable only per-run. *)
+let test_flavour_is_read () =
+ match C.of_string "[defaults]\nflavour = groff\n" with
+ | Error e -> Alcotest.failf "parse: %s" e
+ | Ok c ->
+ Alcotest.(check (option string)) "flavour" (Some "groff") (C.flavour c);
+ Alcotest.(check (list string)) "nothing unknown" [] (C.unknown_keys c)
+
+let test_flavour_absent_is_none () =
+ match C.of_string "[defaults]\nlang = en\n" with
+ | Error e -> Alcotest.failf "parse: %s" e
+ | Ok c -> Alcotest.(check bool) "unset" true (C.flavour c = None)
+
let test_sigla_keys_are_read () =
let text =
"[defaults]\nsigla_style = la\nsigla_book = full\nsigla_tradition = modern\n"
@@ -149,6 +166,8 @@ let suite =
`Quick test_overlays_accumulate_across_blocks;
Alcotest.test_case "two defaults blocks report no unknown sections"
`Quick test_two_defaults_blocks_report_no_unknown_sections;
+ Alcotest.test_case "flavour is read" `Quick test_flavour_is_read;
+ Alcotest.test_case "flavour absent is none" `Quick test_flavour_absent_is_none;
Alcotest.test_case "sigla keys are read" `Quick test_sigla_keys_are_read;
Alcotest.test_case "empty config sigla keys are none" `Quick test_empty_config_sigla_keys_are_none;
Alcotest.test_case "sigla key repeated across blocks last wins"