Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(537)

Unified Diff: pkg/analysis_server/test/edit/refactoring_test.dart

Issue 499723002: Implement 'edit.getRefactoring' for rename refactoring. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Tweak for comment Created 6 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: pkg/analysis_server/test/edit/refactoring_test.dart
diff --git a/pkg/analysis_server/test/edit/refactoring_test.dart b/pkg/analysis_server/test/edit/refactoring_test.dart
index 7dac7e3ecd377fc55228ad2a6924923b597eb626..bb68e3bc29431a41d6c0715e3b88a05e961fed7e 100644
--- a/pkg/analysis_server/test/edit/refactoring_test.dart
+++ b/pkg/analysis_server/test/edit/refactoring_test.dart
@@ -10,7 +10,11 @@ import 'package:analysis_server/src/edit/edit_domain.dart';
import 'package:analysis_server/src/protocol.dart';
import 'package:analysis_server/src/protocol2.dart' show
EditGetAvailableRefactoringsParams, EditGetAvailableRefactoringsResult,
- RefactoringKind;
+ EditGetRefactoringParams, EditGetRefactoringResult, RefactoringKind,
+ RefactoringProblem, RefactoringProblemSeverity, RenameOptions, SourceChange,
+ SourceEdit, SourceFileEdit;
+import 'package:analysis_server/src/services/index/index.dart';
+import 'package:analysis_server/src/services/index/local_memory_index.dart';
import 'package:analysis_testing/reflective_tests.dart';
import 'package:unittest/unittest.dart' hide ERROR;
@@ -20,6 +24,7 @@ import '../analysis_abstract.dart';
main() {
groupSep = ' | ';
runReflectiveTests(GetAvailableRefactoringsTest);
+ runReflectiveTests(GetRefactoring_Rename_Test);
}
@@ -202,3 +207,365 @@ main() {
});
}
}
+
+
+@ReflectiveTestCase()
+class GetRefactoring_Rename_Test extends _AbstractGetRefactoring_Test {
+ test_class() {
+ addTestFile('''
+class Test {}
+main() {
+ Test v;
+}
+''');
+ String search = 'Test {}';
+ String newName = 'NewName';
+ return assertSuccessfulRefactoring(search, newName, '''
+class NewName {}
+main() {
+ NewName v;
+}
+''');
+ }
+
+ test_classMember_field() {
+ addTestFile('''
+class A {
+ var test = 0;
+ main() {
+ print(test);
+ }
+}
+''');
+ String search = 'test = 0';
+ String newName = 'newName';
+ return assertSuccessfulRefactoring(search, newName, '''
+class A {
+ var newName = 0;
+ main() {
+ print(newName);
+ }
+}
+''');
+ }
+
+ test_classMember_getter() {
+ addTestFile('''
+class A {
+ get test => 0;
+ main() {
+ print(test);
+ }
+}
+''');
+ String search = 'test =>';
+ String newName = 'newName';
+ return assertSuccessfulRefactoring(search, newName, '''
+class A {
+ get newName => 0;
+ main() {
+ print(newName);
+ }
+}
+''');
+ }
+
+ test_classMember_setter() {
+ addTestFile('''
+class A {
+ set test(x) {}
+ main() {
+ test = 0;
+ }
+}
+''');
+ String search = 'test = 0';
+ String newName = 'newName';
+ return assertSuccessfulRefactoring(search, newName, '''
+class A {
+ set newName(x) {}
+ main() {
+ newName = 0;
+ }
+}
+''');
+ }
+
+ test_class_options_fatalError() {
+ addTestFile('''
+class Test {}
+main() {
+ Test v;
+}
+''');
+ return waitForTasksFinished().then((_) {
+ String search = 'Test {}';
+ return sendRenameRequest(search, '').then((Response response) {
+ var result = new EditGetRefactoringResult.fromResponse(response);
+ assertResultProblemsFatal(result, 'Class name must not be empty.');
+ // ...there is no any change
+ expect(result.change, isNull);
+ });
+ });
+ }
+
+ test_class_validateOnly() {
+ addTestFile('''
+class Test {}
+main() {
+ Test v;
+}
+''');
+ String search = 'Test {}';
+ String newName = 'NewName';
+ return getRefactoringResult(
+ search,
+ newName,
+ validateOnly: true).then((result) {
+ assertResultProblemsOK(result);
+ expect(result.change, isNull);
+ });
+ }
+
+ test_class_warning() {
+ addTestFile('''
+class Test {}
+main() {
+ Test v;
+}
+''');
+ return waitForTasksFinished().then((_) {
+ String search = 'Test {}';
+ return sendRenameRequest(search, 'newName').then((Response response) {
+ var result = new EditGetRefactoringResult.fromResponse(response);
+ assertResultProblemsWarning(
+ result,
+ 'Class name should start with an uppercase letter.');
+ // ...but there is still a change
+ assertTestRefactoringResult(result, '''
+class newName {}
+main() {
+ newName v;
+}
+''');
+ }).then((_) {
+ return sendRenameRequest(search, 'NewName').then((Response response) {
+ var result = new EditGetRefactoringResult.fromResponse(response);
+ // OK
+ assertResultProblemsOK(result);
+ });
+ });
+ });
+ }
+
+ test_constructor() {
+ addTestFile('''
+class A {
+ A.test() {}
+}
+main() {
+ new A.test();
+}
+''');
+ String search = 'test();';
+ String newName = 'newName';
+ return assertSuccessfulRefactoring(search, newName, '''
+class A {
+ A.newName() {}
+}
+main() {
+ new A.newName();
+}
+''');
+ }
+
+ test_function() {
+ addTestFile('''
+test() {}
+main() {
+ test();
+ print(test);
+}
+''');
+ String search = 'test() {}';
+ String newName = 'newName';
+ return assertSuccessfulRefactoring(search, newName, '''
+newName() {}
+main() {
+ newName();
+ print(newName);
+}
+''');
+ }
+
+ test_init_fatalError_noElement() {
+ addTestFile('// nothing to rename');
+ String search = '// nothing';
+ return getRefactoringResult(search, null).then((result) {
+ assertResultProblemsFatal(result, 'Unable to create a refactoring');
+ // ...there is no any change
+ expect(result.change, isNull);
+ });
+ }
+
+ test_localVariable() {
+ addTestFile('''
+main() {
+ int test = 0;
+ test = 1;
+ test += 2;
+ print(test);
+}
+''');
+ String search = 'test = 1';
+ String newName = 'newName';
+ return assertSuccessfulRefactoring(search, newName, '''
+main() {
+ int newName = 0;
+ newName = 1;
+ newName += 2;
+ print(newName);
+}
+''');
+ }
+
+ test_localVariable_finalCheck_shadowError() {
+ addTestFile('''
+main() {
+ var newName;
+ int test = 0;
+ print(test);
+}
+''');
+ String search = 'test = 0';
+ String newName = 'newName';
+ return getRefactoringResult(search, newName).then((result) {
+ assertResultProblemsError(result, "Duplicate local variable 'newName'.");
+ });
+ }
+}
+
+
+@ReflectiveTestCase()
+class _AbstractGetRefactoring_Test extends AbstractAnalysisTest {
+ /**
+ * Asserts that [result] has a single ERROR problem.
+ */
+ void assertResultProblemsError(EditGetRefactoringResult result,
+ [String message]) {
+ List<RefactoringProblem> problems = result.problems;
+ RefactoringProblem problem = problems[0];
+ expect(problems, hasLength(1));
+ expect(
+ problem.severity,
+ RefactoringProblemSeverity.ERROR,
+ reason: problem.toString());
+ if (message != null) {
+ expect(problem.message, message);
+ }
+ }
+
+ /**
+ * Asserts that [result] has a single FATAL problem.
+ */
+ void assertResultProblemsFatal(EditGetRefactoringResult result,
+ [String message]) {
+ List<RefactoringProblem> problems = result.problems;
+ RefactoringProblem problem = problems[0];
+ expect(problems, hasLength(1));
+ expect(
+ problem.severity,
+ RefactoringProblemSeverity.FATAL,
+ reason: problem.toString());
+ if (message != null) {
+ expect(problem.message, message);
+ }
+ }
+
+ /**
+ * Asserts that [result] has no problems at all.
+ */
+ void assertResultProblemsOK(EditGetRefactoringResult result) {
+ expect(result.problems, isEmpty);
+ }
+
+ /**
+ * Asserts that [result] has a single WARNING problem.
+ */
+ void assertResultProblemsWarning(EditGetRefactoringResult result,
+ [String message]) {
+ List<RefactoringProblem> problems = result.problems;
+ RefactoringProblem problem = problems[0];
+ expect(problems, hasLength(1));
+ expect(
+ problem.severity,
+ RefactoringProblemSeverity.WARNING,
+ reason: problem.toString());
+ if (message != null) {
+ expect(problem.message, message);
+ }
+ }
+
+ Future assertSuccessfulRefactoring(String search, String newName,
+ String expectedCode) {
+ return getRefactoringResult(search, newName).then((result) {
+ assertResultProblemsOK(result);
+ assertTestRefactoringResult(result, expectedCode);
+ });
+ }
+
+ /**
+ * Asserts that the given [EditGetRefactoringResult] has a [testFile] change
+ * which results in the [expectedCode].
+ */
+ void assertTestRefactoringResult(EditGetRefactoringResult result,
+ String expectedCode) {
+ SourceChange change = result.change;
+ expect(change, isNotNull);
+ for (SourceFileEdit fileEdit in change.edits) {
+ if (fileEdit.file == testFile) {
+ String actualCode = SourceEdit.applySequence(testCode, fileEdit.edits);
+ expect(actualCode, expectedCode);
+ return;
+ }
+ }
+ fail('No SourceFileEdit for $testFile in $change');
+ }
+
+ @override
+ Index createIndex() {
+ return createLocalMemoryIndex();
+ }
+
+ Future<EditGetRefactoringResult> getRefactoringResult(String search,
+ String newName, {bool validateOnly: false}) {
+ return waitForTasksFinished().then((_) {
+ return sendRenameRequest(
+ search,
+ newName,
+ validateOnly: validateOnly).then((Response response) {
+ return new EditGetRefactoringResult.fromResponse(response);
+ });
+ });
+ }
+
+ Future sendRenameRequest(String search, String newName, {bool validateOnly:
+ false}) {
+ Request request = new EditGetRefactoringParams(
+ RefactoringKind.RENAME,
+ testFile,
+ findOffset(search),
+ 0,
+ validateOnly,
+ options: new RenameOptions(newName)).toRequest('0');
+ return serverChannel.sendRequest(request);
+ }
+
+ @override
+ void setUp() {
+ super.setUp();
+ server.handlers = [new EditDomainHandler(server),];
+ createProject();
+ handler = new EditDomainHandler(server);
+ }
+}
« no previous file with comments | « pkg/analysis_server/lib/src/services/refactoring/naming_conventions.dart ('k') | pkg/analysis_server/test/mocks.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698