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
|
(* TEST *)
let test_make () =
let () = assert (Pair.make 1 "x" = (1, "x")) in
let () = assert (Pair.make 'e' [] = ('e', [])) in
()
let test_fst () =
let () = assert (Pair.fst (1, "x") = 1) in
let () = assert (Pair.fst ('e', []) = 'e') in
()
let test_snd () =
let () = assert (Pair.snd (1, "x") = "x") in
let () = assert (Pair.snd ('e', []) = []) in
()
let test_swap () =
let () = assert (Pair.swap (1, "x") = ("x", 1)) in
let () = assert (Pair.swap ('e', []) = ([], 'e')) in
()
let test_fold () =
let () = assert (Pair.fold (+) (2, 3) = 5) in
let is_same i s = (s = string_of_int i) in
let () = assert (Pair.fold is_same (2, "2")) in
()
let test_map () =
let () = assert (Pair.map succ (fun a -> a ^ a) (3, "a") = (4, "aa")) in
()
let test_iter () =
let iterator = ref 0 in
let add x = iterator := !iterator + x in
let mul x = iterator := !iterator * x in
let () = Pair.iter add mul (4, 3) in
let () = assert (!iterator = 12) in
()
let test_map_fst () =
let () = assert (Pair.map_fst succ (1, "s") = (2, "s")) in
let () = assert (Pair.map_fst (Fun.const []) (None, 'e') = ([], 'e')) in
()
let test_map_snd () =
let () = assert (Pair.map_snd succ ("s", 1) = ("s", 2)) in
let () = assert (Pair.map_snd (Fun.const []) ('e', None) = ('e', [])) in
()
let test_equal () =
assert (Pair.equal (fun _ _ -> true) String.equal (3, "e") (4, "e")) ;
assert (Pair.equal Int.equal String.equal (3, "e") (4, "e") = false)
let test_compare () =
(* reflexive *)
assert (Pair.compare Int.compare String.compare (3, "a") (3, "a") = 0) ;
(* symmetric (and total) *)
assert (Pair.compare Int.compare Char.compare (3, '3') (4, '4')
* Pair.compare Int.compare Char.compare (4, '4') (3, '3') < 0) ;
(* transitive *)
let cmp1 = Pair.compare Int.compare Char.compare (3, '3') (4, '4') in
let cmp2 = Pair.compare Int.compare Char.compare (4, '4') (5, '5') in
let cmp3 = Pair.compare Int.compare Char.compare (3, '3') (5, '5') in
if cmp1 * cmp2 > 0 then (* 3 < 4 < 5 or 3 > 4 > 5 *)
assert (cmp1 * cmp3 > 0)
let tests () =
test_make ();
test_fst ();
test_snd ();
test_swap ();
test_fold ();
test_map ();
test_map_fst ();
test_map_snd ();
test_equal ();
test_compare ();
()
let () =
tests ();
print_endline "OK"
|