summaryrefslogtreecommitdiff
path: root/ocaml-binary-annot/testsuite/tests/misc/weaktest.ml
diff options
context:
space:
mode:
Diffstat (limited to 'ocaml-binary-annot/testsuite/tests/misc/weaktest.ml')
-rw-r--r--ocaml-binary-annot/testsuite/tests/misc/weaktest.ml73
1 files changed, 73 insertions, 0 deletions
diff --git a/ocaml-binary-annot/testsuite/tests/misc/weaktest.ml b/ocaml-binary-annot/testsuite/tests/misc/weaktest.ml
new file mode 100644
index 0000000000..5dd4e19d41
--- /dev/null
+++ b/ocaml-binary-annot/testsuite/tests/misc/weaktest.ml
@@ -0,0 +1,73 @@
+(* $Id: weaktest.ml 8766 2008-01-11 11:55:36Z doligez $ *)
+
+let debug = false;;
+
+open Printf;;
+
+module Hashed = struct
+ type t = string list;;
+ let equal x y =
+ eprintf "equal: %s / %s\n" (List.hd x) (List.hd y);
+ x = y
+ ;;
+ let hash x = Hashtbl.hash (List.hd x);;
+end;;
+
+module HT = Weak.Make (Hashed);;
+
+let tbl = HT.create 7;;
+
+let r = ref [];;
+
+let bunch =
+ if Array.length Sys.argv < 2
+ then 10000
+ else int_of_string Sys.argv.(1)
+;;
+
+Random.init 314;;
+
+let random_string n =
+ let result = String.create n in
+ for i = 0 to n - 1 do
+ result.[i] <- Char.chr (32 + Random.int 95);
+ done;
+ result
+;;
+
+let added = ref 0;;
+let mistakes = ref 0;;
+
+let print_status () =
+ let (len, entries, sumbuck, buckmin, buckmed, buckmax) = HT.stats tbl in
+ if entries > bunch * (!added + 1) then begin
+ if debug then begin
+ printf "\n===================\n";
+ printf "len = %d\n" len;
+ printf "entries = %d\n" entries;
+ printf "sum of bucket sizes = %d\n" sumbuck;
+ printf "min bucket = %d\n" buckmin;
+ printf "med bucket = %d\n" buckmed;
+ printf "max bucket = %d\n" buckmax;
+ printf "GC count = %d\n" (Gc.quick_stat ()).Gc.major_collections;
+ flush stdout;
+ end;
+ incr mistakes;
+ end;
+ added := 0;
+;;
+
+Gc.create_alarm print_status;;
+
+for j = 0 to 99 do
+ r := [];
+ incr added;
+
+ for i = 1 to bunch do
+ let c = random_string 7 in
+ r := c :: !r;
+ HT.add tbl !r;
+ done;
+done;;
+
+if !mistakes < 5 then printf "pass\n" else printf "fail\n";;