// Copyright (c) 2019, 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 error handling with dart:ffi functions.
//
// SharedObjects=ffi_test_functions

// @dart = 2.9

import 'dart:ffi' as ffi;
import 'dylib_utils.dart';
import "package:expect/expect.dart";

main() {
  testWrongArity();
  testWrongTypes();
  testDynamicAsFunction();
  testDynamicLookupFunction();
}

ffi.DynamicLibrary ffiTestFunctions =
    dlopenPlatformSpecific("ffi_test_functions");

typedef NativeBinaryOp = ffi.Int32 Function(ffi.Int32, ffi.Int32);
typedef BinaryOp = int Function(int, int);

typedef NativeUnaryOp = ffi.Int64 Function(ffi.Pointer<ffi.Int64>);
typedef UnaryOp = int Function(ffi.Pointer<ffi.Int64>);

void testWrongArity() {
  {
    dynamic sumPlus42 =
        ffiTestFunctions.lookupFunction<NativeBinaryOp, BinaryOp>("SumPlus42");
    Expect.throwsNoSuchMethodError(() => sumPlus42(10));
    Expect.throwsNoSuchMethodError(() => sumPlus42(10, 11, 12));
    Expect.throwsNoSuchMethodError(() => sumPlus42(10, 11, 12, y: 13));
  }

  {
    Function sumPlus42 =
        ffiTestFunctions.lookupFunction<NativeBinaryOp, BinaryOp>("SumPlus42");
    Expect.throwsNoSuchMethodError(() => sumPlus42(10));
    Expect.throwsNoSuchMethodError(() => sumPlus42(10, 11, 12));
    Expect.throwsNoSuchMethodError(() => sumPlus42(10, 11, 12, y: 13));
  }
}

void testWrongTypes() {
  {
    dynamic sumPlus42 =
        ffiTestFunctions.lookupFunction<NativeBinaryOp, BinaryOp>("SumPlus42");
    Expect.throwsTypeError(() => sumPlus42("abc", "def"));
  }

  {
    Function sumPlus42 =
        ffiTestFunctions.lookupFunction<NativeBinaryOp, BinaryOp>("SumPlus42");
    Expect.throwsTypeError(() => sumPlus42("abc", "def"));
  }

  {
    dynamic pointerOp = ffiTestFunctions
        .lookupFunction<NativeUnaryOp, UnaryOp>("Assign1337Index1");
    Expect.throwsTypeError(() => pointerOp(0));
  }
}

// Test that invoking 'Pointer.asFunction' with a dynamic receiver type throws
// an exception.
void testDynamicAsFunction() {
  dynamic x = ffi.nullptr.cast<ffi.NativeFunction<ffi.Void Function()>>();
  Expect.throwsNoSuchMethodError(() {
    x.asFunction<void Function()>();
  });
}

// Test that invoking 'DynamicLibrary.lookupFunction' with a dynamic receiver
// type throws an exception.
void testDynamicLookupFunction() {
  dynamic lib = ffiTestFunctions;
  Expect.throwsNoSuchMethodError(() {
    lib.lookupFunction<ffi.Void Function(), void Function()>("_");
  });
}
