// 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/artifacts.dart';
import 'package:flutter_tools/src/base/file_system.dart';
import 'package:flutter_tools/src/base/io.dart';
import 'package:flutter_tools/src/base/logger.dart';
import 'package:flutter_tools/src/globals.dart';
import 'package:flutter_tools/src/web/compile.dart';
import 'package:mockito/mockito.dart';
import 'package:process/process.dart';

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

void main() {
  final MockProcessManager mockProcessManager = MockProcessManager();
  final MockProcess mockProcess = MockProcess();
  final BufferLogger mockLogger = BufferLogger();

  testUsingContext('invokes dart2js with correct arguments', () async {
    const WebCompiler webCompiler = WebCompiler();
    final String engineDartPath = artifacts.getArtifactPath(Artifact.engineDartBinary);
    final String dart2jsPath = artifacts.getArtifactPath(Artifact.dart2jsSnapshot);
    final String flutterPatchedSdkPath = artifacts.getArtifactPath(Artifact.flutterPatchedSdkPath);
    final String librariesPath = fs.path.join(flutterPatchedSdkPath, 'libraries.json');

    when(mockProcess.stdout).thenAnswer((Invocation invocation) => const Stream<List<int>>.empty());
    when(mockProcess.stderr).thenAnswer((Invocation invocation) => const Stream<List<int>>.empty());
    when(mockProcess.exitCode).thenAnswer((Invocation invocation) async => 0);
    when(mockProcessManager.start(any)).thenAnswer((Invocation invocation) async => mockProcess);
    when(mockProcessManager.canRun(engineDartPath)).thenReturn(true);

    await webCompiler.compile(target: 'lib/main.dart');

    final String outputPath = fs.path.join('build', 'web', 'main.dart.js');
    verify(mockProcessManager.start(<String>[
      engineDartPath,
      dart2jsPath,
      'lib/main.dart',
      '-o',
      outputPath,
      '--libraries-spec=$librariesPath',
      '--platform-binaries=$flutterPatchedSdkPath',
      '-m',
    ])).called(1);
  }, overrides: <Type, Generator>{
    ProcessManager: () => mockProcessManager,
    Logger: () => mockLogger,
  });
}

class MockProcessManager extends Mock implements ProcessManager {}
class MockProcess extends Mock implements Process {}