blob: 4c8e40200534f2f1ef41d7d28d8dc172e2b3fbc4 [file] [log] [blame]
// 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.
library test.services.refactoring.rename;
import 'dart:async';
import 'package:analysis_services/correction/change.dart';
import 'package:analysis_services/refactoring/refactoring.dart';
import 'package:analyzer/file_system/file_system.dart';
import 'package:analyzer/src/generated/ast.dart';
import 'package:analyzer/src/generated/element.dart';
import 'package:analyzer/src/generated/source.dart';
import 'package:collection/collection.dart';
import 'package:unittest/unittest.dart';
import 'abstract_refactoring.dart';
/**
* The base class for all [RenameRefactoring] tests.
*/
class RenameRefactoringTest extends RefactoringTest {
RenameRefactoring refactoring;
/**
* Asserts that [refactoringChange] contains a [FileEdit] for the file
* with the given [path], and it results the [expectedCode].
*/
void assertFileChangeResult(String path, String expectedCode) {
// prepare FileEdit
FileEdit fileEdit = refactoringChange.getFileEdit(path);
expect(fileEdit, isNotNull);
// validate resulting code
File file = provider.getResource(path);
Source source = file.createSource();
String ini = context.getContents(source).data;
String actualCode = _applyEdits(ini, fileEdit.edits);
expect(actualCode, expectedCode);
}
/**
* Checks that all conditions are OK and the result of applying the [Change]
* to [testUnit] is [expectedCode].
*/
Future assertSuccessfulRename(String expectedCode) {
return assertRefactoringConditionsOK().then((_) {
return refactoring.createChange().then((Change refactoringChange) {
this.refactoringChange = refactoringChange;
assertTestChangeResult(expectedCode);
});
});
}
/**
* Asserts that [refactoringChange] contains a [FileEdit] for [testFile], and
* it results the [expectedCode].
*/
void assertTestChangeResult(String expectedCode) {
// prepare FileEdit
FileEdit fileEdit = refactoringChange.getFileEdit(testFile);
expect(fileEdit, isNotNull);
// validate resulting code
String actualCode = _applyEdits(testCode, fileEdit.edits);
expect(actualCode, expectedCode);
}
/**
* Creates a new [RenameRefactoring] in [refactoring] for the [Element] of
* the [SimpleIdentifier] at the given [search] pattern.
*/
void createRenameRefactoringAtString(String search) {
SimpleIdentifier identifier = findIdentifier(search);
Element element = identifier.bestElement;
// TODO(scheglov) uncomment later
// if (element instanceof PrefixElement) {
// element = IndexContributor.getImportElement(identifier);
// }
createRenameRefactoringForElement(element);
}
/**
* Creates a new [RenameRefactoring] in [refactoring] for [element].
* Fails if no [RenameRefactoring] can be created.
*/
void createRenameRefactoringForElement(Element element) {
refactoring = new RenameRefactoring(searchEngine, element);
expect(refactoring, isNotNull, reason: "No refactoring for '$element'.");
}
// /**
// * Asserts result of applying [change] to [testCode].
// */
// void assertTestChangeResult(Change change, String expected)
// {
// assertChangeResult(change, testSource, expected);
// }
//
// /**
// * Asserts result of applying [change] to [source].
// */
// void assertChangeResult(Change change, Source source, String expected)
// {
// SourceChange sourceChange = getSourceChange(compositeChange, source);
// assertNotNull("No change for: " + source.toString(), sourceChange);
// String sourceResult = getChangeResult(context, source, sourceChange);
// assertEquals(expected, sourceResult);
//// AnalysisContext context = getAnalysisContext();
//// assertChangeResult(context, compositeChange, source, expected);
// }
String _applyEdits(String code, List<Edit> edits) {
// TODO(scheglov) extract and reuse in assists and fixes tests
mergeSort(edits, compare: (a, b) => a.offset - b.offset);
edits.reversed.forEach((Edit edit) {
code = code.substring(0, edit.offset) +
edit.replacement +
code.substring(edit.end);
});
return code;
}
}