// Copyright 2014 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// @dart = 2.8

import 'package:file/file.dart';
import 'package:file/memory.dart';
import 'package:flutter_tools/src/platform_plugins.dart';


import '../src/common.dart';

void main() {
  testWithoutContext('AndroidPlugin throws tool exit if the plugin main class can not be found', () {
    final FileSystem fileSystem = MemoryFileSystem.test();
    final AndroidPlugin androidPlugin = AndroidPlugin(
      name: 'pluginA',
      package: 'com.company',
      pluginClass: 'PluginA',
      pluginPath: '.pub_cache/plugin_a',
      fileSystem: fileSystem,
    );

    expect(() => androidPlugin.toMap(), throwsToolExit(
      message: "The plugin `pluginA` doesn't have a main class defined in "
      '.pub_cache/plugin_a/android/src/main/java/com/company/PluginA.java '
      'or .pub_cache/plugin_a/android/src/main/kotlin/com/company/PluginA.kt'
    ));
  });

  testWithoutContext('AndroidPlugin parses embedding version 2 from the Java search path', () {
    final FileSystem fileSystem = MemoryFileSystem.test();
    final AndroidPlugin androidPlugin = AndroidPlugin(
      name: 'pluginA',
      package: 'com.company',
      pluginClass: 'PluginA',
      pluginPath: '.pub_cache/plugin_a',
      fileSystem: fileSystem,
    );

    fileSystem.file('.pub_cache/plugin_a/android/src/main/java/com/company/PluginA.java')
      ..createSync(recursive: true)
      ..writeAsStringSync('io.flutter.embedding.engine.plugins.FlutterPlugin');

    expect(androidPlugin.toMap(), <String, Object>{
      'name': 'pluginA',
      'package': 'com.company',
      'class': 'PluginA',
      'supportsEmbeddingV1': false,
      'supportsEmbeddingV2': true,
    });
  });

  testWithoutContext('AndroidPlugin parses embedding version 1 from the Java search path', () {
    final FileSystem fileSystem = MemoryFileSystem.test();
    final AndroidPlugin androidPlugin = AndroidPlugin(
      name: 'pluginA',
      package: 'com.company',
      pluginClass: 'PluginA',
      pluginPath: '.pub_cache/plugin_a',
      fileSystem: fileSystem,
    );

    fileSystem.file('.pub_cache/plugin_a/android/src/main/java/com/company/PluginA.java')
      ..createSync(recursive: true)
      ..writeAsStringSync('some.other.string');

    expect(androidPlugin.toMap(), <String, Object>{
      'name': 'pluginA',
      'package': 'com.company',
      'class': 'PluginA',
      'supportsEmbeddingV1': true,
      'supportsEmbeddingV2': false,
    });
  });

  testWithoutContext('AndroidPlugin parses embedding version 2 from the Kotlin search path', () {
    final FileSystem fileSystem = MemoryFileSystem.test();
    final AndroidPlugin androidPlugin = AndroidPlugin(
      name: 'pluginA',
      package: 'com.company',
      pluginClass: 'PluginA',
      pluginPath: '.pub_cache/plugin_a',
      fileSystem: fileSystem,
    );

    fileSystem.file('.pub_cache/plugin_a/android/src/main/kotlin/com/company/PluginA.kt')
      ..createSync(recursive: true)
      ..writeAsStringSync('io.flutter.embedding.engine.plugins.FlutterPlugin');

    expect(androidPlugin.toMap(), <String, Object>{
      'name': 'pluginA',
      'package': 'com.company',
      'class': 'PluginA',
      'supportsEmbeddingV1': false,
      'supportsEmbeddingV2': true,
    });
  });

  testWithoutContext('AndroidPlugin parses embedding version 1 from the Kotlin search path', () {
    final FileSystem fileSystem = MemoryFileSystem.test();
    final AndroidPlugin androidPlugin = AndroidPlugin(
      name: 'pluginA',
      package: 'com.company',
      pluginClass: 'PluginA',
      pluginPath: '.pub_cache/plugin_a',
      fileSystem: fileSystem,
    );

    fileSystem.file('.pub_cache/plugin_a/android/src/main/kotlin/com/company/PluginA.kt')
      ..createSync(recursive: true)
      ..writeAsStringSync('some.other.string');

    expect(androidPlugin.toMap(), <String, Object>{
      'name': 'pluginA',
      'package': 'com.company',
      'class': 'PluginA',
      'supportsEmbeddingV1': true,
      'supportsEmbeddingV2': false,
    });
  });
}
