ocaml-containers/tests/core/t_bencode.ml
2022-07-02 00:29:25 -04:00

57 lines
1.5 KiB
OCaml

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) ;;