// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
// for details. 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:test/test.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';

import 'integration_tests.dart';

void main() {
  defineReflectiveSuite(() {
    defineReflectiveTests(AnalyzerStatusTest);
  });
}

@reflectiveTest
class AnalyzerStatusTest extends AbstractLspAnalysisServerIntegrationTest {
  Future<void> test_afterDocumentEdits() async {
    const initialContents = 'int a = 1;';
    newFile(mainFilePath, content: initialContents);

    final initialAnalysis = waitForAnalysisComplete();

    await initialize();
    await initialAnalysis;

    // Set up futures to wait for the new events.
    final startNotification = waitForAnalysisStart();
    final completeNotification = waitForAnalysisComplete();

    // Send a modification
    await openFile(mainFileUri, initialContents);
    await replaceFile(222, mainFileUri, 'String a = 1;');

    // Ensure the notifications come through again.
    await startNotification;
    await completeNotification;
  }

  Future<void> test_afterInitialize() async {
    const initialContents = 'int a = 1;';
    newFile(mainFilePath, content: initialContents);

    // To avoid races, set up listeners for the notifications before we initialise
    // and track which event came first to ensure they arrived in the expected
    // order.
    bool? firstNotificationWasAnalyzing;
    final startNotification = waitForAnalysisStart()
        .then((_) => firstNotificationWasAnalyzing ??= true);
    final completeNotification = waitForAnalysisComplete()
        .then((_) => firstNotificationWasAnalyzing ??= false);

    await initialize();
    await startNotification;
    await completeNotification;

    expect(firstNotificationWasAnalyzing, isTrue);
  }
}
