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 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
|
open! Import
open! Hash_set
let%test_module "Set Intersection" =
(module struct
let run_test first_contents second_contents ~expect =
let of_list lst =
let s = create (module String) in
List.iter lst ~f:(add s);
s
in
let s1 = of_list first_contents in
let s2 = of_list second_contents in
let expect = of_list expect in
let result = inter s1 s2 in
iter result ~f:(fun x -> assert (mem expect x));
iter expect ~f:(fun x -> assert (mem result x));
let equal x y = 0 = String.compare x y in
assert (List.equal equal (to_list result) (to_list expect));
assert (length result = length expect);
(* Make sure the sets are unmodified by the inter *)
assert (List.length first_contents = length s1);
assert (List.length second_contents = length s2)
;;
let%test_unit "First smaller" =
run_test [ "0"; "3"; "99" ] [ "0"; "1"; "2"; "3" ] ~expect:[ "0"; "3" ]
;;
let%test_unit "Second smaller" =
run_test [ "a"; "b"; "c"; "d" ] [ "b"; "d" ] ~expect:[ "b"; "d" ]
;;
let%test_unit "No intersection" =
run_test ~expect:[] [ "a"; "b"; "c"; "d" ] [ "1"; "2"; "3"; "4" ]
;;
end)
;;
let%expect_test "sexp" =
let ints = List.init 20 ~f:(fun x -> x * x) in
let int_hash_set = Hash_set.of_list (module Int) ints in
print_s [%sexp (int_hash_set : int Hash_set.t)];
[%expect {| (0 1 4 9 16 25 36 49 64 81 100 121 144 169 196 225 256 289 324 361) |}];
let strs = List.init 20 ~f:(fun x -> Int.to_string x) in
let str_hash_set = Hash_set.of_list (module String) strs in
print_s [%sexp (str_hash_set : string Hash_set.t)];
[%expect {| (0 1 10 11 12 13 14 15 16 17 18 19 2 3 4 5 6 7 8 9) |}]
;;
let%expect_test "to_array" =
let empty_array = to_array (Hash_set.of_list (module Int) []) in
print_s [%sexp (empty_array : int Array.t)];
[%expect {| () |}];
let array_from_to_array = to_array (Hash_set.of_list (module Int) [ 1; 2; 3; 4; 5 ]) in
print_s [%sexp (array_from_to_array : int Array.t)];
[%expect {| (1 3 2 4 5) |}];
let array_via_to_list =
to_list (Hash_set.of_list (module Int) [ 1; 2; 3; 4; 5 ]) |> Array.of_list
in
print_s [%sexp (array_via_to_list : int Array.t)];
[%expect {| (1 3 2 4 5) |}]
;;
let%expect_test "union" =
let print_union s1 s2 =
let s1 = Hash_set.of_list (module Int) s1 in
let s2 = Hash_set.of_list (module Int) s2 in
print_s [%sexp (Hash_set.union s1 s2 : int Hash_set.t)]
in
print_union [ 0; 1; 2 ] [ 3; 4; 5 ];
[%expect {| (0 1 2 3 4 5) |}];
print_union [ 0; 1; 2 ] [ 1; 2; 3 ];
[%expect {| (0 1 2 3) |}]
;;
let%expect_test "deriving equal" =
let module Hs = struct
type t = { hs : Hash_set.M(Int).t } [@@deriving equal]
let of_list lst = { hs = Hash_set.of_list (module Int) lst }
end
in
require [%here] (Hs.equal (Hs.of_list []) (Hs.of_list []));
require [%here] (not (Hs.equal (Hs.of_list [ 1 ]) (Hs.of_list [])));
require [%here] (not (Hs.equal (Hs.of_list [ 1 ]) (Hs.of_list [ 2 ])));
require [%here] (Hs.equal (Hs.of_list [ 1 ]) (Hs.of_list [ 1 ]))
;;
(* This module exists to check, at compile-time, that [Creators] is a subset of
[Creators_generic]. *)
module _ (M : Creators) :
Creators_generic
with type 'a t := 'a M.t
with type 'a elt := 'a
with type ('a, 'z) create_options := ('a, 'z) create_options = struct
include M
let create ?growth_allowed ?size m () = create ?growth_allowed ?size m
end
|