(* $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()