// 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 'dart:async';

import 'package:file/file.dart';

import '../src/common.dart';
import 'test_data/hot_reload_with_asset.dart';
import 'test_driver.dart';
import 'test_utils.dart';

void main() {
  late Directory tempDir;
  final HotReloadWithAssetProject project = HotReloadWithAssetProject();
  late FlutterRunTestDriver flutter;

  setUp(() async {
    tempDir = createResolvedTempDirectorySync('hot_reload_test.');
    await project.setUpIn(tempDir);
    flutter = FlutterRunTestDriver(tempDir);
  });

  tearDown(() async {
    await flutter.stop();
    tryToDelete(tempDir);
  });

  testWithoutContext('hot reload does not need to sync assets on the first reload', () async {
    final Completer<void> onFirstLoad = Completer<void>();
    final Completer<void> onSecondLoad = Completer<void>();

    flutter.stdout.listen((String line) {
      // If the asset fails to load, this message will be printed instead.
      // this indicates that the devFS was not able to locate the asset
      // after the hot reload.
      if (line.contains('FAILED TO LOAD')) {
        fail('Did not load asset: $line');
      }
      if (line.contains('LOADED DATA')) {
        onFirstLoad.complete();
      }
      if (line.contains('SECOND DATA')) {
        onSecondLoad.complete();
      }
    });
    flutter.stdout.listen(printOnFailure);
    await flutter.run();
    await onFirstLoad.future;

    project.uncommentHotReloadPrint();
    await flutter.hotReload();
    await onSecondLoad.future;
  });

  testWithoutContext('hot restart does not need to sync assets on the first reload', () async {
    final Completer<void> onFirstLoad = Completer<void>();
    final Completer<void> onSecondLoad = Completer<void>();

    flutter.stdout.listen((String line) {
      // If the asset fails to load, this message will be printed instead.
      // this indicates that the devFS was not able to locate the asset
      // after the hot reload.
      if (line.contains('FAILED TO LOAD')) {
        fail('Did not load asset: $line');
      }
      if (line.contains('LOADED DATA')) {
        onFirstLoad.complete();
      }
      if (line.contains('SECOND DATA')) {
        onSecondLoad.complete();
      }
    });
    flutter.stdout.listen(printOnFailure);
    await flutter.run();
    await onFirstLoad.future;

    project.uncommentHotReloadPrint();
    await flutter.hotRestart();
    await onSecondLoad.future;
  });
}
