mirror of
https://github.com/c-cube/ocaml-containers.git
synced 2025-12-06 11:15:31 -05:00
62 lines
1.6 KiB
OCaml
62 lines
1.6 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)
|