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

import 'package:file/file.dart';
import 'package:flutter_tools/src/platform_plugins.dart';
import 'package:mockito/mockito.dart';
import 'package:path/path.dart' as p;

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

void main() {
  group('AndroidPlugin', () {
    MockFileSystem mockFileSystem;
    MockPathContext pathContext;

    setUp(() {
      pathContext = MockPathContext();
      when(pathContext.separator).thenReturn('/');

      mockFileSystem = MockFileSystem();
      when(mockFileSystem.path).thenReturn(pathContext);
    });

    testUsingContext('throws tool exit if the plugin main class can\'t be read', () {
      when(pathContext.join('.pub_cache/plugin_a', 'android', 'src', 'main'))
        .thenReturn('.pub_cache/plugin_a/android/src/main');

      when(pathContext.join('.pub_cache/plugin_a/android/src/main', 'java', 'com/company', 'PluginA.java'))
        .thenReturn('.pub_cache/plugin_a/android/src/main/java/com/company/PluginA.java');

      when(pathContext.join('.pub_cache/plugin_a/android/src/main', 'kotlin', 'com/company', 'PluginA.kt'))
        .thenReturn('.pub_cache/plugin_a/android/src/main/kotlin/com/company/PluginA.kt');

      final MockFile pluginJavaMainClass = MockFile();
      when(pluginJavaMainClass.existsSync()).thenReturn(true);
      when(pluginJavaMainClass.readAsStringSync()).thenThrow(const FileSystemException());
      when(mockFileSystem.file('.pub_cache/plugin_a/android/src/main/java/com/company/PluginA.java'))
        .thenReturn(pluginJavaMainClass);

      final MockFile pluginKotlinMainClass = MockFile();
      when(pluginKotlinMainClass.existsSync()).thenReturn(false);
      when(mockFileSystem.file('.pub_cache/plugin_a/android/src/main/kotlin/com/company/PluginA.kt'))
        .thenReturn(pluginKotlinMainClass);

      expect(() {
        AndroidPlugin(
          name: 'pluginA',
          package: 'com.company',
          pluginClass: 'PluginA',
          pluginPath: '.pub_cache/plugin_a',
        ).toMap();
      }, throwsToolExit(
        message: 'Couldn\'t read file null even though it exists. '
                 'Please verify that this file has read permission and try again.'
      ));
    }, overrides: <Type, Generator>{
      FileSystem: () => mockFileSystem,
      ProcessManager: () => FakeProcessManager.any(),
    });
  });
}

class MockFile extends Mock implements File {}
class MockFileSystem extends Mock implements FileSystem {}
class MockPathContext extends Mock implements p.Context {}
