// 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.
//
// SharedObjects=ffi_test_functions

import 'dart:ffi';

import 'package:expect/expect.dart';

import 'dylib_utils.dart';

void main() {
  doDynamicLinking();
  testHandle();
  testNativeAPIs();
}

void doDynamicLinking() {
  Expect.isTrue(NativeApi.majorVersion == 2);
  Expect.isTrue(NativeApi.minorVersion >= 2);
  final initializeApi = testLibrary.lookupFunction<
      IntPtr Function(Pointer<Void>),
      int Function(Pointer<Void>)>("InitDartApiDL");
  Expect.isTrue(initializeApi(NativeApi.initializeApiDLData) == 0);
}

void testHandle() {
  final s = SomeClass(123);
  print("passObjectToC($s)");
  final result = passObjectToC(s);
  print("result = $result");
  Expect.isTrue(identical(s, result));
}

void testNativeAPIs() {
  // No need to expect here, `lookupFunction` throws an argument error if lookup fails.
  Expect.isTrue(testLibrary.providesSymbol("Dart_IsNull_DL"));
  testLibrary.lookupFunction<Bool Function(Handle), bool Function(Object)>(
      "Dart_IsNull_DL");
  Expect.isTrue(NativeApi.majorVersion == 2);
  Expect.isTrue(NativeApi.minorVersion >= 4);
  Expect.isTrue(testLibrary.providesSymbol("Dart_Null_DL"));
  testLibrary
      .lookupFunction<Handle Function(), Object Function()>("Dart_Null_DL");
}

class SomeClass {
  // We use this getter in the native api, don't tree shake it.
  @pragma("vm:entry-point")
  final int a;
  SomeClass(this.a);
}

final testLibrary = dlopenPlatformSpecific("ffi_test_functions");

final passObjectToC = testLibrary.lookupFunction<Handle Function(Handle),
    Object Function(Object)>("PassObjectToCUseDynamicLinking");
