// Copyright (c) 2022, 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.

// Objective C support is only available on mac.
@TestOn('mac-os')

import 'dart:ffi';
import 'dart:io';

import 'package:test/test.dart';
import '../test_utils.dart';
import 'nullable_bindings.dart';

void main() {
  late NullableTestObjCLibrary lib;
  late NullableInterface nullableInterface;
  late NSObject obj;
  group('method calls', () {
    setUpAll(() {
      logWarnings();
      final dylib = File('test/native_objc_test/nullable_test.dylib');
      verifySetupFile(dylib);
      lib = NullableTestObjCLibrary(DynamicLibrary.open(dylib.absolute.path));
      nullableInterface = NullableInterface.new1(lib);
      obj = NSObject.new1(lib);
    });

    group('Nullable property', () {
      test('Not null', () {
        nullableInterface.nullableObjectProperty = obj;
        expect(nullableInterface.nullableObjectProperty, obj);
      });
      test('Null', () {
        nullableInterface.nullableObjectProperty = null;
        expect(nullableInterface.nullableObjectProperty, null);
      });
    });

    group('Nullable return', () {
      test('Not null', () {
        expect(NullableInterface.returnNil_(lib, false), isA<NSObject>());
      });
      test('Null', () {
        expect(NullableInterface.returnNil_(lib, true), null);
      });
    }, skip: "TODO(#334): enable this test");

    group('Nullable arguments', () {
      test('Not null', () {
        expect(
            NullableInterface.isNullWithNullableNSObjectArg_(lib, obj), false);
      });
      test('Null', () {
        expect(
            NullableInterface.isNullWithNullableNSObjectArg_(lib, null), true);
      });
    });

    group('Not-nullable arguments', () {
      test('Not null', () {
        expect(NullableInterface.isNullWithNotNullableNSObjectPtrArg_(lib, obj),
            false);
      });
    });
  });
}
