mte/unikernel/duniverse/base/test/test_int63.ml
2025-11-11 02:07:51 +01:00

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
|}]
;;