let test_basic () = Eio_main.run @@ fun env -> let clock = Eio.Stdenv.clock env in let cache = Cache.String.create ~clock ~base_ttl:10.0 ~jitter:0.0 () in Cache.String.set cache "key1" "value1"; Alcotest.(check (option string)) "get after set" (Some "value1") (Cache.String.get cache "key1"); Alcotest.(check (option string)) "get missing" None (Cache.String.get cache "key2") let test_get_or_compute () = Eio_main.run @@ fun env -> let clock = Eio.Stdenv.clock env in let cache = Cache.String.create ~clock ~base_ttl:10.0 ~jitter:0.0 () in let computed = ref 0 in let compute () = incr computed; "computed" in let v1 = Cache.String.get_or_compute cache "key" compute in let v2 = Cache.String.get_or_compute cache "key" compute in Alcotest.(check string) "first call" "computed" v1; Alcotest.(check string) "second call cached" "computed" v2; Alcotest.(check int) "compute called once" 1 !computed let test_stats () = Eio_main.run @@ fun env -> let clock = Eio.Stdenv.clock env in let cache = Cache.String.create ~clock ~base_ttl:10.0 ~jitter:0.0 () in let total, valid = Cache.String.stats cache in Alcotest.(check int) "empty total" 0 total; Alcotest.(check int) "empty valid" 0 valid; Cache.String.set cache "k1" "v1"; Cache.String.set cache "k2" "v2"; let total, valid = Cache.String.stats cache in Alcotest.(check int) "total after set" 2 total; Alcotest.(check int) "valid after set" 2 valid let suite = ( "cache", [ Alcotest.test_case "get/set" `Quick test_basic; Alcotest.test_case "get_or_compute" `Quick test_get_or_compute; Alcotest.test_case "stats" `Quick test_stats; ] )