blob: f41e6921ebfc6b23b1b73a1b62577334f33edcd4 [file] [log] [blame]
// Copyright (c) 2025, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
//
// This file has been automatically generated. Please do not edit it manually.
// Generated by tests/ffi/generator/array_primitive_elements_test_generator.dart.
//
// SharedObjects=ffi_test_functions
// VMOptions=
// VMOptions=--deterministic --optimization-counter-threshold=90
// VMOptions=--use-slow-path
// VMOptions=--use-slow-path --stacktrace-every=100
import 'dart:ffi';
import 'dart:typed_data';
import 'package:expect/expect.dart';
import 'package:ffi/ffi.dart';
const int arrayLength = 5;
void main() {
// Loop enough to trigger optimizations or stacktraces. See "VMOptions" above.
for (int i = 0; i < 100; ++i) {
testInt8ArrayElements();
testInt8ArrayBackedByInt64ListElements();
testMallocedInt8ArrayElements();
testWriteToInt8ArrayElementsBackedByTypedData();
testWriteToInt8ArrayElementsBackedByPointer();
testInt8ArrayElementsFirstAndLast();
testInt8ArrayElementsTypedDataListBackedByTypedData();
testInt8ArrayElementsTypedDataListBackedByPointer();
testInt16ArrayElements();
testInt16ArrayBackedByInt64ListElements();
testMallocedInt16ArrayElements();
testWriteToInt16ArrayElementsBackedByTypedData();
testWriteToInt16ArrayElementsBackedByPointer();
testInt16ArrayElementsFirstAndLast();
testInt16ArrayElementsTypedDataListBackedByTypedData();
testInt16ArrayElementsTypedDataListBackedByPointer();
testInt16Misaligned();
testInt32ArrayElements();
testInt32ArrayBackedByInt64ListElements();
testMallocedInt32ArrayElements();
testWriteToInt32ArrayElementsBackedByTypedData();
testWriteToInt32ArrayElementsBackedByPointer();
testInt32ArrayElementsFirstAndLast();
testInt32ArrayElementsTypedDataListBackedByTypedData();
testInt32ArrayElementsTypedDataListBackedByPointer();
testInt32Misaligned();
testInt64ArrayElements();
testInt64ArrayBackedByInt64ListElements();
testMallocedInt64ArrayElements();
testWriteToInt64ArrayElementsBackedByTypedData();
testWriteToInt64ArrayElementsBackedByPointer();
testInt64ArrayElementsFirstAndLast();
testInt64ArrayElementsTypedDataListBackedByTypedData();
testInt64ArrayElementsTypedDataListBackedByPointer();
testInt64Misaligned();
testUint8ArrayElements();
testUint8ArrayBackedByInt64ListElements();
testMallocedUint8ArrayElements();
testWriteToUint8ArrayElementsBackedByTypedData();
testWriteToUint8ArrayElementsBackedByPointer();
testUint8ArrayElementsFirstAndLast();
testUint8ArrayElementsTypedDataListBackedByTypedData();
testUint8ArrayElementsTypedDataListBackedByPointer();
testUint16ArrayElements();
testUint16ArrayBackedByInt64ListElements();
testMallocedUint16ArrayElements();
testWriteToUint16ArrayElementsBackedByTypedData();
testWriteToUint16ArrayElementsBackedByPointer();
testUint16ArrayElementsFirstAndLast();
testUint16ArrayElementsTypedDataListBackedByTypedData();
testUint16ArrayElementsTypedDataListBackedByPointer();
testUint16Misaligned();
testUint32ArrayElements();
testUint32ArrayBackedByInt64ListElements();
testMallocedUint32ArrayElements();
testWriteToUint32ArrayElementsBackedByTypedData();
testWriteToUint32ArrayElementsBackedByPointer();
testUint32ArrayElementsFirstAndLast();
testUint32ArrayElementsTypedDataListBackedByTypedData();
testUint32ArrayElementsTypedDataListBackedByPointer();
testUint32Misaligned();
testUint64ArrayElements();
testUint64ArrayBackedByInt64ListElements();
testMallocedUint64ArrayElements();
testWriteToUint64ArrayElementsBackedByTypedData();
testWriteToUint64ArrayElementsBackedByPointer();
testUint64ArrayElementsFirstAndLast();
testUint64ArrayElementsTypedDataListBackedByTypedData();
testUint64ArrayElementsTypedDataListBackedByPointer();
testUint64Misaligned();
testFloatArrayElements();
testFloatArrayBackedByInt64ListElements();
testMallocedFloatArrayElements();
testWriteToFloatArrayElementsBackedByTypedData();
testWriteToFloatArrayElementsBackedByPointer();
testFloatArrayElementsFirstAndLast();
testFloatArrayElementsTypedDataListBackedByTypedData();
testFloatArrayElementsTypedDataListBackedByPointer();
testFloatMisaligned();
testDoubleArrayElements();
testDoubleArrayBackedByInt64ListElements();
testMallocedDoubleArrayElements();
testWriteToDoubleArrayElementsBackedByTypedData();
testWriteToDoubleArrayElementsBackedByPointer();
testDoubleArrayElementsFirstAndLast();
testDoubleArrayElementsTypedDataListBackedByTypedData();
testDoubleArrayElementsTypedDataListBackedByPointer();
testDoubleMisaligned();
testBoolArrayElements();
testBoolArrayBackedByInt64ListElements();
testMallocedBoolArrayElements();
testWriteToBoolArrayElementsBackedByTypedData();
testWriteToBoolArrayElementsBackedByPointer();
testBoolArrayElementsFirstAndLast();
testWCharArrayElements();
testWCharArrayBackedByInt64ListElements();
testMallocedWCharArrayElements();
testWriteToWCharArrayElementsBackedByTypedData();
testWriteToWCharArrayElementsBackedByPointer();
testWCharArrayElementsFirstAndLast();
}
}
final class Int8ArrayStruct extends Struct {
// Placeholder value before array to test the offset calculation logic.
@Int8()
external int placeholder;
@Array(arrayLength)
external Array<Int8> array;
}
void testInt8ArrayElements() {
final struct = Struct.create<Int8ArrayStruct>();
final array = struct.array;
final expected = <int>[];
for (int i = 0; i < arrayLength; i++) {
final value = 100 + i;
array[i] = value;
expected.add(value);
}
Expect.listEquals(expected, array.elements);
}
void testInt8ArrayBackedByInt64ListElements() {
final list = Int64List(6);
final struct = Struct.create<Int8ArrayStruct>(list);
final array = struct.array;
final expected = <int>[];
for (int i = 0; i < arrayLength; i++) {
final value = 100 + i;
array[i] = value;
expected.add(value);
}
Expect.listEquals(expected, array.elements);
}
void testMallocedInt8ArrayElements() {
final struct = malloc<Int8ArrayStruct>();
final array = struct.ref.array;
final expected = <int>[];
for (int i = 0; i < arrayLength; i++) {
final value = 100 + i;
array[i] = value;
expected.add(value);
}
Expect.listEquals(expected, array.elements);
malloc.free(struct);
}
void testWriteToInt8ArrayElementsBackedByTypedData() {
final struct = Struct.create<Int8ArrayStruct>();
final array = struct.array;
final expected = <int>[];
for (int i = 0; i < arrayLength; i++) {
final value = 100 + i;
array.elements[i] = value;
expected.add(value);
}
Expect.listEquals(expected, array.elements);
final actual = <int>[];
for (int i = 0; i < arrayLength; i++) {
actual.add(array[i]);
}
Expect.listEquals(expected, actual);
}
void testWriteToInt8ArrayElementsBackedByPointer() {
final struct = malloc<Int8ArrayStruct>();
final array = struct.ref.array;
final expected = <int>[];
for (int i = 0; i < arrayLength; i++) {
final value = 100 + i;
array.elements[i] = value;
expected.add(value);
}
Expect.listEquals(expected, array.elements);
final actual = <int>[];
for (int i = 0; i < arrayLength; i++) {
actual.add(array[i]);
}
Expect.listEquals(expected, actual);
malloc.free(struct);
}
void testInt8ArrayElementsFirstAndLast() {
final struct = Struct.create<Int8ArrayStruct>();
final elements = struct.array.elements;
var value = 100 + 3;
elements.first = value;
Expect.equals(value, elements.first);
value = 100 + 4;
elements.last = value;
Expect.equals(value, elements.last);
}
void testInt8ArrayElementsTypedDataListBackedByTypedData() {
final struct = Struct.create<Int8ArrayStruct>();
final array = struct.array;
final elements = array.elements;
Expect.equals(sizeOf<Int8>(), elements.offsetInBytes);
Expect.equals(sizeOf<Int8>() * arrayLength, elements.lengthInBytes);
Expect.equals(sizeOf<Int8>(), elements.elementSizeInBytes);
final expected = <int>[];
for (int i = 0; i < arrayLength; i++) {
final value = 100 + i;
array[i] = value;
expected.add(value);
}
Expect.equals(expected.first, elements.first);
Expect.equals(expected.last, elements.last);
// Removed one element from the beginning and one from the end.
final view = Int8List.view(
elements.buffer,
elements.offsetInBytes + sizeOf<Int8>(),
arrayLength - 2,
);
Expect.listEquals(expected.sublist(1, arrayLength - 1), view);
Expect.listEquals(
expected.sublist(1, arrayLength - 1),
Int8List.sublistView(elements, 1, arrayLength - 1),
);
}
void testInt8ArrayElementsTypedDataListBackedByPointer() {
final struct = malloc<Int8ArrayStruct>();
final array = struct.ref.array;
final elements = array.elements;
Expect.equals(0, elements.offsetInBytes);
Expect.equals(sizeOf<Int8>() * arrayLength, elements.lengthInBytes);
Expect.equals(sizeOf<Int8>(), elements.elementSizeInBytes);
final expected = <int>[];
for (int i = 0; i < arrayLength; i++) {
final value = 100 + i;
array[i] = value;
expected.add(value);
}
Expect.equals(expected.first, elements.first);
Expect.equals(expected.last, elements.last);
// Removed one element from the beginning and one from the end.
final view = Int8List.view(
elements.buffer,
elements.offsetInBytes + sizeOf<Int8>(),
arrayLength - 2,
);
Expect.listEquals(expected.sublist(1, arrayLength - 1), view);
Expect.listEquals(
expected.sublist(1, arrayLength - 1),
Int8List.sublistView(elements, 1, arrayLength - 1),
);
malloc.free(struct);
}
final class Int16ArrayStruct extends Struct {
// Placeholder value before array to test the offset calculation logic.
@Int8()
external int placeholder;
@Array(arrayLength)
external Array<Int16> array;
}
void testInt16ArrayElements() {
final struct = Struct.create<Int16ArrayStruct>();
final array = struct.array;
final expected = <int>[];
for (int i = 0; i < arrayLength; i++) {
final value = 100 + i;
array[i] = value;
expected.add(value);
}
Expect.listEquals(expected, array.elements);
}
void testInt16ArrayBackedByInt64ListElements() {
final list = Int64List(6);
final struct = Struct.create<Int16ArrayStruct>(list);
final array = struct.array;
final expected = <int>[];
for (int i = 0; i < arrayLength; i++) {
final value = 100 + i;
array[i] = value;
expected.add(value);
}
Expect.listEquals(expected, array.elements);
}
void testMallocedInt16ArrayElements() {
final struct = malloc<Int16ArrayStruct>();
final array = struct.ref.array;
final expected = <int>[];
for (int i = 0; i < arrayLength; i++) {
final value = 100 + i;
array[i] = value;
expected.add(value);
}
Expect.listEquals(expected, array.elements);
malloc.free(struct);
}
void testWriteToInt16ArrayElementsBackedByTypedData() {
final struct = Struct.create<Int16ArrayStruct>();
final array = struct.array;
final expected = <int>[];
for (int i = 0; i < arrayLength; i++) {
final value = 100 + i;
array.elements[i] = value;
expected.add(value);
}
Expect.listEquals(expected, array.elements);
final actual = <int>[];
for (int i = 0; i < arrayLength; i++) {
actual.add(array[i]);
}
Expect.listEquals(expected, actual);
}
void testWriteToInt16ArrayElementsBackedByPointer() {
final struct = malloc<Int16ArrayStruct>();
final array = struct.ref.array;
final expected = <int>[];
for (int i = 0; i < arrayLength; i++) {
final value = 100 + i;
array.elements[i] = value;
expected.add(value);
}
Expect.listEquals(expected, array.elements);
final actual = <int>[];
for (int i = 0; i < arrayLength; i++) {
actual.add(array[i]);
}
Expect.listEquals(expected, actual);
malloc.free(struct);
}
void testInt16ArrayElementsFirstAndLast() {
final struct = Struct.create<Int16ArrayStruct>();
final elements = struct.array.elements;
var value = 100 + 3;
elements.first = value;
Expect.equals(value, elements.first);
value = 100 + 4;
elements.last = value;
Expect.equals(value, elements.last);
}
void testInt16ArrayElementsTypedDataListBackedByTypedData() {
final struct = Struct.create<Int16ArrayStruct>();
final array = struct.array;
final elements = array.elements;
Expect.equals(sizeOf<Int16>(), elements.offsetInBytes);
Expect.equals(sizeOf<Int16>() * arrayLength, elements.lengthInBytes);
Expect.equals(sizeOf<Int16>(), elements.elementSizeInBytes);
final expected = <int>[];
for (int i = 0; i < arrayLength; i++) {
final value = 100 + i;
array[i] = value;
expected.add(value);
}
Expect.equals(expected.first, elements.first);
Expect.equals(expected.last, elements.last);
// Removed one element from the beginning and one from the end.
final view = Int16List.view(
elements.buffer,
elements.offsetInBytes + sizeOf<Int16>(),
arrayLength - 2,
);
Expect.listEquals(expected.sublist(1, arrayLength - 1), view);
Expect.listEquals(
expected.sublist(1, arrayLength - 1),
Int16List.sublistView(elements, 1, arrayLength - 1),
);
}
void testInt16ArrayElementsTypedDataListBackedByPointer() {
final struct = malloc<Int16ArrayStruct>();
final array = struct.ref.array;
final elements = array.elements;
Expect.equals(0, elements.offsetInBytes);
Expect.equals(sizeOf<Int16>() * arrayLength, elements.lengthInBytes);
Expect.equals(sizeOf<Int16>(), elements.elementSizeInBytes);
final expected = <int>[];
for (int i = 0; i < arrayLength; i++) {
final value = 100 + i;
array[i] = value;
expected.add(value);
}
Expect.equals(expected.first, elements.first);
Expect.equals(expected.last, elements.last);
// Removed one element from the beginning and one from the end.
final view = Int16List.view(
elements.buffer,
elements.offsetInBytes + sizeOf<Int16>(),
arrayLength - 2,
);
Expect.listEquals(expected.sublist(1, arrayLength - 1), view);
Expect.listEquals(
expected.sublist(1, arrayLength - 1),
Int16List.sublistView(elements, 1, arrayLength - 1),
);
malloc.free(struct);
}
@Packed(1)
final class PackedInt16ArrayStruct extends Struct {
// Placeholder value before array to test the offset calculation logic.
@Int8()
external int placeholder;
@Array(arrayLength)
external Array<Int16> array;
}
void testInt16Misaligned() {
final structPointer = malloc<PackedInt16ArrayStruct>();
var array = structPointer.ref.array;
var e = Expect.throwsArgumentError(() => array.elements);
Expect.isTrue(
e.message.contains(
'Pointer address must be aligned to a multiple of the element size',
),
);
malloc.free(structPointer);
final struct = Struct.create<PackedInt16ArrayStruct>();
array = struct.array;
e = Expect.throwsRangeError(() => array.elements);
Expect.isTrue(e.message.contains('must be a multiple of BYTES_PER_ELEMENT'));
}
final class Int32ArrayStruct extends Struct {
// Placeholder value before array to test the offset calculation logic.
@Int8()
external int placeholder;
@Array(arrayLength)
external Array<Int32> array;
}
void testInt32ArrayElements() {
final struct = Struct.create<Int32ArrayStruct>();
final array = struct.array;
final expected = <int>[];
for (int i = 0; i < arrayLength; i++) {
final value = 100 + i;
array[i] = value;
expected.add(value);
}
Expect.listEquals(expected, array.elements);
}
void testInt32ArrayBackedByInt64ListElements() {
final list = Int64List(6);
final struct = Struct.create<Int32ArrayStruct>(list);
final array = struct.array;
final expected = <int>[];
for (int i = 0; i < arrayLength; i++) {
final value = 100 + i;
array[i] = value;
expected.add(value);
}
Expect.listEquals(expected, array.elements);
}
void testMallocedInt32ArrayElements() {
final struct = malloc<Int32ArrayStruct>();
final array = struct.ref.array;
final expected = <int>[];
for (int i = 0; i < arrayLength; i++) {
final value = 100 + i;
array[i] = value;
expected.add(value);
}
Expect.listEquals(expected, array.elements);
malloc.free(struct);
}
void testWriteToInt32ArrayElementsBackedByTypedData() {
final struct = Struct.create<Int32ArrayStruct>();
final array = struct.array;
final expected = <int>[];
for (int i = 0; i < arrayLength; i++) {
final value = 100 + i;
array.elements[i] = value;
expected.add(value);
}
Expect.listEquals(expected, array.elements);
final actual = <int>[];
for (int i = 0; i < arrayLength; i++) {
actual.add(array[i]);
}
Expect.listEquals(expected, actual);
}
void testWriteToInt32ArrayElementsBackedByPointer() {
final struct = malloc<Int32ArrayStruct>();
final array = struct.ref.array;
final expected = <int>[];
for (int i = 0; i < arrayLength; i++) {
final value = 100 + i;
array.elements[i] = value;
expected.add(value);
}
Expect.listEquals(expected, array.elements);
final actual = <int>[];
for (int i = 0; i < arrayLength; i++) {
actual.add(array[i]);
}
Expect.listEquals(expected, actual);
malloc.free(struct);
}
void testInt32ArrayElementsFirstAndLast() {
final struct = Struct.create<Int32ArrayStruct>();
final elements = struct.array.elements;
var value = 100 + 3;
elements.first = value;
Expect.equals(value, elements.first);
value = 100 + 4;
elements.last = value;
Expect.equals(value, elements.last);
}
void testInt32ArrayElementsTypedDataListBackedByTypedData() {
final struct = Struct.create<Int32ArrayStruct>();
final array = struct.array;
final elements = array.elements;
Expect.equals(sizeOf<Int32>(), elements.offsetInBytes);
Expect.equals(sizeOf<Int32>() * arrayLength, elements.lengthInBytes);
Expect.equals(sizeOf<Int32>(), elements.elementSizeInBytes);
final expected = <int>[];
for (int i = 0; i < arrayLength; i++) {
final value = 100 + i;
array[i] = value;
expected.add(value);
}
Expect.equals(expected.first, elements.first);
Expect.equals(expected.last, elements.last);
// Removed one element from the beginning and one from the end.
final view = Int32List.view(
elements.buffer,
elements.offsetInBytes + sizeOf<Int32>(),
arrayLength - 2,
);
Expect.listEquals(expected.sublist(1, arrayLength - 1), view);
Expect.listEquals(
expected.sublist(1, arrayLength - 1),
Int32List.sublistView(elements, 1, arrayLength - 1),
);
}
void testInt32ArrayElementsTypedDataListBackedByPointer() {
final struct = malloc<Int32ArrayStruct>();
final array = struct.ref.array;
final elements = array.elements;
Expect.equals(0, elements.offsetInBytes);
Expect.equals(sizeOf<Int32>() * arrayLength, elements.lengthInBytes);
Expect.equals(sizeOf<Int32>(), elements.elementSizeInBytes);
final expected = <int>[];
for (int i = 0; i < arrayLength; i++) {
final value = 100 + i;
array[i] = value;
expected.add(value);
}
Expect.equals(expected.first, elements.first);
Expect.equals(expected.last, elements.last);
// Removed one element from the beginning and one from the end.
final view = Int32List.view(
elements.buffer,
elements.offsetInBytes + sizeOf<Int32>(),
arrayLength - 2,
);
Expect.listEquals(expected.sublist(1, arrayLength - 1), view);
Expect.listEquals(
expected.sublist(1, arrayLength - 1),
Int32List.sublistView(elements, 1, arrayLength - 1),
);
malloc.free(struct);
}
@Packed(1)
final class PackedInt32ArrayStruct extends Struct {
// Placeholder value before array to test the offset calculation logic.
@Int8()
external int placeholder;
@Array(arrayLength)
external Array<Int32> array;
}
void testInt32Misaligned() {
final structPointer = malloc<PackedInt32ArrayStruct>();
var array = structPointer.ref.array;
var e = Expect.throwsArgumentError(() => array.elements);
Expect.isTrue(
e.message.contains(
'Pointer address must be aligned to a multiple of the element size',
),
);
malloc.free(structPointer);
final struct = Struct.create<PackedInt32ArrayStruct>();
array = struct.array;
e = Expect.throwsRangeError(() => array.elements);
Expect.isTrue(e.message.contains('must be a multiple of BYTES_PER_ELEMENT'));
}
final class Int64ArrayStruct extends Struct {
// Placeholder value before array to test the offset calculation logic.
@Int8()
external int placeholder;
@Array(arrayLength)
external Array<Int64> array;
}
void testInt64ArrayElements() {
final struct = Struct.create<Int64ArrayStruct>();
final array = struct.array;
final expected = <int>[];
for (int i = 0; i < arrayLength; i++) {
final value = 100 + i;
array[i] = value;
expected.add(value);
}
Expect.listEquals(expected, array.elements);
}
void testInt64ArrayBackedByInt64ListElements() {
final list = Int64List(6);
final struct = Struct.create<Int64ArrayStruct>(list);
final array = struct.array;
final expected = <int>[];
for (int i = 0; i < arrayLength; i++) {
final value = 100 + i;
array[i] = value;
expected.add(value);
}
Expect.listEquals(expected, array.elements);
}
void testMallocedInt64ArrayElements() {
final struct = malloc<Int64ArrayStruct>();
final array = struct.ref.array;
final expected = <int>[];
for (int i = 0; i < arrayLength; i++) {
final value = 100 + i;
array[i] = value;
expected.add(value);
}
Expect.listEquals(expected, array.elements);
malloc.free(struct);
}
void testWriteToInt64ArrayElementsBackedByTypedData() {
final struct = Struct.create<Int64ArrayStruct>();
final array = struct.array;
final expected = <int>[];
for (int i = 0; i < arrayLength; i++) {
final value = 100 + i;
array.elements[i] = value;
expected.add(value);
}
Expect.listEquals(expected, array.elements);
final actual = <int>[];
for (int i = 0; i < arrayLength; i++) {
actual.add(array[i]);
}
Expect.listEquals(expected, actual);
}
void testWriteToInt64ArrayElementsBackedByPointer() {
final struct = malloc<Int64ArrayStruct>();
final array = struct.ref.array;
final expected = <int>[];
for (int i = 0; i < arrayLength; i++) {
final value = 100 + i;
array.elements[i] = value;
expected.add(value);
}
Expect.listEquals(expected, array.elements);
final actual = <int>[];
for (int i = 0; i < arrayLength; i++) {
actual.add(array[i]);
}
Expect.listEquals(expected, actual);
malloc.free(struct);
}
void testInt64ArrayElementsFirstAndLast() {
final struct = Struct.create<Int64ArrayStruct>();
final elements = struct.array.elements;
var value = 100 + 3;
elements.first = value;
Expect.equals(value, elements.first);
value = 100 + 4;
elements.last = value;
Expect.equals(value, elements.last);
}
void testInt64ArrayElementsTypedDataListBackedByTypedData() {
final struct = Struct.create<Int64ArrayStruct>();
final array = struct.array;
final elements = array.elements;
Expect.equals(sizeOf<Int64>(), elements.offsetInBytes);
Expect.equals(sizeOf<Int64>() * arrayLength, elements.lengthInBytes);
Expect.equals(sizeOf<Int64>(), elements.elementSizeInBytes);
final expected = <int>[];
for (int i = 0; i < arrayLength; i++) {
final value = 100 + i;
array[i] = value;
expected.add(value);
}
Expect.equals(expected.first, elements.first);
Expect.equals(expected.last, elements.last);
// Removed one element from the beginning and one from the end.
final view = Int64List.view(
elements.buffer,
elements.offsetInBytes + sizeOf<Int64>(),
arrayLength - 2,
);
Expect.listEquals(expected.sublist(1, arrayLength - 1), view);
Expect.listEquals(
expected.sublist(1, arrayLength - 1),
Int64List.sublistView(elements, 1, arrayLength - 1),
);
}
void testInt64ArrayElementsTypedDataListBackedByPointer() {
final struct = malloc<Int64ArrayStruct>();
final array = struct.ref.array;
final elements = array.elements;
Expect.equals(0, elements.offsetInBytes);
Expect.equals(sizeOf<Int64>() * arrayLength, elements.lengthInBytes);
Expect.equals(sizeOf<Int64>(), elements.elementSizeInBytes);
final expected = <int>[];
for (int i = 0; i < arrayLength; i++) {
final value = 100 + i;
array[i] = value;
expected.add(value);
}
Expect.equals(expected.first, elements.first);
Expect.equals(expected.last, elements.last);
// Removed one element from the beginning and one from the end.
final view = Int64List.view(
elements.buffer,
elements.offsetInBytes + sizeOf<Int64>(),
arrayLength - 2,
);
Expect.listEquals(expected.sublist(1, arrayLength - 1), view);
Expect.listEquals(
expected.sublist(1, arrayLength - 1),
Int64List.sublistView(elements, 1, arrayLength - 1),
);
malloc.free(struct);
}
@Packed(1)
final class PackedInt64ArrayStruct extends Struct {
// Placeholder value before array to test the offset calculation logic.
@Int8()
external int placeholder;
@Array(arrayLength)
external Array<Int64> array;
}
void testInt64Misaligned() {
final structPointer = malloc<PackedInt64ArrayStruct>();
var array = structPointer.ref.array;
var e = Expect.throwsArgumentError(() => array.elements);
Expect.isTrue(
e.message.contains(
'Pointer address must be aligned to a multiple of the element size',
),
);
malloc.free(structPointer);
final struct = Struct.create<PackedInt64ArrayStruct>();
array = struct.array;
e = Expect.throwsRangeError(() => array.elements);
Expect.isTrue(e.message.contains('must be a multiple of BYTES_PER_ELEMENT'));
}
final class Uint8ArrayStruct extends Struct {
// Placeholder value before array to test the offset calculation logic.
@Int8()
external int placeholder;
@Array(arrayLength)
external Array<Uint8> array;
}
void testUint8ArrayElements() {
final struct = Struct.create<Uint8ArrayStruct>();
final array = struct.array;
final expected = <int>[];
for (int i = 0; i < arrayLength; i++) {
final value = 100 + i;
array[i] = value;
expected.add(value);
}
Expect.listEquals(expected, array.elements);
}
void testUint8ArrayBackedByInt64ListElements() {
final list = Int64List(6);
final struct = Struct.create<Uint8ArrayStruct>(list);
final array = struct.array;
final expected = <int>[];
for (int i = 0; i < arrayLength; i++) {
final value = 100 + i;
array[i] = value;
expected.add(value);
}
Expect.listEquals(expected, array.elements);
}
void testMallocedUint8ArrayElements() {
final struct = malloc<Uint8ArrayStruct>();
final array = struct.ref.array;
final expected = <int>[];
for (int i = 0; i < arrayLength; i++) {
final value = 100 + i;
array[i] = value;
expected.add(value);
}
Expect.listEquals(expected, array.elements);
malloc.free(struct);
}
void testWriteToUint8ArrayElementsBackedByTypedData() {
final struct = Struct.create<Uint8ArrayStruct>();
final array = struct.array;
final expected = <int>[];
for (int i = 0; i < arrayLength; i++) {
final value = 100 + i;
array.elements[i] = value;
expected.add(value);
}
Expect.listEquals(expected, array.elements);
final actual = <int>[];
for (int i = 0; i < arrayLength; i++) {
actual.add(array[i]);
}
Expect.listEquals(expected, actual);
}
void testWriteToUint8ArrayElementsBackedByPointer() {
final struct = malloc<Uint8ArrayStruct>();
final array = struct.ref.array;
final expected = <int>[];
for (int i = 0; i < arrayLength; i++) {
final value = 100 + i;
array.elements[i] = value;
expected.add(value);
}
Expect.listEquals(expected, array.elements);
final actual = <int>[];
for (int i = 0; i < arrayLength; i++) {
actual.add(array[i]);
}
Expect.listEquals(expected, actual);
malloc.free(struct);
}
void testUint8ArrayElementsFirstAndLast() {
final struct = Struct.create<Uint8ArrayStruct>();
final elements = struct.array.elements;
var value = 100 + 3;
elements.first = value;
Expect.equals(value, elements.first);
value = 100 + 4;
elements.last = value;
Expect.equals(value, elements.last);
}
void testUint8ArrayElementsTypedDataListBackedByTypedData() {
final struct = Struct.create<Uint8ArrayStruct>();
final array = struct.array;
final elements = array.elements;
Expect.equals(sizeOf<Uint8>(), elements.offsetInBytes);
Expect.equals(sizeOf<Uint8>() * arrayLength, elements.lengthInBytes);
Expect.equals(sizeOf<Uint8>(), elements.elementSizeInBytes);
final expected = <int>[];
for (int i = 0; i < arrayLength; i++) {
final value = 100 + i;
array[i] = value;
expected.add(value);
}
Expect.equals(expected.first, elements.first);
Expect.equals(expected.last, elements.last);
// Removed one element from the beginning and one from the end.
final view = Uint8List.view(
elements.buffer,
elements.offsetInBytes + sizeOf<Uint8>(),
arrayLength - 2,
);
Expect.listEquals(expected.sublist(1, arrayLength - 1), view);
Expect.listEquals(
expected.sublist(1, arrayLength - 1),
Uint8List.sublistView(elements, 1, arrayLength - 1),
);
}
void testUint8ArrayElementsTypedDataListBackedByPointer() {
final struct = malloc<Uint8ArrayStruct>();
final array = struct.ref.array;
final elements = array.elements;
Expect.equals(0, elements.offsetInBytes);
Expect.equals(sizeOf<Uint8>() * arrayLength, elements.lengthInBytes);
Expect.equals(sizeOf<Uint8>(), elements.elementSizeInBytes);
final expected = <int>[];
for (int i = 0; i < arrayLength; i++) {
final value = 100 + i;
array[i] = value;
expected.add(value);
}
Expect.equals(expected.first, elements.first);
Expect.equals(expected.last, elements.last);
// Removed one element from the beginning and one from the end.
final view = Uint8List.view(
elements.buffer,
elements.offsetInBytes + sizeOf<Uint8>(),
arrayLength - 2,
);
Expect.listEquals(expected.sublist(1, arrayLength - 1), view);
Expect.listEquals(
expected.sublist(1, arrayLength - 1),
Uint8List.sublistView(elements, 1, arrayLength - 1),
);
malloc.free(struct);
}
final class Uint16ArrayStruct extends Struct {
// Placeholder value before array to test the offset calculation logic.
@Int8()
external int placeholder;
@Array(arrayLength)
external Array<Uint16> array;
}
void testUint16ArrayElements() {
final struct = Struct.create<Uint16ArrayStruct>();
final array = struct.array;
final expected = <int>[];
for (int i = 0; i < arrayLength; i++) {
final value = 100 + i;
array[i] = value;
expected.add(value);
}
Expect.listEquals(expected, array.elements);
}
void testUint16ArrayBackedByInt64ListElements() {
final list = Int64List(6);
final struct = Struct.create<Uint16ArrayStruct>(list);
final array = struct.array;
final expected = <int>[];
for (int i = 0; i < arrayLength; i++) {
final value = 100 + i;
array[i] = value;
expected.add(value);
}
Expect.listEquals(expected, array.elements);
}
void testMallocedUint16ArrayElements() {
final struct = malloc<Uint16ArrayStruct>();
final array = struct.ref.array;
final expected = <int>[];
for (int i = 0; i < arrayLength; i++) {
final value = 100 + i;
array[i] = value;
expected.add(value);
}
Expect.listEquals(expected, array.elements);
malloc.free(struct);
}
void testWriteToUint16ArrayElementsBackedByTypedData() {
final struct = Struct.create<Uint16ArrayStruct>();
final array = struct.array;
final expected = <int>[];
for (int i = 0; i < arrayLength; i++) {
final value = 100 + i;
array.elements[i] = value;
expected.add(value);
}
Expect.listEquals(expected, array.elements);
final actual = <int>[];
for (int i = 0; i < arrayLength; i++) {
actual.add(array[i]);
}
Expect.listEquals(expected, actual);
}
void testWriteToUint16ArrayElementsBackedByPointer() {
final struct = malloc<Uint16ArrayStruct>();
final array = struct.ref.array;
final expected = <int>[];
for (int i = 0; i < arrayLength; i++) {
final value = 100 + i;
array.elements[i] = value;
expected.add(value);
}
Expect.listEquals(expected, array.elements);
final actual = <int>[];
for (int i = 0; i < arrayLength; i++) {
actual.add(array[i]);
}
Expect.listEquals(expected, actual);
malloc.free(struct);
}
void testUint16ArrayElementsFirstAndLast() {
final struct = Struct.create<Uint16ArrayStruct>();
final elements = struct.array.elements;
var value = 100 + 3;
elements.first = value;
Expect.equals(value, elements.first);
value = 100 + 4;
elements.last = value;
Expect.equals(value, elements.last);
}
void testUint16ArrayElementsTypedDataListBackedByTypedData() {
final struct = Struct.create<Uint16ArrayStruct>();
final array = struct.array;
final elements = array.elements;
Expect.equals(sizeOf<Uint16>(), elements.offsetInBytes);
Expect.equals(sizeOf<Uint16>() * arrayLength, elements.lengthInBytes);
Expect.equals(sizeOf<Uint16>(), elements.elementSizeInBytes);
final expected = <int>[];
for (int i = 0; i < arrayLength; i++) {
final value = 100 + i;
array[i] = value;
expected.add(value);
}
Expect.equals(expected.first, elements.first);
Expect.equals(expected.last, elements.last);
// Removed one element from the beginning and one from the end.
final view = Uint16List.view(
elements.buffer,
elements.offsetInBytes + sizeOf<Uint16>(),
arrayLength - 2,
);
Expect.listEquals(expected.sublist(1, arrayLength - 1), view);
Expect.listEquals(
expected.sublist(1, arrayLength - 1),
Uint16List.sublistView(elements, 1, arrayLength - 1),
);
}
void testUint16ArrayElementsTypedDataListBackedByPointer() {
final struct = malloc<Uint16ArrayStruct>();
final array = struct.ref.array;
final elements = array.elements;
Expect.equals(0, elements.offsetInBytes);
Expect.equals(sizeOf<Uint16>() * arrayLength, elements.lengthInBytes);
Expect.equals(sizeOf<Uint16>(), elements.elementSizeInBytes);
final expected = <int>[];
for (int i = 0; i < arrayLength; i++) {
final value = 100 + i;
array[i] = value;
expected.add(value);
}
Expect.equals(expected.first, elements.first);
Expect.equals(expected.last, elements.last);
// Removed one element from the beginning and one from the end.
final view = Uint16List.view(
elements.buffer,
elements.offsetInBytes + sizeOf<Uint16>(),
arrayLength - 2,
);
Expect.listEquals(expected.sublist(1, arrayLength - 1), view);
Expect.listEquals(
expected.sublist(1, arrayLength - 1),
Uint16List.sublistView(elements, 1, arrayLength - 1),
);
malloc.free(struct);
}
@Packed(1)
final class PackedUint16ArrayStruct extends Struct {
// Placeholder value before array to test the offset calculation logic.
@Int8()
external int placeholder;
@Array(arrayLength)
external Array<Uint16> array;
}
void testUint16Misaligned() {
final structPointer = malloc<PackedUint16ArrayStruct>();
var array = structPointer.ref.array;
var e = Expect.throwsArgumentError(() => array.elements);
Expect.isTrue(
e.message.contains(
'Pointer address must be aligned to a multiple of the element size',
),
);
malloc.free(structPointer);
final struct = Struct.create<PackedUint16ArrayStruct>();
array = struct.array;
e = Expect.throwsRangeError(() => array.elements);
Expect.isTrue(e.message.contains('must be a multiple of BYTES_PER_ELEMENT'));
}
final class Uint32ArrayStruct extends Struct {
// Placeholder value before array to test the offset calculation logic.
@Int8()
external int placeholder;
@Array(arrayLength)
external Array<Uint32> array;
}
void testUint32ArrayElements() {
final struct = Struct.create<Uint32ArrayStruct>();
final array = struct.array;
final expected = <int>[];
for (int i = 0; i < arrayLength; i++) {
final value = 100 + i;
array[i] = value;
expected.add(value);
}
Expect.listEquals(expected, array.elements);
}
void testUint32ArrayBackedByInt64ListElements() {
final list = Int64List(6);
final struct = Struct.create<Uint32ArrayStruct>(list);
final array = struct.array;
final expected = <int>[];
for (int i = 0; i < arrayLength; i++) {
final value = 100 + i;
array[i] = value;
expected.add(value);
}
Expect.listEquals(expected, array.elements);
}
void testMallocedUint32ArrayElements() {
final struct = malloc<Uint32ArrayStruct>();
final array = struct.ref.array;
final expected = <int>[];
for (int i = 0; i < arrayLength; i++) {
final value = 100 + i;
array[i] = value;
expected.add(value);
}
Expect.listEquals(expected, array.elements);
malloc.free(struct);
}
void testWriteToUint32ArrayElementsBackedByTypedData() {
final struct = Struct.create<Uint32ArrayStruct>();
final array = struct.array;
final expected = <int>[];
for (int i = 0; i < arrayLength; i++) {
final value = 100 + i;
array.elements[i] = value;
expected.add(value);
}
Expect.listEquals(expected, array.elements);
final actual = <int>[];
for (int i = 0; i < arrayLength; i++) {
actual.add(array[i]);
}
Expect.listEquals(expected, actual);
}
void testWriteToUint32ArrayElementsBackedByPointer() {
final struct = malloc<Uint32ArrayStruct>();
final array = struct.ref.array;
final expected = <int>[];
for (int i = 0; i < arrayLength; i++) {
final value = 100 + i;
array.elements[i] = value;
expected.add(value);
}
Expect.listEquals(expected, array.elements);
final actual = <int>[];
for (int i = 0; i < arrayLength; i++) {
actual.add(array[i]);
}
Expect.listEquals(expected, actual);
malloc.free(struct);
}
void testUint32ArrayElementsFirstAndLast() {
final struct = Struct.create<Uint32ArrayStruct>();
final elements = struct.array.elements;
var value = 100 + 3;
elements.first = value;
Expect.equals(value, elements.first);
value = 100 + 4;
elements.last = value;
Expect.equals(value, elements.last);
}
void testUint32ArrayElementsTypedDataListBackedByTypedData() {
final struct = Struct.create<Uint32ArrayStruct>();
final array = struct.array;
final elements = array.elements;
Expect.equals(sizeOf<Uint32>(), elements.offsetInBytes);
Expect.equals(sizeOf<Uint32>() * arrayLength, elements.lengthInBytes);
Expect.equals(sizeOf<Uint32>(), elements.elementSizeInBytes);
final expected = <int>[];
for (int i = 0; i < arrayLength; i++) {
final value = 100 + i;
array[i] = value;
expected.add(value);
}
Expect.equals(expected.first, elements.first);
Expect.equals(expected.last, elements.last);
// Removed one element from the beginning and one from the end.
final view = Uint32List.view(
elements.buffer,
elements.offsetInBytes + sizeOf<Uint32>(),
arrayLength - 2,
);
Expect.listEquals(expected.sublist(1, arrayLength - 1), view);
Expect.listEquals(
expected.sublist(1, arrayLength - 1),
Uint32List.sublistView(elements, 1, arrayLength - 1),
);
}
void testUint32ArrayElementsTypedDataListBackedByPointer() {
final struct = malloc<Uint32ArrayStruct>();
final array = struct.ref.array;
final elements = array.elements;
Expect.equals(0, elements.offsetInBytes);
Expect.equals(sizeOf<Uint32>() * arrayLength, elements.lengthInBytes);
Expect.equals(sizeOf<Uint32>(), elements.elementSizeInBytes);
final expected = <int>[];
for (int i = 0; i < arrayLength; i++) {
final value = 100 + i;
array[i] = value;
expected.add(value);
}
Expect.equals(expected.first, elements.first);
Expect.equals(expected.last, elements.last);
// Removed one element from the beginning and one from the end.
final view = Uint32List.view(
elements.buffer,
elements.offsetInBytes + sizeOf<Uint32>(),
arrayLength - 2,
);
Expect.listEquals(expected.sublist(1, arrayLength - 1), view);
Expect.listEquals(
expected.sublist(1, arrayLength - 1),
Uint32List.sublistView(elements, 1, arrayLength - 1),
);
malloc.free(struct);
}
@Packed(1)
final class PackedUint32ArrayStruct extends Struct {
// Placeholder value before array to test the offset calculation logic.
@Int8()
external int placeholder;
@Array(arrayLength)
external Array<Uint32> array;
}
void testUint32Misaligned() {
final structPointer = malloc<PackedUint32ArrayStruct>();
var array = structPointer.ref.array;
var e = Expect.throwsArgumentError(() => array.elements);
Expect.isTrue(
e.message.contains(
'Pointer address must be aligned to a multiple of the element size',
),
);
malloc.free(structPointer);
final struct = Struct.create<PackedUint32ArrayStruct>();
array = struct.array;
e = Expect.throwsRangeError(() => array.elements);
Expect.isTrue(e.message.contains('must be a multiple of BYTES_PER_ELEMENT'));
}
final class Uint64ArrayStruct extends Struct {
// Placeholder value before array to test the offset calculation logic.
@Int8()
external int placeholder;
@Array(arrayLength)
external Array<Uint64> array;
}
void testUint64ArrayElements() {
final struct = Struct.create<Uint64ArrayStruct>();
final array = struct.array;
final expected = <int>[];
for (int i = 0; i < arrayLength; i++) {
final value = 100 + i;
array[i] = value;
expected.add(value);
}
Expect.listEquals(expected, array.elements);
}
void testUint64ArrayBackedByInt64ListElements() {
final list = Int64List(6);
final struct = Struct.create<Uint64ArrayStruct>(list);
final array = struct.array;
final expected = <int>[];
for (int i = 0; i < arrayLength; i++) {
final value = 100 + i;
array[i] = value;
expected.add(value);
}
Expect.listEquals(expected, array.elements);
}
void testMallocedUint64ArrayElements() {
final struct = malloc<Uint64ArrayStruct>();
final array = struct.ref.array;
final expected = <int>[];
for (int i = 0; i < arrayLength; i++) {
final value = 100 + i;
array[i] = value;
expected.add(value);
}
Expect.listEquals(expected, array.elements);
malloc.free(struct);
}
void testWriteToUint64ArrayElementsBackedByTypedData() {
final struct = Struct.create<Uint64ArrayStruct>();
final array = struct.array;
final expected = <int>[];
for (int i = 0; i < arrayLength; i++) {
final value = 100 + i;
array.elements[i] = value;
expected.add(value);
}
Expect.listEquals(expected, array.elements);
final actual = <int>[];
for (int i = 0; i < arrayLength; i++) {
actual.add(array[i]);
}
Expect.listEquals(expected, actual);
}
void testWriteToUint64ArrayElementsBackedByPointer() {
final struct = malloc<Uint64ArrayStruct>();
final array = struct.ref.array;
final expected = <int>[];
for (int i = 0; i < arrayLength; i++) {
final value = 100 + i;
array.elements[i] = value;
expected.add(value);
}
Expect.listEquals(expected, array.elements);
final actual = <int>[];
for (int i = 0; i < arrayLength; i++) {
actual.add(array[i]);
}
Expect.listEquals(expected, actual);
malloc.free(struct);
}
void testUint64ArrayElementsFirstAndLast() {
final struct = Struct.create<Uint64ArrayStruct>();
final elements = struct.array.elements;
var value = 100 + 3;
elements.first = value;
Expect.equals(value, elements.first);
value = 100 + 4;
elements.last = value;
Expect.equals(value, elements.last);
}
void testUint64ArrayElementsTypedDataListBackedByTypedData() {
final struct = Struct.create<Uint64ArrayStruct>();
final array = struct.array;
final elements = array.elements;
Expect.equals(sizeOf<Uint64>(), elements.offsetInBytes);
Expect.equals(sizeOf<Uint64>() * arrayLength, elements.lengthInBytes);
Expect.equals(sizeOf<Uint64>(), elements.elementSizeInBytes);
final expected = <int>[];
for (int i = 0; i < arrayLength; i++) {
final value = 100 + i;
array[i] = value;
expected.add(value);
}
Expect.equals(expected.first, elements.first);
Expect.equals(expected.last, elements.last);
// Removed one element from the beginning and one from the end.
final view = Uint64List.view(
elements.buffer,
elements.offsetInBytes + sizeOf<Uint64>(),
arrayLength - 2,
);
Expect.listEquals(expected.sublist(1, arrayLength - 1), view);
Expect.listEquals(
expected.sublist(1, arrayLength - 1),
Uint64List.sublistView(elements, 1, arrayLength - 1),
);
}
void testUint64ArrayElementsTypedDataListBackedByPointer() {
final struct = malloc<Uint64ArrayStruct>();
final array = struct.ref.array;
final elements = array.elements;
Expect.equals(0, elements.offsetInBytes);
Expect.equals(sizeOf<Uint64>() * arrayLength, elements.lengthInBytes);
Expect.equals(sizeOf<Uint64>(), elements.elementSizeInBytes);
final expected = <int>[];
for (int i = 0; i < arrayLength; i++) {
final value = 100 + i;
array[i] = value;
expected.add(value);
}
Expect.equals(expected.first, elements.first);
Expect.equals(expected.last, elements.last);
// Removed one element from the beginning and one from the end.
final view = Uint64List.view(
elements.buffer,
elements.offsetInBytes + sizeOf<Uint64>(),
arrayLength - 2,
);
Expect.listEquals(expected.sublist(1, arrayLength - 1), view);
Expect.listEquals(
expected.sublist(1, arrayLength - 1),
Uint64List.sublistView(elements, 1, arrayLength - 1),
);
malloc.free(struct);
}
@Packed(1)
final class PackedUint64ArrayStruct extends Struct {
// Placeholder value before array to test the offset calculation logic.
@Int8()
external int placeholder;
@Array(arrayLength)
external Array<Uint64> array;
}
void testUint64Misaligned() {
final structPointer = malloc<PackedUint64ArrayStruct>();
var array = structPointer.ref.array;
var e = Expect.throwsArgumentError(() => array.elements);
Expect.isTrue(
e.message.contains(
'Pointer address must be aligned to a multiple of the element size',
),
);
malloc.free(structPointer);
final struct = Struct.create<PackedUint64ArrayStruct>();
array = struct.array;
e = Expect.throwsRangeError(() => array.elements);
Expect.isTrue(e.message.contains('must be a multiple of BYTES_PER_ELEMENT'));
}
final class FloatArrayStruct extends Struct {
// Placeholder value before array to test the offset calculation logic.
@Int8()
external int placeholder;
@Array(arrayLength)
external Array<Float> array;
}
void testFloatArrayElements() {
final struct = Struct.create<FloatArrayStruct>();
final array = struct.array;
final expected = <double>[];
for (int i = 0; i < arrayLength; i++) {
final value = 100.0 + i;
array[i] = value;
expected.add(value);
}
Expect.listEquals(expected, array.elements);
}
void testFloatArrayBackedByInt64ListElements() {
final list = Int64List(6);
final struct = Struct.create<FloatArrayStruct>(list);
final array = struct.array;
final expected = <double>[];
for (int i = 0; i < arrayLength; i++) {
final value = 100.0 + i;
array[i] = value;
expected.add(value);
}
Expect.listEquals(expected, array.elements);
}
void testMallocedFloatArrayElements() {
final struct = malloc<FloatArrayStruct>();
final array = struct.ref.array;
final expected = <double>[];
for (int i = 0; i < arrayLength; i++) {
final value = 100.0 + i;
array[i] = value;
expected.add(value);
}
Expect.listEquals(expected, array.elements);
malloc.free(struct);
}
void testWriteToFloatArrayElementsBackedByTypedData() {
final struct = Struct.create<FloatArrayStruct>();
final array = struct.array;
final expected = <double>[];
for (int i = 0; i < arrayLength; i++) {
final value = 100.0 + i;
array.elements[i] = value;
expected.add(value);
}
Expect.listEquals(expected, array.elements);
final actual = <double>[];
for (int i = 0; i < arrayLength; i++) {
actual.add(array[i]);
}
Expect.listEquals(expected, actual);
}
void testWriteToFloatArrayElementsBackedByPointer() {
final struct = malloc<FloatArrayStruct>();
final array = struct.ref.array;
final expected = <double>[];
for (int i = 0; i < arrayLength; i++) {
final value = 100.0 + i;
array.elements[i] = value;
expected.add(value);
}
Expect.listEquals(expected, array.elements);
final actual = <double>[];
for (int i = 0; i < arrayLength; i++) {
actual.add(array[i]);
}
Expect.listEquals(expected, actual);
malloc.free(struct);
}
void testFloatArrayElementsFirstAndLast() {
final struct = Struct.create<FloatArrayStruct>();
final elements = struct.array.elements;
var value = 100.0 + 3;
elements.first = value;
Expect.equals(value, elements.first);
value = 100.0 + 4;
elements.last = value;
Expect.equals(value, elements.last);
}
void testFloatArrayElementsTypedDataListBackedByTypedData() {
final struct = Struct.create<FloatArrayStruct>();
final array = struct.array;
final elements = array.elements;
Expect.equals(sizeOf<Float>(), elements.offsetInBytes);
Expect.equals(sizeOf<Float>() * arrayLength, elements.lengthInBytes);
Expect.equals(sizeOf<Float>(), elements.elementSizeInBytes);
final expected = <double>[];
for (int i = 0; i < arrayLength; i++) {
final value = 100.0 + i;
array[i] = value;
expected.add(value);
}
Expect.equals(expected.first, elements.first);
Expect.equals(expected.last, elements.last);
// Removed one element from the beginning and one from the end.
final view = Float32List.view(
elements.buffer,
elements.offsetInBytes + sizeOf<Float>(),
arrayLength - 2,
);
Expect.listEquals(expected.sublist(1, arrayLength - 1), view);
Expect.listEquals(
expected.sublist(1, arrayLength - 1),
Float32List.sublistView(elements, 1, arrayLength - 1),
);
}
void testFloatArrayElementsTypedDataListBackedByPointer() {
final struct = malloc<FloatArrayStruct>();
final array = struct.ref.array;
final elements = array.elements;
Expect.equals(0, elements.offsetInBytes);
Expect.equals(sizeOf<Float>() * arrayLength, elements.lengthInBytes);
Expect.equals(sizeOf<Float>(), elements.elementSizeInBytes);
final expected = <double>[];
for (int i = 0; i < arrayLength; i++) {
final value = 100.0 + i;
array[i] = value;
expected.add(value);
}
Expect.equals(expected.first, elements.first);
Expect.equals(expected.last, elements.last);
// Removed one element from the beginning and one from the end.
final view = Float32List.view(
elements.buffer,
elements.offsetInBytes + sizeOf<Float>(),
arrayLength - 2,
);
Expect.listEquals(expected.sublist(1, arrayLength - 1), view);
Expect.listEquals(
expected.sublist(1, arrayLength - 1),
Float32List.sublistView(elements, 1, arrayLength - 1),
);
malloc.free(struct);
}
@Packed(1)
final class PackedFloatArrayStruct extends Struct {
// Placeholder value before array to test the offset calculation logic.
@Int8()
external int placeholder;
@Array(arrayLength)
external Array<Float> array;
}
void testFloatMisaligned() {
final structPointer = malloc<PackedFloatArrayStruct>();
var array = structPointer.ref.array;
var e = Expect.throwsArgumentError(() => array.elements);
Expect.isTrue(
e.message.contains(
'Pointer address must be aligned to a multiple of the element size',
),
);
malloc.free(structPointer);
final struct = Struct.create<PackedFloatArrayStruct>();
array = struct.array;
e = Expect.throwsRangeError(() => array.elements);
Expect.isTrue(e.message.contains('must be a multiple of BYTES_PER_ELEMENT'));
}
final class DoubleArrayStruct extends Struct {
// Placeholder value before array to test the offset calculation logic.
@Int8()
external int placeholder;
@Array(arrayLength)
external Array<Double> array;
}
void testDoubleArrayElements() {
final struct = Struct.create<DoubleArrayStruct>();
final array = struct.array;
final expected = <double>[];
for (int i = 0; i < arrayLength; i++) {
final value = 100.0 + i;
array[i] = value;
expected.add(value);
}
Expect.listEquals(expected, array.elements);
}
void testDoubleArrayBackedByInt64ListElements() {
final list = Int64List(6);
final struct = Struct.create<DoubleArrayStruct>(list);
final array = struct.array;
final expected = <double>[];
for (int i = 0; i < arrayLength; i++) {
final value = 100.0 + i;
array[i] = value;
expected.add(value);
}
Expect.listEquals(expected, array.elements);
}
void testMallocedDoubleArrayElements() {
final struct = malloc<DoubleArrayStruct>();
final array = struct.ref.array;
final expected = <double>[];
for (int i = 0; i < arrayLength; i++) {
final value = 100.0 + i;
array[i] = value;
expected.add(value);
}
Expect.listEquals(expected, array.elements);
malloc.free(struct);
}
void testWriteToDoubleArrayElementsBackedByTypedData() {
final struct = Struct.create<DoubleArrayStruct>();
final array = struct.array;
final expected = <double>[];
for (int i = 0; i < arrayLength; i++) {
final value = 100.0 + i;
array.elements[i] = value;
expected.add(value);
}
Expect.listEquals(expected, array.elements);
final actual = <double>[];
for (int i = 0; i < arrayLength; i++) {
actual.add(array[i]);
}
Expect.listEquals(expected, actual);
}
void testWriteToDoubleArrayElementsBackedByPointer() {
final struct = malloc<DoubleArrayStruct>();
final array = struct.ref.array;
final expected = <double>[];
for (int i = 0; i < arrayLength; i++) {
final value = 100.0 + i;
array.elements[i] = value;
expected.add(value);
}
Expect.listEquals(expected, array.elements);
final actual = <double>[];
for (int i = 0; i < arrayLength; i++) {
actual.add(array[i]);
}
Expect.listEquals(expected, actual);
malloc.free(struct);
}
void testDoubleArrayElementsFirstAndLast() {
final struct = Struct.create<DoubleArrayStruct>();
final elements = struct.array.elements;
var value = 100.0 + 3;
elements.first = value;
Expect.equals(value, elements.first);
value = 100.0 + 4;
elements.last = value;
Expect.equals(value, elements.last);
}
void testDoubleArrayElementsTypedDataListBackedByTypedData() {
final struct = Struct.create<DoubleArrayStruct>();
final array = struct.array;
final elements = array.elements;
Expect.equals(sizeOf<Double>(), elements.offsetInBytes);
Expect.equals(sizeOf<Double>() * arrayLength, elements.lengthInBytes);
Expect.equals(sizeOf<Double>(), elements.elementSizeInBytes);
final expected = <double>[];
for (int i = 0; i < arrayLength; i++) {
final value = 100.0 + i;
array[i] = value;
expected.add(value);
}
Expect.equals(expected.first, elements.first);
Expect.equals(expected.last, elements.last);
// Removed one element from the beginning and one from the end.
final view = Float64List.view(
elements.buffer,
elements.offsetInBytes + sizeOf<Double>(),
arrayLength - 2,
);
Expect.listEquals(expected.sublist(1, arrayLength - 1), view);
Expect.listEquals(
expected.sublist(1, arrayLength - 1),
Float64List.sublistView(elements, 1, arrayLength - 1),
);
}
void testDoubleArrayElementsTypedDataListBackedByPointer() {
final struct = malloc<DoubleArrayStruct>();
final array = struct.ref.array;
final elements = array.elements;
Expect.equals(0, elements.offsetInBytes);
Expect.equals(sizeOf<Double>() * arrayLength, elements.lengthInBytes);
Expect.equals(sizeOf<Double>(), elements.elementSizeInBytes);
final expected = <double>[];
for (int i = 0; i < arrayLength; i++) {
final value = 100.0 + i;
array[i] = value;
expected.add(value);
}
Expect.equals(expected.first, elements.first);
Expect.equals(expected.last, elements.last);
// Removed one element from the beginning and one from the end.
final view = Float64List.view(
elements.buffer,
elements.offsetInBytes + sizeOf<Double>(),
arrayLength - 2,
);
Expect.listEquals(expected.sublist(1, arrayLength - 1), view);
Expect.listEquals(
expected.sublist(1, arrayLength - 1),
Float64List.sublistView(elements, 1, arrayLength - 1),
);
malloc.free(struct);
}
@Packed(1)
final class PackedDoubleArrayStruct extends Struct {
// Placeholder value before array to test the offset calculation logic.
@Int8()
external int placeholder;
@Array(arrayLength)
external Array<Double> array;
}
void testDoubleMisaligned() {
final structPointer = malloc<PackedDoubleArrayStruct>();
var array = structPointer.ref.array;
var e = Expect.throwsArgumentError(() => array.elements);
Expect.isTrue(
e.message.contains(
'Pointer address must be aligned to a multiple of the element size',
),
);
malloc.free(structPointer);
final struct = Struct.create<PackedDoubleArrayStruct>();
array = struct.array;
e = Expect.throwsRangeError(() => array.elements);
Expect.isTrue(e.message.contains('must be a multiple of BYTES_PER_ELEMENT'));
}
final class BoolArrayStruct extends Struct {
// Placeholder value before array to test the offset calculation logic.
@Int8()
external int placeholder;
@Array(arrayLength)
external Array<Bool> array;
}
void testBoolArrayElements() {
final struct = Struct.create<BoolArrayStruct>();
final array = struct.array;
final expected = <bool>[];
for (int i = 0; i < arrayLength; i++) {
final value = i.isEven;
array[i] = value;
expected.add(value);
}
Expect.listEquals(expected, array.elements);
}
void testBoolArrayBackedByInt64ListElements() {
final list = Int64List(6);
final struct = Struct.create<BoolArrayStruct>(list);
final array = struct.array;
final expected = <bool>[];
for (int i = 0; i < arrayLength; i++) {
final value = i.isEven;
array[i] = value;
expected.add(value);
}
Expect.listEquals(expected, array.elements);
}
void testMallocedBoolArrayElements() {
final struct = malloc<BoolArrayStruct>();
final array = struct.ref.array;
final expected = <bool>[];
for (int i = 0; i < arrayLength; i++) {
final value = i.isEven;
array[i] = value;
expected.add(value);
}
Expect.listEquals(expected, array.elements);
malloc.free(struct);
}
void testWriteToBoolArrayElementsBackedByTypedData() {
final struct = Struct.create<BoolArrayStruct>();
final array = struct.array;
final expected = <bool>[];
for (int i = 0; i < arrayLength; i++) {
final value = i.isEven;
array.elements[i] = value;
expected.add(value);
}
Expect.listEquals(expected, array.elements);
final actual = <bool>[];
for (int i = 0; i < arrayLength; i++) {
actual.add(array[i]);
}
Expect.listEquals(expected, actual);
}
void testWriteToBoolArrayElementsBackedByPointer() {
final struct = malloc<BoolArrayStruct>();
final array = struct.ref.array;
final expected = <bool>[];
for (int i = 0; i < arrayLength; i++) {
final value = i.isEven;
array.elements[i] = value;
expected.add(value);
}
Expect.listEquals(expected, array.elements);
final actual = <bool>[];
for (int i = 0; i < arrayLength; i++) {
actual.add(array[i]);
}
Expect.listEquals(expected, actual);
malloc.free(struct);
}
void testBoolArrayElementsFirstAndLast() {
final struct = Struct.create<BoolArrayStruct>();
final elements = struct.array.elements;
var value = 3.isEven;
elements.first = value;
Expect.equals(value, elements.first);
value = 4.isEven;
elements.last = value;
Expect.equals(value, elements.last);
}
final class WCharArrayStruct extends Struct {
// Placeholder value before array to test the offset calculation logic.
@Int8()
external int placeholder;
@Array(arrayLength)
external Array<WChar> array;
}
void testWCharArrayElements() {
final struct = Struct.create<WCharArrayStruct>();
final array = struct.array;
final expected = <int>[];
for (int i = 0; i < arrayLength; i++) {
final value = 100 + i;
array[i] = value;
expected.add(value);
}
Expect.listEquals(expected, array.elements);
}
void testWCharArrayBackedByInt64ListElements() {
final list = Int64List(6);
final struct = Struct.create<WCharArrayStruct>(list);
final array = struct.array;
final expected = <int>[];
for (int i = 0; i < arrayLength; i++) {
final value = 100 + i;
array[i] = value;
expected.add(value);
}
Expect.listEquals(expected, array.elements);
}
void testMallocedWCharArrayElements() {
final struct = malloc<WCharArrayStruct>();
final array = struct.ref.array;
final expected = <int>[];
for (int i = 0; i < arrayLength; i++) {
final value = 100 + i;
array[i] = value;
expected.add(value);
}
Expect.listEquals(expected, array.elements);
malloc.free(struct);
}
void testWriteToWCharArrayElementsBackedByTypedData() {
final struct = Struct.create<WCharArrayStruct>();
final array = struct.array;
final expected = <int>[];
for (int i = 0; i < arrayLength; i++) {
final value = 100 + i;
array.elements[i] = value;
expected.add(value);
}
Expect.listEquals(expected, array.elements);
final actual = <int>[];
for (int i = 0; i < arrayLength; i++) {
actual.add(array[i]);
}
Expect.listEquals(expected, actual);
}
void testWriteToWCharArrayElementsBackedByPointer() {
final struct = malloc<WCharArrayStruct>();
final array = struct.ref.array;
final expected = <int>[];
for (int i = 0; i < arrayLength; i++) {
final value = 100 + i;
array.elements[i] = value;
expected.add(value);
}
Expect.listEquals(expected, array.elements);
final actual = <int>[];
for (int i = 0; i < arrayLength; i++) {
actual.add(array[i]);
}
Expect.listEquals(expected, actual);
malloc.free(struct);
}
void testWCharArrayElementsFirstAndLast() {
final struct = Struct.create<WCharArrayStruct>();
final elements = struct.array.elements;
var value = 100 + 3;
elements.first = value;
Expect.equals(value, elements.first);
value = 100 + 4;
elements.last = value;
Expect.equals(value, elements.last);
}