package org.jboss.tools.seam.ui.test.ca;
import java.util.Set;
import java.util.TreeSet;
import junit.framework.Test;
import junit.framework.TestCase;
import junit.framework.TestSuite;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IncrementalProjectBuilder;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.jdt.internal.ui.javaeditor.CompilationUnitEditor;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.contentassist.ICompletionProposal;
import org.eclipse.jface.text.contentassist.IContentAssistProcessor;
import org.eclipse.jface.text.contentassist.IContentAssistant;
import org.eclipse.jface.text.source.ISourceViewer;
import org.eclipse.jface.text.source.SourceViewerConfiguration;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.part.FileEditorInput;
import org.jboss.tools.common.el.ui.ca.ELProposalProcessor;
import org.jboss.tools.common.model.util.EclipseResourceUtil;
import org.jboss.tools.common.base.test.contentassist.CATestUtil;
import org.jboss.tools.test.util.JobUtils;
import org.jboss.tools.test.util.ResourcesUtils;
import org.jboss.tools.test.util.TestProjectProvider;
public class SeamELContentAssistJbide1676Test extends TestCase {
TestProjectProvider provider = null;
IProject project = null;
boolean makeCopy = false;
boolean autoBuild = true;
private static final String PROJECT_NAME = "TestSeamELContentAssist";
private static final String JAVA_FILENAME = "org/domain/TestSeamELContentAssist/session/Authenticator.java";
private static final String EL_START_TEMPLATE = "#{";
private static final String[] VALID_SEAM_EL_PROPOSALS = new String[] {
"TestSeamELContentAssistEntityManagerFactory",
"fullPostList",
"a4j",
"a4jSkin",
"actor",
"ajaxContext",
"applicationContext",
"authenticator",
"businessProcess",
"businessProcessContext",
"captcha",
"conversation",
"conversationContext",
"conversationList",
"conversationStack",
"currentDate",
"currentDatetime",
"currentTime",
"entityManager",
"eventContext",
"events",
"expressions",
"facesContext",
"facesMessages",
"httpError",
"identity",
"image",
"interpolator",
"isUserInRole",
"jbpmContext",
"locale",
"localeSelector",
"mailSession",
"messages",
"methodContext",
"mockSecureEntity",
"org.jboss.seam.captcha.captcha",
"org.jboss.seam.captcha.captchaImage",
"org.jboss.seam.core.actor",
"org.jboss.seam.core.applicationContext",
"org.jboss.seam.core.businessProcess",
"org.jboss.seam.core.businessProcessContext",
"org.jboss.seam.core.conversation",
"org.jboss.seam.core.conversationContext",
"org.jboss.seam.core.conversationEntries",
"org.jboss.seam.core.conversationList",
"org.jboss.seam.core.conversationStack",
"org.jboss.seam.core.dispatcher",
"org.jboss.seam.core.ejb",
"org.jboss.seam.core.eventContext",
"org.jboss.seam.core.events",
"org.jboss.seam.core.exceptions",
"org.jboss.seam.core.expressions",
"org.jboss.seam.core.facesContext",
"org.jboss.seam.core.facesMessages",
"org.jboss.seam.core.facesPage",
"org.jboss.seam.core.httpError",
"org.jboss.seam.core.image",
"org.jboss.seam.core.init",
"org.jboss.seam.core.interpolator",
"org.jboss.seam.core.isUserInRole",
"org.jboss.seam.core.jbpm",
"org.jboss.seam.core.jbpmContext",
"org.jboss.seam.core.locale",
"org.jboss.seam.core.localeSelector",
"org.jboss.seam.core.manager",
"org.jboss.seam.core.messages",
"org.jboss.seam.core.methodContext",
"org.jboss.seam.core.microcontainer",
"org.jboss.seam.core.pageContext",
"org.jboss.seam.core.pageflow",
"org.jboss.seam.core.pages",
"org.jboss.seam.core.persistenceContexts",
"org.jboss.seam.core.pojoCache",
"org.jboss.seam.core.pooledTask",
"org.jboss.seam.core.pooledTaskInstanceList",
"org.jboss.seam.core.processInstance",
"org.jboss.seam.core.processInstanceFinder",
"org.jboss.seam.core.processInstanceList",
"org.jboss.seam.core.redirect",
"org.jboss.seam.core.renderer",
"org.jboss.seam.core.resourceBundle",
"org.jboss.seam.core.safeActions",
"org.jboss.seam.core.sessionContext",
"org.jboss.seam.core.switcher",
"org.jboss.seam.core.taskInstance",
"org.jboss.seam.core.taskInstanceList",
"org.jboss.seam.core.taskInstanceListForType",
"org.jboss.seam.core.timeZone",
"org.jboss.seam.core.timeZoneSelector",
"org.jboss.seam.core.transactionListener",
"org.jboss.seam.core.transition",
"org.jboss.seam.core.uiComponent",
"org.jboss.seam.core.userPrincipal",
"org.jboss.seam.core.validation",
"org.jboss.seam.core.validators",
"org.jboss.seam.debug.contexts",
"org.jboss.seam.debug.hotDeployFilter",
"org.jboss.seam.debug.introspector",
"org.jboss.seam.framework.currentDate",
"org.jboss.seam.framework.currentDatetime",
"org.jboss.seam.framework.currentTime",
"org.jboss.seam.ioc.spring.contextLoader",
"org.jboss.seam.ioc.spring.springELResolver",
"org.jboss.seam.jms.queueConnection",
"org.jboss.seam.jms.queueSession",
"org.jboss.seam.jms.topicConnection",
"org.jboss.seam.jms.topicSession",
"org.jboss.seam.mail.mailSession",
"org.jboss.seam.persistence.persistenceProvider",
"org.jboss.seam.remoting.messaging.subscriptionRegistry",
"org.jboss.seam.remoting.remoting",
"org.jboss.seam.security.configuration",
"org.jboss.seam.security.identity",
"org.jboss.seam.servlet.characterEncodingFilter",
"org.jboss.seam.servlet.contextFilter",
"org.jboss.seam.servlet.exceptionFilter",
"org.jboss.seam.servlet.multipartFilter",
"org.jboss.seam.servlet.redirectFilter",
"org.jboss.seam.theme.theme",
"org.jboss.seam.theme.themeSelector",
"org.jboss.seam.ui.entityConverter",
"org.jboss.seam.ui.entityConverterStore",
"org.jboss.seam.ui.graphicImage.dynamicImageResource",
"org.jboss.seam.ui.graphicImage.dynamicImageStore",
"org.jboss.seam.ui.resource.webResource",
"org.jboss.seam.async.dispatcher",
"org.jboss.seam.ioc.guice.init",
"org.jboss.seam.ioc.guice.injector",
"org.jboss.seam.pdf.pdfKeyStore",
"org.jboss.seam.remoting.gwt.gwtRemoteService",
"org.jboss.seam.remoting.gwt.gwtToSeamAdapter",
"org.jboss.seam.remoting.messaging.SubscriptionRegistry.userTokens",
"org.jboss.seam.transaction.transaction",
"pageContext",
"pageflow",
"pojoCache",
"pooledTask",
"pooledTaskInstanceList",
"processInstance",
"processInstanceFinder",
"processInstanceList",
"queueSession",
"redirect",
"renderer",
"resourceBundle",
"securityRules",
"sessionContext",
"switcher",
"taskInstance",
"taskInstanceList",
"taskInstanceListForType",
"TestSeamELContentAssistEntityManagerFactory",
"theme",
"themeSelector",
"timeZone",
"timeZoneSelector",
"topicSession",
"transition",
"uiComponent",
"userPrincipal",
"validation",
"interfaceTest"
};
protected Set<String> getJavaStringValidELProposals() {
TreeSet<String> pSet = new TreeSet<String>(String.CASE_INSENSITIVE_ORDER);
for (int i = 0; i < VALID_SEAM_EL_PROPOSALS.length; i++) {
pSet.add(VALID_SEAM_EL_PROPOSALS[i]);
}
return pSet;
}
public static Test suite() {
return new TestSuite(SeamELContentAssistJbide1676Test.class);
}
public void setUp() throws Exception {
try {
autoBuild = ResourcesUtils.setBuildAutomatically(false);
provider = new TestProjectProvider("org.jboss.tools.seam.ui.test", null, PROJECT_NAME, makeCopy);
project = provider.getProject();
project.build(IncrementalProjectBuilder.FULL_BUILD, null);
JobUtils.waitForIdle();
} finally {
ResourcesUtils.setBuildAutomatically(autoBuild);
}
}
protected void tearDown() throws Exception {
if(provider != null) {
provider.dispose();
}
}
public void testSeamELContentAssistJbide1676() throws CoreException {
assertTrue("Test project \"" + PROJECT_NAME + "\" is not loaded", (project != null));
IFolder srcRoot = (IFolder)EclipseResourceUtil.getJavaSourceRoot(project);
IFile javaFile = (srcRoot == null ? null : (IFile)srcRoot.findMember(JAVA_FILENAME));
assertTrue("The file \"" + JAVA_FILENAME + "\" is not found", (javaFile != null));
assertTrue("The file \"" + JAVA_FILENAME + "\" is not found", (javaFile.exists()));
FileEditorInput editorInput = new FileEditorInput(javaFile);
Throwable exception = null;
IEditorPart editorPart = null;
editorPart = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().openEditor(editorInput, "org.eclipse.jdt.ui.CompilationUnitEditor");
// clean deffered events
while (Display.getCurrent().readAndDispatch());
try {
CompilationUnitEditor javaEditor = null;
if (editorPart instanceof CompilationUnitEditor)
javaEditor = (CompilationUnitEditor)editorPart;
// Delay for 3 seconds so that
// the Favorites view can be seen.
JobUtils.waitForIdle();
ISourceViewer viewer = javaEditor.getViewer();
IDocument document = viewer.getDocument();
SourceViewerConfiguration config = CATestUtil.getSourceViewerConfiguration(javaEditor);
IContentAssistant contentAssistant = (config == null ? null : config.getContentAssistant(viewer));
assertTrue("Cannot get the Content Assistant instance for the editor for file \"" + JAVA_FILENAME + "\"", (contentAssistant != null));
String documentContent = document.get();
int start = (documentContent == null ? -1 : documentContent.indexOf(EL_START_TEMPLATE));
int offsetToTest = start + EL_START_TEMPLATE.length();
assertTrue("Cannot find the starting point in the test file \"" + JAVA_FILENAME + "\"", (start != -1));
ICompletionProposal[] result= null;
String errorMessage = null;
IContentAssistProcessor p= CATestUtil.getProcessor(viewer, offsetToTest, contentAssistant);
if (p != null) {
result= p.computeCompletionProposals(viewer, offsetToTest);
}
// if (errorMessage != null && errorMessage.trim().length() > 0) {
// System.out.println("#" + offsetToTest + ": ERROR MESSAGE: " + errorMessage);
// }
assertTrue("Content Assistant peturned no proposals", (result != null && result.length > 0));
// compare SeamELCompletionProposals in the result to the filtered valid proposals
Set<String> existingProposals = new TreeSet<String>(String.CASE_INSENSITIVE_ORDER);
Set<String> nonExistingProposals = new TreeSet<String>(String.CASE_INSENSITIVE_ORDER);
Set<String> filteredValidProposals = getJavaStringValidELProposals();
for (int j = 0; j < result.length; j++) {
// Look only for SeamELProposalProcessor proposals
if (result[j] instanceof ELProposalProcessor.Proposal) {
ELProposalProcessor.Proposal proposal = (ELProposalProcessor.Proposal)result[j];
String proposalString = proposal.getPrefixCompletionText(document, offsetToTest).toString();
if (filteredValidProposals.contains(proposalString)) {
existingProposals.add(proposalString);
filteredValidProposals.remove(proposalString);
} else if (!existingProposals.contains(proposalString)){
nonExistingProposals.add(proposalString);
}
}
}
StringBuilder sb = new StringBuilder("{");
for (String string : filteredValidProposals) {
sb.append(string).append(',');
}
sb.append('}');
assertTrue("Some Seam EL proposals werent\'t shown in the Content Assistant: " + sb.toString(), filteredValidProposals.isEmpty());
sb = new StringBuilder();
if (nonExistingProposals != null && !nonExistingProposals.isEmpty()) {
for (String np : nonExistingProposals) {
sb.append(np).append(' ');
}
}
assertTrue("Some Seam EL proposals were shown in the Content Assistant but they shouldn\'t: " + sb.toString(), nonExistingProposals.isEmpty());
} finally {
PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage()
.closeEditor(editorPart, false);
}
}
}