// Copyright (c) 2017, 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:analyzer_plugin/protocol/protocol_common.dart';
import 'package:test/test.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';

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

main() {
  defineReflectiveSuite(() {
    defineReflectiveTests(GetStatementCompletionTest);
    defineReflectiveTests(GetStatementCompletionTest_UseCFE);
  });
}

@reflectiveTest
class GetStatementCompletionTest extends AbstractAnalysisServerIntegrationTest {
  test_statement_completion() async {
    String pathname = sourcePath('test.dart');
    String text = r'''
void bar() { foo() } // missing semi-colon
void foo() { }''';
    writeFile(pathname, text);
    standardAnalysisSetup();

    await analysisFinished;
    expect(currentAnalysisErrors[pathname], isNotEmpty);

    // expect a statement completion result
    EditGetStatementCompletionResult result =
        await sendEditGetStatementCompletion(pathname, text.indexOf('foo('));
    expect(result.change.edits, isNotEmpty);

    // apply the edit, expect that the new code has no errors
    SourceChange change = result.change;
    expect(change.edits.first.edits, isNotEmpty);
    for (SourceEdit edit in change.edits.first.edits) {
      text = text.replaceRange(edit.offset, edit.end, edit.replacement);
    }
    expect(text, r'''
void bar() { foo(); } // missing semi-colon

void foo() { }''');

    await sendAnalysisUpdateContent({pathname: new AddContentOverlay(text)});

    await analysisFinished;
    expect(currentAnalysisErrors[pathname], isEmpty);
  }
}

@reflectiveTest
class GetStatementCompletionTest_UseCFE extends GetStatementCompletionTest {
  @override
  bool get useCFE => true;

  @override
  @failingTest
  test_statement_completion() => super.test_statement_completion();
}
