Files
mercury/tests/hard_coded/array_primitives.m
Zoltan Somogyi 94fadf1797 Add uint versions of array operations.
library/array.m:
    Add uint versions of most of this module's operations.

NEWS.md:
    Mention the new operations.

library/edit_distance.m:
    Use the new array operations to eliminate some casts.

library/edit_seq.m:
    Minor style fix.

tests/hard_coded/array_gen.{m,exp}:
tests/hard_coded/array_test_2.{m,exp}:
    Extend the tests of array.m's operations to the corresponding uint
    versions. Expect the output for the new versions.

tests/hard_coded/array_resize.m:
tests/hard_coded/array_shrink.m:
    Extend the tests of array.m's operations to the corresponding uint
    versions, but generate output only if their results differ from the
    original int versions. (They don't differ.)

tests/hard_coded/array_primitives.m:
    Style fixes.
2026-01-08 03:47:09 +11:00

78 lines
2.7 KiB
Mathematica

%---------------------------------------------------------------------------%
% vim: ft=mercury ts=4 sw=4 et
%---------------------------------------------------------------------------%
% This is a regression test for the bug fixed in commit 65f683e. That bug was
% an abort due to an InvalidCastException in the C# grades. The problem was
% that the C# implementation of ML_new_array omitted the special case handling
% of primitive unsigned integer types. More generally, several of the array
% primitives (ML_new_array, ML_unsafe_new_array, ML_resize_array and
% ML_shrink_array), all need to implement the special case handling of
% primitive types, in both the C# and Java grades. This test checks that
% special case handling for primitives is present for all of those operations.
%
%---------------------------------------------------------------------------%
:- module array_primitives.
:- interface.
:- import_module io.
:- pred main(io::di, io::uo) is det.
%---------------------------------------------------------------------------%
%---------------------------------------------------------------------------%
:- implementation.
:- import_module array.
:- import_module list.
:- import_module string.
:- import_module type_desc.
%---------------------------------------------------------------------------%
main(!IO) :-
do_test(2i8, 3i8, !IO),
do_test(2u8, 3u8, !IO),
do_test(2i16, 3i16, !IO),
do_test(2u16, 3u16, !IO),
do_test(2i32, 3i32, !IO),
do_test(2u32, 3u32, !IO),
do_test(2i64, 3i64, !IO),
do_test(2u64, 3u64, !IO),
do_test(2, 3, !IO),
do_test(2u, 3u, !IO),
do_test(2.0, 3.0, !IO),
do_test("foo", "bar", !IO),
do_test([1, 2, 3], [4], !IO).
:- pred do_test(T::in, T::in, io::di, io::uo) is det.
do_test(E, F, !IO) :-
TypeName = type_name(type_of(E)),
io.format("*** Testing with element type: %s ****\n", [s(TypeName)], !IO),
array.init(5, E, InitArray), % Test ML_new_array
io.write_string("init = ", !IO),
io.write_line(InitArray, !IO),
GenArray = array.generate(5, (func(_) = E)), % Test ML_unsafe_new_array
io.write_string("generate = ", !IO),
io.write_line(GenArray, !IO),
array.resize(7, F, InitArray, ResizedArray), % Test ML_array_resize
io.write_string("resize = ", !IO),
io.write_line(ResizedArray, !IO),
array.shrink(2, GenArray, ShrunkArray), % Test ML_shrink_array
io.write_string("shrink = ", !IO),
io.write_line(ShrunkArray, !IO),
io.nl(!IO).
%---------------------------------------------------------------------------%
:- end_module array_primitives.
%---------------------------------------------------------------------------%