// 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';
// ignore: unused_import
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() {
  for (int i = 0; i < 100; ++i) {
    testVariadicAt1Int64x2Leaf();
    testVariadicAt1Doublex2Leaf();
    testVariadicAt1Int64x5Leaf();
    testVariadicAt1Doublex5Leaf();
    testVariadicAt1Int64x20Leaf();
    testVariadicAt1Doublex20Leaf();
    testVariadicAt1Int64x2Struct8BytesIntInt64Leaf();
    testVariadicAt1Doublex2Struct32BytesHomogeneousDoubleDLeaf();
    testVariadicAt1DoubleStruct12BytesHomogeneousFloatDoubLeaf();
    testVariadicAt1Int32Struct20BytesHomogeneousInt32Int32Leaf();
    testVariadicAt1DoubleStruct20BytesHomogeneousFloatDoubLeaf();
    testVariadicAt2Int32Int64IntPtrLeaf();
    testVariadicAt1DoubleInt64Int32DoubleInt64Int32Leaf();
    testVariadicAt1Int64Int32Struct12BytesHomogeneousFloatLeaf();
    testVariadicAt11Doublex8FloatStruct12BytesHomogeneousFLeaf();
    testVariadicAt1DoubleInt64Int32Struct20BytesHomogeneouLeaf();
    testVariadicAt5Doublex5Leaf();
    testVariadicAt1Int64x7Struct12BytesHomogeneousInt32Leaf();
    testVariadicAt1Struct12BytesHomogeneousInt32Int32x4Leaf();
  }
}

final variadicAt1Int64x2Leaf = ffiTestFunctions
    .lookupFunction<
      Int64 Function(Int64, VarArgs<(Int64,)>),
      int Function(int, int)
    >("VariadicAt1Int64x2", isLeaf: true);

/// Single variadic argument.
void testVariadicAt1Int64x2Leaf() {
  int a0;
  int a1;

  a0 = -1;
  a1 = 2;

  final result = variadicAt1Int64x2Leaf(a0, a1);

  print("result = $result");

  Expect.equals(1, result);
}

final variadicAt1Doublex2Leaf = ffiTestFunctions
    .lookupFunction<
      Double Function(Double, VarArgs<(Double,)>),
      double Function(double, double)
    >("VariadicAt1Doublex2", isLeaf: true);

/// Single variadic argument.
void testVariadicAt1Doublex2Leaf() {
  double a0;
  double a1;

  a0 = -1.0;
  a1 = 2.0;

  final result = variadicAt1Doublex2Leaf(a0, a1);

  print("result = $result");

  Expect.approxEquals(1.0, result);
}

final variadicAt1Int64x5Leaf = ffiTestFunctions
    .lookupFunction<
      Int64 Function(Int64, VarArgs<(Int64, Int64, Int64, Int64)>),
      int Function(int, int, int, int, int)
    >("VariadicAt1Int64x5", isLeaf: true);

/// Variadic arguments.
void testVariadicAt1Int64x5Leaf() {
  int a0;
  int a1;
  int a2;
  int a3;
  int a4;

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

  final result = variadicAt1Int64x5Leaf(a0, a1, a2, a3, a4);

  print("result = $result");

  Expect.equals(-3, result);
}

final variadicAt1Doublex5Leaf = ffiTestFunctions
    .lookupFunction<
      Double Function(Double, VarArgs<(Double, Double, Double, Double)>),
      double Function(double, double, double, double, double)
    >("VariadicAt1Doublex5", isLeaf: true);

/// Variadic arguments.
void testVariadicAt1Doublex5Leaf() {
  double a0;
  double a1;
  double a2;
  double a3;
  double a4;

  a0 = -1.0;
  a1 = 2.0;
  a2 = -3.0;
  a3 = 4.0;
  a4 = -5.0;

  final result = variadicAt1Doublex5Leaf(a0, a1, a2, a3, a4);

  print("result = $result");

  Expect.approxEquals(-3.0, result);
}

final variadicAt1Int64x20Leaf = ffiTestFunctions
    .lookupFunction<
      Int64 Function(
        Int64,
        VarArgs<
          (
            Int64,
            Int64,
            Int64,
            Int64,
            Int64,
            Int64,
            Int64,
            Int64,
            Int64,
            Int64,
            Int64,
            Int64,
            Int64,
            Int64,
            Int64,
            Int64,
            Int64,
            Int64,
            Int64,
          )
        >,
      ),
      int Function(
        int,
        int,
        int,
        int,
        int,
        int,
        int,
        int,
        int,
        int,
        int,
        int,
        int,
        int,
        int,
        int,
        int,
        int,
        int,
        int,
      )
    >("VariadicAt1Int64x20", isLeaf: true);

/// Variadic arguments exhaust registers.
void testVariadicAt1Int64x20Leaf() {
  int a0;
  int a1;
  int a2;
  int a3;
  int a4;
  int a5;
  int a6;
  int a7;
  int a8;
  int a9;
  int a10;
  int a11;
  int a12;
  int a13;
  int a14;
  int a15;
  int a16;
  int a17;
  int a18;
  int a19;

  a0 = -1;
  a1 = 2;
  a2 = -3;
  a3 = 4;
  a4 = -5;
  a5 = 6;
  a6 = -7;
  a7 = 8;
  a8 = -9;
  a9 = 10;
  a10 = -11;
  a11 = 12;
  a12 = -13;
  a13 = 14;
  a14 = -15;
  a15 = 16;
  a16 = -17;
  a17 = 18;
  a18 = -19;
  a19 = 20;

  final result = variadicAt1Int64x20Leaf(
    a0,
    a1,
    a2,
    a3,
    a4,
    a5,
    a6,
    a7,
    a8,
    a9,
    a10,
    a11,
    a12,
    a13,
    a14,
    a15,
    a16,
    a17,
    a18,
    a19,
  );

  print("result = $result");

  Expect.equals(10, result);
}

final variadicAt1Doublex20Leaf = ffiTestFunctions
    .lookupFunction<
      Double Function(
        Double,
        VarArgs<
          (
            Double,
            Double,
            Double,
            Double,
            Double,
            Double,
            Double,
            Double,
            Double,
            Double,
            Double,
            Double,
            Double,
            Double,
            Double,
            Double,
            Double,
            Double,
            Double,
          )
        >,
      ),
      double Function(
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
      )
    >("VariadicAt1Doublex20", isLeaf: true);

/// Variadic arguments exhaust registers.
void testVariadicAt1Doublex20Leaf() {
  double a0;
  double a1;
  double a2;
  double a3;
  double a4;
  double a5;
  double a6;
  double a7;
  double a8;
  double a9;
  double a10;
  double a11;
  double a12;
  double a13;
  double a14;
  double a15;
  double a16;
  double a17;
  double a18;
  double a19;

  a0 = -1.0;
  a1 = 2.0;
  a2 = -3.0;
  a3 = 4.0;
  a4 = -5.0;
  a5 = 6.0;
  a6 = -7.0;
  a7 = 8.0;
  a8 = -9.0;
  a9 = 10.0;
  a10 = -11.0;
  a11 = 12.0;
  a12 = -13.0;
  a13 = 14.0;
  a14 = -15.0;
  a15 = 16.0;
  a16 = -17.0;
  a17 = 18.0;
  a18 = -19.0;
  a19 = 20.0;

  final result = variadicAt1Doublex20Leaf(
    a0,
    a1,
    a2,
    a3,
    a4,
    a5,
    a6,
    a7,
    a8,
    a9,
    a10,
    a11,
    a12,
    a13,
    a14,
    a15,
    a16,
    a17,
    a18,
    a19,
  );

  print("result = $result");

  Expect.approxEquals(10.0, result);
}

final variadicAt1Int64x2Struct8BytesIntInt64Leaf = ffiTestFunctions
    .lookupFunction<
      Int64 Function(Int64, VarArgs<(Int64, Struct8BytesInt, Int64)>),
      int Function(int, int, Struct8BytesInt, int)
    >("VariadicAt1Int64x2Struct8BytesIntInt64", isLeaf: true);

/// Variadic arguments including struct.
void testVariadicAt1Int64x2Struct8BytesIntInt64Leaf() {
  int a0;
  int a1;
  final a2Pointer = calloc<Struct8BytesInt>();
  final Struct8BytesInt a2 = a2Pointer.ref;
  int a3;

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

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

  print("result = $result");

  Expect.equals(3, result);

  calloc.free(a2Pointer);
}

final variadicAt1Doublex2Struct32BytesHomogeneousDoubleDLeaf = ffiTestFunctions
    .lookupFunction<
      Double Function(
        Double,
        VarArgs<(Double, Struct32BytesHomogeneousDouble, Double)>,
      ),
      double Function(double, double, Struct32BytesHomogeneousDouble, double)
    >("VariadicAt1Doublex2Struct32BytesHomogeneousDoubleD", isLeaf: true);

/// Variadic arguments including struct.
void testVariadicAt1Doublex2Struct32BytesHomogeneousDoubleDLeaf() {
  double a0;
  double a1;
  final a2Pointer = calloc<Struct32BytesHomogeneousDouble>();
  final Struct32BytesHomogeneousDouble a2 = a2Pointer.ref;
  double a3;

  a0 = -1.0;
  a1 = 2.0;
  a2.a0 = -3.0;
  a2.a1 = 4.0;
  a2.a2 = -5.0;
  a2.a3 = 6.0;
  a3 = -7.0;

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

  print("result = $result");

  Expect.approxEquals(-4.0, result);

  calloc.free(a2Pointer);
}

final variadicAt1DoubleStruct12BytesHomogeneousFloatDoubLeaf = ffiTestFunctions
    .lookupFunction<
      Double Function(Double, VarArgs<(Struct12BytesHomogeneousFloat, Double)>),
      double Function(double, Struct12BytesHomogeneousFloat, double)
    >("VariadicAt1DoubleStruct12BytesHomogeneousFloatDoub", isLeaf: true);

/// Variadic arguments including struct.
void testVariadicAt1DoubleStruct12BytesHomogeneousFloatDoubLeaf() {
  double a0;
  final a1Pointer = calloc<Struct12BytesHomogeneousFloat>();
  final Struct12BytesHomogeneousFloat a1 = a1Pointer.ref;
  double a2;

  a0 = -1.0;
  a1.a0 = 2.0;
  a1.a1 = -3.0;
  a1.a2 = 4.0;
  a2 = -5.0;

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

  print("result = $result");

  Expect.approxEquals(-3.0, result);

  calloc.free(a1Pointer);
}

final variadicAt1Int32Struct20BytesHomogeneousInt32Int32Leaf = ffiTestFunctions
    .lookupFunction<
      Int32 Function(Int32, VarArgs<(Struct20BytesHomogeneousInt32, Int32)>),
      int Function(int, Struct20BytesHomogeneousInt32, int)
    >("VariadicAt1Int32Struct20BytesHomogeneousInt32Int32", isLeaf: true);

/// Variadic arguments including struct.
void testVariadicAt1Int32Struct20BytesHomogeneousInt32Int32Leaf() {
  int a0;
  final a1Pointer = calloc<Struct20BytesHomogeneousInt32>();
  final Struct20BytesHomogeneousInt32 a1 = a1Pointer.ref;
  int a2;

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

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

  print("result = $result");

  Expect.equals(-4, result);

  calloc.free(a1Pointer);
}

final variadicAt1DoubleStruct20BytesHomogeneousFloatDoubLeaf = ffiTestFunctions
    .lookupFunction<
      Double Function(Double, VarArgs<(Struct20BytesHomogeneousFloat, Double)>),
      double Function(double, Struct20BytesHomogeneousFloat, double)
    >("VariadicAt1DoubleStruct20BytesHomogeneousFloatDoub", isLeaf: true);

/// Variadic arguments including struct.
void testVariadicAt1DoubleStruct20BytesHomogeneousFloatDoubLeaf() {
  double a0;
  final a1Pointer = calloc<Struct20BytesHomogeneousFloat>();
  final Struct20BytesHomogeneousFloat a1 = a1Pointer.ref;
  double a2;

  a0 = -1.0;
  a1.a0 = 2.0;
  a1.a1 = -3.0;
  a1.a2 = 4.0;
  a1.a3 = -5.0;
  a1.a4 = 6.0;
  a2 = -7.0;

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

  print("result = $result");

  Expect.approxEquals(-4.0, result);

  calloc.free(a1Pointer);
}

final variadicAt2Int32Int64IntPtrLeaf = ffiTestFunctions
    .lookupFunction<
      Int32 Function(Int32, Int64, VarArgs<(IntPtr,)>),
      int Function(int, int, int)
    >("VariadicAt2Int32Int64IntPtr", isLeaf: true);

/// Regression test for variadic arguments.
/// https://github.com/dart-lang/sdk/issues/49460
void testVariadicAt2Int32Int64IntPtrLeaf() {
  int a0;
  int a1;
  int a2;

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

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

  print("result = $result");

  Expect.equals(-2, result);
}

final variadicAt1DoubleInt64Int32DoubleInt64Int32Leaf = ffiTestFunctions
    .lookupFunction<
      Double Function(Double, VarArgs<(Int64, Int32, Double, Int64, Int32)>),
      double Function(double, int, int, double, int, int)
    >("VariadicAt1DoubleInt64Int32DoubleInt64Int32", isLeaf: true);

/// Variadic arguments mixed.
void testVariadicAt1DoubleInt64Int32DoubleInt64Int32Leaf() {
  double a0;
  int a1;
  int a2;
  double a3;
  int a4;
  int a5;

  a0 = -1.0;
  a1 = 2;
  a2 = -3;
  a3 = 4.0;
  a4 = -5;
  a5 = 6;

  final result = variadicAt1DoubleInt64Int32DoubleInt64Int32Leaf(
    a0,
    a1,
    a2,
    a3,
    a4,
    a5,
  );

  print("result = $result");

  Expect.approxEquals(3.0, result);
}

final variadicAt1Int64Int32Struct12BytesHomogeneousFloatLeaf = ffiTestFunctions
    .lookupFunction<
      Double Function(Int64, VarArgs<(Int32, Struct12BytesHomogeneousFloat)>),
      double Function(int, int, Struct12BytesHomogeneousFloat)
    >("VariadicAt1Int64Int32Struct12BytesHomogeneousFloat", isLeaf: true);

/// Variadic arguments homogenous struct stack alignment on macos_arm64.
void testVariadicAt1Int64Int32Struct12BytesHomogeneousFloatLeaf() {
  int a0;
  int a1;
  final a2Pointer = calloc<Struct12BytesHomogeneousFloat>();
  final Struct12BytesHomogeneousFloat a2 = a2Pointer.ref;

  a0 = -1;
  a1 = 2;
  a2.a0 = -3.0;
  a2.a1 = 4.0;
  a2.a2 = -5.0;

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

  print("result = $result");

  Expect.approxEquals(-3.0, result);

  calloc.free(a2Pointer);
}

final variadicAt11Doublex8FloatStruct12BytesHomogeneousFLeaf = ffiTestFunctions
    .lookupFunction<
      Double Function(
        Double,
        Double,
        Double,
        Double,
        Double,
        Double,
        Double,
        Double,
        Float,
        Struct12BytesHomogeneousFloat,
        Int64,
        VarArgs<(Int32, Struct12BytesHomogeneousFloat)>,
      ),
      double Function(
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        Struct12BytesHomogeneousFloat,
        int,
        int,
        Struct12BytesHomogeneousFloat,
      )
    >("VariadicAt11Doublex8FloatStruct12BytesHomogeneousF", isLeaf: true);

/// Variadic arguments homogenous struct stack alignment on macos_arm64.
void testVariadicAt11Doublex8FloatStruct12BytesHomogeneousFLeaf() {
  double a0;
  double a1;
  double a2;
  double a3;
  double a4;
  double a5;
  double a6;
  double a7;
  double a8;
  final a9Pointer = calloc<Struct12BytesHomogeneousFloat>();
  final Struct12BytesHomogeneousFloat a9 = a9Pointer.ref;
  int a10;
  int a11;
  final a12Pointer = calloc<Struct12BytesHomogeneousFloat>();
  final Struct12BytesHomogeneousFloat a12 = a12Pointer.ref;

  a0 = -1.0;
  a1 = 2.0;
  a2 = -3.0;
  a3 = 4.0;
  a4 = -5.0;
  a5 = 6.0;
  a6 = -7.0;
  a7 = 8.0;
  a8 = -9.0;
  a9.a0 = 10.0;
  a9.a1 = -11.0;
  a9.a2 = 12.0;
  a10 = -13;
  a11 = 14;
  a12.a0 = -15.0;
  a12.a1 = 16.0;
  a12.a2 = -17.0;

  final result = variadicAt11Doublex8FloatStruct12BytesHomogeneousFLeaf(
    a0,
    a1,
    a2,
    a3,
    a4,
    a5,
    a6,
    a7,
    a8,
    a9,
    a10,
    a11,
    a12,
  );

  print("result = $result");

  Expect.approxEquals(-9.0, result);

  calloc.free(a9Pointer);
  calloc.free(a12Pointer);
}

final variadicAt1DoubleInt64Int32Struct20BytesHomogeneouLeaf = ffiTestFunctions
    .lookupFunction<
      Double Function(
        Double,
        VarArgs<
          (
            Int64,
            Int32,
            Struct20BytesHomogeneousInt32,
            Double,
            Int64,
            Int32,
            Struct12BytesHomogeneousFloat,
            Int64,
          )
        >,
      ),
      double Function(
        double,
        int,
        int,
        Struct20BytesHomogeneousInt32,
        double,
        int,
        int,
        Struct12BytesHomogeneousFloat,
        int,
      )
    >("VariadicAt1DoubleInt64Int32Struct20BytesHomogeneou", isLeaf: true);

/// Variadic arguments mixed.
void testVariadicAt1DoubleInt64Int32Struct20BytesHomogeneouLeaf() {
  double a0;
  int a1;
  int a2;
  final a3Pointer = calloc<Struct20BytesHomogeneousInt32>();
  final Struct20BytesHomogeneousInt32 a3 = a3Pointer.ref;
  double a4;
  int a5;
  int a6;
  final a7Pointer = calloc<Struct12BytesHomogeneousFloat>();
  final Struct12BytesHomogeneousFloat a7 = a7Pointer.ref;
  int a8;

  a0 = -1.0;
  a1 = 2;
  a2 = -3;
  a3.a0 = 4;
  a3.a1 = -5;
  a3.a2 = 6;
  a3.a3 = -7;
  a3.a4 = 8;
  a4 = -9.0;
  a5 = 10;
  a6 = -11;
  a7.a0 = 12.0;
  a7.a1 = -13.0;
  a7.a2 = 14.0;
  a8 = -15;

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

  print("result = $result");

  Expect.approxEquals(-8.0, result);

  calloc.free(a3Pointer);
  calloc.free(a7Pointer);
}

final variadicAt5Doublex5Leaf = ffiTestFunctions
    .lookupFunction<
      Double Function(Double, Double, Double, Double, Double, VarArgs<()>),
      double Function(double, double, double, double, double)
    >("VariadicAt5Doublex5", isLeaf: true);

/// Variadic arguments function definition, but not passing any.
void testVariadicAt5Doublex5Leaf() {
  double a0;
  double a1;
  double a2;
  double a3;
  double a4;

  a0 = -1.0;
  a1 = 2.0;
  a2 = -3.0;
  a3 = 4.0;
  a4 = -5.0;

  final result = variadicAt5Doublex5Leaf(a0, a1, a2, a3, a4);

  print("result = $result");

  Expect.approxEquals(-3.0, result);
}

final variadicAt1Int64x7Struct12BytesHomogeneousInt32Leaf = ffiTestFunctions
    .lookupFunction<
      Int64 Function(
        Int64,
        VarArgs<
          (
            Int64,
            Int64,
            Int64,
            Int64,
            Int64,
            Int64,
            Struct12BytesHomogeneousInt32,
          )
        >,
      ),
      int Function(
        int,
        int,
        int,
        int,
        int,
        int,
        int,
        Struct12BytesHomogeneousInt32,
      )
    >("VariadicAt1Int64x7Struct12BytesHomogeneousInt32", isLeaf: true);

/// Struct stradles last argument register, variadic
void testVariadicAt1Int64x7Struct12BytesHomogeneousInt32Leaf() {
  int a0;
  int a1;
  int a2;
  int a3;
  int a4;
  int a5;
  int a6;
  final a7Pointer = calloc<Struct12BytesHomogeneousInt32>();
  final Struct12BytesHomogeneousInt32 a7 = a7Pointer.ref;

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

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

  print("result = $result");

  Expect.equals(5, result);

  calloc.free(a7Pointer);
}

final variadicAt1Struct12BytesHomogeneousInt32Int32x4Leaf = ffiTestFunctions
    .lookupFunction<
      Int32 Function(
        Struct12BytesHomogeneousInt32,
        VarArgs<(Int32, Int32, Int32, Int32)>,
      ),
      int Function(Struct12BytesHomogeneousInt32, int, int, int, int)
    >("VariadicAt1Struct12BytesHomogeneousInt32Int32x4", isLeaf: true);

/// Variadic arguments test on macos_arm64.
void testVariadicAt1Struct12BytesHomogeneousInt32Int32x4Leaf() {
  final a0Pointer = calloc<Struct12BytesHomogeneousInt32>();
  final Struct12BytesHomogeneousInt32 a0 = a0Pointer.ref;
  int a1;
  int a2;
  int a3;
  int a4;

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

  final result = variadicAt1Struct12BytesHomogeneousInt32Int32x4Leaf(
    a0,
    a1,
    a2,
    a3,
    a4,
  );

  print("result = $result");

  Expect.equals(-4, result);

  calloc.free(a0Pointer);
}
