mirror of
https://github.com/Mercury-Language/mercury.git
synced 2026-04-15 17:33:38 +00:00
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.
146 lines
4.6 KiB
Mathematica
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.
|
|
%---------------------------------------------------------------------------%
|