// Copyright (c) 2019, 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. // // Dart test program for testing dart:ffi struct pointers. library FfiTest; import 'dart:ffi' as ffi; import "package:expect/expect.dart"; import 'coordinate_bare.dart' as bare; import 'coordinate_manual.dart' as manual; import 'coordinate.dart'; void main() { testStructAllocate(); testStructFromAddress(); testStructWithNulls(); testBareStruct(); testManualStruct(); testTypeTest(); } /// allocates each coordinate separately in c memory void testStructAllocate() { Coordinate c1 = Coordinate(10.0, 10.0, null); Coordinate c2 = Coordinate(20.0, 20.0, c1); Coordinate c3 = Coordinate(30.0, 30.0, c2); c1.next = c3; Coordinate currentCoordinate = c1; Expect.equals(10.0, currentCoordinate.x); currentCoordinate = currentCoordinate.next; Expect.equals(30.0, currentCoordinate.x); currentCoordinate = currentCoordinate.next; Expect.equals(20.0, currentCoordinate.x); currentCoordinate = currentCoordinate.next; Expect.equals(10.0, currentCoordinate.x); c1.free(); c2.free(); c3.free(); } /// allocates coordinates consecutively in c memory void testStructFromAddress() { Coordinate c1 = Coordinate.allocate(count: 3); Coordinate c2 = c1.elementAt(1); Coordinate c3 = c1.elementAt(2); c1.x = 10.0; c1.y = 10.0; c1.next = c3; c2.x = 20.0; c2.y = 20.0; c2.next = c1; c3.x = 30.0; c3.y = 30.0; c3.next = c2; Coordinate currentCoordinate = c1; Expect.equals(10.0, currentCoordinate.x); currentCoordinate = currentCoordinate.next; Expect.equals(30.0, currentCoordinate.x); currentCoordinate = currentCoordinate.next; Expect.equals(20.0, currentCoordinate.x); currentCoordinate = currentCoordinate.next; Expect.equals(10.0, currentCoordinate.x); c1.free(); } void testStructWithNulls() { Coordinate coordinate = Coordinate(10.0, 10.0, null); Expect.isNull(coordinate.next); coordinate.next = coordinate; Expect.isNotNull(coordinate.next); coordinate.next = null; Expect.isNull(coordinate.next); coordinate.free(); } void testBareStruct() { int structSize = ffi.sizeOf() * 2 + ffi.sizeOf(); bare.Coordinate c1 = ffi.allocate(count: structSize * 3).cast(); bare.Coordinate c2 = c1.offsetBy(structSize).cast(); bare.Coordinate c3 = c1.offsetBy(structSize * 2).cast(); c1.x = 10.0; c1.y = 10.0; c1.next = c3; c2.x = 20.0; c2.y = 20.0; c2.next = c1; c3.x = 30.0; c3.y = 30.0; c3.next = c2; bare.Coordinate currentCoordinate = c1; Expect.equals(10.0, currentCoordinate.x); currentCoordinate = currentCoordinate.next; Expect.equals(30.0, currentCoordinate.x); currentCoordinate = currentCoordinate.next; Expect.equals(20.0, currentCoordinate.x); currentCoordinate = currentCoordinate.next; Expect.equals(10.0, currentCoordinate.x); c1.free(); } void testManualStruct() { manual.Coordinate c1 = manual.Coordinate(10.0, 10.0, null); manual.Coordinate c2 = manual.Coordinate(20.0, 20.0, c1); manual.Coordinate c3 = manual.Coordinate(30.0, 30.0, c2); c1.next = c3; manual.Coordinate currentCoordinate = c1; Expect.equals(10.0, currentCoordinate.x); currentCoordinate = currentCoordinate.next; Expect.equals(30.0, currentCoordinate.x); currentCoordinate = currentCoordinate.next; Expect.equals(20.0, currentCoordinate.x); currentCoordinate = currentCoordinate.next; Expect.equals(10.0, currentCoordinate.x); c1.free(); c2.free(); c3.free(); } void testTypeTest() { Coordinate c = Coordinate(10, 10, null); Expect.isTrue(c is ffi.Pointer); Expect.isTrue(c is ffi.Pointer); c.free(); }