// 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.

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

import 'dart:async';
import 'dart:io';

import 'package:ffigen/src/config_provider/config.dart';
import 'package:ffigen/src/header_parser.dart';
import 'package:logging/logging.dart';
import 'package:path/path.dart' as p;
import 'package:test/test.dart';
import 'package:yaml/yaml.dart';

import '../test_utils.dart';

void main() {
  group('swift_example_test', () {
    setUpAll(() {
      logWarnings(Level.SEVERE);
    });

    test('swift', () async {
      // Run the swiftc command from the example README, to generate the header.
      final process = await Process.start(
          'swiftc',
          [
            '-c',
            'swift_api.swift',
            '-module-name',
            'swift_module',
            '-emit-objc-header-path',
            'swift_api.h',
            '-emit-library',
            '-o',
            'libswiftapi.dylib',
          ],
          workingDirectory: p.join(Directory.current.path, 'example/swift'));
      unawaited(stdout.addStream(process.stdout));
      unawaited(stderr.addStream(process.stderr));
      final result = await process.exitCode;
      expect(result, 0);

      final pubspecFile = File('example/swift/pubspec.yaml');
      final pubspecYaml = loadYaml(pubspecFile.readAsStringSync()) as YamlMap;
      final config = Config.fromYaml(pubspecYaml['ffigen'] as YamlMap,
          filename: pubspecFile.path);
      final output = parse(config).generate();

      // Verify that the output contains all the methods and classes that the
      // example app uses.
      expect(output, contains('class SwiftLibrary{'));
      expect(output, contains('class NSString extends NSObject {'));
      expect(output, contains('class SwiftClass extends NSObject {'));
      expect(output, contains('static SwiftClass new1(SwiftLibrary _lib) {'));
      expect(output, contains('NSString sayHello() {'));
      expect(output, contains('int get someField {'));
      expect(output, contains('set someField(int value) {'));

      // Verify that SwiftClass is loaded using the swift_module prefix.
      expect(
          output,
          contains(RegExp(r'late final _class_SwiftClass.* = '
              r'_getClass.*\("swift_module\.SwiftClass"\)')));
    });
  });
}
