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 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131
|
(* TEST
*)
let strf = Printf.sprintf
let assert_raise_invalid_argument f v =
assert (try ignore (f v); false with Invalid_argument _ -> true);
()
let test_ok_error () =
assert (Result.ok 3 = Ok 3);
assert (Result.error "ha!" = Error "ha!");
()
let test_value () =
assert (Result.value (Ok 3) ~default:5 = 3);
assert (Result.value (Error "ha!") ~default:5 = 5);
()
let test_get_ok_error () =
assert (Result.get_ok (Ok 3) = 3);
assert_raise_invalid_argument Result.get_ok (Error "ha!");
assert (Result.get_error (Error "ha!") = "ha!");
assert_raise_invalid_argument Result.get_error (Ok 2);
()
let test_bind () =
assert (Result.bind (Ok 3) (fun x -> Ok (succ x)) = Ok 4);
assert (Result.bind (Ok 3) (fun x -> Error (strf "hu%d!" x)) = Error "hu3!");
assert (Result.bind (Error "ha!") (fun x -> Ok (succ x)) = Error "ha!");
assert (Result.bind (Error "ha!") (fun _ -> Error "hu!") = Error "ha!");
()
let test_join () =
assert (Result.join (Ok (Ok 3)) = Ok 3);
assert (Result.join (Ok (Error "ha!")) = Error "ha!");
assert (Result.join (Error "ha!") = Error "ha!");
()
let test_maps () =
assert (Result.map succ (Ok 3) = Ok 4);
assert (Result.map succ (Error "ha!") = Error "ha!");
assert (Result.map_error succ (Error 3) = Error 4);
assert (Result.map_error succ (Ok 2) = Ok 2);
()
let test_fold () =
assert (Result.fold ~ok:succ ~error:succ (Ok 1) = 2);
assert (Result.fold ~ok:succ ~error:succ (Error 1) = 2);
assert (Result.(fold ~ok ~error) (Ok 1) = (Ok 1));
assert (Result.(fold ~ok ~error) (Error "ha!") = (Error "ha!"));
()
let test_iters () =
let count = ref 0 in
let set_count x = count := x in
assert (!count = 0);
Result.iter set_count (Ok 2); assert (!count = 2);
Result.iter set_count (Error "ha!"); assert (!count = 2);
Result.iter_error set_count (Error 3); assert (!count = 3);
Result.iter_error set_count (Ok "ha!"); assert (!count = 3);
()
let test_is_ok_error () =
assert (Result.is_ok (Ok 2) = true);
assert (Result.is_error (Ok 2) = false);
assert (Result.is_ok (Error "ha!") = false);
assert (Result.is_error (Error "ha!") = true);
()
let test_equal () =
let ok v0 v1 = (v0 mod 2) = (v1 mod 2) in
let error = ok in
let equal = Result.equal ~ok ~error in
assert (not @@ equal (Ok 2) (Ok 3));
assert ( equal (Ok 2) (Ok 4));
assert (not @@ equal (Ok 2) (Error 3));
assert (not @@ equal (Ok 2) (Error 4));
assert (not @@ equal (Error 2) (Ok 3));
assert (not @@ equal (Error 2) (Ok 4));
assert (not @@ equal (Error 2) (Error 3));
assert ( equal (Error 2) (Error 4));
()
let test_compare () =
let ok v0 v1 = - (compare v0 v1) in
let error = ok in
let compare = Result.compare ~ok ~error in
assert (compare (Ok 2) (Ok 1) = -1);
assert (compare (Ok 2) (Ok 2) = 0);
assert (compare (Ok 2) (Ok 3) = 1);
assert (compare (Ok 2) (Error 1) = -1);
assert (compare (Ok 2) (Error 2) = -1);
assert (compare (Ok 2) (Error 3) = -1);
assert (compare (Error 2) (Ok 1) = 1);
assert (compare (Error 2) (Ok 2) = 1);
assert (compare (Error 2) (Ok 3) = 1);
assert (compare (Error 2) (Error 1) = -1);
assert (compare (Error 2) (Error 2) = 0);
assert (compare (Error 2) (Error 3) = 1);
()
let test_to_option_list_seq () =
assert (Result.to_option (Ok 3) = Some 3);
assert (Result.to_option (Error "ha!") = None);
assert (Result.to_list (Ok 3) = [3]);
assert (Result.to_list (Error "ha!") = []);
begin match (Result.to_seq (Ok 3)) () with
| Seq.Cons (3, f) -> assert (f () = Seq.Nil)
| _ -> assert false
end;
assert ((Result.to_seq (Error "ha!")) () = Seq.Nil);
()
let tests () =
test_ok_error ();
test_value ();
test_get_ok_error ();
test_bind ();
test_join ();
test_maps ();
test_fold ();
test_iters ();
test_is_ok_error ();
test_equal ();
test_compare ();
test_to_option_list_seq ();
()
let () =
tests ();
print_endline "OK"
|