module L = Colitur_kernel.Layer module Cel = Colitur_kernel.Celebration module S = Colitur_kernel.Slug module DS = Colitur_kernel.Date_spec module Col = Colitur_kernel.Colour type rank = Class1 | Class3 [@@deriving sexp] let slug = S.of_string_exn let cel ?(rank = Class3) ?(colour = Col.White) s = Cel.make ~slug:(slug s) ~rank ~colour ~layer:"base" () let entry ?(month = 1) ?(day = 1) ?rank ?colour s = { L.date = (match DS.fixed ~month ~day with Ok d -> d | Error e -> failwith e); cel = cel ?rank ?colour s } let base () = L.of_entries ~id:"base" ~name:"Test base" [ entry ~month:1 ~day:5 "telesphorus"; entry ~month:1 ~day:14 "hilary" ] let test_layer_basics () = let l = base () in Alcotest.(check bool) "find present" true (L.find l (slug "hilary") <> None); Alcotest.(check bool) "find absent" true (L.find l (slug "nobody") = None); Alcotest.(check bool) "mem" true (L.mem l (slug "telesphorus")); (* canonical order is by slug, so sexp output is byte-stable *) Alcotest.(check (list string)) "canonical order" [ "hilary"; "telesphorus" ] (List.map (fun e -> S.to_string e.L.cel.Cel.slug) l.L.entries) let test_layer_index () = let idx = L.index_by_date (base ()) in Alcotest.(check int) "Jan 14 has one" 1 (List.length (L.on_date idx ~month:1 ~day:14)); Alcotest.(check int) "Jan 20 has none" 0 (List.length (L.on_date idx ~month:1 ~day:20)) let test_layer_sexp () = let l = base () in let sexp = L.sexp_of_t sexp_of_rank l in Alcotest.(check bool) "roundtrip" true (L.t_of_sexp rank_of_sexp sexp = l) let suite = ( "Layer/Overlay", [ Alcotest.test_case "layer basics" `Quick test_layer_basics; Alcotest.test_case "layer by-date index" `Quick test_layer_index; Alcotest.test_case "layer sexp" `Quick test_layer_sexp ] )