| // 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); | |
| } |