// 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/memory.dart';
import 'package:flutter_tools/src/base/file_system.dart';
import 'package:flutter_tools/src/base/platform.dart';
import 'package:flutter_tools/src/base/user_messages.dart';
import 'package:flutter_tools/src/base/version.dart';
import 'package:flutter_tools/src/doctor_validator.dart';
import 'package:flutter_tools/src/vscode/vscode.dart';
import 'package:flutter_tools/src/vscode/vscode_validator.dart';
import 'package:test/fake.dart';

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

void main() {
  testWithoutContext('VsCode search locations on windows supports an empty environment', () {
    final FileSystem fileSystem = MemoryFileSystem.test(style: FileSystemStyle.windows);
    final Platform platform = FakePlatform(
      operatingSystem: 'windows',
      environment: <String, String>{},
    );

    expect(VsCode.allInstalled(fileSystem, platform, FakeProcessManager.any()), isEmpty);
  });

  group(VsCodeValidator, () {
    testUsingContext('Warns if VS Code version could not be found', () async {
      final VsCodeValidator validator = VsCodeValidator(_FakeVsCode());
      final ValidationResult result = await validator.validate();
      expect(result.messages, contains(const ValidationMessage.error('Unable to determine VS Code version.')));
      expect(result.statusInfo, 'version unknown');
    }, overrides: <Type, Generator>{
      UserMessages: () => UserMessages(),
    });
  });
}

class _FakeVsCode extends Fake implements VsCode {
  @override
  Iterable<ValidationMessage> get validationMessages => <ValidationMessage>[];

  @override
  String get productName => 'VS Code';

  @override
  Version? get version => null;
}