mte/unikernel/duniverse/pp/test/tests.ml

334 lines
8.1 KiB
OCaml
Raw Normal View History

2025-11-11 02:07:51 +01:00
open StdLabels
open Pp.O
let print pp = Format.printf "%a@." Pp.to_fmt pp
let many n pp = Array.make n pp |> Array.to_list |> Pp.concat ~sep:Pp.space
let xs n = many n (Pp.char 'x')
let ys n = many n (Pp.char 'y')
let%expect_test _ =
let hello_xs n = Pp.text "Hello" ++ Pp.space ++ xs n in
print (Pp.box ~indent:2 (hello_xs 200));
[%expect
{|
Hello x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x
x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x
x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x
x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x
x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x
x x x x x x x x x x x x
|}];
print (Pp.hbox (hello_xs 50));
[%expect
{|
Hello x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x
|}];
print (Pp.vbox ~indent:2 (hello_xs 5));
[%expect {|
Hello
x
x
x
x
x
|}];
print (Pp.hvbox ~indent:2 (hello_xs 5));
[%expect {|
Hello x x x x x
|}];
print (Pp.hvbox ~indent:2 (hello_xs 50));
[%expect
{|
Hello
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
|}];
print (Pp.hovbox ~indent:2 (hello_xs 200));
[%expect
{|
Hello x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x
x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x
x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x
x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x
x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x
x x x x x x x x x x x x
|}]
let%expect_test "verbatimf" =
print (Pp.verbatimf "ident%d" 42);
[%expect {| ident42 |}]
(* Difference between box and hovbox *)
let%expect_test _ =
let pp f = f (xs 50 ++ Pp.break ~nspaces:2 ~shift:(-1) ++ xs 10) in
print (pp (Pp.box ~indent:2));
[%expect
{|
x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x
x x x x x x x x x x x
x x x x x x x x x x
|}];
print (pp (Pp.hovbox ~indent:2));
[%expect
{|
x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x
x x x x x x x x x x x x x x x x x x x x x
|}]
let enum_x_and_y = Pp.enumerate [ xs; ys ] ~f:(fun f -> f 50)
let%expect_test _ =
print enum_x_and_y;
[%expect
{|
- x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x
x x x x x x x x x x x x
- y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y
y y y y y y y y y y y y
|}]
let%expect_test _ =
print
(Pp.enumerate
[ Pp.enumerate [ "abc"; "def" ] ~f:Pp.text; enum_x_and_y ]
~f:(fun x -> x));
[%expect
{|
- - abc
- def
- - x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x
x x x x x x x x x x x x x
- y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y
y y y y y y y y y y y y y
|}]
let%expect_test _ =
print (Pp.verbatim "....." ++ Pp.box ~indent:2 (xs 50));
[%expect
{|
.....x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x
x x x x x x x x x x x x x x |}]
let error_example_1 =
Pp.vbox
(Pp.box (Pp.text "Error: something went wrong!")
++ Pp.cut
++ Pp.box (Pp.text "Here are a few things you can do:")
++ Pp.cut
++ Pp.enumerate
~f:(fun x -> x)
[ Pp.text
"read the documentation, double check the way you are using this \
software to make sure you are not doing something wrong, and \
hopefully fix the problem on your side and move on"
; Pp.text
"strace furiously the program to try and understand why exactly \
it is trying to do what it is doing"
; Pp.text "report an issue upstream"
; Pp.text "if all else fails"
++ Pp.cut
++ Pp.enumerate ~f:Pp.text
[ "scream loudly at your computer"
; "take a break from your keyboard"
; "clear your head and try again"
]
])
let%expect_test _ =
print error_example_1;
[%expect
{|
Error: something went wrong!
Here are a few things you can do:
- read the documentation, double check the way you are using this software to
make sure you are not doing something wrong, and hopefully fix the problem
on your side and move on
- strace furiously the program to try and understand why exactly it is trying
to do what it is doing
- report an issue upstream
- if all else fails
- scream loudly at your computer
- take a break from your keyboard
- clear your head and try again |}]
(* Wrap the formatted lines *)
let%expect_test _ =
print
(Pp.hovbox ~indent:2
(Array.make 50 (Pp.char 'x')
|> Array.to_list
|> Pp.concat
~sep:(Pp.custom_break ~fits:("", 2, "") ~breaks:(" \\", -1, ""))));
[%expect
{|
x x x x x x x x x x x x x x x x x x x x x x x x x \
x x x x x x x x x x x x x x x x x x x x x x x x x
|}]
let%expect_test "comparison" =
let x = error_example_1
and y = Pp.hovbox ~indent:2 (xs 200) in
let print x = Printf.printf "comparison result: %d\n" x in
print (Pp.compare (fun _ _ -> 0) x y);
print (Pp.compare (fun _ _ -> 0) x x);
print (Pp.compare (fun _ _ -> 0) y x);
[%expect
{|
comparison result: -1
comparison result: 0
comparison result: 1 |}]
(* The differnces between [Pp.paragraph], [Pp.text], [Pp.verbatim] and box +
[Pp.text] when inside a [Pp.vbox]. *)
let%expect_test "paragraph" =
let lorem =
"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum \
euismod, nisl eget aliquam ultricies."
in
let seperator text _ =
Pp.vbox
@@ Pp.seq Pp.space
(Pp.hbox
@@ Pp.textf "-< %s >-%s" text
(String.init (20 - String.length text) ~f:(fun _ -> '-')))
in
print @@ Pp.vbox
@@ Pp.concat_map ~sep:Pp.space
~f:(fun f -> f lorem)
[ seperator "verbatim"
; Pp.verbatim
; seperator "text"
; Pp.text
; seperator "paragraph"
; Pp.paragraph
; seperator "hovbox + text"
; (fun x -> Pp.hovbox (Pp.text x))
; seperator "hvbox + text"
; (fun x -> Pp.hvbox (Pp.text x))
; seperator "hbox + text"
; (fun x -> Pp.hbox (Pp.text x))
; seperator "vbox + text"
; (fun x -> Pp.vbox (Pp.text x))
; seperator "box + text"
; (fun x -> Pp.box (Pp.text x))
];
[%expect
{|
-< verbatim >-------------
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum euismod, nisl eget aliquam ultricies.
-< text >-----------------
Lorem
ipsum
dolor
sit
amet,
consectetur
adipiscing
elit.
Vestibulum
euismod,
nisl
eget
aliquam
ultricies.
-< paragraph >------------
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum euismod,
nisl eget aliquam ultricies.
-< hovbox + text >--------
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum euismod,
nisl eget aliquam ultricies.
-< hvbox + text >---------
Lorem
ipsum
dolor
sit
amet,
consectetur
adipiscing
elit.
Vestibulum
euismod,
nisl
eget
aliquam
ultricies.
-< hbox + text >----------
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum euismod, nisl eget aliquam ultricies.
-< vbox + text >----------
Lorem
ipsum
dolor
sit
amet,
consectetur
adipiscing
elit.
Vestibulum
euismod,
nisl
eget
aliquam
ultricies.
-< box + text >-----------
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum euismod,
nisl eget aliquam ultricies. |}]
let%expect_test "paragraphf" =
print (Pp.paragraphf "Hello World%s" "!");
[%expect {| Hello World! |}]