Bit-matching test.
[ocaml-bitstring.git] / tests / 10_match_bits.ml
1 (* Match random bits.
2  * $Id$
3  *)
4
5 open Printf
6
7 let rec range a b =
8   if a <= b then
9     a :: range (a+1) b
10   else
11     []
12
13 let () =
14   Random.self_init ();
15
16   for len = 0 to 999 do
17     (* Create a random string of bits. *)
18     let expected = List.map (fun _ -> Random.bool ()) (range 0 (len-1)) in
19
20     let bits = Bitmatch.Buffer.create () in
21     List.iter (Bitmatch.Buffer.add_bit bits) expected;
22     let bits = Bitmatch.Buffer.contents bits in
23
24     (* Now read the bitstring in groups of 1, 2, 3 .. etc. bits.
25      * In each case check the result against what we generated ('expected').
26      *)
27     let actual =
28       let rec loop bits =
29         bitmatch bits with
30         | { b0 : 1; rest : -1 : bitstring } -> b0 :: loop rest
31         | { _ } -> []
32       in
33       loop bits in
34     if actual <> expected then
35       failwith (sprintf "match bits: failed on 1 bit test, len = %d" len);
36
37     let actual =
38       let rec loop bits =
39         bitmatch bits with
40         | { b0 : 1; b1 : 1; rest : -1 : bitstring } -> b0 :: b1 :: loop rest
41         | { b0 : 1; rest : -1 : bitstring } -> b0 :: loop rest
42         | { _ } -> []
43       in
44       loop bits in
45     if actual <> expected then
46       failwith (sprintf "match bits: failed on 1 bit test, len = %d" len);
47
48     let actual =
49       let rec loop bits =
50         bitmatch bits with
51         | { b0 : 1; b1 : 1; b2 : 1;
52             rest : -1 : bitstring } -> b0 :: b1 :: b2 :: loop rest
53         | { b0 : 1; rest : -1 : bitstring } -> b0 :: loop rest
54         | { _ } -> []
55       in
56       loop bits in
57     if actual <> expected then
58       failwith (sprintf "match bits: failed on 1 bit test, len = %d" len);
59
60     let actual =
61       let rec loop bits =
62         bitmatch bits with
63         | { b0 : 1; b1 : 1; b2 : 1; b3 : 1;
64             rest : -1 : bitstring } -> b0 :: b1 :: b2 :: b3 :: loop rest
65         | { b0 : 1; rest : -1 : bitstring } -> b0 :: loop rest
66         | { _ } -> []
67       in
68       loop bits in
69     if actual <> expected then
70       failwith (sprintf "match bits: failed on 1 bit test, len = %d" len);
71
72     let actual =
73       let rec loop bits =
74         bitmatch bits with
75         | { b0 : 1; b1 : 1; b2 : 1; b3 : 1;
76             b4 : 1; b5 : 1; b6 : 1; b7 : 1;
77             b8 : 1;
78             rest : -1 : bitstring } ->
79             b0 :: b1 :: b2 :: b3 :: b4 :: b5 :: b6 :: b7 :: b8 :: loop rest
80         | { b0 : 1; rest : -1 : bitstring } -> b0 :: loop rest
81         | { _ } -> []
82       in
83       loop bits in
84     if actual <> expected then
85       failwith (sprintf "match bits: failed on 1 bit test, len = %d" len);
86   done