/******************************************************************************* * Copyright (c) 2007 Red Hat, Inc. * Distributed under license by Red Hat, Inc. All rights reserved. * This program is 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: * Red Hat, Inc. - initial API and implementation ******************************************************************************/ package org.jboss.tools.cdi.ui.test.wizard; import java.lang.reflect.Modifier; import java.util.ArrayList; import java.util.List; import junit.framework.TestCase; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IncrementalProjectBuilder; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.jdt.core.IJavaProject; import org.eclipse.jdt.core.IPackageFragment; import org.eclipse.jdt.core.IType; import org.eclipse.jdt.core.JavaModelException; import org.eclipse.jdt.internal.ui.wizards.NewElementWizard; import org.eclipse.jdt.ui.wizards.NewTypeWizardPage; import org.eclipse.jface.dialogs.IMessageProvider; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.wizard.WizardDialog; import org.eclipse.osgi.util.NLS; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.dialogs.WizardNewFileCreationPage; import org.jboss.tools.cdi.core.CDIConstants; import org.jboss.tools.cdi.core.CDICorePlugin; import org.jboss.tools.cdi.core.CDIVersion; import org.jboss.tools.cdi.core.ICDIAnnotation; import org.jboss.tools.cdi.core.ICDIProject; import org.jboss.tools.cdi.core.IInterceptorBinding; import org.jboss.tools.cdi.core.IStereotype; import org.jboss.tools.cdi.internal.core.scanner.lib.BeanArchiveDetector; import org.jboss.tools.cdi.ui.CDIUIMessages; import org.jboss.tools.cdi.ui.CDIUIPlugin; import org.jboss.tools.cdi.ui.wizard.NewAnnotationLiteralCreationWizard; import org.jboss.tools.cdi.ui.wizard.NewAnnotationLiteralWizardPage; import org.jboss.tools.cdi.ui.wizard.NewBeanCreationWizard; import org.jboss.tools.cdi.ui.wizard.NewBeanWizardPage; import org.jboss.tools.cdi.ui.wizard.NewBeansXMLCreationWizard; import org.jboss.tools.cdi.ui.wizard.NewCDIElementWizard; import org.jboss.tools.cdi.ui.wizard.NewDecoratorWizardPage; import org.jboss.tools.cdi.ui.wizard.NewInterceptorBindingWizardPage; import org.jboss.tools.cdi.ui.wizard.NewInterceptorWizardPage; import org.jboss.tools.cdi.ui.wizard.NewQualifierWizardPage; import org.jboss.tools.cdi.ui.wizard.NewScopeWizardPage; import org.jboss.tools.cdi.ui.wizard.NewStereotypeWizardPage; import org.jboss.tools.common.EclipseUtil; import org.jboss.tools.common.model.XModelObject; import org.jboss.tools.common.model.util.EclipseResourceUtil; import org.jboss.tools.common.util.FileUtil; import org.jboss.tools.test.util.JUnitUtils; import org.jboss.tools.test.util.WorkbenchUtils; /** * @author Viacheslav Kabanovich * */ public class NewCDIWizardTest extends TestCase { static String PACK_NAME = "test"; static String QUALIFIER_NAME = "MyQualifier"; static String HAIRY_PACK_NAME = "org.jboss.jsr299.tck.tests.definition.qualifier"; static String HAIRY_QUALIFIER = "Hairy"; static String STEREOTYPE_NAME = "MyStereotype"; static String STEREOTYPE2_NAME = "MyStereotype2"; static String SCOPE_NAME = "MyScope"; static String INTERCEPTOR_BINDING_NAME = "MyInterceptorBinding"; static String INTERCEPTOR_BINDING2_NAME = "MyInterceptorBinding2"; static String EXISTING_PACK_NAME = "org.jboss.jsr299.tck.tests.jbt.validation.target"; static String EXISTING_INTERCEPTOR_BINDING_NAME = "InterceptorBindingWTypeTarget"; // @Inherited @Target({TYPE}) static String INTERCEPTOR_NAME = "MyInterceptor"; static String DECORATOR_NAME = "MapDecorator<K,V>"; static String BEAN_NAME = "MyBean"; static class WizardContext { NewElementWizard wizard; IProject tck; IJavaProject jp; WizardDialog dialog; NewTypeWizardPage page; String packName; String typeName; public void init(String wizardId, String packName, String typeName) { wizard = (NewElementWizard)WorkbenchUtils.findWizardByDefId(wizardId); tck = ResourcesPlugin.getWorkspace().getRoot().getProject("tck"); jp = EclipseUtil.getJavaProject(tck); wizard.init(CDIUIPlugin.getDefault().getWorkbench(), new StructuredSelection(jp)); if(wizard instanceof NewCDIElementWizard) { ((NewCDIElementWizard)wizard).setOpenEditorAfterFinish(false); } else if(wizard instanceof NewAnnotationLiteralCreationWizard) { ((NewAnnotationLiteralCreationWizard)wizard).setOpenEditorAfterFinish(false); } dialog = new WizardDialog( PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), wizard); dialog.setBlockOnOpen(false); dialog.open(); page = (NewTypeWizardPage)dialog.getSelectedPage(); setTypeName(packName, typeName); } public void setTypeName(String packName, String typeName) { this.packName = packName; this.typeName = typeName; page.setTypeName(typeName, true); IPackageFragment pack = page.getPackageFragmentRoot().getPackageFragment(packName); page.setPackageFragment(pack, true); } public String getNewTypeContent() { IType type = null; try { String tn = typeName; int q = tn.indexOf("<"); if(q >= 0) tn = tn.substring(0, q); type = jp.findType(packName + "." + tn); } catch (JavaModelException e) { JUnitUtils.fail("Cannot find type " + typeName, e); } IFile file = (IFile)type.getResource(); assertNotNull(file); String text = null; try { text = FileUtil.readStream(file.getContents()); } catch (CoreException e) { JUnitUtils.fail("Cannot read from " + file, e); } return text; } public void close() { dialog.close(); } } static class NewBeansXMLWizardContext { NewBeansXMLCreationWizard wizard; IProject tck; IJavaProject jp; WizardDialog dialog; public void init(String wizardId) { wizard = (NewBeansXMLCreationWizard)WorkbenchUtils.findWizardByDefId(wizardId); tck = ResourcesPlugin.getWorkspace().getRoot().getProject("tck"); jp = EclipseUtil.getJavaProject(tck); wizard.init(CDIUIPlugin.getDefault().getWorkbench(), new StructuredSelection(jp)); dialog = new WizardDialog( PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), wizard); wizard.setOpenEditorAfterFinish(false); dialog.setBlockOnOpen(false); dialog.open(); } public void close() { dialog.close(); } } public void testNewQualifierWizard() { WizardContext context = new WizardContext(); context.init("org.jboss.tools.cdi.ui.wizard.NewQualifierCreationWizard", PACK_NAME, QUALIFIER_NAME); try { NewQualifierWizardPage page = (NewQualifierWizardPage)context.page; page.setInherited(true); context.wizard.performFinish(); String text = context.getNewTypeContent(); assertTrue(text.contains("@Qualifier")); assertTrue(text.contains("@Inherited")); assertTrue(text.contains("@Target({ TYPE, METHOD, PARAMETER, FIELD })")); assertTrue(text.contains("@Retention(RUNTIME)")); } finally { context.close(); } } public void testNewStereotypeWizard() { WizardContext context = new WizardContext(); context.init("org.jboss.tools.cdi.ui.wizard.NewStereotypeCreationWizard", PACK_NAME, STEREOTYPE_NAME); try { NewStereotypeWizardPage page = (NewStereotypeWizardPage)context.page; page.setInherited(true); page.setTarget("METHOD,FIELD"); page.setNamed(true); page.setAlternative(true); page.setToBeRegisteredInBeansXML(true); assertTrue(page.isToBeRegisteredInBeansXML()); context.wizard.performFinish(); String text = context.getNewTypeContent(); assertTrue(text.contains("@Stereotype")); assertTrue(text.contains("@Inherited")); assertTrue(text.contains("@Named")); assertTrue(text.contains("@Target({ METHOD, FIELD })")); assertTrue(text.contains("@Retention(RUNTIME)")); IProject tck = ResourcesPlugin.getWorkspace().getRoot().getProject("tck"); IFile f = tck.getFile("WebContent/WEB-INF/beans.xml"); XModelObject o = EclipseResourceUtil.createObjectForResource(f); XModelObject c = o.getChildByPath("Alternatives/" + PACK_NAME + "." + STEREOTYPE_NAME); assertNotNull(c); } finally { context.close(); } // testNewStereotypeWizardWithStereotype() context = new WizardContext(); context.init("org.jboss.tools.cdi.ui.wizard.NewStereotypeCreationWizard", PACK_NAME, STEREOTYPE2_NAME); try { context.tck.build(IncrementalProjectBuilder.INCREMENTAL_BUILD,null); } catch (CoreException e) { e.printStackTrace(); } ICDIProject cdi = CDICorePlugin.getCDIProject(context.tck, true); IStereotype s = cdi.getStereotype(PACK_NAME + "." + STEREOTYPE_NAME); IStereotype d = cdi.getStereotype(CDIConstants.DECORATOR_STEREOTYPE_TYPE_NAME); assertNotNull(s); assertNotNull(d); try { NewStereotypeWizardPage page = (NewStereotypeWizardPage)context.page; page.setInherited(true); page.setTarget("METHOD,FIELD"); page.setNamed(true); page.addStereotype(d); String message = page.getErrorMessage(); assertNull(message); message = page.getMessage(); assertNotNull(message); int messageType = page.getMessageType(); assertEquals(IMessageProvider.WARNING, messageType); String testmessage = NLS.bind(CDIUIMessages.MESSAGE_STEREOTYPE_IS_NOT_COMPATIBLE, d.getSourceType().getElementName()); assertEquals(testmessage, message); page.addStereotype(s); message = page.getErrorMessage(); testmessage = NLS.bind(CDIUIMessages.MESSAGE_STEREOTYPE_CANNOT_BE_APPLIED_TO_TYPE, s.getSourceType().getElementName()); assertEquals(testmessage, message); } finally { context.close(); } } public void testNewScopeWizard() { WizardContext context = new WizardContext(); context.init("org.jboss.tools.cdi.ui.wizard.NewScopeCreationWizard", PACK_NAME, SCOPE_NAME); try { NewScopeWizardPage page = (NewScopeWizardPage)context.page; context.wizard.performFinish(); String text = context.getNewTypeContent(); assertTrue(text.contains("@NormalScope")); assertTrue(text.contains("@Inherited")); assertTrue(text.contains("@Target({ TYPE, METHOD, FIELD })")); assertTrue(text.contains("@Retention(RUNTIME)")); } finally { context.close(); } } public void testNewInterceptorBindingWizard() { WizardContext context = new WizardContext(); context.init("org.jboss.tools.cdi.ui.wizard.NewInterceptorBindingCreationWizard", PACK_NAME, INTERCEPTOR_BINDING_NAME); try { NewInterceptorBindingWizardPage page = (NewInterceptorBindingWizardPage)context.page; page.setTarget("TYPE"); context.wizard.performFinish(); String text = context.getNewTypeContent(); assertTrue(text.contains("@InterceptorBinding")); assertTrue(text.contains("@Inherited")); assertTrue(text.contains("@Target({ TYPE })")); assertTrue(text.contains("@Retention(RUNTIME)")); } finally { context.close(); } } /** * Existing interceptor binding, taken from TCK, is annotated @Inherited @Target({TYPE}) * If this test fails, first check that the existing interceptor binding has not been * moved or modified. * In the previous version, the result of testNewInterceptorBindingWizard() was used, * but that turned to be not safe, since the order of tests is not guaranteed. * * @throws CoreException */ public void testNewInterceptorBindingWizardWithBinding() throws CoreException { IProject tck = ResourcesPlugin.getWorkspace().getRoot().getProject("tck"); tck.build(IncrementalProjectBuilder.FULL_BUILD, new NullProgressMonitor()); WizardContext context = new WizardContext(); context.init("org.jboss.tools.cdi.ui.wizard.NewInterceptorBindingCreationWizard", PACK_NAME, INTERCEPTOR_BINDING2_NAME); try { NewInterceptorBindingWizardPage page = (NewInterceptorBindingWizardPage)context.page; ICDIProject cdi = CDICorePlugin.getCDIProject(context.tck, true); IInterceptorBinding s = cdi.getInterceptorBinding(EXISTING_PACK_NAME + "." + EXISTING_INTERCEPTOR_BINDING_NAME); assertNotNull(s); page.addInterceptorBinding(s); String message = page.getErrorMessage(); assertNull(message); message = page.getMessage(); assertNotNull(message); int messageType = page.getMessageType(); assertEquals(IMessageProvider.WARNING, messageType); String testmessage = NLS.bind(CDIUIMessages.MESSAGE_INTERCEPTOR_BINDING_IS_NOT_COMPATIBLE, s.getSourceType().getElementName()); assertEquals(testmessage, message); page.setTarget("TYPE"); message = page.getErrorMessage(); assertNull(message); message = page.getMessage(); assertNull(message); } finally { context.close(); } } /** * Existing interceptor binding, taken from TCK, is annotated @Inherited @Target({TYPE}) * If this test fails, first check that the existing interceptor binding has not been * moved or modified. * In the previous version, the result of testNewInterceptorBindingWizard() was used, * but that turned to be not safe, since the order of tests is not guaranteed. * * @throws CoreException */ public void testNewInterceptorWizard() throws CoreException { WizardContext context = new WizardContext(); context.init("org.jboss.tools.cdi.ui.wizard.NewInterceptorCreationWizard", PACK_NAME, INTERCEPTOR_NAME); ICDIProject cdi = CDICorePlugin.getCDIProject(context.tck, true); ICDIAnnotation a = cdi.getInterceptorBinding(EXISTING_PACK_NAME + "." + EXISTING_INTERCEPTOR_BINDING_NAME); assertNotNull(a); try { NewInterceptorWizardPage page = (NewInterceptorWizardPage)context.page; page.addInterceptorBinding(a); assertTrue(page.isToBeRegisteredInBeansXML()); context.setTypeName("com.acme", "Foo"); assertFalse(page.isToBeRegisteredInBeansXML()); context.setTypeName(PACK_NAME, INTERCEPTOR_NAME); assertTrue(page.isToBeRegisteredInBeansXML()); context.wizard.performFinish(); String text = context.getNewTypeContent(); assertTrue(text.contains("@Interceptor")); assertTrue(text.contains("@" + EXISTING_INTERCEPTOR_BINDING_NAME)); IProject tck = ResourcesPlugin.getWorkspace().getRoot().getProject("tck"); IFile f = tck.getFile("WebContent/WEB-INF/beans.xml"); XModelObject o = EclipseResourceUtil.createObjectForResource(f); XModelObject c = o.getChildByPath("Interceptors/" + PACK_NAME + "." + INTERCEPTOR_NAME); assertNotNull(c); } finally { context.close(); } } public void testNewDecoratorWizard() { WizardContext context = new WizardContext(); context.init("org.jboss.tools.cdi.ui.wizard.NewDecoratorCreationWizard", PACK_NAME, DECORATOR_NAME); ICDIProject cdi = CDICorePlugin.getCDIProject(context.tck, true); try { NewDecoratorWizardPage page = (NewDecoratorWizardPage)context.page; List<String> interfacesNames = new ArrayList<String>(); interfacesNames.add("java.util.Map<K,V>"); page.setSuperInterfaces(interfacesNames, true); context.wizard.performFinish(); String text = context.getNewTypeContent(); // System.out.println(text); assertTrue(text.contains("@Decorator")); assertTrue(text.contains("@Delegate")); } finally { context.close(); } } public void testNewBeanWizard() throws Exception { WizardContext context = new WizardContext(); context.init("org.jboss.tools.cdi.ui.wizard.NewBeanCreationWizard", PACK_NAME, BEAN_NAME); ICDIProject cdi = CDICorePlugin.getCDIProject(context.tck, true); try { NewBeanWizardPage page = (NewBeanWizardPage)context.page; page.setBeanName("myNewBean"); assertEquals(IMessageProvider.NONE, page.getMessageType()); page.setScope(CDIConstants.SESSION_SCOPED_ANNOTATION_TYPE_NAME); String message = page.getMessage(); assertEquals(CDIUIMessages.MESSAGE_BEAN_SHOULD_BE_SERIALIZABLE, message); assertEquals(IMessageProvider.WARNING, page.getMessageType()); page.setScope(CDIConstants.APPLICATION_SCOPED_ANNOTATION_TYPE_NAME); assertEquals(IMessageProvider.NONE, page.getMessageType()); cdi.getNature().setBeanDiscoveryMode(BeanArchiveDetector.ANNOTATED); page.setScope(""); message = page.getErrorMessage(); assertEquals(CDIUIMessages.SCOPE_SHOULD_BE_SET_IN_ARCHIVE_WITH_DISCOVERY_MODE_ANNOTATED, message); page.setScope(CDIConstants.APPLICATION_SCOPED_ANNOTATION_TYPE_NAME); assertEquals(IMessageProvider.NONE, page.getMessageType()); cdi.getNature().setBeanDiscoveryMode(BeanArchiveDetector.ALL); page.setScope(""); assertEquals(IMessageProvider.NONE, page.getMessageType()); context.wizard.performFinish(); String text = context.getNewTypeContent(); // System.out.println(text); assertTrue(text.contains("@Named")); assertTrue(text.contains("\"myNewBean\"")); IType type = (IType)context.wizard.getCreatedElement(); int f = type.getFlags(); assertTrue(Modifier.isPublic(f)); assertFalse(Modifier.isAbstract(f)); // String[] is = type.getSuperInterfaceNames(); // assertEquals(1, is.length); // assertEquals("Serializable", is[0]); } finally { context.close(); } } public void testNewAnnotationLiteralWizard() { WizardContext context = new WizardContext(); context.init("org.jboss.tools.cdi.ui.wizard.NewAnnotationLiteralCreationWizard", PACK_NAME, HAIRY_QUALIFIER + "Literal"); ICDIProject cdi = CDICorePlugin.getCDIProject(context.tck, true); try { NewAnnotationLiteralWizardPage page = (NewAnnotationLiteralWizardPage)context.page; page.setQualifier(HAIRY_PACK_NAME + "." + HAIRY_QUALIFIER); context.wizard.performFinish(); String text = context.getNewTypeContent(); // System.out.println(text); assertTrue(text.contains("AnnotationLiteral<" + HAIRY_QUALIFIER + ">")); } finally { context.close(); } } public void testNewAnnotationLiteralWizardWithMembers() { WizardContext context = new WizardContext(); context.init("org.jboss.tools.cdi.ui.wizard.NewAnnotationLiteralCreationWizard", PACK_NAME, "NewLiteral"); ICDIProject cdi = CDICorePlugin.getCDIProject(context.tck, true); try { NewAnnotationLiteralWizardPage page = (NewAnnotationLiteralWizardPage)context.page; page.setQualifier("javax.enterprise.inject.New"); context.wizard.performFinish(); String text = context.getNewTypeContent(); // System.out.println(text); assertTrue(text.contains("AnnotationLiteral<New>")); assertTrue(text.contains("private final Class<?> value;")); } finally { context.close(); } } public void testNewBeansXMLWizard() throws CoreException { NewBeansXMLWizardContext context = new NewBeansXMLWizardContext(); context.init("org.jboss.tools.cdi.ui.wizard.NewBeansXMLCreationWizard"); try { WizardNewFileCreationPage page = (WizardNewFileCreationPage)context.wizard.getPage("newFilePage1"); String s = page.getFileName(); assertEquals("beans.xml", s); assertFalse(context.wizard.canFinish()); page.setFileName("beans2.xml"); assertTrue(context.wizard.canFinish()); String c = page.getContainerFullPath().toString(); assertEquals("/tck/WebContent/WEB-INF", c); assertEquals(CDIVersion.CDI_1_0.toString(), context.wizard.getVersion()); context.wizard.performFinish(); IFile f = context.tck.getParent().getFile(page.getContainerFullPath().append(page.getFileName())); assertTrue(f.exists()); String text = FileUtil.readStream(f.getContents()); assertTrue(text.indexOf("http://java.sun.com/xml/ns/javaee") > 0); } finally { context.close(); } } public void testNewBeansXMLWizard11() throws CoreException { NewBeansXMLWizardContext context = new NewBeansXMLWizardContext(); context.init("org.jboss.tools.cdi.ui.wizard.NewBeansXMLCreationWizard"); try { WizardNewFileCreationPage page = (WizardNewFileCreationPage)context.wizard.getPage("newFilePage1"); String s = page.getFileName(); assertEquals("beans.xml", s); assertFalse(context.wizard.canFinish()); page.setFileName("beans3.xml"); assertTrue(context.wizard.canFinish()); String c = page.getContainerFullPath().toString(); assertEquals("/tck/WebContent/WEB-INF", c); assertEquals(CDIVersion.CDI_1_0.toString(), context.wizard.getVersion()); context.wizard.setVersion(CDIVersion.CDI_1_1); context.wizard.performFinish(); IFile f = context.tck.getParent().getFile(page.getContainerFullPath().append(page.getFileName())); assertTrue(f.exists()); String text = FileUtil.readStream(f.getContents()); assertTrue(text.indexOf("1.1") > 0); } finally { context.close(); } } }