// 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:build/build.dart';
import 'package:flutter_tools/src/build_runner/build_script.dart';
import 'package:mockito/mockito.dart';

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

void main() {
  MockBuildStep mockBuildStep;
  AssetId inputId;

  setUp(() {
    mockBuildStep = MockBuildStep();
    inputId = AssetId('hello_world', 'lib/main.dart');
    when(mockBuildStep.inputId).thenReturn(inputId);
    when(mockBuildStep.readAsString(any)).thenAnswer((Invocation invocation) async {
      return 'void main() { }';
    });

  });

  test('FlutterWebShellBuilder correctly configures platform', () async {
    const FlutterWebShellBuilder builder = FlutterWebShellBuilder(
      hasPlugins: false,
      initializePlatform: true,
    );

    await builder.build(mockBuildStep);

    verify(mockBuildStep.writeAsString(any, argThat(contains('if (true) '
        '{\n    await ui.webOnlyInitializePlatform')))).called(1);
  });

  test('FlutterWebShellBuilder correctly configures does not platform', () async {
    const FlutterWebShellBuilder builder = FlutterWebShellBuilder(
      hasPlugins: false,
      initializePlatform: false,
    );

    await builder.build(mockBuildStep);

    verify(mockBuildStep.writeAsString(any, argThat(contains('if (false) '
        '{\n    await ui.webOnlyInitializePlatform')))).called(1);
  });

  test('FlutterWebShellBuilder correctly configures plugins', () async {
    const FlutterWebShellBuilder builder = FlutterWebShellBuilder(
      hasPlugins: true,
      initializePlatform: true,
    );

    await builder.build(mockBuildStep);

    verify(mockBuildStep.writeAsString(any,
        argThat(contains('registerPlugins(webPluginRegistry)')))).called(1);
  });

  test('FlutterWebShellBuilder correctly does not configure plugins', () async {
    const FlutterWebShellBuilder builder = FlutterWebShellBuilder(
      hasPlugins: false,
      initializePlatform: true,
    );

    await builder.build(mockBuildStep);

    verify(mockBuildStep.writeAsString(any,
        argThat(isNot(contains('registerPlugins(webPluginRegistry)'))))).called(1);
  });
}

class MockBuildStep extends Mock implements BuildStep {}