| // Copyright (c) 2021, 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. |
| // |
| // SharedObjects=ffi_test_functions |
| |
| // @dart = 2.9 |
| |
| import 'dart:ffi'; |
| |
| import "package:expect/expect.dart"; |
| import 'package:ffi/ffi.dart'; |
| |
| // Reuse compound definitions. |
| import 'function_structs_by_value_generated_compounds.dart'; |
| |
| void main() { |
| testSizeOf(); |
| testLoad(); |
| testStore(); |
| testToString(); |
| testRange(); |
| } |
| |
| void testSizeOf() { |
| Expect.equals(8, sizeOf<Struct8BytesInlineArrayInt>()); |
| Expect.equals(10, sizeOf<StructInlineArrayIrregular>()); |
| Expect.equals(4008, sizeOf<StructInlineArrayBig>()); |
| } |
| |
| // Only tests with Pointer as backing store. |
| void testLoad() { |
| final pointer = calloc<Struct8BytesInlineArrayInt>(); |
| final struct = pointer.ref; |
| final array = struct.a0; |
| pointer.cast<Uint8>()[0] = 42; |
| pointer.cast<Uint8>()[7] = 3; |
| Expect.equals(42, array[0]); |
| Expect.equals(3, array[7]); |
| calloc.free(pointer); |
| } |
| |
| // Only tests with Pointer as backing store. |
| void testStore() { |
| final pointer = calloc<Struct8BytesInlineArrayInt>(); |
| pointer.cast<Uint8>()[0] = 42; |
| pointer.cast<Uint8>()[7] = 3; |
| final pointer2 = calloc<Struct8BytesInlineArrayInt>(); |
| pointer2.ref.a0 = pointer.ref.a0; |
| Expect.equals(42, pointer2.ref.a0[0]); |
| Expect.equals(3, pointer2.ref.a0[7]); |
| calloc.free(pointer); |
| calloc.free(pointer2); |
| } |
| |
| // Tests the toString of the test generator. |
| void testToString() { |
| final pointer = calloc<Struct8BytesInlineArrayInt>(); |
| final struct = pointer.ref; |
| final array = struct.a0; |
| for (var i = 0; i < 8; i++) { |
| array[i] = i; |
| } |
| Expect.equals("([0, 1, 2, 3, 4, 5, 6, 7])", struct.toString()); |
| calloc.free(pointer); |
| |
| final pointer2 = calloc<StructInlineArrayIrregular>(); |
| final struct2 = pointer2.ref; |
| struct2.a0[0].a0 = 0; |
| struct2.a0[0].a1 = 1; |
| struct2.a0[1].a0 = 2; |
| struct2.a0[1].a1 = 3; |
| struct2.a1 = 4; |
| print(struct2); |
| Expect.equals("([(0, 1), (2, 3)], 4)", struct2.toString()); |
| calloc.free(pointer2); |
| } |
| |
| void testRange() { |
| final pointer = calloc<Struct8BytesInlineArrayInt>(); |
| final struct = pointer.ref; |
| final array = struct.a0; |
| array[0] = 1; |
| Expect.equals(1, array[0]); |
| array[7] = 7; |
| Expect.equals(7, array[7]); |
| Expect.throws(() => array[-1]); |
| Expect.throws(() => array[-1] = 0); |
| Expect.throws(() => array[8]); |
| Expect.throws(() => array[8] = 0); |
| calloc.free(pointer); |
| } |