diff options
| author | Lukasz Kasprzak <lukas@labunix.xyz> | 2026-08-20 17:14:42 +0200 |
|---|---|---|
| committer | Lukasz Kasprzak <lukas@labunix.xyz> | 2026-08-20 17:14:42 +0200 |
| commit | d68feb04f71c3dea3b59726e2ffca225d99eaa35 (patch) | |
| tree | 8be66516af6a6dd40aa8ca85add74de6f5ef4a04 /test/test_lang_coverage.ml | |
| parent | 27606c42b7506ab7ffc7f1bd32d4d4a72c6400c8 (diff) | |
| download | colitur-d68feb04f71c3dea3b59726e2ffca225d99eaa35.tar.gz colitur-d68feb04f71c3dea3b59726e2ffca225d99eaa35.zip | |
feat(lang): Latin and English book names, and the shipped sigla styles
la.ini and en.ini both gain [sigla] (the current Vulgate/Latin punctuation
convention, byte-identical to Render.default_style) and [bible] (a .full
and .abbr row for every id in Book.all -- 45 cited ids plus the 7 tradition
targets, 52 total). Shipping [sigla] changes no output, asserted by the
full test run. Shipping [bible] does change rendered book names, which is
the point.
la.ini's titles are sourced from docs/research/scan1.txt/scan2.txt (the
1962 Missal scans), each row citing the line its incipit pattern was read
from. Six pairs (kings_3/4, corinthians_1/2, thessalonians_1/2,
timothy_1/2, peter_1/2) share one Missal incipit and differ only in the
sourced .abbr, matching what the primary text itself does. Three ids
(proverbs, song_of_songs, ecclesiasticus) and the seven tradition targets
are marked UNSOURCED and fall back to the data's own spelling, per this
project's central rule against inventing a Latin title.
Re-running the task's own sourcing note against the scans, counting every
hit rather than eyeballing a frequency-sorted list, found nine of its
NOT-sourced verdicts were undercounted (a single clean hit, buried under
higher-frequency matches): Galatians, Colossians, both Thessalonians, both
Peter, Malachi, Numbers, Jonas, Osee and Esdras all have a clean incipit
in the scans and are sourced here. The note's other three verdicts stand,
confirmed independently. Ecclesiasticus is not simply unfound: this Missal
reuses Wisdom's own Lectio libri Sapientiae incipit for Ecclesiasticus
readings too (both were anciently classed as one Sapiential group), so
using it for Ecclesiasticus would misidentify the book, not merely
abbreviate it -- recorded in that row's own comment.
en.ini's [bible] is filled in full, not left partial the way [celebration]
is: without it, a Vulgate-numbered id would fall through the [meta]
fallback chain to la.ini's Latin name, not merely a less complete English
one. Traditional Douay-Rheims names for the Vulgate ids (3 Kings, Osee,
Ecclesiasticus, Isaias, Apocalypse), modern names for the seven tradition
targets, since --sigla-tradition modern is the reader asking for modern
numbering.
test_lang_coverage.ml gains test_every_book_named, asserting every
Book.all id has both forms in la.ini -- the check that catches a forgotten
tradition target, since nothing else in the suite ever names them.
Shipping real book names changes 11 golden template renders (Render/golden)
and several test/cli.t examples that used to demonstrate the pre-Task-10
default-spelling fallback; both are updated to the new, correct output,
each line checked against a fresh render before promoting.
Diffstat (limited to 'test/test_lang_coverage.ml')
| -rw-r--r-- | test/test_lang_coverage.ml | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/test/test_lang_coverage.ml b/test/test_lang_coverage.ml index b4de5be..b2d32a4 100644 --- a/test/test_lang_coverage.ml +++ b/test/test_lang_coverage.ml @@ -95,6 +95,30 @@ let test_every_rite_has_a_latin_name () = (fun id -> if L.rite t id = id then Alcotest.failf "no Latin display name for rite %S" id) [ Rite_ef.Temporal_ef.id ] +(* Task 10: every id Colitur_citation.Book.all knows must have BOTH a + `.full` and an `.abbr` row in lang/la.ini's own [bible] section -- this is + the check that would have caught a forgotten tradition target (the seven + ids in book.ml's own `tradition_targets`, never cited by the data itself, + so nothing else here would ever notice one missing -- see book.mli's own + note on why `default_spelling` falls back to the bare id for exactly + this case). The total-lookup contract makes this a one-line miss test: + `Lang.bible la key = key` IS "no entry", the same pattern + `test_every_slug_has_a_latin_name` above already uses for [celebration]. *) +let test_every_book_named () = + let la = la () in + let missing = + List.concat_map + (fun id -> + let n = Colitur_citation.Book.to_string id in + List.filter_map + (fun form -> + let key = n ^ "." ^ form in + if L.bible la key = key then Some key else None) + [ "full"; "abbr" ]) + Colitur_citation.Book.all + in + Alcotest.(check (list string)) "every book named, both forms" [] missing + (* lang/en.ini is DELIBERATELY partial (see its own header note): it declares [meta] fallback = la, so a slug it does not carry itself should still resolve through the chain to la.ini's name rather than degrade to the bare @@ -136,4 +160,5 @@ let suite = [ Alcotest.test_case "every slug has a Latin name" `Slow test_every_slug_has_a_latin_name; Alcotest.test_case "vocabularies complete" `Quick test_vocabularies_are_complete; Alcotest.test_case "every rite has a Latin name" `Quick test_every_rite_has_a_latin_name; + Alcotest.test_case "every book named, both forms" `Quick test_every_book_named; Alcotest.test_case "en.ini falls back to Latin" `Quick test_en_falls_back_to_latin ] ) |
