18af310c01
_BoolArrayList needs to extend FixedLengthListMixin instead of UnmodifiableListMixin since it implements `operator []=`. Also contains some other doc fixes that were brought up post-submit in https://dart-review.googlesource.com/c/sdk/+/414821. TEST=tests/ffi/array_primitive_elements_generated_test.dart CoreLibraryReviewExempt: Dart VM only. Bug: https://github.com/dart-lang/sdk/issues/45508 Change-Id: I7635152283aec51a4f38e06fdfc7da84e93e55ab Cq-Include-Trybots: dart/try:vm-aot-android-release-arm64c-try,vm-aot-android-release-arm_x64-try,vm-aot-asan-linux-release-x64-try,vm-aot-linux-debug-x64-try,vm-aot-linux-debug-x64c-try,vm-aot-mac-release-arm64-try,vm-aot-mac-release-x64-try,vm-aot-msan-linux-release-x64-try,vm-aot-obfuscate-linux-release-x64-try,vm-aot-optimization-level-linux-release-x64-try,vm-aot-tsan-linux-release-x64-try,vm-aot-ubsan-linux-release-x64-try,vm-aot-win-debug-arm64-try,vm-aot-win-debug-x64-try,vm-aot-win-debug-x64c-try,vm-appjit-linux-debug-x64-try,vm-asan-linux-release-arm64-try,vm-asan-linux-release-x64-try,vm-checked-mac-release-arm64-try,vm-eager-optimization-linux-release-ia32-try,vm-eager-optimization-linux-release-x64-try,vm-ffi-android-debug-arm-try,vm-ffi-android-debug-arm64c-try,vm-ffi-mac-debug-simarm64_arm64-try,vm-ffi-qemu-linux-release-arm-try,vm-ffi-qemu-linux-release-riscv64-try,vm-fuchsia-release-arm64-try,vm-fuchsia-release-x64-try,vm-linux-debug-ia32-try,vm-linux-debug-x64-try,vm-linux-debug-x64c-try,vm-mac-debug-arm64-try,vm-mac-debug-x64-try,vm-msan-linux-release-arm64-try,vm-msan-linux-release-x64-try,vm-reload-linux-debug-x64-try,vm-reload-rollback-linux-debug-x64-try,vm-tsan-linux-release-arm64-try,vm-tsan-linux-release-x64-try,vm-ubsan-linux-release-arm64-try,vm-ubsan-linux-release-x64-try,vm-win-debug-arm64-try,vm-win-debug-x64-try,vm-win-debug-x64c-try,vm-win-release-ia32-try Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/417100 Reviewed-by: Daco Harkes <dacoharkes@google.com> Commit-Queue: Michael Goderbauer <goderbauer@google.com>
2089 lines
61 KiB
Dart
2089 lines
61 KiB
Dart
// 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);
|
|
}
|