From 405910d2fd245e7a11e09eecb8c6fffb68d2169c Mon Sep 17 00:00:00 2001 From: Lukasz Kasprzak Date: Thu, 20 Aug 2026 14:40:12 +0200 Subject: feat(citation): canonical book ids and tradition mapping Seven books arrive in two spellings, inherited from lectio's ini and ultimately from Divinum Officium. Collapse them onto one id here rather than editing generated data. Naming and renumbering are kept apart: a tradition decides which book an id denotes, a language file decides what it is called. --- test/test_citation.ml | 43 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 test/test_citation.ml (limited to 'test/test_citation.ml') diff --git a/test/test_citation.ml b/test/test_citation.ml new file mode 100644 index 0000000..0694d8b --- /dev/null +++ b/test/test_citation.ml @@ -0,0 +1,43 @@ +module B = Colitur_citation.Book + +let s = Alcotest.string + +let test_both_spellings_are_one_book () = + (* The seven inherited duplicate spellings must collapse. This is the + whole reason the parser exists rather than a regex. *) + let same a b = + match B.of_token a, B.of_token b with + | Some x, Some y -> + Alcotest.(check s) (a ^ " = " ^ b) (B.to_string x) (B.to_string y) + | _ -> Alcotest.failf "%s or %s did not resolve" a b + in + same "Isa" "Isa."; + same "Matt" "Matt."; + same "1 Cor" "1 Cor."; + same "1 Pet" "1 Pet."; + same "1 Thess" "1 Thess."; + same "Eph" "Eph."; + same "3 Kgs." "3 Kings" + +let test_unknown_token_is_none () = + Alcotest.(check bool) "not a book" true (B.of_token "Nonesuch" = None) + +let test_vulgate_is_identity () = + match B.of_token "3 Kings" with + | None -> Alcotest.fail "3 Kings did not resolve" + | Some k -> + Alcotest.(check s) "unmapped" "kings_3" (B.to_string (B.map B.vulgate k)) + +let test_modern_renumbers () = + let modern = B.tradition_of_fields [ ("kings_3", "kings_1") ] in + match B.of_token "3 Kings" with + | None -> Alcotest.fail "3 Kings did not resolve" + | Some k -> + Alcotest.(check s) "renumbered" "kings_1" (B.to_string (B.map modern k)) + +let suite = + ( "book", + [ Alcotest.test_case "both spellings one book" `Quick test_both_spellings_are_one_book; + Alcotest.test_case "unknown token" `Quick test_unknown_token_is_none; + Alcotest.test_case "vulgate identity" `Quick test_vulgate_is_identity; + Alcotest.test_case "modern renumbers" `Quick test_modern_renumbers ] ) -- cgit v1.3