// 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); typedef UnaryOp = int Function(ffi.Pointer); void testWrongArity() { { dynamic sumPlus42 = ffiTestFunctions .lookupFunction("SumPlus42"); Expect.throwsNoSuchMethodError(() => sumPlus42(10)); Expect.throwsNoSuchMethodError(() => sumPlus42(10, 11, 12)); Expect.throwsNoSuchMethodError(() => sumPlus42(10, 11, 12, y: 13)); } { Function sumPlus42 = ffiTestFunctions .lookupFunction("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("SumPlus42"); Expect.throwsTypeError(() => sumPlus42("abc", "def")); } { Function sumPlus42 = ffiTestFunctions .lookupFunction("SumPlus42"); Expect.throwsTypeError(() => sumPlus42("abc", "def")); } { dynamic pointerOp = ffiTestFunctions.lookupFunction( "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>(); Expect.throwsNoSuchMethodError(() { x.asFunction(); }); } // Test that invoking 'DynamicLibrary.lookupFunction' with a dynamic receiver // type throws an exception. void testDynamicLookupFunction() { dynamic lib = ffiTestFunctions; Expect.throwsNoSuchMethodError(() { lib.lookupFunction("_"); }); }