// Copyright 2019 The Chromium 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/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(processManager.run(<String>['clang++', '--version'])).thenAnswer((_) async {
        return FakeProcessResult(
          stdout: 'clang version 4.0.1-10 (tags/RELEASE_401/final)\njunk',
          exitCode: 0,
        );
      });
      when(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(processManager.run(<String>['clang++', '--version'])).thenAnswer((_) async {
        return FakeProcessResult(
          stdout: 'clang version 2.0.1-10 (tags/RELEASE_401/final)\njunk',
          exitCode: 0,
        );
      });
      when(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(processManager.run(<String>['clang++', '--version'])).thenAnswer((_) async {
        return FakeProcessResult(
          stdout: 'clang version 4.0.1-10 (tags/RELEASE_401/final)\njunk',
          exitCode: 0,
        );
      });
      when(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(processManager.run(<String>['clang++', '--version'])).thenAnswer((_) async {
        return FakeProcessResult(
          stdout: '',
          exitCode: 1,
        );
      });
      when(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(processManager.run(<String>['clang++', '--version'])).thenAnswer((_) async {
        return FakeProcessResult(
          stdout: '',
          exitCode: 1,
        );
      });
      when(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 {}
