(*
* ExtLib Testing Suite
* Copyright (C) 2004 Janne Hellsten
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version,
* with the special exception on linking described in file LICENSE.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*)
module P = Printf
let log s =
P.printf "%s\n" s;
flush stdout
let random_char () =
char_of_int (Random.int 256)
let random_string () =
let len = Random.int 256 in
let str = String.create len in
if len > 0 then
for i = 0 to (len-1) do
str.[i] <- random_char ()
done;
Bytes.unsafe_to_string str
let random_string_len len =
let len = len in
let str = String.create len in
if len > 0 then
for i = 0 to (len-1) do
str.[i] <- random_char ()
done;
Bytes.unsafe_to_string str
(* For counting the success ratio *)
let test_run_count = ref 0
let test_success_count = ref 0
let g_test_run_count = ref 0
let g_test_success_count = ref 0
let test_module name f =
P.printf "%s\n" name;
flush stdout;
test_run_count := 0;
test_success_count := 0;
f ();
if !test_run_count <> 0 then
P.printf " %i/%i tests succeeded.\n"
!test_success_count !test_run_count
let run_test ~test_name f =
try
incr g_test_run_count;
incr test_run_count;
P.printf " %s" test_name;
flush stdout;
let () = f () in
incr g_test_success_count;
incr test_success_count;
P.printf " - OK\n"
with
Assert_failure (file,line,column) ->
P.printf " - FAILED\n reason: ";
P.printf " %s:%i:%i\n" file line column;
flush stdout
let all_tests = Hashtbl.create 10
let register modname l =
let existing = try Hashtbl.find all_tests modname with Not_found -> [] in
Hashtbl.replace all_tests modname (l @ existing)
let register1 modname name f = register modname [name,f]
let run_all filter =
let allowed name =
match filter with
| None -> true
| Some l -> List.mem (String.lowercase name) l
in
g_test_run_count := 0;
g_test_success_count := 0;
Hashtbl.iter begin fun modname tests ->
let allowed_module = allowed modname in
test_module modname begin fun () ->
List.iter begin fun (test_name,f) ->
if allowed_module || allowed (modname^"."^test_name) then run_test ~test_name f
end tests
end
end all_tests;
if !g_test_run_count <> 0 then
P.printf "\nOverall %i/%i tests succeeded.\n"
!g_test_success_count !g_test_run_count;
!g_test_run_count = !g_test_success_count