89 lines
2.5 KiB
OCaml
89 lines
2.5 KiB
OCaml
|
(* 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
|