184 lines
4.4 KiB
OCaml
184 lines
4.4 KiB
OCaml
open! Import
|
|
open! Int63
|
|
|
|
let%expect_test ("hash coherence" [@tags "64-bits-only"]) =
|
|
check_int_hash_coherence [%here] (module Int63);
|
|
[%expect {| |}]
|
|
;;
|
|
|
|
let%test_unit _ = [%test_result: t] max_value ~expect:(of_int64_exn 4611686018427387903L)
|
|
|
|
let%test_unit _ =
|
|
[%test_result: t] min_value ~expect:(of_int64_exn (-4611686018427387904L))
|
|
;;
|
|
|
|
let%test_unit _ =
|
|
[%test_result: t] (of_int32_exn Int32.min_value) ~expect:(of_int32 Int32.min_value)
|
|
;;
|
|
|
|
let%test_unit _ =
|
|
[%test_result: t] (of_int32_exn Int32.max_value) ~expect:(of_int32 Int32.max_value)
|
|
;;
|
|
|
|
let%test "typical random 0" = Exn.does_raise (fun () -> random zero)
|
|
|
|
let%test_module "Overflow_exn" =
|
|
(module struct
|
|
open Overflow_exn
|
|
|
|
let%test_module "( + )" =
|
|
(module struct
|
|
let test t = Exn.does_raise (fun () -> t + t)
|
|
let%test "max_value / 2 + 1" = test (succ (max_value / of_int 2))
|
|
let%test "min_value / 2 - 1" = test (pred (min_value / of_int 2))
|
|
let%test "min_value + min_value" = test min_value
|
|
let%test "max_value + max_value" = test max_value
|
|
end)
|
|
;;
|
|
|
|
let%test_module "( - )" =
|
|
(module struct
|
|
let%test "min_value - 1" = Exn.does_raise (fun () -> min_value - one)
|
|
let%test "max_value - -1" = Exn.does_raise (fun () -> max_value - neg one)
|
|
|
|
let%test "min_value / 2 - max_value / 2 - 2" =
|
|
Exn.does_raise (fun () ->
|
|
(min_value / of_int 2) - (max_value / of_int 2) - of_int 2)
|
|
;;
|
|
|
|
let%test "min_value - max_value" =
|
|
Exn.does_raise (fun () -> min_value - max_value)
|
|
;;
|
|
|
|
let%test "max_value - min_value" =
|
|
Exn.does_raise (fun () -> max_value - min_value)
|
|
;;
|
|
|
|
let%test "max_value - -max_value" =
|
|
Exn.does_raise (fun () -> max_value - neg max_value)
|
|
;;
|
|
end)
|
|
;;
|
|
|
|
let is_overflow = Exn.does_raise
|
|
|
|
let%test_module "( * )" =
|
|
(module struct
|
|
let%test "1 * 1" = one * one = one
|
|
let%test "1 * 0" = one * zero = zero
|
|
let%test "0 * 1" = zero * one = zero
|
|
let%test "min_value * -1" = is_overflow (fun () -> min_value * neg one)
|
|
let%test "-1 * min_value" = is_overflow (fun () -> neg one * min_value)
|
|
|
|
let%test "46116860184273879 * 100" =
|
|
of_int64_exn 46116860184273879L * of_int 100 = of_int64_exn 4611686018427387900L
|
|
;;
|
|
|
|
let%test "46116860184273879 * 101" =
|
|
is_overflow (fun () -> of_int64_exn 46116860184273879L * of_int 101)
|
|
;;
|
|
end)
|
|
;;
|
|
|
|
let%test_module "( / )" =
|
|
(module struct
|
|
let%test "1 / 1" = one / one = one
|
|
let%test "min_value / -1" = is_overflow (fun () -> min_value / neg one)
|
|
let%test "min_value / 1" = min_value / one = min_value
|
|
let%test "max_value / -1" = max_value / neg one = min_value + one
|
|
end)
|
|
;;
|
|
end)
|
|
;;
|
|
|
|
let%expect_test "[floor_log2]" =
|
|
let floor_log2 t = print_s [%sexp (floor_log2 t : int)] in
|
|
show_raise (fun () -> floor_log2 zero);
|
|
[%expect {| (raised ("[Int.floor_log2] got invalid input" 0)) |}];
|
|
floor_log2 one;
|
|
[%expect {| 0 |}];
|
|
for i = 1 to 8 do
|
|
floor_log2 (i |> of_int)
|
|
done;
|
|
[%expect {|
|
|
0
|
|
1
|
|
1
|
|
2
|
|
2
|
|
2
|
|
2
|
|
3
|
|
|}];
|
|
floor_log2 ((one lsl 61) - one);
|
|
[%expect {| 60 |}];
|
|
floor_log2 (one lsl 61);
|
|
[%expect {| 61 |}];
|
|
floor_log2 max_value;
|
|
[%expect {| 61 |}]
|
|
;;
|
|
|
|
let%expect_test "binary" =
|
|
quickcheck_m
|
|
[%here]
|
|
(module struct
|
|
type t = int64 [@@deriving quickcheck, sexp_of]
|
|
end)
|
|
~f:(fun int64 -> ignore (Binary.to_string (of_int64_trunc int64) : string));
|
|
[%expect {| |}]
|
|
;;
|
|
|
|
let test_binary i =
|
|
let i = of_int64_exn i in
|
|
Binary.to_string_hum i |> print_endline;
|
|
Binary.to_string i |> print_endline;
|
|
print_s [%sexp (i : Binary.t)]
|
|
;;
|
|
|
|
let%expect_test ("binary emulation" [@tags "js-only"]) =
|
|
test_binary 0b1L;
|
|
[%expect {|
|
|
0b1
|
|
0b1
|
|
0b1
|
|
|}];
|
|
test_binary 0b0L;
|
|
[%expect {|
|
|
0b0
|
|
0b0
|
|
0b0
|
|
|}]
|
|
;;
|
|
|
|
let%expect_test "binary" =
|
|
test_binary 0b01L;
|
|
[%expect {|
|
|
0b1
|
|
0b1
|
|
0b1
|
|
|}];
|
|
test_binary 0b100L;
|
|
[%expect {|
|
|
0b100
|
|
0b100
|
|
0b100
|
|
|}];
|
|
test_binary 0b101L;
|
|
[%expect {|
|
|
0b101
|
|
0b101
|
|
0b101
|
|
|}];
|
|
test_binary 0b10_1010_1010_1010L;
|
|
[%expect {|
|
|
0b10_1010_1010_1010
|
|
0b10101010101010
|
|
0b10_1010_1010_1010
|
|
|}];
|
|
test_binary 0b11_1111_0000_0000L;
|
|
[%expect {|
|
|
0b11_1111_0000_0000
|
|
0b11111100000000
|
|
0b11_1111_0000_0000
|
|
|}]
|
|
;;
|