Plasma GitLab Archive
Projects Blog Knowledge

(* $Id: ps_rangemap.ml 325 2010-11-17 16:30:18Z gerd $ *)

(* Tests whether Plasma_util.RangeMap is ok *)

(* First Test Round: Only I64RM, i.e. all ranges are mergable 

   1. add 20-29, 60-69, 40-49  (add separate range)
   2. delete 40-49             (del separate range)
   3. add 80-89                (add separate range on the right)
   4. add 0-9                  (add separate range on the left)
   5. sub 20-29
   6. sub 20-28
   7. sub 21-29
   8. sub 21-28
   9. sub 21-68
  10. sub 32-33
  11. sub 0-99
  12. sub 0-0
  13. sub 89-89
  14. del 20-29
  15. del 20-28
  16. del 21-29
  17. del 21-28
  18. del 21-68
  19. del 32-33
  20. del 0-99
  21. del 0-0
  22. del 89-89
  23. add 30-31
  24. add 18-19
  25. add 32-59
*)

open Plasma_util
open Printf

let i64rm_add key t =
  I64RM.add key key t


let i64rm_list rm =
  List.rev
    (I64RM.fold
       (fun (min,max) _ acc ->
	  (min,max) :: acc
       )
       rm
       [])

let i64rm_string rm =
  String.concat ","
    (List.map (fun (min,max) -> sprintf "%Ld-%Ld" min max) (i64rm_list rm))

let check name f =
  try
    printf "Test %s: %!" name;
    let b = f() in
    if b then
      printf "passed\n%!"
    else
      printf "FAILED\n%!"
  with
    | err ->
	printf "EXCEPTION: %s\n%!" (Printexc.to_string err)


let round1() =
  printf "ps_rangemap round 1\n%!";
  let s0 = I64RM.empty in

  let s1 = i64rm_add (40L,49L) (i64rm_add (60L,69L) (i64rm_add (20L,29L) s0)) in
  check "s1" (fun () -> i64rm_list s1 = [20L,29L; 40L,49L; 60L,69L]);

  let s2 = I64RM.remove (40L,49L) s1 in
  check "s2" (fun () -> i64rm_list s2 = [20L,29L; 60L,69L]);

  let s3 = i64rm_add (80L,89L) s2 in
  check "s3" (fun () -> i64rm_list s3 = [20L,29L; 60L,69L; 80L,89L]);

  let s4 = i64rm_add (0L,9L) s3 in
  check "s4" (fun () -> i64rm_list s4 = [0L,9L; 20L,29L; 60L,69L; 80L,89L]);

  let s5 = I64RM.sub (20L,29L) s4 in
  check "s5" (fun () -> i64rm_list s5 = [ 20L, 29L ]);

  let s6 = I64RM.sub (20L,28L) s4 in
  check "s6" (fun () -> i64rm_list s6 = [ 20L, 28L ]);

  let s7 = I64RM.sub (21L,29L) s4 in
  check "s7" (fun () -> i64rm_list s7 = [ 21L, 29L ]);

  let s8 = I64RM.sub (21L,28L) s4 in
  check "s8" (fun () -> i64rm_list s8 = [ 21L, 28L ]);

  let s9 = I64RM.sub (21L,68L) s4 in
  check "s9" (fun () -> i64rm_list s9 = [ 21L, 29L; 60L, 68L ]);

  let s10 = I64RM.sub (32L,33L) s4 in
  check "s5" (fun () -> i64rm_list s10 = [ ]);

  let s11 = I64RM.sub (0L,99L) s4 in
  check "s11" (fun () -> i64rm_list s11 = [0L,9L; 20L,29L; 60L,69L; 80L,89L]);

  let s12 = I64RM.sub (0L,0L) s4 in
  check "s12" (fun () -> i64rm_list s12 = [ 0L, 0L ]);

  let s13 = I64RM.sub (89L,89L) s4 in
  check "s13" (fun () -> i64rm_list s13 = [ 89L, 89L ]);

  let s14 = I64RM.remove (20L,29L) s4 in
  check "s14" (fun () -> i64rm_list s14 = [ 0L, 9L; 60L,69L; 80L,89L ]);

  let s15 = I64RM.remove (20L,28L) s4 in
  check "s15"
    (fun () -> i64rm_list s15 = [ 0L, 9L; 29L,29L; 60L,69L; 80L,89L ]);

  let s16 = I64RM.remove (21L,29L) s4 in
  check "s16"
    (fun () -> i64rm_list s16 = [ 0L, 9L; 20L,20L; 60L,69L; 80L,89L ]);

  let s17 = I64RM.remove (21L,28L) s4 in
  check "s17"
    (fun () -> i64rm_list s17 = [ 0L, 9L; 20L,20L; 29L,29L; 60L,69L; 80L,89L ]);

  let s18 = I64RM.remove (21L,68L) s4 in
  check "s18"
    (fun () -> i64rm_list s18 = [ 0L, 9L; 20L,20L; 69L,69L; 80L,89L ]);

  let s19 = I64RM.remove (32L,33L) s4 in
  check "s19"
    (fun () -> i64rm_list s19 = [ 0L, 9L; 20L,29L; 60L,69L; 80L,89L ]);

  let s19a = I64RM.remove (30L,31L) s4 in
  check "s19a"
    (fun () -> i64rm_list s19a = [ 0L, 9L; 20L,29L; 60L,69L; 80L,89L ]);

  let s19b = I64RM.remove (18L,19L) s4 in
  check "s19b"
    (fun () -> i64rm_list s19b = [ 0L, 9L; 20L,29L; 60L,69L; 80L,89L ]);

  let s20 = I64RM.remove (0L,99L) s4 in
  check "s20" (fun () -> i64rm_list s20 = []);

  let s21 = I64RM.remove (0L,0L) s4 in
  check "s21"
    (fun () -> i64rm_list s21 = [ 1L, 9L; 20L,29L; 60L,69L; 80L,89L ]);

  let s22 = I64RM.remove (89L,89L) s4 in
  check "s22"
    (fun () -> i64rm_list s22 = [ 0L, 9L; 20L,29L; 60L,69L; 80L,88L ]);

  let s23 = i64rm_add (30L,31L) s4 in
  check "s23"
    (fun () -> i64rm_list s23 = [ 0L, 9L; 20L,31L; 60L,69L; 80L,89L ]);
  (* printf "s23: %s\n" (i64rm_string s23); *)

  let s24 = i64rm_add (18L,19L) s23 in
  check "s24"
    (fun () -> i64rm_list s24 = [ 0L, 9L; 18L,31L; 60L,69L; 80L,89L ]);

  let s25 = i64rm_add (32L,59L) s24 in
  check "s25" (fun () -> i64rm_list s25 = [ 0L, 9L; 18L,69L; 80L,89L ]);

  printf "ps_rangemap round 1 done\n%!";
  ()

(* Second test round: Use Trivial_blockrange

   u1: add 20-29, 60-69
   u2: add 40-49 SHIFTED
   u3: add 30-31
   u4: add 18-19
   u5: add 32-39
   u6: add 50-59 SHIFTED
   u7: del 40-49
   u8: add 40-49
 *)

module RM = RangeMap(I64)(Trivial_blockrange)

let rm_add ((min,max) as key) t =
  let v =
    { Trivial_blockrange.idx_from = min;
      block_from = min;
      len = Int64.to_int (Int64.sub max min) + 1;
    } in
  RM.add key v t

let rm_add_shifted ((min,max) as key) t =
  let v =
    { Trivial_blockrange.idx_from = min;
      block_from = Int64.add min 100L;
      len = Int64.to_int (Int64.sub max min) + 1;
    } in
  RM.add key v t

let rm_list rm =
  List.rev
    (RM.fold
       (fun (min,max) _ acc ->
	  (min,max) :: acc
       )
       rm
       [])

let round2() =
  printf "ps_rangemap round 2\n%!";
  let u0 = RM.empty in

  let u1 = rm_add (60L,69L) (rm_add (20L,29L) u0) in
  check "u1" (fun () -> rm_list u1 = [ 20L, 29L; 60L,69L ]);
  
  let u2 = rm_add_shifted (40L,49L) u1 in
  check "u2" (fun () -> rm_list u2 = [ 20L,29L; 40L,49L; 60L,69L ]);

  let u3 = rm_add (30L,31L) u2 in
  check "u3" (fun () -> rm_list u3 = [ 20L,31L; 40L,49L; 60L,69L ]);

  let u4 = rm_add (18L,19L) u3 in
  check "u4" (fun () -> rm_list u4 = [ 18L,31L; 40L,49L; 60L,69L ]);
  
  let u5 = rm_add (32L, 39L) u4 in
  check "u5" (fun () -> rm_list u5 = [ 18L,39L; 40L,49L; 60L,69L ]);

  let u6 = rm_add_shifted (50L,59L) u5 in
  check "u6" (fun () -> rm_list u6 = [ 18L,39L; 40L,59L; 60L,69L ]);

  let u7 = RM.remove (40L,49L) u6 in
  check "u7" (fun () -> rm_list u7 = [ 18L,39L; 50L,59L; 60L,69L ]);

  let u8 = rm_add (40L,49L) u7 in
  check "u8" (fun () -> rm_list u8 = [ 18L,49L; 50L,59L; 60L,69L ]);

  let u9 = RM.remove (45L, 55L) u8 in
  check "u9" (fun () -> rm_list u9 = [ 18L,44L; 56L,59L; 60L,69L ]);


  printf "ps_rangemap round 2 done\n%!";
  ()



let () =
  round1();
  round2()

This web site is published by Informatikbüro Gerd Stolpmann
Powered by Caml