1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168
|
(* TEST
include ocamlcommon;
*)
(* Test for compressed marshaling / unmarshaling *)
open Compression
let max_data_depth = 500000
type t = A | B of int | C of float | D of string | E of char
| F of t | G of t * t | H of int * t | I of t * float | J
let longstring =
"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
let verylongstring =
"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\
0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\
0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\
0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\
0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\
0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\
0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\
0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
let bigint = Int64.to_int 0x123456789ABCDEF0L
let test_out ?(flags = []) filename =
let oc = open_out_bin filename in
output_value oc 1;
output_value oc (-1);
output_value oc 258;
output_value oc 20000;
output_value oc 0x12345678;
output_value oc bigint;
output_value oc "foobargeebuz";
output_value oc longstring;
output_value oc verylongstring;
output_value oc 3.141592654;
output_value oc ();
output_value oc A;
output_value oc (B 1);
output_value oc (C 2.718);
output_value oc (D "hello, world!");
output_value oc (E 'l');
output_value oc (F(B 1));
output_value oc (G(A, G(B 2, G(C 3.14, G(D "glop", E 'e')))));
output_value oc (H(1, A));
output_value oc (I(B 2, 1e-6));
let x = D "sharing" in
let y = G(x, x) in
let z = G(y, G(x, y)) in
output_value oc z;
output_value oc [|1;2;3;4;5;6;7;8;9;10;11;12;13;14;15;16|];
let rec big n = if n <= 0 then A else H(n, big(n-1)) in
output_value oc (big 1000);
output_value oc (Int32.of_string "0");
output_value oc (Int32.of_string "123456");
output_value oc (Int32.of_string "-123456");
output_value oc (Int64.of_string "0");
output_value oc (Int64.of_string "123456789123456");
output_value oc (Int64.of_string "-123456789123456");
output_value oc (Nativeint.of_string "0");
output_value oc (Nativeint.of_string "123456");
output_value oc (Nativeint.of_string "-123456");
output_value oc
(Nativeint.shift_left (Nativeint.of_string "123456789") 32);
output_value oc
(Nativeint.shift_left (Nativeint.of_string "-123456789") 32);
let i = Int64.of_string "123456789123456" in
output_value oc (i,i);
close_out oc
let test n b =
print_string "Test "; print_int n;
if b then print_string " passed.\n" else print_string " FAILED.\n";
flush stderr
let test_in filename =
let ic = open_in_bin filename in
test 1 (input_value ic = 1);
test 2 (input_value ic = (-1));
test 3 (input_value ic = 258);
test 4 (input_value ic = 20000);
test 5 (input_value ic = 0x12345678);
test 6 (input_value ic = bigint);
test 7 (input_value ic = "foobargeebuz");
test 8 (input_value ic = longstring);
test 9 (input_value ic = verylongstring);
test 10 (input_value ic = 3.141592654);
test 11 (input_value ic = ());
test 12 (match input_value ic with
A -> true
| _ -> false);
test 13 (match input_value ic with
(B 1) -> true
| _ -> false);
test 14 (match input_value ic with
(C f) -> f = 2.718
| _ -> false);
test 15 (match input_value ic with
(D "hello, world!") -> true
| _ -> false);
test 16 (match input_value ic with
(E 'l') -> true
| _ -> false);
test 17 (match input_value ic with
(F(B 1)) -> true
| _ -> false);
test 18 (match input_value ic with
(G(A, G(B 2, G(C 3.14, G(D "glop", E 'e'))))) -> true
| _ -> false);
test 19 (match input_value ic with
(H(1, A)) -> true
| _ -> false);
test 20 (match input_value ic with
(I(B 2, 1e-6)) -> true
| _ -> false);
test 21 (match input_value ic with
G((G((D "sharing" as t1), t2) as t3), G(t4, t5)) ->
t1 == t2 && t3 == t5 && t4 == t1
| _ -> false);
test 22 (input_value ic = [|1;2;3;4;5;6;7;8;9;10;11;12;13;14;15;16|]);
let rec check_big n t =
if n <= 0 then
test 23 (match t with A -> true | _ -> false)
else
match t with H(m, s) -> if m = n then check_big (n-1) s
else test 23 false
| _ -> test 23 false
in
check_big 1000 (input_value ic);
test 26 (input_value ic = Int32.of_string "0");
test 27 (input_value ic = Int32.of_string "123456");
test 28 (input_value ic = Int32.of_string "-123456");
test 29 (input_value ic = Int64.of_string "0");
test 30 (input_value ic = Int64.of_string "123456789123456");
test 31 (input_value ic = Int64.of_string "-123456789123456");
test 32 (input_value ic = Nativeint.of_string "0");
test 33 (input_value ic = Nativeint.of_string "123456");
test 34 (input_value ic = Nativeint.of_string "-123456");
test 35 (input_value ic =
Nativeint.shift_left (Nativeint.of_string "123456789") 32);
test 36 (input_value ic =
Nativeint.shift_left (Nativeint.of_string "-123456789") 32);
let ((i, j) : int64 * int64) = input_value ic in
test 37 (i = Int64.of_string "123456789123456");
test 38 (j = Int64.of_string "123456789123456");
test 39 (i == j);
close_in ic
let test_supported filename =
Out_channel.(with_open_bin filename (fun oc -> output_value oc ()));
let s = In_channel.(with_open_bin filename input_all) in
let actually_supported =
match s.[3] with
| '\xBD' -> true
| '\xBE' -> false
| _ -> assert false in
if false then test 100 (actually_supported = compression_supported)
let main () =
test_out "intext_compressed.data"; test_in "intext_compressed.data";
test_supported "intext_compressed.data";
Sys.remove "intext_compressed.data"
let _ = main ()
|