154 lines
5.5 KiB
OCaml
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"))
|
|
|}]
|
|
;;
|