module T = (val Containers_testlib.make ~__FILE__ ()) include T open Containers_bencode;; eq ~printer:to_string_debug (map_of_list []) (Decode.of_string_exn "de");; eq ~printer:to_string_debug (list [ int 1; int 2; string "foo" ]) (Decode.of_string_exn "li1ei2e3:fooe") module B = Containers_bencode let rec size = function | Int _ | String _ -> 1 | List l -> List.fold_left (fun n x -> n + size x) 0 l | Map m -> Str_map.fold (fun _ v n -> size v + n) m 0 let g_rand_b = Q.Gen.( sized_size (0 -- 7) @@ fix @@ fun self n -> let str n = string_size ~gen:char (0 -- n) in let base = [ int >|= B.int; str 100 >|= B.string ] in match n with | 0 -> oneof base | n -> frequency @@ List.map (fun x -> 2, x) base @ [ 1, list_size (0 -- 10) (self (n - 1)) >|= B.list; ( 1, list_size (0 -- 10) (pair (str 10) (self (n - 1))) >|= B.map_of_list ); ]) let rec shrink_b self = Q.( Iter.( match self with | Int i -> Shrink.int64 i >|= B.int64 | String s -> Shrink.string s >|= B.string | List l -> Shrink.list ~shrink:shrink_b l >|= B.list | Map l -> let l = Str_map.fold (fun k v l -> (k, v) :: l) l [] in Shrink.list ~shrink:(fun (k, v) -> Shrink.string k >|= (fun k -> k, v) <+> (shrink_b v >|= fun v -> k, v)) l >|= B.map_of_list)) let rand_b = Q.make ~print:to_string_debug ~stats:[ "size", size ] ~shrink:shrink_b g_rand_b ;; q rand_b (fun b -> let s = Encode.to_string b in equal (Decode.of_string_exn s) b)