// 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) {
    testVariadicAt1Int64x2();
    testVariadicAt1Doublex2();
    testVariadicAt1Int64x5();
    testVariadicAt1Doublex5();
    testVariadicAt1Int64x20();
    testVariadicAt1Doublex20();
    testVariadicAt1Int64x2Struct8BytesIntInt64();
    testVariadicAt1Doublex2Struct32BytesHomogeneousDoubleD();
    testVariadicAt1DoubleStruct12BytesHomogeneousFloatDoub();
    testVariadicAt1Int32Struct20BytesHomogeneousInt32Int32();
    testVariadicAt1DoubleStruct20BytesHomogeneousFloatDoub();
    testVariadicAt2Int32Int64IntPtr();
    testVariadicAt1DoubleInt64Int32DoubleInt64Int32();
    testVariadicAt1Int64Int32Struct12BytesHomogeneousFloat();
    testVariadicAt11Doublex8FloatStruct12BytesHomogeneousF();
    testVariadicAt1DoubleInt64Int32Struct20BytesHomogeneou();
    testVariadicAt5Doublex5();
    testVariadicAt1Int64x7Struct12BytesHomogeneousInt32();
    testVariadicAt1Struct12BytesHomogeneousInt32Int32x4();
  }
}

final variadicAt1Int64x2 = ffiTestFunctions
    .lookupFunction<
      Int64 Function(Int64, VarArgs<(Int64,)>),
      int Function(int, int)
    >("VariadicAt1Int64x2");

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

  a0 = -1;
  a1 = 2;

  final result = variadicAt1Int64x2(a0, a1);

  print("result = $result");

  Expect.equals(1, result);
}

final variadicAt1Doublex2 = ffiTestFunctions
    .lookupFunction<
      Double Function(Double, VarArgs<(Double,)>),
      double Function(double, double)
    >("VariadicAt1Doublex2");

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

  a0 = -1.0;
  a1 = 2.0;

  final result = variadicAt1Doublex2(a0, a1);

  print("result = $result");

  Expect.approxEquals(1.0, result);
}

final variadicAt1Int64x5 = ffiTestFunctions
    .lookupFunction<
      Int64 Function(Int64, VarArgs<(Int64, Int64, Int64, Int64)>),
      int Function(int, int, int, int, int)
    >("VariadicAt1Int64x5");

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

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

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

  print("result = $result");

  Expect.equals(-3, result);
}

final variadicAt1Doublex5 = ffiTestFunctions
    .lookupFunction<
      Double Function(Double, VarArgs<(Double, Double, Double, Double)>),
      double Function(double, double, double, double, double)
    >("VariadicAt1Doublex5");

/// Variadic arguments.
void testVariadicAt1Doublex5() {
  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 = variadicAt1Doublex5(a0, a1, a2, a3, a4);

  print("result = $result");

  Expect.approxEquals(-3.0, result);
}

final variadicAt1Int64x20 = 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");

/// Variadic arguments exhaust registers.
void testVariadicAt1Int64x20() {
  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 = variadicAt1Int64x20(
    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 variadicAt1Doublex20 = 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");

/// Variadic arguments exhaust registers.
void testVariadicAt1Doublex20() {
  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 = variadicAt1Doublex20(
    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 variadicAt1Int64x2Struct8BytesIntInt64 = ffiTestFunctions
    .lookupFunction<
      Int64 Function(Int64, VarArgs<(Int64, Struct8BytesInt, Int64)>),
      int Function(int, int, Struct8BytesInt, int)
    >("VariadicAt1Int64x2Struct8BytesIntInt64");

/// Variadic arguments including struct.
void testVariadicAt1Int64x2Struct8BytesIntInt64() {
  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 = variadicAt1Int64x2Struct8BytesIntInt64(a0, a1, a2, a3);

  print("result = $result");

  Expect.equals(3, result);

  calloc.free(a2Pointer);
}

final variadicAt1Doublex2Struct32BytesHomogeneousDoubleD = ffiTestFunctions
    .lookupFunction<
      Double Function(
        Double,
        VarArgs<(Double, Struct32BytesHomogeneousDouble, Double)>,
      ),
      double Function(double, double, Struct32BytesHomogeneousDouble, double)
    >("VariadicAt1Doublex2Struct32BytesHomogeneousDoubleD");

/// Variadic arguments including struct.
void testVariadicAt1Doublex2Struct32BytesHomogeneousDoubleD() {
  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 = variadicAt1Doublex2Struct32BytesHomogeneousDoubleD(
    a0,
    a1,
    a2,
    a3,
  );

  print("result = $result");

  Expect.approxEquals(-4.0, result);

  calloc.free(a2Pointer);
}

final variadicAt1DoubleStruct12BytesHomogeneousFloatDoub = ffiTestFunctions
    .lookupFunction<
      Double Function(Double, VarArgs<(Struct12BytesHomogeneousFloat, Double)>),
      double Function(double, Struct12BytesHomogeneousFloat, double)
    >("VariadicAt1DoubleStruct12BytesHomogeneousFloatDoub");

/// Variadic arguments including struct.
void testVariadicAt1DoubleStruct12BytesHomogeneousFloatDoub() {
  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 = variadicAt1DoubleStruct12BytesHomogeneousFloatDoub(a0, a1, a2);

  print("result = $result");

  Expect.approxEquals(-3.0, result);

  calloc.free(a1Pointer);
}

final variadicAt1Int32Struct20BytesHomogeneousInt32Int32 = ffiTestFunctions
    .lookupFunction<
      Int32 Function(Int32, VarArgs<(Struct20BytesHomogeneousInt32, Int32)>),
      int Function(int, Struct20BytesHomogeneousInt32, int)
    >("VariadicAt1Int32Struct20BytesHomogeneousInt32Int32");

/// Variadic arguments including struct.
void testVariadicAt1Int32Struct20BytesHomogeneousInt32Int32() {
  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 = variadicAt1Int32Struct20BytesHomogeneousInt32Int32(a0, a1, a2);

  print("result = $result");

  Expect.equals(-4, result);

  calloc.free(a1Pointer);
}

final variadicAt1DoubleStruct20BytesHomogeneousFloatDoub = ffiTestFunctions
    .lookupFunction<
      Double Function(Double, VarArgs<(Struct20BytesHomogeneousFloat, Double)>),
      double Function(double, Struct20BytesHomogeneousFloat, double)
    >("VariadicAt1DoubleStruct20BytesHomogeneousFloatDoub");

/// Variadic arguments including struct.
void testVariadicAt1DoubleStruct20BytesHomogeneousFloatDoub() {
  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 = variadicAt1DoubleStruct20BytesHomogeneousFloatDoub(a0, a1, a2);

  print("result = $result");

  Expect.approxEquals(-4.0, result);

  calloc.free(a1Pointer);
}

final variadicAt2Int32Int64IntPtr = ffiTestFunctions
    .lookupFunction<
      Int32 Function(Int32, Int64, VarArgs<(IntPtr,)>),
      int Function(int, int, int)
    >("VariadicAt2Int32Int64IntPtr");

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

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

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

  print("result = $result");

  Expect.equals(-2, result);
}

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

/// Variadic arguments mixed.
void testVariadicAt1DoubleInt64Int32DoubleInt64Int32() {
  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 = variadicAt1DoubleInt64Int32DoubleInt64Int32(
    a0,
    a1,
    a2,
    a3,
    a4,
    a5,
  );

  print("result = $result");

  Expect.approxEquals(3.0, result);
}

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

/// Variadic arguments homogenous struct stack alignment on macos_arm64.
void testVariadicAt1Int64Int32Struct12BytesHomogeneousFloat() {
  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 = variadicAt1Int64Int32Struct12BytesHomogeneousFloat(a0, a1, a2);

  print("result = $result");

  Expect.approxEquals(-3.0, result);

  calloc.free(a2Pointer);
}

final variadicAt11Doublex8FloatStruct12BytesHomogeneousF = 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");

/// Variadic arguments homogenous struct stack alignment on macos_arm64.
void testVariadicAt11Doublex8FloatStruct12BytesHomogeneousF() {
  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 = variadicAt11Doublex8FloatStruct12BytesHomogeneousF(
    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 variadicAt1DoubleInt64Int32Struct20BytesHomogeneou = 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");

/// Variadic arguments mixed.
void testVariadicAt1DoubleInt64Int32Struct20BytesHomogeneou() {
  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 = variadicAt1DoubleInt64Int32Struct20BytesHomogeneou(
    a0,
    a1,
    a2,
    a3,
    a4,
    a5,
    a6,
    a7,
    a8,
  );

  print("result = $result");

  Expect.approxEquals(-8.0, result);

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

final variadicAt5Doublex5 = ffiTestFunctions
    .lookupFunction<
      Double Function(Double, Double, Double, Double, Double, VarArgs<()>),
      double Function(double, double, double, double, double)
    >("VariadicAt5Doublex5");

/// Variadic arguments function definition, but not passing any.
void testVariadicAt5Doublex5() {
  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 = variadicAt5Doublex5(a0, a1, a2, a3, a4);

  print("result = $result");

  Expect.approxEquals(-3.0, result);
}

final variadicAt1Int64x7Struct12BytesHomogeneousInt32 = ffiTestFunctions
    .lookupFunction<
      Int64 Function(
        Int64,
        VarArgs<
          (
            Int64,
            Int64,
            Int64,
            Int64,
            Int64,
            Int64,
            Struct12BytesHomogeneousInt32,
          )
        >,
      ),
      int Function(
        int,
        int,
        int,
        int,
        int,
        int,
        int,
        Struct12BytesHomogeneousInt32,
      )
    >("VariadicAt1Int64x7Struct12BytesHomogeneousInt32");

/// Struct stradles last argument register, variadic
void testVariadicAt1Int64x7Struct12BytesHomogeneousInt32() {
  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 = variadicAt1Int64x7Struct12BytesHomogeneousInt32(
    a0,
    a1,
    a2,
    a3,
    a4,
    a5,
    a6,
    a7,
  );

  print("result = $result");

  Expect.equals(5, result);

  calloc.free(a7Pointer);
}

final variadicAt1Struct12BytesHomogeneousInt32Int32x4 = ffiTestFunctions
    .lookupFunction<
      Int32 Function(
        Struct12BytesHomogeneousInt32,
        VarArgs<(Int32, Int32, Int32, Int32)>,
      ),
      int Function(Struct12BytesHomogeneousInt32, int, int, int, int)
    >("VariadicAt1Struct12BytesHomogeneousInt32Int32x4");

/// Variadic arguments test on macos_arm64.
void testVariadicAt1Struct12BytesHomogeneousInt32Int32x4() {
  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 = variadicAt1Struct12BytesHomogeneousInt32Int32x4(
    a0,
    a1,
    a2,
    a3,
    a4,
  );

  print("result = $result");

  Expect.equals(-4, result);

  calloc.free(a0Pointer);
}
