// 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.

// Dart test program for testing dart:ffi function pointers with callbacks.
//
// VMOptions=
// VMOptions=--deterministic --optimization-counter-threshold=90
// VMOptions=--stacktrace-every=100
// VMOptions=--use-slow-path
// VMOptions=--use-slow-path  --stacktrace-every=100
// SharedObjects=ffi_test_functions

import 'dart:ffi';

import 'callback_tests_utils.dart';

final testcases = [
  CallbackTest(
    "SumVeryManySmallInts",
    Pointer.fromFunction<NativeVeryManyIntsOp>(sumVeryManySmallInts, 0),
  ),
  CallbackTest(
    "SumVeryManyFloatsDoubles",
    Pointer.fromFunction<NativeVeryManyFloatsDoublesOp>(
      sumVeryManyDoubles,
      0.0,
    ),
  ),
];

void main() {
  for (int i = 0; i < 100; ++i) {
    testcases.forEach((t) => t.run());
  }
}

int sumVeryManySmallInts(
  int _1,
  int _2,
  int _3,
  int _4,
  int _5,
  int _6,
  int _7,
  int _8,
  int _9,
  int _10,
  int _11,
  int _12,
  int _13,
  int _14,
  int _15,
  int _16,
  int _17,
  int _18,
  int _19,
  int _20,
  int _21,
  int _22,
  int _23,
  int _24,
  int _25,
  int _26,
  int _27,
  int _28,
  int _29,
  int _30,
  int _31,
  int _32,
  int _33,
  int _34,
  int _35,
  int _36,
  int _37,
  int _38,
  int _39,
  int _40,
) {
  print(
    "sumVeryManySmallInts(" +
        "$_1, $_2, $_3, $_4, $_5, $_6, $_7, $_8, $_9, $_10, " +
        "$_11, $_12, $_13, $_14, $_15, $_16, $_17, $_18, $_19, $_20, " +
        "$_21, $_22, $_23, $_24, $_25, $_26, $_27, $_28, $_29, $_30, " +
        "$_31, $_32, $_33, $_34, $_35, $_36, $_37, $_38, $_39, $_40)",
  );
  return _1 +
      _2 +
      _3 +
      _4 +
      _5 +
      _6 +
      _7 +
      _8 +
      _9 +
      _10 +
      _11 +
      _12 +
      _13 +
      _14 +
      _15 +
      _16 +
      _17 +
      _18 +
      _19 +
      _20 +
      _21 +
      _22 +
      _23 +
      _24 +
      _25 +
      _26 +
      _27 +
      _28 +
      _29 +
      _30 +
      _31 +
      _32 +
      _33 +
      _34 +
      _35 +
      _36 +
      _37 +
      _38 +
      _39 +
      _40;
}

double sumVeryManyDoubles(
  double _1,
  double _2,
  double _3,
  double _4,
  double _5,
  double _6,
  double _7,
  double _8,
  double _9,
  double _10,
  double _11,
  double _12,
  double _13,
  double _14,
  double _15,
  double _16,
  double _17,
  double _18,
  double _19,
  double _20,
  double _21,
  double _22,
  double _23,
  double _24,
  double _25,
  double _26,
  double _27,
  double _28,
  double _29,
  double _30,
  double _31,
  double _32,
  double _33,
  double _34,
  double _35,
  double _36,
  double _37,
  double _38,
  double _39,
  double _40,
) {
  print(
    "sumVeryManyDoubles(" +
        "$_1, $_2, $_3, $_4, $_5, $_6, $_7, $_8, $_9, $_10, " +
        "$_11, $_12, $_13, $_14, $_15, $_16, $_17, $_18, $_19, $_20, " +
        "$_21, $_22, $_23, $_24, $_25, $_26, $_27, $_28, $_29, $_30, " +
        "$_31, $_32, $_33, $_34, $_35, $_36, $_37, $_38, $_39, $_40)",
  );
  return _1 +
      _2 +
      _3 +
      _4 +
      _5 +
      _6 +
      _7 +
      _8 +
      _9 +
      _10 +
      _11 +
      _12 +
      _13 +
      _14 +
      _15 +
      _16 +
      _17 +
      _18 +
      _19 +
      _20 +
      _21 +
      _22 +
      _23 +
      _24 +
      _25 +
      _26 +
      _27 +
      _28 +
      _29 +
      _30 +
      _31 +
      _32 +
      _33 +
      _34 +
      _35 +
      _36 +
      _37 +
      _38 +
      _39 +
      _40;
}

typedef NativeVeryManyIntsOp =
    Int16 Function(
      Int8,
      Int16,
      Int8,
      Int16,
      Int8,
      Int16,
      Int8,
      Int16,
      Int8,
      Int16,
      Int8,
      Int16,
      Int8,
      Int16,
      Int8,
      Int16,
      Int8,
      Int16,
      Int8,
      Int16,
      Int8,
      Int16,
      Int8,
      Int16,
      Int8,
      Int16,
      Int8,
      Int16,
      Int8,
      Int16,
      Int8,
      Int16,
      Int8,
      Int16,
      Int8,
      Int16,
      Int8,
      Int16,
      Int8,
      Int16,
    );

typedef NativeVeryManyFloatsDoublesOp =
    Double Function(
      Float,
      Double,
      Float,
      Double,
      Float,
      Double,
      Float,
      Double,
      Float,
      Double,
      Float,
      Double,
      Float,
      Double,
      Float,
      Double,
      Float,
      Double,
      Float,
      Double,
      Float,
      Double,
      Float,
      Double,
      Float,
      Double,
      Float,
      Double,
      Float,
      Double,
      Float,
      Double,
      Float,
      Double,
      Float,
      Double,
      Float,
      Double,
      Float,
      Double,
    );
