// 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",
    );
