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

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()>("_");
  });
}
