// Copyright (c) 2020, 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 tests the non trampoline aspects of nested structs.
//
// SharedObjects=ffi_test_functions

import 'dart:ffi';

import "package:expect/expect.dart";
import "package:ffi/ffi.dart";

import 'dylib_utils.dart';

final ffiTestFunctions = dlopenPlatformSpecific("ffi_test_functions");
void main() {
  for (int i = 0; i < 10; ++i) {
    testSizeOf();
    testAllocate();
    testRead();
    testWrite();
    testCopy();
  }
}

class Struct4BytesHomogeneousInt16 extends Struct {
  @Int16()
  external int a0;

  @Int16()
  external int a1;

  String toString() => "(${a0}, ${a1})";
}

class Struct8BytesNestedInt extends Struct {
  external Struct4BytesHomogeneousInt16 a0;

  external Struct4BytesHomogeneousInt16 a1;

  String toString() => "(${a0}, ${a1})";
}

void testSizeOf() {
  print(sizeOf<Struct8BytesNestedInt>());
  Expect.equals(8, sizeOf<Struct8BytesNestedInt>());
}

void testAllocate() {
  final p = calloc<Struct8BytesNestedInt>();
  Expect.type<Pointer<Struct8BytesNestedInt>>(p);
  print(p);
  calloc.free(p);
}

/// Test that reading does not segfault, even uninitialized.
void testRead() {
  print("read");
  final p = calloc<Struct8BytesNestedInt>();
  print(p);
  print(p.ref.runtimeType);
  print(p.address);
  print(p.ref.a0.runtimeType);
  print(p.ref.a0.a0);
  calloc.free(p);
  print("read");
}

void testWrite() {
  print("write");
  final p = calloc<Struct8BytesNestedInt>(2);
  p[0].a0.a0 = 12;
  p[0].a0.a1 = 13;
  p[0].a1.a0 = 14;
  p[0].a1.a1 = 15;
  p[1].a0.a0 = 16;
  p[1].a0.a1 = 17;
  p[1].a1.a0 = 18;
  p[1].a1.a1 = 19;
  Expect.equals(12, p[0].a0.a0);
  Expect.equals(13, p[0].a0.a1);
  Expect.equals(14, p[0].a1.a0);
  Expect.equals(15, p[0].a1.a1);
  Expect.equals(16, p[1].a0.a0);
  Expect.equals(17, p[1].a0.a1);
  Expect.equals(18, p[1].a1.a0);
  Expect.equals(19, p[1].a1.a1);
  calloc.free(p);
  print("written");
}

void testCopy() {
  print("copy");
  final p = calloc<Struct8BytesNestedInt>();
  p.ref.a0.a0 = 12;
  p.ref.a0.a1 = 13;
  p.ref.a1 = p.ref.a0;
  Expect.equals(12, p.ref.a1.a0);
  Expect.equals(13, p.ref.a1.a1);
  calloc.free(p);
  print("copied");
}
