Files
mercury/tests/hard_coded/read_binary_int32.m
Peter Wang 93802cf7fd Add expected outputs for big endian.
tests/hard_coded/read_binary_int16.exp2:
tests/hard_coded/read_binary_int32.exp2:
tests/hard_coded/read_binary_int64.exp2:
tests/hard_coded/read_binary_uint16.exp2:
tests/hard_coded/read_binary_uint32.exp2:
tests/hard_coded/read_binary_uint64.exp2:
    Add expected outputs on big endian architectures.

tests/hard_coded/read_binary_int16.m:
tests/hard_coded/read_binary_int32.m:
tests/hard_coded/read_binary_int64.m:
tests/hard_coded/read_binary_uint16.m:
tests/hard_coded/read_binary_uint32.m:
tests/hard_coded/read_binary_uint64.m:
    Document expected outputs.
2019-06-05 11:45:41 +10:00

146 lines
4.6 KiB
Mathematica

%---------------------------------------------------------------------------%
% vim: ft=mercury ts=4 sw=4 et
%---------------------------------------------------------------------------%
%
% Test reading of binary int32s.
%
% The .exp file is for little endian architectures.
% The .exp2 file is for big endian architectures.
%
%---------------------------------------------------------------------------%
:- module read_binary_int32.
:- interface.
:- import_module io.
:- pred main(io::di, io::uo) is det.
%---------------------------------------------------------------------------%
%---------------------------------------------------------------------------%
:- implementation.
:- import_module list.
:- import_module string.
:- import_module int32.
%---------------------------------------------------------------------------%
main(!IO) :-
list.foldl(run_test(big_endian), test_cases, !IO),
list.foldl(run_test(little_endian), test_cases, !IO),
list.foldl(run_test(native), test_cases, !IO).
:- pred run_test(byte_order::in, test_case::in, io::di, io::uo) is det.
run_test(ByteOrder, TestBytes, !IO) :-
io.remove_file(test_file, _, !IO),
io.write_string("================\n", !IO),
io.open_binary_output(test_file, OpenOutResult, !IO),
(
OpenOutResult = ok(OutFile),
io.write_string("Input: ", !IO),
io.write(TestBytes, !IO),
( if TestBytes = [Byte1, Byte2, Byte3, Byte4] then
io.write_string(" (LE: ", !IO),
io.write_int32(from_bytes_le(Byte1, Byte2, Byte3, Byte4), !IO),
io.write_string(") (BE: ", !IO),
io.write_int32(from_bytes_be(Byte1, Byte2, Byte3, Byte4), !IO),
io.write_string(")\n", !IO)
else
io.nl(!IO)
),
list.foldl(write_binary_uint8(OutFile), TestBytes, !IO),
io.close_binary_output(OutFile, !IO),
io.open_binary_input(test_file, OpenInResult, !IO),
(
OpenInResult = ok(InFile),
(
ByteOrder = big_endian,
read_binary_int32_be(InFile, ReadResult, !IO)
;
ByteOrder = little_endian,
read_binary_int32_le(InFile, ReadResult, !IO)
;
ByteOrder = native,
read_binary_int32(InFile, ReadResult, !IO)
),
io.close_binary_input(InFile, !IO),
(
ReadResult = ok(ResultUInt16),
io.write_string("Result: ", !IO),
io.write(ResultUInt16, !IO),
io.write_string(" (", !IO),
describe_byte_order(ByteOrder, !IO),
io.write_string(")\n", !IO)
;
ReadResult = eof,
io.write_string("Result: EOF (", !IO),
describe_byte_order(ByteOrder, !IO),
io.write_string(")\n", !IO)
;
ReadResult = incomplete(Bytes),
io.format("Result: Incomplete (%s) (", [s(string(Bytes))],
!IO),
describe_byte_order(ByteOrder, !IO),
io.write_string(")\n", !IO)
;
ReadResult = error(IO_Error),
io.format("Result: Error (%s)\n", [s(io.error_message(IO_Error))],
!IO)
),
io.remove_file(test_file, _, !IO)
;
OpenInResult = error(IO_Error),
io.format("I/O ERROR: %s\n", [s(io.error_message(IO_Error))],
!IO)
)
;
OpenOutResult = error(IO_Error),
io.format("I/O ERROR: %s\n", [s(io.error_message(IO_Error))], !IO)
).
:- pred describe_byte_order(byte_order::in, io::di, io::uo) is det.
describe_byte_order(ByteOrder, !IO) :-
(
ByteOrder = big_endian,
io.write_string("read big-endian", !IO)
;
ByteOrder = little_endian,
io.write_string("read little-endian", !IO)
;
ByteOrder = native,
io.write_string("read native byte order", !IO)
).
:- func test_file = string.
test_file = "read_binary_int32.bin".
%---------------------------------------------------------------------------%
:- type byte_order
---> big_endian
; little_endian
; native.
:- type test_case == list(uint8).
:- func test_cases = list(test_case).
test_cases = [
[],
[1u8],
[1u8, 2u8],
[1u8, 2u8, 3u8],
[0u8, 0u8, 0u8, 1u8],
[0xffu8, 0u8, 0u8, 0u8],
[1u8, 1u8, 0u8, 0u8]
].
%---------------------------------------------------------------------------%
:- end_module read_binary_int32.
%---------------------------------------------------------------------------%