ligo/vendors/Red-Black_Trees/RedBlackMain.ml

89 lines
2.5 KiB
OCaml
Raw Normal View History

(* Unit testing of module [RedBlack] *)
open RedBlack;;
let () = Printf.printf "Testing Red-black trees... "
let cmp = Pervasives.compare
let in_items = [6;7;9;1;0;3;6;1;8;5;4;2]
let sorted_in_items = List.sort_uniq cmp in_items
let () = Printf.printf "\nInput items: "
let () = List.iter (fun x -> Printf.printf "%d " x) in_items
let () = Printf.printf "\nSorted input: "
let () = List.iter (fun x -> Printf.printf "%d " x) sorted_in_items
let t = List.fold_right (add ~cmp Old) in_items empty
let out_items = elements t
let () = Printf.printf "\nOutput items: "
let () = List.iter (fun x -> Printf.printf "%d " x) out_items
let () = Printf.printf "\n%!"
let () =
if sorted_in_items = out_items then
Printf.printf "PASS.\n%!"
else Printf.printf "FAILED.\n%!"
let rec draw ~pad:(pd,pc) = function
Ext -> ()
| Int (colour, left, root, right) ->
let app i sub =
let pad =
(pc ^ (if i = 1 then "`-- " else "|-- "),
pc ^ (if i = 1 then " " else "| "))
in draw ~pad sub in
begin
Printf.printf "%s%s(%d)\n" pd (if colour = Red then "R" else "B") root;
List.iteri app [left; right]
end
let () = draw ~pad:("","") t
let rec to_string buffer ~pad:(pd,pc) = function
Ext -> ()
| Int (colour, left, root, right) ->
let root_str =
Printf.sprintf "%s%s(%d)\n" pd
(if colour = Red then "R" else "B") root in
let app rank sub =
let pad =
(pc ^ (if rank = 1 then "`-- " else "|-- "),
pc ^ (if rank = 1 then " " else "| "))
in to_string buffer ~pad sub in
begin
Buffer.add_string buffer root_str;
List.iteri app [left; right]
end
let to_string tree =
let buffer = Buffer.create 131 in
let () = to_string buffer ~pad:("","") tree
in Buffer.contents buffer
let () = to_string t |> print_string |> print_newline
let rec pretty buffer ~pad:(pd,pc) = function
Ext -> Buffer.add_string buffer (pd ^ "Ext\n")
| Int (colour, left, root, right) ->
let root_str =
Printf.sprintf "%sInt (%s,%d)\n" pd
(if colour = Red then "Red" else "Black") root in
let app rank sub =
let pad =
pc ^ (if rank = 0 then "|-- " else "`-- "),
pc ^ (if rank = 0 then "| " else " ")
in pretty buffer ~pad sub in
begin
Buffer.add_string buffer root_str;
List.iteri app [left; right]
end
let pretty tree =
let buffer = Buffer.create 131 in
let () = pretty buffer ~pad:("","") tree
in Buffer.contents buffer
let () = pretty t |> print_string |> print_newline