This commit is contained in:
swrup 2025-11-11 02:07:51 +01:00
parent aa2ff7b2f0
commit 2f3113f55d
11742 changed files with 1223940 additions and 0 deletions

View file

@ -0,0 +1,436 @@
let buffer_size = 10000
let loops = 10000
let allocdiff =
let stat1 = Gc.quick_stat () in
let stat2 = Gc.quick_stat () in
(stat2.Gc.minor_words -. stat1.Gc.minor_words)
let test_fun s f =
let t1 = Unix.gettimeofday () in
let stat1 = Gc.quick_stat () in
f ();
let stat2 = Gc.quick_stat () in
let t2 = Unix.gettimeofday () in
Printf.printf "%s: time %f alloc: %f\n%!" s (t2 -. t1)
(stat2.Gc.minor_words -. stat1.Gc.minor_words -. allocdiff)
module Bytes_test = struct
open EndianBytes
module BE = BigEndian
module LE = LittleEndian
let buffer = Bytes.create buffer_size
let loop_read_uint16_be () =
for i = 0 to Bytes.length buffer - 2 do
ignore(BE.get_uint16 buffer i)
done
let loop_read_uint16_le () =
for i = 0 to Bytes.length buffer - 2 do
ignore(LE.get_uint16 buffer i)
done
let loop_read_int16_be () =
for i = 0 to Bytes.length buffer - 2 do
ignore(BE.get_int16 buffer i)
done
let loop_read_int16_le () =
for i = 0 to Bytes.length buffer - 2 do
ignore(LE.get_int16 buffer i)
done
let loop_read_int32_be () =
for i = 0 to Bytes.length buffer - 4 do
ignore(Int32.to_int (BE.get_int32 buffer i))
done
let loop_read_int32_le () =
for i = 0 to Bytes.length buffer - 4 do
ignore(Int32.to_int (LE.get_int32 buffer i))
done
let loop_read_int64_be () =
for i = 0 to Bytes.length buffer - 8 do
ignore(Int64.to_int (BE.get_int64 buffer i))
done
let loop_read_int64_le () =
for i = 0 to Bytes.length buffer - 8 do
ignore(Int64.to_int (LE.get_int64 buffer i))
done
let loop_write_int16_be () =
for i = 0 to Bytes.length buffer - 2 do
ignore(BE.set_int16 buffer i 10)
done
let loop_write_int16_le () =
for i = 0 to Bytes.length buffer - 2 do
ignore(LE.set_int16 buffer i 10)
done
let loop_write_int32_be () =
for i = 0 to Bytes.length buffer - 4 do
ignore((BE.set_int32 buffer i) 10l)
done
let loop_write_int32_le () =
for i = 0 to Bytes.length buffer - 4 do
ignore((LE.set_int32 buffer i) 10l)
done
let loop_write_int64_be () =
for i = 0 to Bytes.length buffer - 8 do
ignore((BE.set_int64 buffer i) 10L)
done
let loop_write_int64_le () =
for i = 0 to Bytes.length buffer - 8 do
ignore((LE.set_int64 buffer i) 10L)
done
let do_loop f () =
for i = 0 to loops - 1 do
f ()
done
let run s f = test_fun s (do_loop f)
let run_test () =
run "loop_read_uint16_be" loop_read_uint16_be;
run "loop_read_uint16_le" loop_read_uint16_le;
run "loop_read_int16_be" loop_read_int16_be;
run "loop_read_int16_le" loop_read_int16_le;
run "loop_read_int32_be" loop_read_int32_be;
run "loop_read_int32_le" loop_read_int32_le;
run "loop_read_int64_be" loop_read_int64_be;
run "loop_read_int64_le" loop_read_int64_le;
run "loop_write_int16_be" loop_write_int16_be;
run "loop_write_int16_le" loop_write_int16_le;
run "loop_write_int32_be" loop_write_int32_be;
run "loop_write_int32_le" loop_write_int32_le;
run "loop_write_int64_be" loop_write_int64_be;
run "loop_write_int64_le" loop_write_int64_le
end
module Bytes_unsafe_test = struct
open EndianBytes
module BE = BigEndian_unsafe
module LE = LittleEndian_unsafe
let buffer = Bytes.create buffer_size
let loop_read_uint16_be () =
for i = 0 to Bytes.length buffer - 2 do
ignore(BE.get_uint16 buffer i)
done
let loop_read_uint16_le () =
for i = 0 to Bytes.length buffer - 2 do
ignore(LE.get_uint16 buffer i)
done
let loop_read_int16_be () =
for i = 0 to Bytes.length buffer - 2 do
ignore(BE.get_int16 buffer i)
done
let loop_read_int16_le () =
for i = 0 to Bytes.length buffer - 2 do
ignore(LE.get_int16 buffer i)
done
let loop_read_int32_be () =
for i = 0 to Bytes.length buffer - 4 do
ignore(Int32.to_int (BE.get_int32 buffer i))
done
let loop_read_int32_le () =
for i = 0 to Bytes.length buffer - 4 do
ignore(Int32.to_int (LE.get_int32 buffer i))
done
let loop_read_int64_be () =
for i = 0 to Bytes.length buffer - 8 do
ignore(Int64.to_int (BE.get_int64 buffer i))
done
let loop_read_int64_le () =
for i = 0 to Bytes.length buffer - 8 do
ignore(Int64.to_int (LE.get_int64 buffer i))
done
let loop_write_int16_be () =
for i = 0 to Bytes.length buffer - 2 do
ignore(BE.set_int16 buffer i 10)
done
let loop_write_int16_le () =
for i = 0 to Bytes.length buffer - 2 do
ignore(LE.set_int16 buffer i 10)
done
let loop_write_int32_be () =
for i = 0 to Bytes.length buffer - 4 do
ignore((BE.set_int32 buffer i) 10l)
done
let loop_write_int32_le () =
for i = 0 to Bytes.length buffer - 4 do
ignore((LE.set_int32 buffer i) 10l)
done
let loop_write_int64_be () =
for i = 0 to Bytes.length buffer - 8 do
ignore((BE.set_int64 buffer i) 10L)
done
let loop_write_int64_le () =
for i = 0 to Bytes.length buffer - 8 do
ignore((LE.set_int64 buffer i) 10L)
done
let do_loop f () =
for i = 0 to loops - 1 do
f ()
done
let run s f = test_fun s (do_loop f)
let run_test () =
run "loop_read_uint16_be" loop_read_uint16_be;
run "loop_read_uint16_le" loop_read_uint16_le;
run "loop_read_int16_be" loop_read_int16_be;
run "loop_read_int16_le" loop_read_int16_le;
run "loop_read_int32_be" loop_read_int32_be;
run "loop_read_int32_le" loop_read_int32_le;
run "loop_read_int64_be" loop_read_int64_be;
run "loop_read_int64_le" loop_read_int64_le;
run "loop_write_int16_be" loop_write_int16_be;
run "loop_write_int16_le" loop_write_int16_le;
run "loop_write_int32_be" loop_write_int32_be;
run "loop_write_int32_le" loop_write_int32_le;
run "loop_write_int64_be" loop_write_int64_be;
run "loop_write_int64_le" loop_write_int64_le
end
module Bigstring_test = struct
open EndianBigstring
module BE = BigEndian
module LE = LittleEndian
open Bigarray
let buffer = Array1.create char c_layout buffer_size
let loop_read_uint16_be () =
for i = 0 to Bigarray.Array1.dim buffer - 2 do
ignore(BE.get_uint16 buffer i)
done
let loop_read_uint16_le () =
for i = 0 to Bigarray.Array1.dim buffer - 2 do
ignore(LE.get_uint16 buffer i)
done
let loop_read_int16_be () =
for i = 0 to Bigarray.Array1.dim buffer - 2 do
ignore(BE.get_int16 buffer i)
done
let loop_read_int16_le () =
for i = 0 to Bigarray.Array1.dim buffer - 2 do
ignore(LE.get_int16 buffer i)
done
let loop_read_int32_be () =
for i = 0 to Bigarray.Array1.dim buffer - 4 do
ignore(Int32.to_int (BE.get_int32 buffer i))
done
let loop_read_int32_le () =
for i = 0 to Bigarray.Array1.dim buffer - 4 do
ignore(Int32.to_int (LE.get_int32 buffer i))
done
let loop_read_int64_be () =
for i = 0 to Bigarray.Array1.dim buffer - 8 do
ignore(Int64.to_int (BE.get_int64 buffer i))
done
let loop_read_int64_le () =
for i = 0 to Bigarray.Array1.dim buffer - 8 do
ignore(Int64.to_int (LE.get_int64 buffer i))
done
let loop_write_int16_be () =
for i = 0 to Bigarray.Array1.dim buffer - 2 do
ignore(BE.set_int16 buffer i 10)
done
let loop_write_int16_le () =
for i = 0 to Bigarray.Array1.dim buffer - 2 do
ignore(LE.set_int16 buffer i 10)
done
let loop_write_int32_be () =
for i = 0 to Bigarray.Array1.dim buffer - 4 do
ignore((BE.set_int32 buffer i) 10l)
done
let loop_write_int32_le () =
for i = 0 to Bigarray.Array1.dim buffer - 4 do
ignore((LE.set_int32 buffer i) 10l)
done
let loop_write_int64_be () =
for i = 0 to Bigarray.Array1.dim buffer - 8 do
ignore((BE.set_int64 buffer i) 10L)
done
let loop_write_int64_le () =
for i = 0 to Bigarray.Array1.dim buffer - 8 do
ignore((LE.set_int64 buffer i) 10L)
done
let do_loop f () =
for i = 0 to loops - 1 do
f ()
done
let run s f = test_fun s (do_loop f)
let run_test () =
run "loop_read_uint16_be" loop_read_uint16_be;
run "loop_read_uint16_le" loop_read_uint16_le;
run "loop_read_int16_be" loop_read_int16_be;
run "loop_read_int16_le" loop_read_int16_le;
run "loop_read_int32_be" loop_read_int32_be;
run "loop_read_int32_le" loop_read_int32_le;
run "loop_read_int64_be" loop_read_int64_be;
run "loop_read_int64_le" loop_read_int64_le;
run "loop_write_int16_be" loop_write_int16_be;
run "loop_write_int16_le" loop_write_int16_le;
run "loop_write_int32_be" loop_write_int32_be;
run "loop_write_int32_le" loop_write_int32_le;
run "loop_write_int64_be" loop_write_int64_be;
run "loop_write_int64_le" loop_write_int64_le
end
module Bigstring_unsafe_test = struct
open EndianBigstring
module BE = BigEndian_unsafe
module LE = LittleEndian_unsafe
open Bigarray
let buffer = Array1.create char c_layout buffer_size
let loop_read_uint16_be () =
for i = 0 to Bigarray.Array1.dim buffer - 2 do
ignore(BE.get_uint16 buffer i)
done
let loop_read_uint16_le () =
for i = 0 to Bigarray.Array1.dim buffer - 2 do
ignore(LE.get_uint16 buffer i)
done
let loop_read_int16_be () =
for i = 0 to Bigarray.Array1.dim buffer - 2 do
ignore(BE.get_int16 buffer i)
done
let loop_read_int16_le () =
for i = 0 to Bigarray.Array1.dim buffer - 2 do
ignore(LE.get_int16 buffer i)
done
let loop_read_int32_be () =
for i = 0 to Bigarray.Array1.dim buffer - 4 do
ignore(Int32.to_int (BE.get_int32 buffer i))
done
let loop_read_int32_le () =
for i = 0 to Bigarray.Array1.dim buffer - 4 do
ignore(Int32.to_int (LE.get_int32 buffer i))
done
let loop_read_int64_be () =
for i = 0 to Bigarray.Array1.dim buffer - 8 do
ignore(Int64.to_int (BE.get_int64 buffer i))
done
let loop_read_int64_le () =
for i = 0 to Bigarray.Array1.dim buffer - 8 do
ignore(Int64.to_int (LE.get_int64 buffer i))
done
let loop_write_int16_be () =
for i = 0 to Bigarray.Array1.dim buffer - 2 do
ignore(BE.set_int16 buffer i 10)
done
let loop_write_int16_le () =
for i = 0 to Bigarray.Array1.dim buffer - 2 do
ignore(LE.set_int16 buffer i 10)
done
let loop_write_int32_be () =
for i = 0 to Bigarray.Array1.dim buffer - 4 do
ignore((BE.set_int32 buffer i) 10l)
done
let loop_write_int32_le () =
for i = 0 to Bigarray.Array1.dim buffer - 4 do
ignore((LE.set_int32 buffer i) 10l)
done
let loop_write_int64_be () =
for i = 0 to Bigarray.Array1.dim buffer - 8 do
ignore((BE.set_int64 buffer i) 10L)
done
let loop_write_int64_le () =
for i = 0 to Bigarray.Array1.dim buffer - 8 do
ignore((LE.set_int64 buffer i) 10L)
done
let do_loop f () =
for i = 0 to loops - 1 do
f ()
done
let run s f = test_fun s (do_loop f)
let run_test () =
run "loop_read_uint16_be" loop_read_uint16_be;
run "loop_read_uint16_le" loop_read_uint16_le;
run "loop_read_int16_be" loop_read_int16_be;
run "loop_read_int16_le" loop_read_int16_le;
run "loop_read_int32_be" loop_read_int32_be;
run "loop_read_int32_le" loop_read_int32_le;
run "loop_read_int64_be" loop_read_int64_be;
run "loop_read_int64_le" loop_read_int64_le;
run "loop_write_int16_be" loop_write_int16_be;
run "loop_write_int16_le" loop_write_int16_le;
run "loop_write_int32_be" loop_write_int32_be;
run "loop_write_int32_le" loop_write_int32_le;
run "loop_write_int64_be" loop_write_int64_be;
run "loop_write_int64_le" loop_write_int64_le
end
let () =
Printf.printf "safe bytes:\n%!";
Bytes_test.run_test ();
Printf.printf "unsafe bytes:\n%!";
Bytes_unsafe_test.run_test ();
Printf.printf "safe bigstring:\n%!";
Bigstring_test.run_test ();
Printf.printf "unsafe bigstring:\n%!";
Bigstring_unsafe_test.run_test ()

View file

@ -0,0 +1,35 @@
(rule
(targets test_string.ml)
(deps (:< test_string.cppo.ml))
(action (run %{bin:cppo} %{<} -o %{targets})))
(rule
(targets test_bytes.ml)
(deps (:< test_bytes.cppo.ml))
(action (run %{bin:cppo} %{<} -o %{targets})))
(rule
(targets test_bigstring.ml)
(deps (:< test_bigstring.cppo.ml))
(action (run %{bin:cppo} %{<} -o %{targets})))
(library
(name tests)
(wrapped false)
(modules test_string test_bytes test_bigstring)
(libraries ocplib-endian ocplib-endian.bigstring bigarray bytes))
(executables
(names test)
(modules test)
(libraries ocplib-endian tests))
(executables
(names bench)
(modules bench)
(libraries ocplib-endian ocplib-endian.bigstring))
(alias
(name runtest)
(deps (:< test.exe))
(action (run %{<})))

View file

@ -0,0 +1,39 @@
let allocdiff =
let stat1 = Gc.quick_stat () in
let stat2 = Gc.quick_stat () in
(stat2.Gc.minor_words -. stat1.Gc.minor_words)
let () =
Test_bigstring.test1 ();
let stat1 = Gc.quick_stat () in
Test_bigstring.test2 ();
if Sys.word_size = 64 then Test_bigstring.test_64 ();
let stat2 = Gc.quick_stat () in
(* with a 32 bit system, int64 must be heap allocated *)
if Sys.word_size = 32 then Test_bigstring.test_64 ();
let alloc1 = stat2.Gc.minor_words -. stat1.Gc.minor_words -. allocdiff in
Printf.printf "bigstring: allocated words %f\n%!" alloc1;
Test_string.test1 ();
let stat1 = Gc.quick_stat () in
Test_string.test2 ();
if Sys.word_size = 64 then Test_string.test_64 ();
let stat2 = Gc.quick_stat () in
if Sys.word_size = 32 then Test_string.test_64 ();
let alloc2 = stat2.Gc.minor_words -. stat1.Gc.minor_words -. allocdiff in
Printf.printf "string: allocated words %f\n%!" alloc2;
Test_bytes.test1 ();
let stat1 = Gc.quick_stat () in
Test_bytes.test2 ();
if Sys.word_size = 64 then Test_bytes.test_64 ();
let stat2 = Gc.quick_stat () in
if Sys.word_size = 32 then Test_bytes.test_64 ();
let alloc3 = stat2.Gc.minor_words -. stat1.Gc.minor_words -. allocdiff in
Printf.printf "bytes: allocated words %f\n%!" alloc3;
(* we cannot ensure that there are no allocations only with the
primives added in 4.01.0 *)
if (alloc1 <> 0. || alloc2 <> 0. || alloc3 <> 0.)
then exit 1
else exit 0

View file

@ -0,0 +1,191 @@
open Bigarray
open EndianBigstring
[@@@warning "-52-53"]
module BE = BigEndian
module LE = LittleEndian
module NE = NativeEndian
let big_endian = Sys.big_endian
let bigstring_of_string s =
let a = Array1.create char c_layout (String.length s) in
for i = 0 to String.length s - 1 do
a.{i} <- s.[i]
done;
a
let s = bigstring_of_string (String.make 10 '\x00')
let assert_bound_check2 f v1 v2 =
try
ignore(f v1 v2);
assert false
with
| Invalid_argument("index out of bounds") -> ()
let assert_bound_check3 f v1 v2 v3 =
try
ignore(f v1 v2 v3);
assert false
with
| Invalid_argument("index out of bounds") -> ()
let test1 () =
assert_bound_check2 BE.get_int8 s (-1);
assert_bound_check2 BE.get_int8 s 10;
assert_bound_check2 BE.get_uint16 s (-1);
assert_bound_check2 BE.get_uint16 s 9;
assert_bound_check2 BE.get_int32 s (-1);
assert_bound_check2 BE.get_int32 s 7;
assert_bound_check2 BE.get_int64 s (-1);
assert_bound_check2 BE.get_int64 s 3;
assert_bound_check3 BE.set_int8 s (-1) 0;
assert_bound_check3 BE.set_int8 s 10 0;
assert_bound_check3 BE.set_int16 s (-1) 0;
assert_bound_check3 BE.set_int16 s 9 0;
assert_bound_check3 BE.set_int32 s (-1) 0l;
assert_bound_check3 BE.set_int32 s 7 0l;
assert_bound_check3 BE.set_int64 s (-1) 0L;
assert_bound_check3 BE.set_int64 s 3 0L
let test2 () =
BE.set_int8 s 0 63; (* in [0; 127] *)
assert( BE.get_uint8 s 0 = 63 );
assert( BE.get_int8 s 0 = 63 );
BE.set_int8 s 0 155; (* in [128; 255] *)
assert( BE.get_uint8 s 0 = 155 );
BE.set_int8 s 0 (-103); (* in [-128; -1] *)
assert( BE.get_int8 s 0 = (-103) );
BE.set_int8 s 0 0x1234; (* outside of the [-127;255] range *)
assert( BE.get_uint8 s 0 = 0x34 );
assert( BE.get_int8 s 0 = 0x34 );
BE.set_int8 s 0 0xAACD; (* outside of the [-127;255] range, -0x33 land 0xFF = 0xCD*)
assert( BE.get_uint8 s 0 = 0xCD );
assert( BE.get_int8 s 0 = (-0x33) );
BE.set_int16 s 0 0x1234;
assert( BE.get_uint16 s 0 = 0x1234 );
assert( BE.get_uint16 s 1 = 0x3400 );
assert( BE.get_uint16 s 2 = 0 );
assert( LE.get_uint16 s 0 = 0x3412 );
assert( LE.get_uint16 s 1 = 0x0034 );
assert( LE.get_uint16 s 2 = 0 );
if big_endian then begin
assert( BE.get_uint16 s 0 = NE.get_uint16 s 0 );
assert( BE.get_uint16 s 1 = NE.get_uint16 s 1 );
assert( BE.get_uint16 s 2 = NE.get_uint16 s 2 );
end
else begin
assert( LE.get_uint16 s 0 = NE.get_uint16 s 0 );
assert( LE.get_uint16 s 1 = NE.get_uint16 s 1 );
assert( LE.get_uint16 s 2 = NE.get_uint16 s 2 );
end;
assert( BE.get_int16 s 0 = 0x1234 );
assert( BE.get_int16 s 1 = 0x3400 );
assert( BE.get_int16 s 2 = 0 );
BE.set_int16 s 0 0xFEDC;
assert( BE.get_uint16 s 0 = 0xFEDC );
assert( BE.get_uint16 s 1 = 0xDC00 );
assert( BE.get_uint16 s 2 = 0 );
assert( LE.get_uint16 s 0 = 0xDCFE );
assert( LE.get_uint16 s 1 = 0x00DC );
assert( LE.get_uint16 s 2 = 0 );
if big_endian then begin
assert( BE.get_uint16 s 0 = NE.get_uint16 s 0 );
assert( BE.get_uint16 s 1 = NE.get_uint16 s 1 );
assert( BE.get_uint16 s 2 = NE.get_uint16 s 2 );
end
else begin
assert( LE.get_uint16 s 0 = NE.get_uint16 s 0 );
assert( LE.get_uint16 s 1 = NE.get_uint16 s 1 );
assert( LE.get_uint16 s 2 = NE.get_uint16 s 2 );
end;
assert( BE.get_int16 s 0 = -292 );
assert( BE.get_int16 s 1 = -9216 );
assert( BE.get_int16 s 2 = 0 );
if big_endian
then begin
NE.set_int16 s 0 0x1234;
assert( BE.get_uint16 s 0 = 0x1234 );
assert( BE.get_uint16 s 1 = 0x3400 );
assert( BE.get_uint16 s 2 = 0 )
end;
LE.set_int16 s 0 0x1234;
assert( BE.get_uint16 s 0 = 0x3412 );
assert( BE.get_uint16 s 1 = 0x1200 );
assert( BE.get_uint16 s 2 = 0 );
if not big_endian
then begin
NE.set_int16 s 0 0x1234;
assert( BE.get_uint16 s 0 = 0x3412 );
assert( BE.get_uint16 s 1 = 0x1200 );
assert( BE.get_uint16 s 2 = 0 )
end;
LE.set_int16 s 0 0xFEDC;
assert( LE.get_uint16 s 0 = 0xFEDC );
assert( LE.get_uint16 s 1 = 0x00FE );
assert( LE.get_uint16 s 2 = 0 );
BE.set_int32 s 0 0x12345678l;
assert( BE.get_int32 s 0 = 0x12345678l );
assert( LE.get_int32 s 0 = 0x78563412l );
if big_endian
then assert( BE.get_int32 s 0 = NE.get_int32 s 0 )
else assert( LE.get_int32 s 0 = NE.get_int32 s 0 );
LE.set_int32 s 0 0x12345678l;
assert( LE.get_int32 s 0 = 0x12345678l );
assert( BE.get_int32 s 0 = 0x78563412l );
if big_endian
then assert( BE.get_int32 s 0 = NE.get_int32 s 0 )
else assert( LE.get_int32 s 0 = NE.get_int32 s 0 );
NE.set_int32 s 0 0x12345678l;
if big_endian
then assert( BE.get_int32 s 0 = 0x12345678l )
else assert( LE.get_int32 s 0 = 0x12345678l );
()
let test_64 () =
BE.set_int64 s 0 0x1234567890ABCDEFL;
assert( BE.get_int64 s 0 = 0x1234567890ABCDEFL );
assert( LE.get_int64 s 0 = 0xEFCDAB9078563412L );
if big_endian
then assert( BE.get_int64 s 0 = NE.get_int64 s 0 )
else assert( LE.get_int64 s 0 = NE.get_int64 s 0 );
LE.set_int64 s 0 0x1234567890ABCDEFL;
assert( LE.get_int64 s 0 = 0x1234567890ABCDEFL );
assert( BE.get_int64 s 0 = 0xEFCDAB9078563412L );
if big_endian
then assert( BE.get_int64 s 0 = NE.get_int64 s 0 )
else assert( LE.get_int64 s 0 = NE.get_int64 s 0 );
NE.set_int64 s 0 0x1234567890ABCDEFL;
if big_endian
then assert( BE.get_int64 s 0 = 0x1234567890ABCDEFL )
else assert( LE.get_int64 s 0 = 0x1234567890ABCDEFL );
()

View file

@ -0,0 +1,185 @@
open EndianBytes
[@@@warning "-52"]
let to_t x = x
(* do not allocate to avoid breaking tests *)
module BE = BigEndian
module LE = LittleEndian
module NE = NativeEndian
let big_endian = Sys.big_endian
let s = Bytes.make 10 '\x00'
let assert_bound_check2 f v1 v2 =
try
ignore(f v1 v2);
assert false
with
| Invalid_argument("index out of bounds") -> ()
let assert_bound_check3 f v1 v2 v3 =
try
ignore(f v1 v2 v3);
assert false
with
| Invalid_argument("index out of bounds") -> ()
let test1 () =
assert_bound_check2 BE.get_int8 (to_t s) (-1);
assert_bound_check2 BE.get_int8 (to_t s) 10;
assert_bound_check2 BE.get_uint16 (to_t s) (-1);
assert_bound_check2 BE.get_uint16 (to_t s) 9;
assert_bound_check2 BE.get_int32 (to_t s) (-1);
assert_bound_check2 BE.get_int32 (to_t s) 7;
assert_bound_check2 BE.get_int64 (to_t s) (-1);
assert_bound_check2 BE.get_int64 (to_t s) 3;
assert_bound_check3 BE.set_int8 s (-1) 0;
assert_bound_check3 BE.set_int8 s 10 0;
assert_bound_check3 BE.set_int16 s (-1) 0;
assert_bound_check3 BE.set_int16 s 9 0;
assert_bound_check3 BE.set_int32 s (-1) 0l;
assert_bound_check3 BE.set_int32 s 7 0l;
assert_bound_check3 BE.set_int64 s (-1) 0L;
assert_bound_check3 BE.set_int64 s 3 0L
let test2 () =
BE.set_int8 s 0 63; (* in [0; 127] *)
assert( BE.get_uint8 (to_t s) 0 = 63 );
assert( BE.get_int8 (to_t s) 0 = 63 );
BE.set_int8 s 0 155; (* in [128; 255] *)
assert( BE.get_uint8 (to_t s) 0 = 155 );
BE.set_int8 s 0 (-103); (* in [-128; -1] *)
assert( BE.get_int8 (to_t s) 0 = (-103) );
BE.set_int8 s 0 0x1234; (* outside of the [-127;255] range *)
assert( BE.get_uint8 (to_t s) 0 = 0x34 );
assert( BE.get_int8 (to_t s) 0 = 0x34 );
BE.set_int8 s 0 0xAACD; (* outside of the [-127;255] range, -0x33 land 0xFF = 0xCD*)
assert( BE.get_uint8 (to_t s) 0 = 0xCD );
assert( BE.get_int8 (to_t s) 0 = (-0x33) );
BE.set_int16 s 0 0x1234;
assert( BE.get_uint16 (to_t s) 0 = 0x1234 );
assert( BE.get_uint16 (to_t s) 1 = 0x3400 );
assert( BE.get_uint16 (to_t s) 2 = 0 );
assert( LE.get_uint16 (to_t s) 0 = 0x3412 );
assert( LE.get_uint16 (to_t s) 1 = 0x0034 );
assert( LE.get_uint16 (to_t s) 2 = 0 );
if big_endian then begin
assert( BE.get_uint16 (to_t s) 0 = NE.get_uint16 (to_t s) 0 );
assert( BE.get_uint16 (to_t s) 1 = NE.get_uint16 (to_t s) 1 );
assert( BE.get_uint16 (to_t s) 2 = NE.get_uint16 (to_t s) 2 );
end
else begin
assert( LE.get_uint16 (to_t s) 0 = NE.get_uint16 (to_t s) 0 );
assert( LE.get_uint16 (to_t s) 1 = NE.get_uint16 (to_t s) 1 );
assert( LE.get_uint16 (to_t s) 2 = NE.get_uint16 (to_t s) 2 );
end;
assert( BE.get_int16 (to_t s) 0 = 0x1234 );
assert( BE.get_int16 (to_t s) 1 = 0x3400 );
assert( BE.get_int16 (to_t s) 2 = 0 );
BE.set_int16 s 0 0xFEDC;
assert( BE.get_uint16 (to_t s) 0 = 0xFEDC );
assert( BE.get_uint16 (to_t s) 1 = 0xDC00 );
assert( BE.get_uint16 (to_t s) 2 = 0 );
assert( LE.get_uint16 (to_t s) 0 = 0xDCFE );
assert( LE.get_uint16 (to_t s) 1 = 0x00DC );
assert( LE.get_uint16 (to_t s) 2 = 0 );
if big_endian then begin
assert( BE.get_uint16 (to_t s) 0 = NE.get_uint16 (to_t s) 0 );
assert( BE.get_uint16 (to_t s) 1 = NE.get_uint16 (to_t s) 1 );
assert( BE.get_uint16 (to_t s) 2 = NE.get_uint16 (to_t s) 2 );
end
else begin
assert( LE.get_uint16 (to_t s) 0 = NE.get_uint16 (to_t s) 0 );
assert( LE.get_uint16 (to_t s) 1 = NE.get_uint16 (to_t s) 1 );
assert( LE.get_uint16 (to_t s) 2 = NE.get_uint16 (to_t s) 2 );
end;
assert( BE.get_int16 (to_t s) 0 = -292 );
assert( BE.get_int16 (to_t s) 1 = -9216 );
assert( BE.get_int16 (to_t s) 2 = 0 );
if big_endian
then begin
NE.set_int16 s 0 0x1234;
assert( BE.get_uint16 (to_t s) 0 = 0x1234 );
assert( BE.get_uint16 (to_t s) 1 = 0x3400 );
assert( BE.get_uint16 (to_t s) 2 = 0 )
end;
LE.set_int16 s 0 0x1234;
assert( BE.get_uint16 (to_t s) 0 = 0x3412 );
assert( BE.get_uint16 (to_t s) 1 = 0x1200 );
assert( BE.get_uint16 (to_t s) 2 = 0 );
if not big_endian
then begin
NE.set_int16 s 0 0x1234;
assert( BE.get_uint16 (to_t s) 0 = 0x3412 );
assert( BE.get_uint16 (to_t s) 1 = 0x1200 );
assert( BE.get_uint16 (to_t s) 2 = 0 )
end;
LE.set_int16 s 0 0xFEDC;
assert( LE.get_uint16 (to_t s) 0 = 0xFEDC );
assert( LE.get_uint16 (to_t s) 1 = 0x00FE );
assert( LE.get_uint16 (to_t s) 2 = 0 );
BE.set_int32 s 0 0x12345678l;
assert( BE.get_int32 (to_t s) 0 = 0x12345678l );
assert( LE.get_int32 (to_t s) 0 = 0x78563412l );
if big_endian
then assert( BE.get_int32 (to_t s) 0 = NE.get_int32 (to_t s) 0 )
else assert( LE.get_int32 (to_t s) 0 = NE.get_int32 (to_t s) 0 );
LE.set_int32 s 0 0x12345678l;
assert( LE.get_int32 (to_t s) 0 = 0x12345678l );
assert( BE.get_int32 (to_t s) 0 = 0x78563412l );
if big_endian
then assert( BE.get_int32 (to_t s) 0 = NE.get_int32 (to_t s) 0 )
else assert( LE.get_int32 (to_t s) 0 = NE.get_int32 (to_t s) 0 );
NE.set_int32 s 0 0x12345678l;
if big_endian
then assert( BE.get_int32 (to_t s) 0 = 0x12345678l )
else assert( LE.get_int32 (to_t s) 0 = 0x12345678l );
()
let test_64 () =
BE.set_int64 s 0 0x1234567890ABCDEFL;
assert( BE.get_int64 (to_t s) 0 = 0x1234567890ABCDEFL );
assert( LE.get_int64 (to_t s) 0 = 0xEFCDAB9078563412L );
if big_endian
then assert( BE.get_int64 (to_t s) 0 = NE.get_int64 (to_t s) 0 )
else assert( LE.get_int64 (to_t s) 0 = NE.get_int64 (to_t s) 0 );
LE.set_int64 s 0 0x1234567890ABCDEFL;
assert( LE.get_int64 (to_t s) 0 = 0x1234567890ABCDEFL );
assert( BE.get_int64 (to_t s) 0 = 0xEFCDAB9078563412L );
if big_endian
then assert( BE.get_int64 (to_t s) 0 = NE.get_int64 (to_t s) 0 )
else assert( LE.get_int64 (to_t s) 0 = NE.get_int64 (to_t s) 0 );
NE.set_int64 s 0 0x1234567890ABCDEFL;
if big_endian
then assert( BE.get_int64 (to_t s) 0 = 0x1234567890ABCDEFL )
else assert( LE.get_int64 (to_t s) 0 = 0x1234567890ABCDEFL );
()

View file

@ -0,0 +1,188 @@
open EndianString
[@@@warning "-52"]
(* Allow testing deprecated string_set functions *)
[@@@warning "-3"]
let to_t = Bytes.unsafe_to_string
(* do not allocate to avoid breaking tests *)
module BE = BigEndian
module LE = LittleEndian
module NE = NativeEndian
let big_endian = Sys.big_endian
let s = Bytes.make 10 '\x00'
let assert_bound_check2 f v1 v2 =
try
ignore(f v1 v2);
assert false
with
| Invalid_argument("index out of bounds") -> ()
let assert_bound_check3 f v1 v2 v3 =
try
ignore(f v1 v2 v3);
assert false
with
| Invalid_argument("index out of bounds") -> ()
let test1 () =
assert_bound_check2 BE.get_int8 (to_t s) (-1);
assert_bound_check2 BE.get_int8 (to_t s) 10;
assert_bound_check2 BE.get_uint16 (to_t s) (-1);
assert_bound_check2 BE.get_uint16 (to_t s) 9;
assert_bound_check2 BE.get_int32 (to_t s) (-1);
assert_bound_check2 BE.get_int32 (to_t s) 7;
assert_bound_check2 BE.get_int64 (to_t s) (-1);
assert_bound_check2 BE.get_int64 (to_t s) 3;
assert_bound_check3 BE.set_int8 s (-1) 0;
assert_bound_check3 BE.set_int8 s 10 0;
assert_bound_check3 BE.set_int16 s (-1) 0;
assert_bound_check3 BE.set_int16 s 9 0;
assert_bound_check3 BE.set_int32 s (-1) 0l;
assert_bound_check3 BE.set_int32 s 7 0l;
assert_bound_check3 BE.set_int64 s (-1) 0L;
assert_bound_check3 BE.set_int64 s 3 0L
let test2 () =
BE.set_int8 s 0 63; (* in [0; 127] *)
assert( BE.get_uint8 (to_t s) 0 = 63 );
assert( BE.get_int8 (to_t s) 0 = 63 );
BE.set_int8 s 0 155; (* in [128; 255] *)
assert( BE.get_uint8 (to_t s) 0 = 155 );
BE.set_int8 s 0 (-103); (* in [-128; -1] *)
assert( BE.get_int8 (to_t s) 0 = (-103) );
BE.set_int8 s 0 0x1234; (* outside of the [-127;255] range *)
assert( BE.get_uint8 (to_t s) 0 = 0x34 );
assert( BE.get_int8 (to_t s) 0 = 0x34 );
BE.set_int8 s 0 0xAACD; (* outside of the [-127;255] range, -0x33 land 0xFF = 0xCD*)
assert( BE.get_uint8 (to_t s) 0 = 0xCD );
assert( BE.get_int8 (to_t s) 0 = (-0x33) );
BE.set_int16 s 0 0x1234;
assert( BE.get_uint16 (to_t s) 0 = 0x1234 );
assert( BE.get_uint16 (to_t s) 1 = 0x3400 );
assert( BE.get_uint16 (to_t s) 2 = 0 );
assert( LE.get_uint16 (to_t s) 0 = 0x3412 );
assert( LE.get_uint16 (to_t s) 1 = 0x0034 );
assert( LE.get_uint16 (to_t s) 2 = 0 );
if big_endian then begin
assert( BE.get_uint16 (to_t s) 0 = NE.get_uint16 (to_t s) 0 );
assert( BE.get_uint16 (to_t s) 1 = NE.get_uint16 (to_t s) 1 );
assert( BE.get_uint16 (to_t s) 2 = NE.get_uint16 (to_t s) 2 );
end
else begin
assert( LE.get_uint16 (to_t s) 0 = NE.get_uint16 (to_t s) 0 );
assert( LE.get_uint16 (to_t s) 1 = NE.get_uint16 (to_t s) 1 );
assert( LE.get_uint16 (to_t s) 2 = NE.get_uint16 (to_t s) 2 );
end;
assert( BE.get_int16 (to_t s) 0 = 0x1234 );
assert( BE.get_int16 (to_t s) 1 = 0x3400 );
assert( BE.get_int16 (to_t s) 2 = 0 );
BE.set_int16 s 0 0xFEDC;
assert( BE.get_uint16 (to_t s) 0 = 0xFEDC );
assert( BE.get_uint16 (to_t s) 1 = 0xDC00 );
assert( BE.get_uint16 (to_t s) 2 = 0 );
assert( LE.get_uint16 (to_t s) 0 = 0xDCFE );
assert( LE.get_uint16 (to_t s) 1 = 0x00DC );
assert( LE.get_uint16 (to_t s) 2 = 0 );
if big_endian then begin
assert( BE.get_uint16 (to_t s) 0 = NE.get_uint16 (to_t s) 0 );
assert( BE.get_uint16 (to_t s) 1 = NE.get_uint16 (to_t s) 1 );
assert( BE.get_uint16 (to_t s) 2 = NE.get_uint16 (to_t s) 2 );
end
else begin
assert( LE.get_uint16 (to_t s) 0 = NE.get_uint16 (to_t s) 0 );
assert( LE.get_uint16 (to_t s) 1 = NE.get_uint16 (to_t s) 1 );
assert( LE.get_uint16 (to_t s) 2 = NE.get_uint16 (to_t s) 2 );
end;
assert( BE.get_int16 (to_t s) 0 = -292 );
assert( BE.get_int16 (to_t s) 1 = -9216 );
assert( BE.get_int16 (to_t s) 2 = 0 );
if big_endian
then begin
NE.set_int16 s 0 0x1234;
assert( BE.get_uint16 (to_t s) 0 = 0x1234 );
assert( BE.get_uint16 (to_t s) 1 = 0x3400 );
assert( BE.get_uint16 (to_t s) 2 = 0 )
end;
LE.set_int16 s 0 0x1234;
assert( BE.get_uint16 (to_t s) 0 = 0x3412 );
assert( BE.get_uint16 (to_t s) 1 = 0x1200 );
assert( BE.get_uint16 (to_t s) 2 = 0 );
if not big_endian
then begin
NE.set_int16 s 0 0x1234;
assert( BE.get_uint16 (to_t s) 0 = 0x3412 );
assert( BE.get_uint16 (to_t s) 1 = 0x1200 );
assert( BE.get_uint16 (to_t s) 2 = 0 )
end;
LE.set_int16 s 0 0xFEDC;
assert( LE.get_uint16 (to_t s) 0 = 0xFEDC );
assert( LE.get_uint16 (to_t s) 1 = 0x00FE );
assert( LE.get_uint16 (to_t s) 2 = 0 );
BE.set_int32 s 0 0x12345678l;
assert( BE.get_int32 (to_t s) 0 = 0x12345678l );
assert( LE.get_int32 (to_t s) 0 = 0x78563412l );
if big_endian
then assert( BE.get_int32 (to_t s) 0 = NE.get_int32 (to_t s) 0 )
else assert( LE.get_int32 (to_t s) 0 = NE.get_int32 (to_t s) 0 );
LE.set_int32 s 0 0x12345678l;
assert( LE.get_int32 (to_t s) 0 = 0x12345678l );
assert( BE.get_int32 (to_t s) 0 = 0x78563412l );
if big_endian
then assert( BE.get_int32 (to_t s) 0 = NE.get_int32 (to_t s) 0 )
else assert( LE.get_int32 (to_t s) 0 = NE.get_int32 (to_t s) 0 );
NE.set_int32 s 0 0x12345678l;
if big_endian
then assert( BE.get_int32 (to_t s) 0 = 0x12345678l )
else assert( LE.get_int32 (to_t s) 0 = 0x12345678l );
()
let test_64 () =
BE.set_int64 s 0 0x1234567890ABCDEFL;
assert( BE.get_int64 (to_t s) 0 = 0x1234567890ABCDEFL );
assert( LE.get_int64 (to_t s) 0 = 0xEFCDAB9078563412L );
if big_endian
then assert( BE.get_int64 (to_t s) 0 = NE.get_int64 (to_t s) 0 )
else assert( LE.get_int64 (to_t s) 0 = NE.get_int64 (to_t s) 0 );
LE.set_int64 s 0 0x1234567890ABCDEFL;
assert( LE.get_int64 (to_t s) 0 = 0x1234567890ABCDEFL );
assert( BE.get_int64 (to_t s) 0 = 0xEFCDAB9078563412L );
if big_endian
then assert( BE.get_int64 (to_t s) 0 = NE.get_int64 (to_t s) 0 )
else assert( LE.get_int64 (to_t s) 0 = NE.get_int64 (to_t s) 0 );
NE.set_int64 s 0 0x1234567890ABCDEFL;
if big_endian
then assert( BE.get_int64 (to_t s) 0 = 0x1234567890ABCDEFL )
else assert( LE.get_int64 (to_t s) 0 = 0x1234567890ABCDEFL );
()