(* * ExtLib Testing Suite * Copyright (C) 2004 Janne Hellsten * Copyright (C) 2008 Red Hat, Inc. * Copyright (C) 2010 ygrek * * 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 *) (* Standard library list *) module StdList = List open ExtList exception Test_Exception let check_empty_list_exn f = try f (); false with List.Empty_list -> true (** Random length list with [0;1;2;..n] contents. *) let rnd_list () = let len = Random.int 3 in List.init len Std.identity let test_iteri () = for i = 0 to 15 do List.iteri (fun i e -> assert (i = e)) (rnd_list ()); done let test_mapi () = for i = 0 to 15 do let rnd_list = rnd_list () in let lst = List.mapi (fun n e -> (e,"foo")) rnd_list in let lst' = List.mapi (fun n (e,s) -> assert (s = "foo"); assert (n = e); n) lst in List.iteri (fun i e -> assert (i = e)) lst' done let test_exceptions () = assert (check_empty_list_exn (fun () -> List.hd [])); assert (check_empty_list_exn (fun () -> List.first [])); assert (check_empty_list_exn (fun () -> List.last [])) let test_find_exc () = let check_exn f = try f (); false with Test_Exception -> true | _ -> false in assert (check_exn (fun () -> (List.find_exc (fun _ -> true) Test_Exception []))); try for i = 0 to 15 do let rnd_lst = rnd_list () in begin match rnd_lst with [] -> () | lst -> let rnd_elem = Random.int (List.length lst) in assert (check_exn (fun () -> List.find_exc (fun e -> e = List.length lst) Test_Exception lst)); assert (not (check_exn (fun () -> List.find_exc (fun e -> e = rnd_elem) Test_Exception lst))) end done with _ -> assert false let test_findi () = let check_fn f = try (let e,i = f () in e<>i) with Not_found -> true in try for i = 0 to 15 do let rnd_lst = rnd_list () in begin match rnd_lst with [] -> () | lst -> let rnd_elem = Random.int (List.length lst) in assert (check_fn (fun () -> List.findi (fun i e -> e = List.length lst) lst)); assert (not (check_fn (fun () -> List.findi (fun i e -> e = rnd_elem) lst))) end done with _ -> assert false let test_fold_right () = let maxlen = 2000 in (* NOTE assuming we will not blow the stack with 2000 elements *) let lst = List.init maxlen Std.identity in let a = StdList.fold_right (fun e a -> e::a) lst [] in let b = List.fold_right (fun e a -> e::a) lst [] in assert (a = b) let test_fold_right2 () = let len = 2000 in let cnt = ref 0 in let lst = List.init len Std.identity in ignore (StdList.fold_right (fun e a -> incr cnt; e::a) lst []); let cnt_std = !cnt in cnt := 0; ignore (List.fold_right (fun e a -> incr cnt; e::a) lst []); assert (cnt_std = len); assert (!cnt = cnt_std) let test_map () = for i = 0 to 10 do let f = ( * ) 2 in let lst = rnd_list () in let a = StdList.map f lst in let b = List.map f lst in assert (a = b) done let test_find_map () = let f = function "this", v -> Some v | _ -> None in (try let r = List.find_map f [ "a", 1; "b", 2; "this", 3; "d", 4 ] in assert (3 = r); let r = List.find_map f [ "this", 1; "b", 2; "c", 3; "d", 4 ] in assert (1 = r); let r = List.find_map f [ "a", 1; "b", 2; "c", 3; "this", 4 ] in assert (4 = r); let r = List.find_map f [ "this", 1; "b", 2; "c", 3; "this", 4 ] in assert (1 = r); let r = List.find_map f [ "a", 1; "b", 2; "this", 3; "this", 4 ] in assert (3 = r); let r = List.find_map f [ "this", 5 ] in assert (5 = r) with Not_found -> assert false ); (try ignore (List.find_map f []); assert false with Not_found -> () ); (try ignore (List.find_map f [ "a", 1 ]); assert false with Not_found -> () ); (try ignore (List.find_map f [ "a", 1; "b", 2 ]); assert false with Not_found -> () ) (* Issue 12: List.make not tail-recursive *) let test_make () = let l = List.make 10_000_000 1 in assert (List.length l = 10_000_000) let () = Util.register "ExtList" [ "iteri", test_iteri; "mapi", test_mapi; "exceptions", test_exceptions; "find_exc", test_find_exc; "findi", test_findi; "fold_right", test_fold_right; "fold_right2", test_fold_right2; "map", test_map; "find_map", test_find_map; "make", test_make; ]