// 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:flutter_tools/src/doctor.dart';
import 'package:flutter_tools/src/globals.dart' as globals;
import 'package:flutter_tools/src/linux/linux_doctor.dart';
import 'package:mockito/mockito.dart';
import 'package:process/process.dart';

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

void main() {
  group(LinuxDoctorValidator, () {
    ProcessManager processManager;
    LinuxDoctorValidator linuxDoctorValidator;

    setUp(() {
      processManager = MockProcessManager();
      linuxDoctorValidator = LinuxDoctorValidator();
    });

    testUsingContext('Returns full validation when clang++ and make are availibe', () async {
      when(globals.processManager.run(<String>['clang++', '--version'])).thenAnswer((_) async {
        return FakeProcessResult(
          stdout: 'clang version 4.0.1-10 (tags/RELEASE_401/final)\njunk',
          exitCode: 0,
        );
      });
      when(globals.processManager.run(<String>[
        'make',
        '--version',
      ])).thenAnswer((_) async {
        return FakeProcessResult(
          stdout: 'GNU Make 4.1\njunk',
          exitCode: 0,
        );
      });

      final ValidationResult result = await linuxDoctorValidator.validate();
      expect(result.type, ValidationType.installed);
      expect(result.messages, <ValidationMessage>[
        ValidationMessage('clang++ 4.0.1'),
        ValidationMessage('GNU Make 4.1'),
      ]);
    }, overrides: <Type, Generator>{
      ProcessManager: () => processManager,
    });

    testUsingContext('Returns partial validation when clang++ version is too old', () async {
      when(globals.processManager.run(<String>['clang++', '--version'])).thenAnswer((_) async {
        return FakeProcessResult(
          stdout: 'clang version 2.0.1-10 (tags/RELEASE_401/final)\njunk',
          exitCode: 0,
        );
      });
      when(globals.processManager.run(<String>[
        'make',
        '--version',
      ])).thenAnswer((_) async {
        return FakeProcessResult(
          stdout: 'GNU Make 4.1\njunk',
          exitCode: 0,
        );
      });

      final ValidationResult result = await linuxDoctorValidator.validate();
      expect(result.type, ValidationType.partial);
      expect(result.messages, <ValidationMessage>[
        ValidationMessage.error('clang++ 2.0.1 is below minimum version of 3.4.0'),
        ValidationMessage('GNU Make 4.1'),
      ]);
    }, overrides: <Type, Generator>{
      ProcessManager: () => processManager,
    });

    testUsingContext('Returns mising validation when make is not availible', () async {
      when(globals.processManager.run(<String>['clang++', '--version'])).thenAnswer((_) async {
        return FakeProcessResult(
          stdout: 'clang version 4.0.1-10 (tags/RELEASE_401/final)\njunk',
          exitCode: 0,
        );
      });
      when(globals.processManager.run(<String>[
        'make',
        '--version',
      ])).thenAnswer((_) async {
        return FakeProcessResult(
          stdout: '',
          exitCode: 1,
        );
      });

      final ValidationResult result = await linuxDoctorValidator.validate();
      expect(result.type, ValidationType.missing);
      expect(result.messages, <ValidationMessage>[
        ValidationMessage('clang++ 4.0.1'),
        ValidationMessage.error('make is not installed'),
      ]);
    }, overrides: <Type, Generator>{
      ProcessManager: () => processManager,
    });

    testUsingContext('Returns mising validation when clang++ is not availible', () async {
      when(globals.processManager.run(<String>['clang++', '--version'])).thenAnswer((_) async {
        return FakeProcessResult(
          stdout: '',
          exitCode: 1,
        );
      });
      when(globals.processManager.run(<String>[
        'make',
        '--version',
      ])).thenAnswer((_) async {
        return FakeProcessResult(
          stdout: 'GNU Make 4.1\njunk',
          exitCode: 0,
        );
      });

      final ValidationResult result = await linuxDoctorValidator.validate();
      expect(result.type, ValidationType.missing);
      expect(result.messages, <ValidationMessage>[
        ValidationMessage.error('clang++ is not installed'),
        ValidationMessage('GNU Make 4.1'),
      ]);
    }, overrides: <Type, Generator>{
      ProcessManager: () => processManager,
    });


    testUsingContext('Returns missing validation when clang and make are not availible', () async {
      when(globals.processManager.run(<String>['clang++', '--version'])).thenAnswer((_) async {
        return FakeProcessResult(
          stdout: '',
          exitCode: 1,
        );
      });
      when(globals.processManager.run(<String>[
        'make',
        '--version',
      ])).thenAnswer((_) async {
        return FakeProcessResult(
          stdout: '',
          exitCode: 1,
        );
      });

      final ValidationResult result = await linuxDoctorValidator.validate();
      expect(result.type, ValidationType.missing);
    }, overrides: <Type, Generator>{
      ProcessManager: () => processManager,
    });
  });
}

class MockProcessManager extends Mock implements ProcessManager {}
