// 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/base/file_system.dart';
import 'package:flutter_tools/src/fuchsia/fuchsia_sdk.dart';
import 'package:flutter_tools/src/fuchsia/fuchsia_workflow.dart';
import 'package:mockito/mockito.dart';

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

class MockFile extends Mock implements File {}

void main() {
  group('Fuchsia workflow', () {
    final MockFile devFinder = MockFile();
    final MockFile sshConfig = MockFile();
    when(devFinder.absolute).thenReturn(devFinder);
    when(sshConfig.absolute).thenReturn(sshConfig);

    testUsingContext('can not list and launch devices if there is not ssh config and dev finder', () {
      expect(fuchsiaWorkflow.canLaunchDevices, false);
      expect(fuchsiaWorkflow.canListDevices, false);
      expect(fuchsiaWorkflow.canListEmulators, false);
    }, overrides: <Type, Generator>{
      FuchsiaArtifacts: () => FuchsiaArtifacts(devFinder: null, sshConfig: null),
    });

    testUsingContext('can not list and launch devices if there is not ssh config and dev finder', () {
      expect(fuchsiaWorkflow.canLaunchDevices, false);
      expect(fuchsiaWorkflow.canListDevices, true);
      expect(fuchsiaWorkflow.canListEmulators, false);
    }, overrides: <Type, Generator>{
      FuchsiaArtifacts: () => FuchsiaArtifacts(devFinder: devFinder, sshConfig: null),
    });

    testUsingContext('can list and launch devices supported with sufficient SDK artifacts', () {
      expect(fuchsiaWorkflow.canLaunchDevices, true);
      expect(fuchsiaWorkflow.canListDevices, true);
      expect(fuchsiaWorkflow.canListEmulators, false);
    }, overrides: <Type, Generator>{
      FuchsiaArtifacts: () =>
          FuchsiaArtifacts(devFinder: devFinder, sshConfig: sshConfig),
    });
  });
}
