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

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));
  }
}
