// 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.
//
// VMOptions=
// VMOptions=--deterministic --optimization-counter-threshold=10
// VMOptions=--use-slow-path
// VMOptions=--use-slow-path --stacktrace-every=100
// VMOptions=--write-protect-code --no-dual-map-code
// VMOptions=--write-protect-code --no-dual-map-code --use-slow-path
// VMOptions=--write-protect-code --no-dual-map-code --stacktrace-every=100
// SharedObjects=ffi_test_functions

// @dart = 2.9

import 'dart:ffi';

import "package:expect/expect.dart";

import 'callback_tests_utils.dart';
import 'dylib_utils.dart';

void main() {
  for (int i = 0; i < 100; ++i) {
    testSumFloatsAndDoubles();
    testSumFloatsAndDoublesCallback();
  }
}

DynamicLibrary ffiTestFunctions = dlopenPlatformSpecific("ffi_test_functions");

final sumFloatsAndDoubles = ffiTestFunctions.lookupFunction<
    Double Function(Float, Double, Float),
    double Function(double, double, double)>("SumFloatsAndDoubles");

void testSumFloatsAndDoubles() {
  Expect.approxEquals(6.0, sumFloatsAndDoubles(1.0, 2.0, 3.0));
}

void testSumFloatsAndDoublesCallback() {
  CallbackTest(
          "SumFloatsAndDoubles",
          Pointer.fromFunction<Double Function(Float, Double, Float)>(
              sumFloatsAndDoublesDart, 0.0))
      .run();
}

double sumFloatsAndDoublesDart(double a, double b, double c) {
  print("sumFloatsAndDoublesDart($a, $b, $c)");
  return a + b + c;
}
