package org.jboss.tools.seam.core.test.refactoring;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IncrementalProjectBuilder;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.ltk.core.refactoring.CompositeChange;
import org.eclipse.ltk.core.refactoring.RefactoringStatus;
import org.eclipse.ltk.core.refactoring.RefactoringStatusEntry;
import org.eclipse.ltk.core.refactoring.TextFileChange;
import org.eclipse.text.edits.MultiTextEdit;
import org.jboss.tools.common.base.test.RenameParticipantTestUtil;
import org.jboss.tools.common.base.test.RenameParticipantTestUtil.TestChangeStructure;
import org.jboss.tools.common.base.test.RenameParticipantTestUtil.TestTextChange;
import org.jboss.tools.common.util.FileUtil;
import org.jboss.tools.seam.core.ISeamComponent;
import org.jboss.tools.seam.core.ISeamProject;
import org.jboss.tools.seam.internal.core.refactoring.RenameComponentProcessor;
import org.jboss.tools.test.util.ResourcesUtils;
import org.junit.Assert;
public class SeamComponentRefactoringTest extends SeamRefactoringTest {
public SeamComponentRefactoringTest(){
super("Seam Component Refactoring Test");
}
public void testSeamComponentRename() throws CoreException {
ResourcesUtils.setBuildAutomatically(false);
try {
ArrayList<TestChangeStructure> list = new ArrayList<TestChangeStructure>();
TestChangeStructure structure = new TestChangeStructure(ejbProject.getProject(), "/ejbModule/org/domain/"+warProjectName+"/session/TestComponent.java");
TestTextChange change = new TestTextChange(89, 6, "\"best\"");
structure.addTextChange(change);
list.add(structure);
structure = new TestChangeStructure(warProject, "/WebContent/WEB-INF/components.xml");
change = new TestTextChange(1106, 4, "best");
structure.addTextChange(change);
change = new TestTextChange(1934, 4, "best");
structure.addTextChange(change);
list.add(structure);
structure = new TestChangeStructure(ejbProject, "/ejbModule/org/domain/"+warProjectName+"/session/TestSeamComponent.java");
change = new TestTextChange(420, 11, "@In(\"best\")");
structure.addTextChange(change);
change = new TestTextChange(389, 8, "(\"best\")");
structure.addTextChange(change);
change = new TestTextChange(455, 16, "@Factory(\"best\")");
structure.addTextChange(change);
change = new TestTextChange(529, 8, "(\"best\")");
structure.addTextChange(change);
change = new TestTextChange(589, 4, "best");
structure.addTextChange(change);
list.add(structure);
structure = new TestChangeStructure(ejbProject, "/ejbModule/seam.properties");
change = new TestTextChange(0, 4, "best");
structure.addTextChange(change);
list.add(structure);
structure = new TestChangeStructure(warProject, "/WebContent/test.xhtml");
change = new TestTextChange(1088, 4, "best");
structure.addTextChange(change);
list.add(structure);
structure = new TestChangeStructure(warProject, "/WebContent/test.jsp");
change = new TestTextChange(227, 4, "best");
structure.addTextChange(change);
list.add(structure);
structure = new TestChangeStructure(warProject, "/src/test.properties");
change = new TestTextChange(29, 4, "best");
structure.addTextChange(change);
list.add(structure);
renameComponent(seamEjbProject, "test", "best", list, 0);
} finally {
ResourcesUtils.setBuildAutomatically(true);
}
}
public void testRemaningMailSessionDeclarationInComponentsXml_JBIDE4447() throws CoreException {
ArrayList<TestChangeStructure> list = new ArrayList<TestChangeStructure>();
TestChangeStructure structure = new TestChangeStructure(warProject, "/WebContent/WEB-INF/components.xml");
TestTextChange change = new TestTextChange(2345, 41, "name=\"org.jboss.seam.mail.newMailSession\"");
structure.addTextChange(change);
list.add(structure);
renameComponent(seamWarProject, "org.jboss.seam.mail.mailSession", "org.jboss.seam.mail.newMailSession", list, 8000);
}
private void renameComponent(ISeamProject seamProject, String componentName, String newName, List<TestChangeStructure> changeList, long delay) throws CoreException{
// Test before renaming
ISeamComponent component = seamProject.getComponent(componentName);
assertNotNull("Can't load component " + componentName, component);
// This line fail the test testJBIDE4447
// assertNotNull("Component " + component.getName() + " does not have java declaration.", component.getJavaDeclaration());
// Rename Seam Component
RenameComponentProcessor processor = new RenameComponentProcessor(component);
processor.setNewName(newName);
RefactoringStatus status = processor.checkInitialConditions(new NullProgressMonitor());
RefactoringStatusEntry[] entries = status.getEntries();
for (RefactoringStatusEntry entry : entries) {
System.out.println("Refactor status - " + entry.getMessage());
}
Assert.assertNull("Rename processor returns fatal error",
status.getEntryMatchingSeverity(RefactoringStatus.FATAL));
status = processor.checkFinalConditions(new NullProgressMonitor(), null);
entries = status.getEntries();
for (RefactoringStatusEntry entry : entries) {
System.out.println("Refactor status - " + entry.getMessage());
}
Assert.assertNull("Rename processor returns fatal error",
status.getEntryMatchingSeverity(RefactoringStatus.FATAL));
CompositeChange rootChange = (CompositeChange)processor.createChange(new NullProgressMonitor());
assertEquals("There is unexpected number of changes",changeList.size(), rootChange.getChildren().length);
for(int i = 0; i < rootChange.getChildren().length;i++){
TextFileChange fileChange = (TextFileChange)rootChange.getChildren()[i];
MultiTextEdit edit = (MultiTextEdit)fileChange.getEdit();
TestChangeStructure change = RenameParticipantTestUtil.findChange(changeList, fileChange.getFile());
if(change != null){
assertEquals(change.size(), edit.getChildrenSize());
}
}
rootChange.perform(new NullProgressMonitor());
// do not relay on Auto build, build what you need and test results
ejbProject.build(IncrementalProjectBuilder.FULL_BUILD, null);
warProject.build(IncrementalProjectBuilder.FULL_BUILD, null);
// Test results
assertNotNull("Can't load component " + newName, seamProject.getComponent(newName));
for(TestChangeStructure changeStructure : changeList){
IFile file = changeStructure.getProject().getFile(changeStructure.getFileName());
String content = null;
try {
content = FileUtil.readStream(file);
} catch (CoreException e) {
e.printStackTrace();
fail(e.getMessage());
}
//System.out.println("File - "+file.getName()+" offset - "+changeStructure.getOffset()+" expected - ["+changeStructure.getText()+"] actual - ["+content.substring(changeStructure.getOffset(), changeStructure.getOffset()+changeStructure.getLength())+"]");
for(TestTextChange change : changeStructure.getTextChanges()){
assertEquals("There is unexpected change in resource - "+file.getName(),change.getText(), content.substring(change.getOffset(), change.getOffset()+change.getLength()));
}
}
}
}