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

154 lines
5.5 KiB
OCaml

open! Import
open! Info
let%expect_test _ =
print_endline (to_string_hum (of_exn (Failure "foo")));
[%expect {| (Failure foo) |}]
;;
let%expect_test _ =
print_endline (to_string_hum (tag (of_string "b") ~tag:"a"));
[%expect {| (a b) |}]
;;
let%expect_test _ =
print_endline (to_string_hum (of_list (List.map ~f:of_string [ "a"; "b"; "c" ])));
[%expect {| (a b c) |}]
;;
let%expect_test _ =
print_endline (to_string_hum (tag_s ~tag:[%message "tag"] (create_s [%message "info"])));
[%expect {| (tag info) |}]
;;
let of_strings strings = of_list (List.map ~f:of_string strings)
let nested =
of_list
(List.map ~f:of_strings [ [ "a"; "b"; "c" ]; [ "d"; "e"; "f" ]; [ "g"; "h"; "i" ] ])
;;
let%expect_test _ =
print_endline (to_string_hum nested);
[%expect {| (a b c d e f g h i) |}]
;;
let%expect_test _ =
require_equal
[%here]
(module Sexp)
(sexp_of_t nested)
(sexp_of_t (of_strings [ "a"; "b"; "c"; "d"; "e"; "f"; "g"; "h"; "i" ]));
[%expect {| |}]
;;
let%expect_test _ =
match to_exn (of_exn (Failure "foo")) with
| Failure "foo" -> ()
| exn -> raise_s [%sexp { got = (exn : exn); expected = Failure "foo" }]
;;
let round t =
let sexp = sexp_of_t t in
require [%here] (Sexp.( = ) sexp (sexp_of_t (t_of_sexp sexp)))
;;
let%expect_test "non-empty tag" =
tag_arg (of_string "hello") "tag" 13 [%sexp_of: int] |> sexp_of_t |> print_s;
[%expect {| (tag 13 hello) |}]
;;
let%expect_test "empty tag" =
tag_arg (of_string "hello") "" 13 [%sexp_of: int] |> sexp_of_t |> print_s;
[%expect {| (13 hello) |}]
;;
let%expect_test _ = round (of_string "hello")
let%expect_test _ = round (of_thunk (fun () -> "hello"))
let%expect_test _ = round (create "tag" 13 [%sexp_of: int])
let%expect_test _ = round (tag (of_string "hello") ~tag:"tag")
let%expect_test _ = round (tag_arg (of_string "hello") "tag" 13 [%sexp_of: int])
let%expect_test _ = round (tag_arg (of_string "hello") "" 13 [%sexp_of: int])
let%expect_test _ = round (of_list [ of_string "hello"; of_string "goodbye" ])
let%expect_test _ =
round (t_of_sexp (Sexplib.Sexp.of_string "((random sexp 1)(b 2)((c (1 2 3))))"))
;;
let%expect_test _ =
require_equal [%here] (module String) (to_string_hum (of_string "a\nb")) "a\nb";
[%expect {| |}]
;;
let%expect_test "stack overflow" =
(* [Info.of_list [info]] and [Info.of_lazy_t (lazy info)] produce an [Info.t] with the
same sexp as the original. Ideally, deep nesting of these should not yield a stack
overflow just to produce a small value. *)
let depth =
match Word_size.word_size with
| W64 -> 1_000_000
| W32 -> 100_000
in
let test f =
let info = ref (Info.of_string "info") in
for _ = 1 to depth do
info := f !info
done;
print_s (Info.sexp_of_t !info)
in
test (fun info -> Info.of_list [ info ]);
[%expect {| info |}];
test (fun info -> Info.of_lazy_t (lazy info));
[%expect {| info |}];
test (fun info -> Info.of_lazy_t (lazy (Info.of_list [ info ])));
[%expect {| info |}]
;;
let%expect_test "cyclic info computation" =
let info =
let rec lazy_info = lazy (Info.of_lazy_t lazy_info) in
Info.of_lazy_t lazy_info
in
print_s (Info.sexp_of_t info);
[%expect {| (Could_not_construct "cycle while computing message") |}]
;;
let%expect_test "show how backtraces are printed" =
(* This is a real backtrace from some random OCaml program.
The words [Raised] and [Called] have been lowercased to fool the expect test
collector and prevent it from complaining about the presence of a backtrace. This is
fine for this test because we are using a static string as the source for the
backtrace, rather than actually raising (which might change output between compiler
versions). *)
let backtrace =
"raised at Base__Error.raise in file \"error.ml\" (inlined), line 9, characters 14-30\n\
called from Base__Error.raise_s in file \"error.ml\", line 10, characters 19-40\n\
called from Floops_interfaces__Registrant.register_exn in file \"registrant.ml\", \
line 18, characters 4-241\n\
called from Floops_interfaces_test__Registrant_test.Test_brick.create_exn.(fun) in \
file \"registrant_test.ml\", line 25, characters 6-67\n\
called from Base__Or_error.try_with in file \"or_error.ml\", line 84, characters 9-15\n"
in
let exn = of_exn ~backtrace:(`This backtrace) (Failure "foo") in
print_s [%sexp (exn : t)];
[%expect
{|
((Failure foo)
("raised at Base__Error.raise in file \"error.ml\" (inlined), line 9, characters 14-30"
"called from Base__Error.raise_s in file \"error.ml\", line 10, characters 19-40"
"called from Floops_interfaces__Registrant.register_exn in file \"registrant.ml\", line 18, characters 4-241"
"called from Floops_interfaces_test__Registrant_test.Test_brick.create_exn.(fun) in file \"registrant_test.ml\", line 25, characters 6-67"
"called from Base__Or_error.try_with in file \"or_error.ml\", line 84, characters 9-15"))
|}];
print_endline (Info.to_string_hum exn);
[%expect
{|
((Failure foo)
("raised at Base__Error.raise in file \"error.ml\" (inlined), line 9, characters 14-30"
"called from Base__Error.raise_s in file \"error.ml\", line 10, characters 19-40"
"called from Floops_interfaces__Registrant.register_exn in file \"registrant.ml\", line 18, characters 4-241"
"called from Floops_interfaces_test__Registrant_test.Test_brick.create_exn.(fun) in file \"registrant_test.ml\", line 25, characters 6-67"
"called from Base__Or_error.try_with in file \"or_error.ml\", line 84, characters 9-15"))
|}]
;;