// Copyright (c) 2023, 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/structs_by_value_tests_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 "package:expect/expect.dart";
import "package:ffi/ffi.dart";

import 'dylib_utils.dart';

// Reuse the compound classes.
import 'function_structs_by_value_generated_compounds.dart';

final ffiTestFunctions = dlopenPlatformSpecific("ffi_test_functions");
void main() {
  // Force dlopen so @Native lookups in DynamicLibrary.process() succeed.
  dlopenGlobalPlatformSpecific('ffi_test_functions');

  for (int i = 0; i < 100; ++i) {
    testReturnStructArgumentStruct1ByteIntNativeLeaf();
    testReturnStructArgumentInt32x8Struct1ByteIntNativeLeaf();
    testReturnStructArgumentStruct8BytesHomogeneousFloatNativeLeaf();
    testReturnStructArgumentStruct20BytesHomogeneousInt32NativeLeaf();
    testReturnStructArgumentInt32x8Struct20BytesHomogeneouNativeLeaf();
    testReturnStructArgumentStruct8BytesInlineArrayIntNativeLeaf();
    testReturnStructArgumentStructStruct16BytesHomogeneousNativeLeaf();
    testReturnStructArgumentStructStruct32BytesHomogeneousNativeLeaf();
    testReturnStructArgumentStructStruct16BytesMixed3NativeLeaf();
    testReturnStructAlignmentInt16NativeLeaf();
    testReturnStructAlignmentInt32NativeLeaf();
    testReturnStructAlignmentInt64NativeLeaf();
    testReturnStruct8BytesNestedIntNativeLeaf();
    testReturnStruct8BytesNestedFloatNativeLeaf();
    testReturnStruct8BytesNestedFloat2NativeLeaf();
    testReturnStruct8BytesNestedMixedNativeLeaf();
    testReturnStruct16BytesNestedIntNativeLeaf();
    testReturnStruct32BytesNestedIntNativeLeaf();
    testReturnStructNestedIntStructAlignmentInt16NativeLeaf();
    testReturnStructNestedIntStructAlignmentInt32NativeLeaf();
    testReturnStructNestedIntStructAlignmentInt64NativeLeaf();
    testReturnStructNestedIrregularEvenBiggerNativeLeaf();
  }
}

@Native<Struct1ByteInt Function(Struct1ByteInt)>(
    symbol: 'ReturnStructArgumentStruct1ByteInt', isLeaf: true)
external Struct1ByteInt returnStructArgumentStruct1ByteIntNativeLeaf(
    Struct1ByteInt a0);

/// Test that a struct passed in as argument can be returned.
/// Especially for ffi callbacks.
/// Struct is passed in int registers in most ABIs.
void testReturnStructArgumentStruct1ByteIntNativeLeaf() {
  final a0Pointer = calloc<Struct1ByteInt>();
  final Struct1ByteInt a0 = a0Pointer.ref;

  a0.a0 = -1;

  final result = returnStructArgumentStruct1ByteIntNativeLeaf(a0);

  print("result = $result");

  Expect.equals(a0.a0, result.a0);

  calloc.free(a0Pointer);
}

@Native<
        Struct1ByteInt Function(Int32, Int32, Int32, Int32, Int32, Int32, Int32,
            Int32, Struct1ByteInt)>(
    symbol: 'ReturnStructArgumentInt32x8Struct1ByteInt', isLeaf: true)
external Struct1ByteInt returnStructArgumentInt32x8Struct1ByteIntNativeLeaf(
    int a0,
    int a1,
    int a2,
    int a3,
    int a4,
    int a5,
    int a6,
    int a7,
    Struct1ByteInt a8);

/// Test that a struct passed in as argument can be returned.
/// Especially for ffi callbacks.
/// Struct is passed on stack on all ABIs.
void testReturnStructArgumentInt32x8Struct1ByteIntNativeLeaf() {
  int a0;
  int a1;
  int a2;
  int a3;
  int a4;
  int a5;
  int a6;
  int a7;
  final a8Pointer = calloc<Struct1ByteInt>();
  final Struct1ByteInt a8 = a8Pointer.ref;

  a0 = -1;
  a1 = 2;
  a2 = -3;
  a3 = 4;
  a4 = -5;
  a5 = 6;
  a6 = -7;
  a7 = 8;
  a8.a0 = -9;

  final result = returnStructArgumentInt32x8Struct1ByteIntNativeLeaf(
      a0, a1, a2, a3, a4, a5, a6, a7, a8);

  print("result = $result");

  Expect.equals(a8.a0, result.a0);

  calloc.free(a8Pointer);
}

@Native<Struct8BytesHomogeneousFloat Function(Struct8BytesHomogeneousFloat)>(
    symbol: 'ReturnStructArgumentStruct8BytesHomogeneousFloat', isLeaf: true)
external Struct8BytesHomogeneousFloat
    returnStructArgumentStruct8BytesHomogeneousFloatNativeLeaf(
        Struct8BytesHomogeneousFloat a0);

/// Test that a struct passed in as argument can be returned.
/// Especially for ffi callbacks.
/// Struct is passed in float registers in most ABIs.
void testReturnStructArgumentStruct8BytesHomogeneousFloatNativeLeaf() {
  final a0Pointer = calloc<Struct8BytesHomogeneousFloat>();
  final Struct8BytesHomogeneousFloat a0 = a0Pointer.ref;

  a0.a0 = -1.0;
  a0.a1 = 2.0;

  final result = returnStructArgumentStruct8BytesHomogeneousFloatNativeLeaf(a0);

  print("result = $result");

  Expect.approxEquals(a0.a0, result.a0);
  Expect.approxEquals(a0.a1, result.a1);

  calloc.free(a0Pointer);
}

@Native<Struct20BytesHomogeneousInt32 Function(Struct20BytesHomogeneousInt32)>(
    symbol: 'ReturnStructArgumentStruct20BytesHomogeneousInt32', isLeaf: true)
external Struct20BytesHomogeneousInt32
    returnStructArgumentStruct20BytesHomogeneousInt32NativeLeaf(
        Struct20BytesHomogeneousInt32 a0);

/// On arm64, both argument and return value are passed in by pointer.
void testReturnStructArgumentStruct20BytesHomogeneousInt32NativeLeaf() {
  final a0Pointer = calloc<Struct20BytesHomogeneousInt32>();
  final Struct20BytesHomogeneousInt32 a0 = a0Pointer.ref;

  a0.a0 = -1;
  a0.a1 = 2;
  a0.a2 = -3;
  a0.a3 = 4;
  a0.a4 = -5;

  final result =
      returnStructArgumentStruct20BytesHomogeneousInt32NativeLeaf(a0);

  print("result = $result");

  Expect.equals(a0.a0, result.a0);
  Expect.equals(a0.a1, result.a1);
  Expect.equals(a0.a2, result.a2);
  Expect.equals(a0.a3, result.a3);
  Expect.equals(a0.a4, result.a4);

  calloc.free(a0Pointer);
}

@Native<
        Struct20BytesHomogeneousInt32 Function(Int32, Int32, Int32, Int32,
            Int32, Int32, Int32, Int32, Struct20BytesHomogeneousInt32)>(
    symbol: 'ReturnStructArgumentInt32x8Struct20BytesHomogeneou', isLeaf: true)
external Struct20BytesHomogeneousInt32
    returnStructArgumentInt32x8Struct20BytesHomogeneouNativeLeaf(
        int a0,
        int a1,
        int a2,
        int a3,
        int a4,
        int a5,
        int a6,
        int a7,
        Struct20BytesHomogeneousInt32 a8);

/// On arm64, both argument and return value are passed in by pointer.
/// Ints exhaust registers, so that pointer is passed on stack.
void testReturnStructArgumentInt32x8Struct20BytesHomogeneouNativeLeaf() {
  int a0;
  int a1;
  int a2;
  int a3;
  int a4;
  int a5;
  int a6;
  int a7;
  final a8Pointer = calloc<Struct20BytesHomogeneousInt32>();
  final Struct20BytesHomogeneousInt32 a8 = a8Pointer.ref;

  a0 = -1;
  a1 = 2;
  a2 = -3;
  a3 = 4;
  a4 = -5;
  a5 = 6;
  a6 = -7;
  a7 = 8;
  a8.a0 = -9;
  a8.a1 = 10;
  a8.a2 = -11;
  a8.a3 = 12;
  a8.a4 = -13;

  final result = returnStructArgumentInt32x8Struct20BytesHomogeneouNativeLeaf(
      a0, a1, a2, a3, a4, a5, a6, a7, a8);

  print("result = $result");

  Expect.equals(a8.a0, result.a0);
  Expect.equals(a8.a1, result.a1);
  Expect.equals(a8.a2, result.a2);
  Expect.equals(a8.a3, result.a3);
  Expect.equals(a8.a4, result.a4);

  calloc.free(a8Pointer);
}

@Native<Struct8BytesInlineArrayInt Function(Struct8BytesInlineArrayInt)>(
    symbol: 'ReturnStructArgumentStruct8BytesInlineArrayInt', isLeaf: true)
external Struct8BytesInlineArrayInt
    returnStructArgumentStruct8BytesInlineArrayIntNativeLeaf(
        Struct8BytesInlineArrayInt a0);

/// Test returning struct with inline array.
void testReturnStructArgumentStruct8BytesInlineArrayIntNativeLeaf() {
  final a0Pointer = calloc<Struct8BytesInlineArrayInt>();
  final Struct8BytesInlineArrayInt a0 = a0Pointer.ref;

  a0.a0[0] = 1;
  a0.a0[1] = 2;
  a0.a0[2] = 3;
  a0.a0[3] = 4;
  a0.a0[4] = 5;
  a0.a0[5] = 6;
  a0.a0[6] = 7;
  a0.a0[7] = 8;

  final result = returnStructArgumentStruct8BytesInlineArrayIntNativeLeaf(a0);

  print("result = $result");

  for (int i = 0; i < 8; i++) {
    Expect.equals(a0.a0[i], result.a0[i]);
  }

  calloc.free(a0Pointer);
}

@Native<
        StructStruct16BytesHomogeneousFloat2 Function(
            StructStruct16BytesHomogeneousFloat2)>(
    symbol: 'ReturnStructArgumentStructStruct16BytesHomogeneous', isLeaf: true)
external StructStruct16BytesHomogeneousFloat2
    returnStructArgumentStructStruct16BytesHomogeneousNativeLeaf(
        StructStruct16BytesHomogeneousFloat2 a0);

/// Return value in FPU registers on arm hardfp and arm64.
void testReturnStructArgumentStructStruct16BytesHomogeneousNativeLeaf() {
  final a0Pointer = calloc<StructStruct16BytesHomogeneousFloat2>();
  final StructStruct16BytesHomogeneousFloat2 a0 = a0Pointer.ref;

  a0.a0.a0 = -1.0;
  a0.a1[0].a0 = 2.0;
  a0.a1[1].a0 = -3.0;
  a0.a2 = 4.0;

  final result =
      returnStructArgumentStructStruct16BytesHomogeneousNativeLeaf(a0);

  print("result = $result");

  Expect.approxEquals(a0.a0.a0, result.a0.a0);
  for (int i = 0; i < 2; i++) {
    Expect.approxEquals(a0.a1[i].a0, result.a1[i].a0);
  }
  Expect.approxEquals(a0.a2, result.a2);

  calloc.free(a0Pointer);
}

@Native<
        StructStruct32BytesHomogeneousDouble2 Function(
            StructStruct32BytesHomogeneousDouble2)>(
    symbol: 'ReturnStructArgumentStructStruct32BytesHomogeneous', isLeaf: true)
external StructStruct32BytesHomogeneousDouble2
    returnStructArgumentStructStruct32BytesHomogeneousNativeLeaf(
        StructStruct32BytesHomogeneousDouble2 a0);

/// Return value in FPU registers on arm64.
void testReturnStructArgumentStructStruct32BytesHomogeneousNativeLeaf() {
  final a0Pointer = calloc<StructStruct32BytesHomogeneousDouble2>();
  final StructStruct32BytesHomogeneousDouble2 a0 = a0Pointer.ref;

  a0.a0.a0 = -1.0;
  a0.a1[0].a0 = 2.0;
  a0.a1[1].a0 = -3.0;
  a0.a2 = 4.0;

  final result =
      returnStructArgumentStructStruct32BytesHomogeneousNativeLeaf(a0);

  print("result = $result");

  Expect.approxEquals(a0.a0.a0, result.a0.a0);
  for (int i = 0; i < 2; i++) {
    Expect.approxEquals(a0.a1[i].a0, result.a1[i].a0);
  }
  Expect.approxEquals(a0.a2, result.a2);

  calloc.free(a0Pointer);
}

@Native<StructStruct16BytesMixed3 Function(StructStruct16BytesMixed3)>(
    symbol: 'ReturnStructArgumentStructStruct16BytesMixed3', isLeaf: true)
external StructStruct16BytesMixed3
    returnStructArgumentStructStruct16BytesMixed3NativeLeaf(
        StructStruct16BytesMixed3 a0);

/// On x64 Linux, return value is split over FP and int registers.
void testReturnStructArgumentStructStruct16BytesMixed3NativeLeaf() {
  final a0Pointer = calloc<StructStruct16BytesMixed3>();
  final StructStruct16BytesMixed3 a0 = a0Pointer.ref;

  a0.a0.a0 = -1.0;
  a0.a1[0].a0 = 2.0;
  a0.a1[0].a1 = -3;
  a0.a1[0].a2 = 4;
  a0.a2[0] = -5;
  a0.a2[1] = 6;

  final result = returnStructArgumentStructStruct16BytesMixed3NativeLeaf(a0);

  print("result = $result");

  Expect.approxEquals(a0.a0.a0, result.a0.a0);
  for (int i = 0; i < 1; i++) {
    Expect.approxEquals(a0.a1[i].a0, result.a1[i].a0);
    Expect.equals(a0.a1[i].a1, result.a1[i].a1);
    Expect.equals(a0.a1[i].a2, result.a1[i].a2);
  }
  for (int i = 0; i < 2; i++) {
    Expect.equals(a0.a2[i], result.a2[i]);
  }

  calloc.free(a0Pointer);
}

@Native<StructAlignmentInt16 Function(Int8, Int16, Int8)>(
    symbol: 'ReturnStructAlignmentInt16', isLeaf: true)
external StructAlignmentInt16 returnStructAlignmentInt16NativeLeaf(
    int a0, int a1, int a2);

/// Test alignment and padding of 16 byte int within struct.
void testReturnStructAlignmentInt16NativeLeaf() {
  int a0;
  int a1;
  int a2;

  a0 = -1;
  a1 = 2;
  a2 = -3;

  final result = returnStructAlignmentInt16NativeLeaf(a0, a1, a2);

  print("result = $result");

  Expect.equals(a0, result.a0);
  Expect.equals(a1, result.a1);
  Expect.equals(a2, result.a2);
}

@Native<StructAlignmentInt32 Function(Int8, Int32, Int8)>(
    symbol: 'ReturnStructAlignmentInt32', isLeaf: true)
external StructAlignmentInt32 returnStructAlignmentInt32NativeLeaf(
    int a0, int a1, int a2);

/// Test alignment and padding of 32 byte int within struct.
void testReturnStructAlignmentInt32NativeLeaf() {
  int a0;
  int a1;
  int a2;

  a0 = -1;
  a1 = 2;
  a2 = -3;

  final result = returnStructAlignmentInt32NativeLeaf(a0, a1, a2);

  print("result = $result");

  Expect.equals(a0, result.a0);
  Expect.equals(a1, result.a1);
  Expect.equals(a2, result.a2);
}

@Native<StructAlignmentInt64 Function(Int8, Int64, Int8)>(
    symbol: 'ReturnStructAlignmentInt64', isLeaf: true)
external StructAlignmentInt64 returnStructAlignmentInt64NativeLeaf(
    int a0, int a1, int a2);

/// Test alignment and padding of 64 byte int within struct.
void testReturnStructAlignmentInt64NativeLeaf() {
  int a0;
  int a1;
  int a2;

  a0 = -1;
  a1 = 2;
  a2 = -3;

  final result = returnStructAlignmentInt64NativeLeaf(a0, a1, a2);

  print("result = $result");

  Expect.equals(a0, result.a0);
  Expect.equals(a1, result.a1);
  Expect.equals(a2, result.a2);
}

@Native<
        Struct8BytesNestedInt Function(
            Struct4BytesHomogeneousInt16, Struct4BytesHomogeneousInt16)>(
    symbol: 'ReturnStruct8BytesNestedInt', isLeaf: true)
external Struct8BytesNestedInt returnStruct8BytesNestedIntNativeLeaf(
    Struct4BytesHomogeneousInt16 a0, Struct4BytesHomogeneousInt16 a1);

/// Simple nested struct.
void testReturnStruct8BytesNestedIntNativeLeaf() {
  final a0Pointer = calloc<Struct4BytesHomogeneousInt16>();
  final Struct4BytesHomogeneousInt16 a0 = a0Pointer.ref;
  final a1Pointer = calloc<Struct4BytesHomogeneousInt16>();
  final Struct4BytesHomogeneousInt16 a1 = a1Pointer.ref;

  a0.a0 = -1;
  a0.a1 = 2;
  a1.a0 = -3;
  a1.a1 = 4;

  final result = returnStruct8BytesNestedIntNativeLeaf(a0, a1);

  print("result = $result");

  Expect.equals(a0.a0, result.a0.a0);
  Expect.equals(a0.a1, result.a0.a1);
  Expect.equals(a1.a0, result.a1.a0);
  Expect.equals(a1.a1, result.a1.a1);

  calloc.free(a0Pointer);
  calloc.free(a1Pointer);
}

@Native<Struct8BytesNestedFloat Function(Struct4BytesFloat, Struct4BytesFloat)>(
    symbol: 'ReturnStruct8BytesNestedFloat', isLeaf: true)
external Struct8BytesNestedFloat returnStruct8BytesNestedFloatNativeLeaf(
    Struct4BytesFloat a0, Struct4BytesFloat a1);

/// Simple nested struct with floats.
void testReturnStruct8BytesNestedFloatNativeLeaf() {
  final a0Pointer = calloc<Struct4BytesFloat>();
  final Struct4BytesFloat a0 = a0Pointer.ref;
  final a1Pointer = calloc<Struct4BytesFloat>();
  final Struct4BytesFloat a1 = a1Pointer.ref;

  a0.a0 = -1.0;
  a1.a0 = 2.0;

  final result = returnStruct8BytesNestedFloatNativeLeaf(a0, a1);

  print("result = $result");

  Expect.approxEquals(a0.a0, result.a0.a0);
  Expect.approxEquals(a1.a0, result.a1.a0);

  calloc.free(a0Pointer);
  calloc.free(a1Pointer);
}

@Native<Struct8BytesNestedFloat2 Function(Struct4BytesFloat, Float)>(
    symbol: 'ReturnStruct8BytesNestedFloat2', isLeaf: true)
external Struct8BytesNestedFloat2 returnStruct8BytesNestedFloat2NativeLeaf(
    Struct4BytesFloat a0, double a1);

/// The nesting is irregular, testing homogenous float rules on arm and arm64,
/// and the fpu register usage on x64.
void testReturnStruct8BytesNestedFloat2NativeLeaf() {
  final a0Pointer = calloc<Struct4BytesFloat>();
  final Struct4BytesFloat a0 = a0Pointer.ref;
  double a1;

  a0.a0 = -1.0;
  a1 = 2.0;

  final result = returnStruct8BytesNestedFloat2NativeLeaf(a0, a1);

  print("result = $result");

  Expect.approxEquals(a0.a0, result.a0.a0);
  Expect.approxEquals(a1, result.a1);

  calloc.free(a0Pointer);
}

@Native<
        Struct8BytesNestedMixed Function(
            Struct4BytesHomogeneousInt16, Struct4BytesFloat)>(
    symbol: 'ReturnStruct8BytesNestedMixed', isLeaf: true)
external Struct8BytesNestedMixed returnStruct8BytesNestedMixedNativeLeaf(
    Struct4BytesHomogeneousInt16 a0, Struct4BytesFloat a1);

/// Simple nested struct with mixed members.
void testReturnStruct8BytesNestedMixedNativeLeaf() {
  final a0Pointer = calloc<Struct4BytesHomogeneousInt16>();
  final Struct4BytesHomogeneousInt16 a0 = a0Pointer.ref;
  final a1Pointer = calloc<Struct4BytesFloat>();
  final Struct4BytesFloat a1 = a1Pointer.ref;

  a0.a0 = -1;
  a0.a1 = 2;
  a1.a0 = -3.0;

  final result = returnStruct8BytesNestedMixedNativeLeaf(a0, a1);

  print("result = $result");

  Expect.equals(a0.a0, result.a0.a0);
  Expect.equals(a0.a1, result.a0.a1);
  Expect.approxEquals(a1.a0, result.a1.a0);

  calloc.free(a0Pointer);
  calloc.free(a1Pointer);
}

@Native<
        Struct16BytesNestedInt Function(
            Struct8BytesNestedInt, Struct8BytesNestedInt)>(
    symbol: 'ReturnStruct16BytesNestedInt', isLeaf: true)
external Struct16BytesNestedInt returnStruct16BytesNestedIntNativeLeaf(
    Struct8BytesNestedInt a0, Struct8BytesNestedInt a1);

/// Deeper nested struct to test recursive member access.
void testReturnStruct16BytesNestedIntNativeLeaf() {
  final a0Pointer = calloc<Struct8BytesNestedInt>();
  final Struct8BytesNestedInt a0 = a0Pointer.ref;
  final a1Pointer = calloc<Struct8BytesNestedInt>();
  final Struct8BytesNestedInt a1 = a1Pointer.ref;

  a0.a0.a0 = -1;
  a0.a0.a1 = 2;
  a0.a1.a0 = -3;
  a0.a1.a1 = 4;
  a1.a0.a0 = -5;
  a1.a0.a1 = 6;
  a1.a1.a0 = -7;
  a1.a1.a1 = 8;

  final result = returnStruct16BytesNestedIntNativeLeaf(a0, a1);

  print("result = $result");

  Expect.equals(a0.a0.a0, result.a0.a0.a0);
  Expect.equals(a0.a0.a1, result.a0.a0.a1);
  Expect.equals(a0.a1.a0, result.a0.a1.a0);
  Expect.equals(a0.a1.a1, result.a0.a1.a1);
  Expect.equals(a1.a0.a0, result.a1.a0.a0);
  Expect.equals(a1.a0.a1, result.a1.a0.a1);
  Expect.equals(a1.a1.a0, result.a1.a1.a0);
  Expect.equals(a1.a1.a1, result.a1.a1.a1);

  calloc.free(a0Pointer);
  calloc.free(a1Pointer);
}

@Native<
        Struct32BytesNestedInt Function(
            Struct16BytesNestedInt, Struct16BytesNestedInt)>(
    symbol: 'ReturnStruct32BytesNestedInt', isLeaf: true)
external Struct32BytesNestedInt returnStruct32BytesNestedIntNativeLeaf(
    Struct16BytesNestedInt a0, Struct16BytesNestedInt a1);

/// Even deeper nested struct to test recursive member access.
void testReturnStruct32BytesNestedIntNativeLeaf() {
  final a0Pointer = calloc<Struct16BytesNestedInt>();
  final Struct16BytesNestedInt a0 = a0Pointer.ref;
  final a1Pointer = calloc<Struct16BytesNestedInt>();
  final Struct16BytesNestedInt a1 = a1Pointer.ref;

  a0.a0.a0.a0 = -1;
  a0.a0.a0.a1 = 2;
  a0.a0.a1.a0 = -3;
  a0.a0.a1.a1 = 4;
  a0.a1.a0.a0 = -5;
  a0.a1.a0.a1 = 6;
  a0.a1.a1.a0 = -7;
  a0.a1.a1.a1 = 8;
  a1.a0.a0.a0 = -9;
  a1.a0.a0.a1 = 10;
  a1.a0.a1.a0 = -11;
  a1.a0.a1.a1 = 12;
  a1.a1.a0.a0 = -13;
  a1.a1.a0.a1 = 14;
  a1.a1.a1.a0 = -15;
  a1.a1.a1.a1 = 16;

  final result = returnStruct32BytesNestedIntNativeLeaf(a0, a1);

  print("result = $result");

  Expect.equals(a0.a0.a0.a0, result.a0.a0.a0.a0);
  Expect.equals(a0.a0.a0.a1, result.a0.a0.a0.a1);
  Expect.equals(a0.a0.a1.a0, result.a0.a0.a1.a0);
  Expect.equals(a0.a0.a1.a1, result.a0.a0.a1.a1);
  Expect.equals(a0.a1.a0.a0, result.a0.a1.a0.a0);
  Expect.equals(a0.a1.a0.a1, result.a0.a1.a0.a1);
  Expect.equals(a0.a1.a1.a0, result.a0.a1.a1.a0);
  Expect.equals(a0.a1.a1.a1, result.a0.a1.a1.a1);
  Expect.equals(a1.a0.a0.a0, result.a1.a0.a0.a0);
  Expect.equals(a1.a0.a0.a1, result.a1.a0.a0.a1);
  Expect.equals(a1.a0.a1.a0, result.a1.a0.a1.a0);
  Expect.equals(a1.a0.a1.a1, result.a1.a0.a1.a1);
  Expect.equals(a1.a1.a0.a0, result.a1.a1.a0.a0);
  Expect.equals(a1.a1.a0.a1, result.a1.a1.a0.a1);
  Expect.equals(a1.a1.a1.a0, result.a1.a1.a1.a0);
  Expect.equals(a1.a1.a1.a1, result.a1.a1.a1.a1);

  calloc.free(a0Pointer);
  calloc.free(a1Pointer);
}

@Native<
        StructNestedIntStructAlignmentInt16 Function(
            StructAlignmentInt16, StructAlignmentInt16)>(
    symbol: 'ReturnStructNestedIntStructAlignmentInt16', isLeaf: true)
external StructNestedIntStructAlignmentInt16
    returnStructNestedIntStructAlignmentInt16NativeLeaf(
        StructAlignmentInt16 a0, StructAlignmentInt16 a1);

/// Test alignment and padding of nested struct with 16 byte int.
void testReturnStructNestedIntStructAlignmentInt16NativeLeaf() {
  final a0Pointer = calloc<StructAlignmentInt16>();
  final StructAlignmentInt16 a0 = a0Pointer.ref;
  final a1Pointer = calloc<StructAlignmentInt16>();
  final StructAlignmentInt16 a1 = a1Pointer.ref;

  a0.a0 = -1;
  a0.a1 = 2;
  a0.a2 = -3;
  a1.a0 = 4;
  a1.a1 = -5;
  a1.a2 = 6;

  final result = returnStructNestedIntStructAlignmentInt16NativeLeaf(a0, a1);

  print("result = $result");

  Expect.equals(a0.a0, result.a0.a0);
  Expect.equals(a0.a1, result.a0.a1);
  Expect.equals(a0.a2, result.a0.a2);
  Expect.equals(a1.a0, result.a1.a0);
  Expect.equals(a1.a1, result.a1.a1);
  Expect.equals(a1.a2, result.a1.a2);

  calloc.free(a0Pointer);
  calloc.free(a1Pointer);
}

@Native<
        StructNestedIntStructAlignmentInt32 Function(
            StructAlignmentInt32, StructAlignmentInt32)>(
    symbol: 'ReturnStructNestedIntStructAlignmentInt32', isLeaf: true)
external StructNestedIntStructAlignmentInt32
    returnStructNestedIntStructAlignmentInt32NativeLeaf(
        StructAlignmentInt32 a0, StructAlignmentInt32 a1);

/// Test alignment and padding of nested struct with 32 byte int.
void testReturnStructNestedIntStructAlignmentInt32NativeLeaf() {
  final a0Pointer = calloc<StructAlignmentInt32>();
  final StructAlignmentInt32 a0 = a0Pointer.ref;
  final a1Pointer = calloc<StructAlignmentInt32>();
  final StructAlignmentInt32 a1 = a1Pointer.ref;

  a0.a0 = -1;
  a0.a1 = 2;
  a0.a2 = -3;
  a1.a0 = 4;
  a1.a1 = -5;
  a1.a2 = 6;

  final result = returnStructNestedIntStructAlignmentInt32NativeLeaf(a0, a1);

  print("result = $result");

  Expect.equals(a0.a0, result.a0.a0);
  Expect.equals(a0.a1, result.a0.a1);
  Expect.equals(a0.a2, result.a0.a2);
  Expect.equals(a1.a0, result.a1.a0);
  Expect.equals(a1.a1, result.a1.a1);
  Expect.equals(a1.a2, result.a1.a2);

  calloc.free(a0Pointer);
  calloc.free(a1Pointer);
}

@Native<
        StructNestedIntStructAlignmentInt64 Function(
            StructAlignmentInt64, StructAlignmentInt64)>(
    symbol: 'ReturnStructNestedIntStructAlignmentInt64', isLeaf: true)
external StructNestedIntStructAlignmentInt64
    returnStructNestedIntStructAlignmentInt64NativeLeaf(
        StructAlignmentInt64 a0, StructAlignmentInt64 a1);

/// Test alignment and padding of nested struct with 64 byte int.
void testReturnStructNestedIntStructAlignmentInt64NativeLeaf() {
  final a0Pointer = calloc<StructAlignmentInt64>();
  final StructAlignmentInt64 a0 = a0Pointer.ref;
  final a1Pointer = calloc<StructAlignmentInt64>();
  final StructAlignmentInt64 a1 = a1Pointer.ref;

  a0.a0 = -1;
  a0.a1 = 2;
  a0.a2 = -3;
  a1.a0 = 4;
  a1.a1 = -5;
  a1.a2 = 6;

  final result = returnStructNestedIntStructAlignmentInt64NativeLeaf(a0, a1);

  print("result = $result");

  Expect.equals(a0.a0, result.a0.a0);
  Expect.equals(a0.a1, result.a0.a1);
  Expect.equals(a0.a2, result.a0.a2);
  Expect.equals(a1.a0, result.a1.a0);
  Expect.equals(a1.a1, result.a1.a1);
  Expect.equals(a1.a2, result.a1.a2);

  calloc.free(a0Pointer);
  calloc.free(a1Pointer);
}

@Native<
    StructNestedIrregularEvenBigger Function(
        Uint64,
        StructNestedIrregularBigger,
        StructNestedIrregularBigger,
        Double)>(symbol: 'ReturnStructNestedIrregularEvenBigger', isLeaf: true)
external StructNestedIrregularEvenBigger
    returnStructNestedIrregularEvenBiggerNativeLeaf(
        int a0,
        StructNestedIrregularBigger a1,
        StructNestedIrregularBigger a2,
        double a3);

/// Return big irregular struct as smoke test.
void testReturnStructNestedIrregularEvenBiggerNativeLeaf() {
  int a0;
  final a1Pointer = calloc<StructNestedIrregularBigger>();
  final StructNestedIrregularBigger a1 = a1Pointer.ref;
  final a2Pointer = calloc<StructNestedIrregularBigger>();
  final StructNestedIrregularBigger a2 = a2Pointer.ref;
  double a3;

  a0 = 1;
  a1.a0.a0 = 2;
  a1.a0.a1.a0.a0 = -3;
  a1.a0.a1.a0.a1 = 4;
  a1.a0.a1.a1.a0 = -5.0;
  a1.a0.a2 = 6;
  a1.a0.a3.a0.a0 = -7.0;
  a1.a0.a3.a1 = 8.0;
  a1.a0.a4 = 9;
  a1.a0.a5.a0.a0 = 10.0;
  a1.a0.a5.a1.a0 = -11.0;
  a1.a0.a6 = 12;
  a1.a1.a0.a0 = -13;
  a1.a1.a0.a1 = 14;
  a1.a1.a1.a0 = -15.0;
  a1.a2 = 16.0;
  a1.a3 = -17.0;
  a2.a0.a0 = 18;
  a2.a0.a1.a0.a0 = -19;
  a2.a0.a1.a0.a1 = 20;
  a2.a0.a1.a1.a0 = -21.0;
  a2.a0.a2 = 22;
  a2.a0.a3.a0.a0 = -23.0;
  a2.a0.a3.a1 = 24.0;
  a2.a0.a4 = 25;
  a2.a0.a5.a0.a0 = 26.0;
  a2.a0.a5.a1.a0 = -27.0;
  a2.a0.a6 = 28;
  a2.a1.a0.a0 = -29;
  a2.a1.a0.a1 = 30;
  a2.a1.a1.a0 = -31.0;
  a2.a2 = 32.0;
  a2.a3 = -33.0;
  a3 = 34.0;

  final result =
      returnStructNestedIrregularEvenBiggerNativeLeaf(a0, a1, a2, a3);

  print("result = $result");

  Expect.equals(a0, result.a0);
  Expect.equals(a1.a0.a0, result.a1.a0.a0);
  Expect.equals(a1.a0.a1.a0.a0, result.a1.a0.a1.a0.a0);
  Expect.equals(a1.a0.a1.a0.a1, result.a1.a0.a1.a0.a1);
  Expect.approxEquals(a1.a0.a1.a1.a0, result.a1.a0.a1.a1.a0);
  Expect.equals(a1.a0.a2, result.a1.a0.a2);
  Expect.approxEquals(a1.a0.a3.a0.a0, result.a1.a0.a3.a0.a0);
  Expect.approxEquals(a1.a0.a3.a1, result.a1.a0.a3.a1);
  Expect.equals(a1.a0.a4, result.a1.a0.a4);
  Expect.approxEquals(a1.a0.a5.a0.a0, result.a1.a0.a5.a0.a0);
  Expect.approxEquals(a1.a0.a5.a1.a0, result.a1.a0.a5.a1.a0);
  Expect.equals(a1.a0.a6, result.a1.a0.a6);
  Expect.equals(a1.a1.a0.a0, result.a1.a1.a0.a0);
  Expect.equals(a1.a1.a0.a1, result.a1.a1.a0.a1);
  Expect.approxEquals(a1.a1.a1.a0, result.a1.a1.a1.a0);
  Expect.approxEquals(a1.a2, result.a1.a2);
  Expect.approxEquals(a1.a3, result.a1.a3);
  Expect.equals(a2.a0.a0, result.a2.a0.a0);
  Expect.equals(a2.a0.a1.a0.a0, result.a2.a0.a1.a0.a0);
  Expect.equals(a2.a0.a1.a0.a1, result.a2.a0.a1.a0.a1);
  Expect.approxEquals(a2.a0.a1.a1.a0, result.a2.a0.a1.a1.a0);
  Expect.equals(a2.a0.a2, result.a2.a0.a2);
  Expect.approxEquals(a2.a0.a3.a0.a0, result.a2.a0.a3.a0.a0);
  Expect.approxEquals(a2.a0.a3.a1, result.a2.a0.a3.a1);
  Expect.equals(a2.a0.a4, result.a2.a0.a4);
  Expect.approxEquals(a2.a0.a5.a0.a0, result.a2.a0.a5.a0.a0);
  Expect.approxEquals(a2.a0.a5.a1.a0, result.a2.a0.a5.a1.a0);
  Expect.equals(a2.a0.a6, result.a2.a0.a6);
  Expect.equals(a2.a1.a0.a0, result.a2.a1.a0.a0);
  Expect.equals(a2.a1.a0.a1, result.a2.a1.a0.a1);
  Expect.approxEquals(a2.a1.a1.a0, result.a2.a1.a1.a0);
  Expect.approxEquals(a2.a2, result.a2.a2);
  Expect.approxEquals(a2.a3, result.a2.a3);
  Expect.approxEquals(a3, result.a3);

  calloc.free(a1Pointer);
  calloc.free(a2Pointer);
}
