aboutsummaryrefslogtreecommitdiff
path: root/test/test_slug.ml
blob: af70e9a6075ad21c895db84c41d663b8c0314049 (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
module S = Colitur_kernel.Slug
module L = Colitur_kernel.Lang

let ok_slug s = match S.of_string s with
  | Ok t -> t | Error e -> Alcotest.failf "slug %S: %s" s e

let test_slug_accepts () =
  Alcotest.(check string) "plain" "ef-advent-sunday-1" (S.to_string (ok_slug "ef-advent-sunday-1"));
  Alcotest.(check string) "digits" "ef-lent-3-monday" (S.to_string (ok_slug "ef-lent-3-monday"))

let test_slug_rejects () =
  List.iter
    (fun bad ->
      Alcotest.(check bool) (Printf.sprintf "reject %S" bad) true (Result.is_error (S.of_string bad)))
    [ ""; "Ef-Advent"; "ef advent"; "ef_advent"; "-leading"; "trailing-"; "ef/advent" ]

let test_slug_sexp () =
  let s = ok_slug "ef-easter-sunday" in
  Alcotest.(check bool) "roundtrip" true (S.equal (S.t_of_sexp (S.sexp_of_t s)) s);
  (* A malformed slug in a data file must be rejected, not silently accepted. *)
  Alcotest.check_raises "bad slug in sexp"
    (Sexplib0.Sexp_conv_error.Of_sexp_error
       (Failure "slug \"Bad Slug\": only [a-z0-9-] allowed", Sexplib0.Sexp.Atom "Bad Slug"))
    (fun () -> ignore (S.t_of_sexp (Sexplib0.Sexp.Atom "Bad Slug")))

let test_lang () =
  Alcotest.(check string) "la" "la" (L.to_string (match L.of_string "la" with
    | Ok t -> t | Error e -> Alcotest.failf "%s" e));
  List.iter
    (fun bad ->
      Alcotest.(check bool) (Printf.sprintf "reject %S" bad) true (Result.is_error (L.of_string bad)))
    [ ""; "e"; "eng"; "EN"; "e1" ]

let suite =
  ( "Slug/Lang",
    [ Alcotest.test_case "slug accepts" `Quick test_slug_accepts;
      Alcotest.test_case "slug rejects" `Quick test_slug_rejects;
      Alcotest.test_case "slug sexp validates" `Quick test_slug_sexp;
      Alcotest.test_case "lang" `Quick test_lang ] )