mte/unikernel/duniverse/base/test/test_int.ml

301 lines
7.6 KiB
OCaml
Raw Normal View History

2025-11-11 02:07:51 +01:00
open! Import
open! Int
let%expect_test ("hash coherence" [@tags "64-bits-only"]) =
check_int_hash_coherence [%here] (module Int);
[%expect {| |}]
;;
let%expect_test "[max_value_30_bits]" =
print_s [%sexp (max_value_30_bits : t)];
[%expect {| 1_073_741_823 |}]
;;
let%expect_test "of_string_opt" =
print_s [%sexp (of_string_opt "1" : int option)];
[%expect "(1)"];
print_s [%sexp (of_string_opt "1a" : int option)];
[%expect "()"];
print_s [%sexp (of_string_opt "99999999999999999999999999999" : int option)];
[%expect "()"]
;;
let%expect_test "to_string_hum" =
let test_roundtrip int =
require_equal [%here] (module Int) (of_string (to_string_hum int)) int
in
quickcheck_m
[%here]
(module struct
type t = int [@@deriving quickcheck, sexp_of]
end)
~examples:[ Int.min_value; Int.max_value ]
~f:test_roundtrip
;;
let%expect_test "hex" =
let test x =
let n = Or_error.try_with (fun () -> Int.Hex.of_string x) in
print_s [%message (n : int Or_error.t)]
in
test "0x1c5f";
[%expect {| (n (Ok 7_263)) |}];
test "0x1c5f NON-HEX-GARBAGE";
[%expect
{|
(n (
Error (
Failure
"Base.Int.Hex.of_string: invalid input \"0x1c5f NON-HEX-GARBAGE\"")))
|}]
;;
let%test_module "Hex" =
(module struct
let f (i, s_hum) =
let s = String.filter s_hum ~f:(fun c -> not (Char.equal c '_')) in
let sexp_hum = Sexp.Atom s_hum in
let sexp = Sexp.Atom s in
[%test_result: Sexp.t] ~message:"sexp_of_t" ~expect:sexp (Hex.sexp_of_t i);
[%test_result: int] ~message:"t_of_sexp" ~expect:i (Hex.t_of_sexp sexp);
[%test_result: int] ~message:"t_of_sexp[human]" ~expect:i (Hex.t_of_sexp sexp_hum);
[%test_result: string] ~message:"to_string" ~expect:s (Hex.to_string i);
[%test_result: string] ~message:"to_string_hum" ~expect:s_hum (Hex.to_string_hum i);
[%test_result: int] ~message:"of_string" ~expect:i (Hex.of_string s);
[%test_result: int] ~message:"of_string[human]" ~expect:i (Hex.of_string s_hum)
;;
let%test_unit _ =
List.iter
~f
[ 0, "0x0"
; 1, "0x1"
; 2, "0x2"
; 5, "0x5"
; 10, "0xa"
; 16, "0x10"
; 254, "0xfe"
; 65_535, "0xffff"
; 65_536, "0x1_0000"
; 1_000_000, "0xf_4240"
; -1, "-0x1"
; -2, "-0x2"
; -1_000_000, "-0xf_4240"
; ( max_value
, match num_bits with
| 31 -> "0x3fff_ffff"
| 32 -> "0x7fff_ffff"
| 63 -> "0x3fff_ffff_ffff_ffff"
| _ -> assert false )
; ( min_value
, match num_bits with
| 31 -> "-0x4000_0000"
| 32 -> "-0x8000_0000"
| 63 -> "-0x4000_0000_0000_0000"
| _ -> assert false )
]
;;
let%test_unit _ = [%test_result: int] (Hex.of_string "0XA") ~expect:10
let%test_unit _ =
match Option.try_with (fun () -> Hex.of_string "0") with
| None -> ()
| Some _ -> failwith "Hex must always have a 0x prefix."
;;
let%test_unit _ =
match Option.try_with (fun () -> Hex.of_string "0x_0") with
| None -> ()
| Some _ -> failwith "Hex may not have '_' before the first digit."
;;
end)
;;
let%expect_test "binary" =
quickcheck_m
[%here]
(module struct
type t = int [@@deriving quickcheck, sexp_of]
end)
~f:(fun (t : t) -> ignore (Binary.to_string t : string))
;;
let test_binary i =
Binary.to_string_hum i |> print_endline;
Binary.to_string i |> print_endline;
print_s [%sexp (i : Binary.t)]
;;
let%expect_test "binary" =
test_binary 0b0;
[%expect {|
0b0
0b0
0b0
|}];
test_binary 0b01;
[%expect {|
0b1
0b1
0b1
|}];
test_binary 0b100;
[%expect {|
0b100
0b100
0b100
|}];
test_binary 0b101;
[%expect {|
0b101
0b101
0b101
|}];
test_binary 0b10_1010_1010_1010;
[%expect {|
0b10_1010_1010_1010
0b10101010101010
0b10_1010_1010_1010
|}];
test_binary 0b11_1111_0000_0000;
[%expect {|
0b11_1111_0000_0000
0b11111100000000
0b11_1111_0000_0000
|}];
test_binary 19;
[%expect {|
0b1_0011
0b10011
0b1_0011
|}];
test_binary 0;
[%expect {|
0b0
0b0
0b0
|}]
;;
let%expect_test ("63-bit cases" [@tags "64-bits-only"]) =
test_binary (-1);
[%expect
{|
0b111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111
0b111111111111111111111111111111111111111111111111111111111111111
0b111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111
|}];
test_binary max_value;
[%expect
{|
0b11_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111
0b11111111111111111111111111111111111111111111111111111111111111
0b11_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111
|}];
test_binary min_value;
[%expect
{|
0b100_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000
0b100000000000000000000000000000000000000000000000000000000000000
0b100_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000
|}]
;;
let%expect_test ("32-bit cases" [@tags "js-only"]) =
test_binary (-1);
[%expect
{|
0b1111_1111_1111_1111_1111_1111_1111_1111
0b11111111111111111111111111111111
0b1111_1111_1111_1111_1111_1111_1111_1111
|}];
test_binary max_value;
[%expect
{|
0b111_1111_1111_1111_1111_1111_1111_1111
0b1111111111111111111111111111111
0b111_1111_1111_1111_1111_1111_1111_1111
|}];
test_binary min_value;
[%expect
{|
0b1000_0000_0000_0000_0000_0000_0000_0000
0b10000000000000000000000000000000
0b1000_0000_0000_0000_0000_0000_0000_0000
|}]
;;
let%test _ = neg 5 + 5 = 0
let%test _ = pow min_value 1 = min_value
let%test _ = pow max_value 1 = max_value
let%test "comparisons" =
let original_compare (x : int) y = Stdlib.compare x y in
let valid_compare x y =
let result = compare x y in
let expect = original_compare x y in
assert (Bool.( = ) (result < 0) (expect < 0));
assert (Bool.( = ) (result > 0) (expect > 0));
assert (Bool.( = ) (result = 0) (expect = 0));
assert (result = expect)
in
valid_compare min_value min_value;
valid_compare min_value (-1);
valid_compare (-1) min_value;
valid_compare min_value 0;
valid_compare 0 min_value;
valid_compare max_value (-1);
valid_compare (-1) max_value;
valid_compare max_value min_value;
valid_compare max_value max_value;
true
;;
let test f x = test_conversion ~to_string:Int.Hex.to_string_hum f x
let numbers = [ 0x10_20; 0x11_22_33; 0x11_22_33_1F; 0x11_22_33_44 ]
let%expect_test "bswap16" =
List.iter numbers ~f:(test bswap16);
[%expect
{|
0x1020 --> 0x2010
0x11_2233 --> 0x3322
0x1122_331f --> 0x1f33
0x1122_3344 --> 0x4433
|}]
;;
let%expect_test "% and /%" =
quickcheck_m
[%here]
(module struct
type t =
int
* (int
[@quickcheck.generator Base_quickcheck.Generator.small_strictly_positive_int])
[@@deriving quickcheck, sexp_of]
end)
~f:(fun (a, b) ->
let r = a % b in
let q = a /% b in
require [%here] (r >= 0);
require_equal [%here] (module Int) a ((q * b) + r))
;;
include (
struct
(** Various functors whose type-correctness ensures desired relationships between
interfaces. *)
(* O contained in S *)
module _ (M : S) : module type of M.O = M
(* O contained in S_unbounded *)
module _ (M : S_unbounded) : module type of M.O = M
(* S_unbounded in S *)
module _ (M : S) : S_unbounded = M
end :
sig end)