blob: 2be62cd08381fb8835596cf3a26fbc47a13a0ed0 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2005, 2006 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.jdt.ui.tests.refactoring;
import junit.framework.Test;
import junit.framework.TestCase;
import junit.framework.TestSuite;
import org.eclipse.jdt.internal.corext.refactoring.rename.RenamingNameSuggestor;
public class RenamingNameSuggestorTests extends TestCase {
public static Test suite() {
return new TestSuite(RenamingNameSuggestorTests.class);
}
String[] fPrefixes;
String[] fSuffixes;
RenamingNameSuggestor fSuggestor;
private String fHelper(String oldFieldName, String oldTypeName, String newTypeName) {
return fSuggestor.suggestNewVariableName(fPrefixes, fSuffixes, oldFieldName, oldTypeName, newTypeName);
}
private String mHelper(String oldFieldName, String oldTypeName, String newTypeName) {
return fSuggestor.suggestNewMethodName(oldFieldName, oldTypeName, newTypeName);
}
public void mh(String orig, String changed, String oldT, String newT) {
assertEquals(changed, mHelper(orig, oldT, newT));
}
public void mhf(String orig, String oldT, String newT) {
assertEquals(null, mHelper(orig, oldT, newT));
}
public void fh(String orig, String changed, String oldT, String newT) {
assertEquals(changed, fHelper(orig, oldT, newT));
}
public void fhf(String orig, String oldT, String newT) {
assertEquals(null, fHelper(orig, oldT, newT));
}
public void setStrategy(int strategy) {
fSuggestor= new RenamingNameSuggestor(strategy);
}
public void testOnlyPrefix() {
fPrefixes= new String[] { "f", "q" };
fSuffixes= new String[0];
setStrategy(RenamingNameSuggestor.STRATEGY_EXACT);
// Prefix can, but need not be specified.
assertEquals("fSomeOtherClass", fHelper("fSomeClass", "SomeClass", "SomeOtherClass"));
assertEquals("qSomeOtherClass", fHelper("qSomeClass", "SomeClass", "SomeOtherClass"));
assertEquals("someOtherClass", fHelper("someClass", "SomeClass", "SomeOtherClass"));
//Interface names
assertEquals("fNewJavaElement", fHelper("fJavaElement", "IJavaElement", "INewJavaElement"));
assertEquals("newJavaElement", fHelper("javaElement", "IJavaElement", "INewJavaElement"));
// Unrelated stuff
assertNull(fHelper("fSomeClass", "Unrelated", "Unrelated2"));
}
public void testPrefixAndSuffix() {
fPrefixes= new String[] { "f", "q" };
fSuffixes= new String[] { "Suf1" };
setStrategy(RenamingNameSuggestor.STRATEGY_EXACT);
// Suffix and Prefix can, but need not be specified.
assertEquals("fSomeOtherSuf1", fHelper("fSomeSuf1", "Some", "SomeOther"));
assertEquals("someOtherSuf1", fHelper("someSuf1", "Some", "SomeOther"));
assertEquals("fSomeOther", fHelper("fSome", "Some", "SomeOther"));
assertEquals("someOther", fHelper("some", "Some", "SomeOther"));
//Interface names
assertEquals("fNewJavaElementSuf1", fHelper("fJavaElementSuf1", "IJavaElement", "INewJavaElement"));
assertEquals("newJavaElement", fHelper("javaElement", "IJavaElement", "INewJavaElement"));
}
public void testOnlySuffix() {
fPrefixes= new String[0];
fSuffixes= new String[] { "Suf1" };
setStrategy(RenamingNameSuggestor.STRATEGY_EXACT);
//Suffix can, but need not be specified
assertEquals("someOtherClassSuf1", fHelper("someClassSuf1", "SomeClass", "SomeOtherClass"));
assertEquals("someOtherClass", fHelper("someClass", "SomeClass", "SomeOtherClass"));
//Interface names
assertEquals("newJavaElementSuf1", fHelper("javaElementSuf1", "IJavaElement", "INewJavaElement"));
assertEquals("newJavaElement", fHelper("javaElement", "IJavaElement", "INewJavaElement"));
}
public void testVeryShortNames() {
fPrefixes= new String[] { "f", "q" };
fSuffixes= new String[] { "_" };
setStrategy(RenamingNameSuggestor.STRATEGY_SUFFIX);
assertEquals("fB", fHelper("fA", "A", "B"));
assertEquals("qB", fHelper("qA", "A", "B"));
assertEquals("b", fHelper("a", "A", "B"));
assertEquals("b_", fHelper("a_", "A", "B"));
fh("mAHahAHa", "mBHahAHa", "A", "B"); // match first occurrence
}
public void testEmbeddedMatching() {
fPrefixes= new String[0];
fSuffixes= new String[0];
setStrategy(RenamingNameSuggestor.STRATEGY_EMBEDDED);
mh("getJavaElement", "getNewJavaElement", "JavaElement", "NewJavaElement");
mh("javaElement", "newJavaElement", "JavaElement", "NewJavaElement");
mh("createjavaElement", "createnewJavaElement", "JavaElement", "NewJavaElement");
mh("getJavaElement", "getNewJavaElement", "IJavaElement", "INewJavaElement");
mhf("createJavaElementcache", "JavaElement", "NewJavaElement");
// match with "_" or "$" and other non-letters and non-digits at the next hunk
mh("someClass_pm", "someDifferentClass_pm", "SomeClass", "SomeDifferentClass");
mh("someClass$$", "someDifferentClass$$", "SomeClass", "SomeDifferentClass");
// match a second type name
fh("createelementsecondElement", "createelementsecondMember", "Element", "Member");
fh("createelementsecondelement", "createelementsecondmember", "Element", "Member");
fhf("createelementsecondelementnomore", "Element", "Member");
}
public void testCamelCaseMatching() {
fPrefixes= new String[0];
fSuffixes= new String[0];
setStrategy(RenamingNameSuggestor.STRATEGY_SUFFIX);
// only the last camel case match
mh("getElement", "getMember", "JavaElement", "JavaMember");
mh("getElement", "getMember", "IJavaElement", "IJavaMember");
mh("getElement", "getMember", "AVeryLongJavaElement", "AVeryLongJavaMember");
// two
mh("getJavaElement", "getJavaMember", "SimpleJavaElement", "SimpleJavaMember");
mh("getJavaElement", "getGeneralElement", "SimpleJavaElement", "SimpleGeneralElement");
//three
mh("getVeryLongJavaElement", "getSomeCompletelyDifferentName", "ExtremelyVeryLongJavaElement", "ExtremelySomeCompletelyDifferentName");
//some fields
fh("element", "member", "JavaElement", "JavaMember");
fh("element", "member", "IJavaElement", "IJavaMember");
fh("javaElement", "javaMember", "JavaElement", "JavaMember");
fh("cachedJavaElement", "cachedJavaMember", "JavaElement", "JavaMember");
fh("javaElement", "nonjavaMember", "JavaElement", "NonjavaMember");
// some methods
mh("getFreakyClass", "getLast", "FreakyClass", "Last");
mh("Element", "Member", "SomeFreakyElement", "SomeFreakyMember");
mh("createMyASTNode", "createMyNode", "MyASTNode", "MyNode");
// freaky stuff
mh("getASTNode", "getASTElement", "ASTNode", "ASTElement");
mh("getASTNode", "getTreeNode", "ASTNode", "TreeNode"); // ;)
mh("getASTHeaven2", "getNoBrainer", "ASTHeaven2", "NoBrainer");
fh("java$Element$", "javaElement", "Java$Element$", "JavaElement");
// suffixes inside the name
fh("theElementToUse", "theThingToUse", "JavaElement", "JavaThing");
// only match last hunk
mh("getJavaSomeElement", "getJavaSomeMember", "JavaElement", "JavaMember");
mhf("getJavaSome", "JavaElement", "JavaMember");
// failures
mhf("getElement", "JavaElementLabel", "JavaMemberLabel");
mhf("getElementlabel", "JavaElement", "JavaMember");
fhf("myClass", "A", "B");
// avoid "silly" name suggestions
fhf("fElement", "SomeLongElement", "AnotherDifferentElement"); //-> don't suggest renaming fElement to fElement!
}
public void testUpperCaseCamelCaseMatching() {
fPrefixes= new String[] { "f" };
fSuffixes= new String[0];
setStrategy(RenamingNameSuggestor.STRATEGY_EXACT);
// complete uppercase camel case hunks
fh("fAST", "fAbstractSyntaxTree", "AST", "AbstractSyntaxTree");
fh("AST", "AbstractSyntaxTree", "AST", "AbstractSyntaxTree");
// complete uppercase camel case hunks, but lowercased
fh("fAst", "fAbstractSyntaxTree", "AST", "AbstractSyntaxTree");
fh("ast", "abstractSyntaxTree", "AST", "AbstractSyntaxTree");
fh("aST", "abstractSyntaxTree", "AST", "AbstractSyntaxTree");
fh("fASTNode", "fAbstractSTNode", "ASTNode", "AbstractSTNode");
fh("fASTNode", "fASTreeNode", "ASTNode", "ASTreeNode");
/*
* do not match:
* fh("fAstNode", "fAbstractSTNode", "ASTNode", "AbstractSTNode");
* fh("fAstNode", "fAsTreeNode", "ASTNode", "ASTreeNode");
*
* When changing all-uppercase hunks in exact or embedded mode, it is unclear
* which hunk in the new type name corresponds to the custom-lowercased hunk
* in the old variable name. Rather than guessing the hunk, we only
* proceed hunk-by-hunk in suffix mode.
*/
setStrategy(RenamingNameSuggestor.STRATEGY_EMBEDDED);
fh("fAst2", "fAbstractSyntaxTree2", "AST", "AbstractSyntaxTree");
fh("aST2", "abstractSyntaxTree2", "AST", "AbstractSyntaxTree");
setStrategy(RenamingNameSuggestor.STRATEGY_SUFFIX);
// partial uppercase camel case hunks
fh("fAST", "fMUST", "PersonalAST", "PersonalMUST");
// "downgrading" the new hunks
fh("fAst", "fMust", "PersonalAST", "PersonalMUST");
fh("fHUNKPowered", "fMONKPowered", "ReallyHUNKPowered", "ReallyMONKPowered");
fh("fHunkPowered", "fMonkPowered", "ReallyHUNKPowered", "ReallyMONKPowered");
fh("fHunkPowered", "fMonkPowered", "ReallyHUNKPowered", "ReallyMonkPowered");
fh("fHunkPowered", "fHunk2Powered", "HunkPowered", "Hunk2Powered");
fh("powered", "powered2", "HunkPOWERED", "MonkPOWERED2");
// adapted middle hunks
fh("astNode", "fastNode", "ASTNode", "FASTNode");
mh("createMyASTNode", "createMySECONDNode", "MyASTNode", "MySECONDNode");
mh("createMyAstNode", "createMySecondNode", "MyASTNode", "MySECONDNode");
// some more methods
mh("createAST", "createAbstractSyntaxTree", "AST", "AbstractSyntaxTree");
// match new hunks
fh("fASTNode", "fMyASTNode", "ASTNode", "MyASTNode");
fh("fAstNode", "fMyAstNode", "ASTNode", "MyASTNode");
fh("fDifferentAstNode", "fDifferentMyAstNode", "ASTNode", "MyASTNode");
fh("fDifferentAstNodeToUse", "fDifferentMyAstNodeToUse", "ASTNode", "MyASTNode");
// propagating lowercased front
fh("astNode", "myAstNode", "ASTNode", "MyASTNode");
}
public void testPluralS() {
fPrefixes= new String[0];
fSuffixes= new String[0];
setStrategy(RenamingNameSuggestor.STRATEGY_EXACT);
fh("items", "things", "Item", "Thing");
fh("handies", "mobilePhones", "Handy", "MobilePhone");
fh("handy", "mobilePhone", "Handy", "MobilePhone");
fh("mobilePhones", "handies", "MobilePhone", "Handy");
fh("mobilePhone", "handy", "MobilePhone", "Handy");
fh("handies", "mandies", "Handy", "Mandy");
setStrategy(RenamingNameSuggestor.STRATEGY_EMBEDDED);
fh("itemsOnLoan", "thingsOnLoan", "Item", "Thing");
fh("itemStuff", "thingStuff", "Item", "Thing"); //-> no plural s!
fh("someHandiesOnLoan", "someMobilePhonesOnLoan", "Handy", "MobilePhone");
fh("someHandiesOnLoan", "someMandiesOnLoan", "Handy", "Mandy");
setStrategy(RenamingNameSuggestor.STRATEGY_SUFFIX);
fh("someItemsOnLoan", "someThingsOnLoan", "ASTItem", "NOASTThing");
fh("someHandiesOnLoan", "someMandiesOnLoan", "Handy", "Mandy");
fh("someHandiesOnLoan", "someMobilePhonesOnLoan", "Handy", "MobilePhone");
fh("somePhonesOnLoan", "someHandiesOnLoan", "MobilePhone", "Handy");
}
}