// Copyright (c) 2014, 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 'dart:async';

import 'package:analysis_server/protocol/protocol_generated.dart';
import 'package:test/test.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';

import '../support/integration_tests.dart';

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

/// Wrapper around the test package's `fail` function.
///
/// Unlike the test package's `fail` function, this function is not annotated
/// with @alwaysThrows, so we can call it at the top of a test method without
/// causing the rest of the method to be flagged as dead code.
void _fail(String message) {
  fail(message);
}

@reflectiveTest
class SetSubscriptionsTest extends AbstractAnalysisServerIntegrationTest {
  @failingTest
  Future<void> test_setSubscriptions() async {
    // This test times out on the bots and has been disabled to keep them green.
    // We need to discover the cause and re-enable it.

    _fail(
        'This test times out on the bots and has been disabled to keep them green.'
        'We need to discover the cause and re-enable it.');

    var statusReceived = false;
    var analysisBegun = Completer();
    onServerStatus.listen((_) {
      statusReceived = true;
    });
    onAnalysisErrors.listen((_) {
      if (!analysisBegun.isCompleted) {
        analysisBegun.complete();
      }
    });
    await sendServerSetSubscriptions([]);

    var pathname = sourcePath('test.dart');
    writeFile(pathname, '''
void f() {
  var x;
}''');
    await standardAnalysisSetup(subscribeStatus: false);
    // Analysis should begin, but no server.status notification should be
    // received.
    await analysisBegun.future;

    expect(statusReceived, isFalse);
    await sendServerSetSubscriptions([ServerService.STATUS]);

    // Tickle test.dart just in case analysis has already completed.
    writeFile(pathname, '''
void f() {
  var y;
}''');
    // Analysis should eventually complete, and we should be notified
    // about it.
    await analysisFinished;
  }
}
