// Copyright (c) 2024, 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

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() {
  testInlineArray();
  testInlineArrayNested();
  testInlineArrayNestedDeep();
  testSizeOf();
}

void testInlineArray() {
  const length = 10;
  final lengthInBytes =
      sizeOf<StructInlineArrayVariable>() + sizeOf<Uint8>() * length;
  final pointer = calloc.allocate<StructInlineArrayVariable>(lengthInBytes);
  pointer.ref.a0 = length;
  final struct = pointer.ref;
  for (int i = 0; i < length; i++) {
    struct.a1[i] = i;
  }
  var sum = 0;
  for (int i = 0; i < length; i++) {
    sum += struct.a1[i];
  }
  calloc.free(pointer);
  Expect.equals(45, sum);
}

void testInlineArrayNested() {
  const length = 10;
  final lengthInBytes = sizeOf<StructInlineArrayVariableNested>() +
      sizeOf<Uint8>() * length * 2 * 2;
  final pointer =
      calloc.allocate<StructInlineArrayVariableNested>(lengthInBytes);
  pointer.ref.a0 = length;
  final struct = pointer.ref;
  for (int i = 0; i < length; i++) {
    struct.a1[i][0][0] = i;
  }
  var sum = 0;
  for (int i = 0; i < length; i++) {
    sum += struct.a1[i][0][0];
  }
  calloc.free(pointer);
  Expect.equals(45, sum);
}

void testInlineArrayNestedDeep() {
  const length = 10;
  final lengthInBytes = sizeOf<StructInlineArrayVariableNestedDeep>() +
      sizeOf<Uint8>() * length * 2 * 2 * 2 * 2 * 2 * 2;
  final pointer =
      calloc.allocate<StructInlineArrayVariableNestedDeep>(lengthInBytes);
  pointer.ref.a0 = length;
  final struct = pointer.ref;
  for (int i = 0; i < length; i++) {
    struct.a1[i][0][0][1][1][0][0] = i;
  }
  var sum = 0;
  for (int i = 0; i < length; i++) {
    sum += struct.a1[i][0][0][1][1][0][0];
  }
  calloc.free(pointer);
  Expect.equals(45, sum);
}

final class Foo extends Struct {
  @Int8()
  external int field0;
}

final class Foo2 extends Struct {
  @Int8()
  external int field0;

  @Array<Uint32>.variable()
  external Array<Uint32> field1;
}

void testSizeOf() {
  Expect.equals(1, sizeOf<Foo>());
  Expect.equals(4, sizeOf<Foo2>());
}
