/* * Copyright (c) 2013, the Dart project authors. * * Licensed under the Eclipse Public License v1.0 (the "License"); you may not use this file except * in compliance with the License. You may obtain a copy of the License at * * http://www.eclipse.org/legal/epl-v10.html * * Unless required by applicable law or agreed to in writing, software distributed under the License * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express * or implied. See the License for the specific language governing permissions and limitations under * the License. */ package com.google.dart.engine.services.internal.refactoring; import com.google.dart.engine.ast.ConstructorDeclaration; import com.google.dart.engine.element.ConstructorElement; import com.google.dart.engine.services.change.Change; import com.google.dart.engine.services.status.RefactoringStatusSeverity; import com.google.dart.engine.source.FileBasedSource; import com.google.dart.engine.source.Source; import java.io.File; /** * Test for {@link RenameConstructorRefactoringImpl}. */ public class RenameConstructorRefactoringImplTest extends RenameRefactoringImplTest { public void test_checkFinalConditions_hasMember_ClassElement() throws Exception { indexTestUnit( "// filler filler filler filler filler filler filler filler filler filler", "class A {", " A.test() {}", " A.newName() {} // existing", "}"); createRenameRefactoring("test() {}"); // check status refactoring.setNewName("newName"); assertRefactoringStatus( refactoring.checkFinalConditions(pm), RefactoringStatusSeverity.ERROR, "Class 'A' already declares constructor with name 'newName'.", findRangeIdentifier("newName() {} // existing")); } public void test_checkFinalConditions_hasMember_MethodElement() throws Exception { indexTestUnit( "// filler filler filler filler filler filler filler filler filler filler", "class A {", " A.test() {}", " newName() {} // existing", "}"); createRenameRefactoring("test() {}"); // check status refactoring.setNewName("newName"); assertRefactoringStatus( refactoring.checkFinalConditions(pm), RefactoringStatusSeverity.ERROR, "Class 'A' already declares method with name 'newName'.", findRangeIdentifier("newName() {} // existing")); } public void test_checkNewName() throws Exception { indexTestUnit( "// filler filler filler filler filler filler filler filler filler filler", "class A {", " A.test() {} // marker", "}"); createRenameRefactoring("test() {} // marker"); // null assertRefactoringStatus( refactoring.checkNewName(null), RefactoringStatusSeverity.ERROR, "Constructor name must not be null."); // empty assertRefactoringStatusOK(refactoring.checkNewName("")); // same name assertRefactoringStatus( refactoring.checkNewName("test"), RefactoringStatusSeverity.FATAL, "Choose another name."); } public void test_createChange_changeName_redirect() throws Exception { indexTestUnit( "// filler filler filler filler filler filler filler filler filler filler", "class A implements B {", " A.test() {} // marker", "}", "class B {", " factory B.named() = A.test;", "}", "main() {", " new A.test();", "}"); // configure refactoring createRenameRefactoring("test() {} // marker"); assertEquals("Rename Constructor", refactoring.getRefactoringName()); refactoring.setNewName("newName"); // validate change assertSuccessfulRename( "// filler filler filler filler filler filler filler filler filler filler", "class A implements B {", " A.newName() {} // marker", "}", "class B {", " factory B.named() = A.newName;", "}", "main() {", " new A.newName();", "}"); } public void test_createChange_changeName_super() throws Exception { indexTestUnit( "// filler filler filler filler filler filler filler filler filler filler", "class A {", " A.test() {} // marker", "}", "class B extends A {", " B() : super.test() {}", "}", "main() {", " new A.test();", "}"); // configure refactoring createRenameRefactoring("test() {} // marker"); assertEquals("Rename Constructor", refactoring.getRefactoringName()); refactoring.setNewName("newName"); // validate change assertSuccessfulRename( "// filler filler filler filler filler filler filler filler filler filler", "class A {", " A.newName() {} // marker", "}", "class B extends A {", " B() : super.newName() {}", "}", "main() {", " new A.newName();", "}"); } public void test_createChange_classTypeAlias() throws Exception { indexTestUnit( "// filler filler filler filler filler filler filler filler filler filler", "class A implements B {", " A.test() {}", "}", "class C {}", "class B = A with C;", "main() {", " new A.test();", " new B.test();", "}"); // configure refactoring { ConstructorElement constructor = findNode("A.test() {}", ConstructorDeclaration.class).getElement(); createRenameRefactoring(constructor); } assertEquals("Rename Constructor", refactoring.getRefactoringName()); refactoring.setNewName("newName"); // validate change assertSuccessfulRename( "// filler filler filler filler filler filler filler filler filler filler", "class A implements B {", " A.newName() {}", "}", "class C {}", "class B = A with C;", "main() {", " new A.newName();", " new B.newName();", "}"); } public void test_createChange_multipleUnits() throws Exception { testCode = makeSource( "// filler filler filler filler filler filler filler filler filler filler", "library libA;", "class A {", " A.test() {} // marker", "}", "class B extends A {", " B() : super.test() {}", "}", "main() {", " new A.test();", "}"); Source libA = addSource(testCode); Source libB = addSource( "/B.dart", makeSource( "// filler filler filler filler filler filler filler filler filler filler", "import 'test.dart';", "main() {", " new A.test();", "}")); indexTestUnit(libA); indexUnit(libB); Source sourceB = libB; // configure refactoring createRenameRefactoring("test() {} // marker"); assertEquals("Rename Constructor", refactoring.getRefactoringName()); refactoring.setNewName("newName"); // validate change assertRefactoringStatusOK(); Change refactoringChange = refactoring.createChange(pm); assertChangeResult( refactoringChange, testSource, makeSource( "// filler filler filler filler filler filler filler filler filler filler", "library libA;", "class A {", " A.newName() {} // marker", "}", "class B extends A {", " B() : super.newName() {}", "}", "main() {", " new A.newName();", "}")); assertChangeResult( refactoringChange, sourceB, makeSource( "// filler filler filler filler filler filler filler filler filler filler", "import 'test.dart';", "main() {", " new A.newName();", "}")); } public void test_createChange_remove() throws Exception { indexTestUnit( "// filler filler filler filler filler filler filler filler filler filler", "class A {", " A.test() {} // marker", "}", "class B extends A {", " B() : super.test() {}", "}", "main() {", " new A.test();", "}"); // configure refactoring createRenameRefactoring("test() {} // marker"); assertEquals("Rename Constructor", refactoring.getRefactoringName()); refactoring.setNewName(""); // validate change assertSuccessfulRename( "// filler filler filler filler filler filler filler filler filler filler", "class A {", " A() {} // marker", "}", "class B extends A {", " B() : super() {}", "}", "main() {", " new A();", "}"); } public void test_createChange_setName() throws Exception { indexTestUnit( "// filler filler filler filler filler filler filler filler filler filler", "class A {", " A() {} // marker", "}", "class B extends A {", " B() : super() {}", "}", "main() {", " new A();", "}"); // configure refactoring { ConstructorElement constructor = findNode("A() {}", ConstructorDeclaration.class).getElement(); createRenameRefactoring(constructor); } assertEquals("Rename Constructor", refactoring.getRefactoringName()); refactoring.setNewName("newName"); // validate change assertSuccessfulRename( "// filler filler filler filler filler filler filler filler filler filler", "class A {", " A.newName() {} // marker", "}", "class B extends A {", " B() : super.newName() {}", "}", "main() {", " new A.newName();", "}"); } public void test_shouldReportUnsafeRefactoringSource() throws Exception { indexTestUnit( "// filler filler filler filler filler filler filler filler filler filler", "class A {", " A.myPublic() {}", " A._myPrivate() {}", "}"); Source externalSource = new FileBasedSource(new File("other.dart")); // check public createRenameRefactoring("myPublic() {}"); assertTrue(refactoring.shouldReportUnsafeRefactoringSource(analysisContext, testSource)); assertTrue(refactoring.shouldReportUnsafeRefactoringSource(analysisContext, externalSource)); assertFalse(refactoring.shouldReportUnsafeRefactoringSource(null, testSource)); // check private createRenameRefactoring("_myPrivate() {}"); assertTrue(refactoring.shouldReportUnsafeRefactoringSource(analysisContext, testSource)); assertFalse(refactoring.shouldReportUnsafeRefactoringSource(analysisContext, externalSource)); } }