// 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(GetRefactoringTest);
    defineReflectiveTests(GetRefactoringTest_UseCFE);
  });
}

@reflectiveTest
class GetRefactoringTest extends AbstractAnalysisServerIntegrationTest {
  test_rename() async {
    String pathname = sourcePath('test.dart');
    String text = r'''
void foo() { }

void bar() {
  foo();
  foo();
}
''';
    writeFile(pathname, text);
    standardAnalysisSetup();

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

    // expect no edits if no rename options specified
    EditGetRefactoringResult result = await sendEditGetRefactoring(
        RefactoringKind.RENAME, pathname, text.indexOf('foo('), 0, false);
    expect(result.initialProblems, isEmpty);
    expect(result.optionsProblems, isEmpty);
    expect(result.finalProblems, isEmpty);
    expect(result.potentialEdits, isNull);
    expect(result.change, isNull);

    // expect a valid rename refactoring
    result = await sendEditGetRefactoring(
        RefactoringKind.RENAME, pathname, text.indexOf('foo('), 0, false,
        options: new RenameOptions('baz'));
    expect(result.initialProblems, isEmpty);
    expect(result.optionsProblems, isEmpty);
    expect(result.finalProblems, isEmpty);
    expect(result.potentialEdits, isNull);
    expect(result.change.edits, isNotEmpty);

    // apply the refactoring, 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);
    }
    await sendAnalysisUpdateContent({pathname: new AddContentOverlay(text)});

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

@reflectiveTest
class GetRefactoringTest_UseCFE extends GetRefactoringTest {
  @override
  bool get useCFE => true;

  @override
  @failingTest
  Future test_rename() => test_rename();
}
