module OrderedInt : Set.ORDERED =
struct
type elem = Elem of int
let cons e = Elem e
let eq = (=)
let lt = (<)
let leq = (<=)
end
(* it's separate from SetTester because, for certain Set, you
might have special Set elements and different generator
although way of testing the Set would be the same *)
module IntGenerator : Set.GENERATOR =
struct
(* well, I don't really undrestand why doens't it want to compile
if defined as in comments. I think that's another reason to
complain :P *)
module O = (* (OrderedInt : Set.ORDERED with type elem = int) *)
struct
type elem = int
let eq = (=)
let lt = (<)
let leq = (<=)
end (* O *)
type p =
Const
| Sequential of bool
| Random of float
let rec generate_list j =
if j > 1 then
List.rev((j)::(List.rev (generate_list (j - 1))))
else if j = 1 then [1] else []
let gen_parametrised_list = function _ -> function _ -> []
end
module SetTester (G : Set.GENERATOR) (SF : Set.SET_FUNCTOR) =
struct
module S = SF(G.O)
let list = G.generate_list 89
type elem = S.elem
let empty = S.empty()
(* E L E M E N T ' S G E N E R A T O R S *)
(* integers from i to j *)
let rec list_i_to_j i j =
if j > i then
List.rev(j::(List.rev (list_i_to_j i (j - 1))))
else if i = j then [i] else []
let init_random =
Random.self_init()
let random_int_from_i_to_j i j =
i + Random.int (j - i)
let rec list_of_n_rand_from_i_to_j n i j =
let rec pom k a =
if k > 0 then
pom (k-1) ((random_int_from_i_to_j i j)::a)
else a
in
pom n []
(* gives true with propability s / r *)
let prop_s_div_r s r =
if s >= r then
true
else
if Random.int r < s then
true
else
false
(* adds k times element min to list l in random places *)
let add_k_min_to_l k min l =
let (_, _, w) =
List.fold_left
(* f *)
(fun (r, s, w) h ->
if prop_s_div_r s r
then
(r - 1, s - 1, min::h::w)
else
(r - 1, s, h::w))
(* a *)
(List.length l, k, [])
(* l *)
l
in
List.rev w
(* this module is parametrized *)
(* feel free to change the default values *)
(* though they can be changed dynamically *)
(* P A R A M E T E R S *)
(* elem and min need to be of same type 'a *)
let min = ref 0
(* min should be only used with minimal key *)
let elem = ref 1
(* defines the smallest key in the list *)
let min_key = ref 0
let num_of_min = ref 100
let num_of_other = ref 1000
let num_of_delete = ref 1000
(* please remember, that the same list is used for *)
(* either speed and correctness testing *)
let keys = ref []
let key_gen () =
begin
init_random;
keys :=
( add_k_min_to_l
!num_of_min
!min_key
( list_of_n_rand_from_i_to_j !num_of_other (!min_key + 1) (!min_key + !num_of_other)) );
end
let insert_elements l =
List.fold_left
(* f *)
(fun s h -> S.insert s h )
(* a *)
(S.empty())
(* l *)
l
let divide_elements size_of_first =
let (elem1, elem2, _) =
List.fold_left
(* f *)
(fun (e1, e2, c) h ->
if c > 0 then
(h::e1, e2, c - 1)
else
(e1, h::e2, c) )
(* a *)
([], [], size_of_first)
(* l *)
list
in (elem1, elem2)
let correct_insert_member s e =
let (inserted, not_inserted) =
divide_elements (List.length list)
in
let s = insert_elements inserted
in
let correct_inserted =
List.fold_left
(* f *)
(fun a h ->
if a then
S.member s h
else false)
(* a *)
true
(* l *)
inserted
in
if correct_inserted then
List.fold_left
(* f *)
(fun a h ->
if a then
not (S.member s h)
else false)
(* a *)
true
(* l *)
not_inserted
else
false
end;;