/* * Copyright 2013 Guidewire Software, Inc. */ package gw.plugin.ij.actions; import com.intellij.ide.util.PackageUtil; import com.intellij.openapi.application.ApplicationManager; import com.intellij.psi.PsiDirectory; import com.intellij.psi.PsiFile; import com.intellij.psi.impl.file.PsiDirectoryFactory; import com.intellij.util.IncorrectOperationException; import gw.plugin.ij.framework.GosuTestCase; import org.jetbrains.annotations.Nullable; import java.io.File; public class CreateEnhancementActionTest extends GosuTestCase { public void testEnhanceJavaClass() { try { File testRootDir = createTempDirectory(); final PsiDirectory rootDir = PsiDirectoryFactory.getInstance(getProject()).createDirectory(getVirtualFile(testRootDir)); final PsiDirectory pkgDir = PackageUtil.findOrCreateDirectoryForPackage(getModule(), "test.pkg", rootDir, false); final String className = "CalendarEnhancement"; final String enhancedClassName = "java.util.Calendar"; final String templateName = "GosuEnhancement.gsx"; ApplicationManager.getApplication().runWriteAction(new Runnable() { @Override public void run() { TestAction action = new TestAction(pkgDir, className, enhancedClassName, templateName); action.runTest(); } }); // verify result PsiFile pfile = pkgDir.findFile("CalendarEnhancement.gsx"); if (pfile == null) { fail("File CalendarEnhancement.gsx did not get created. Check log file for details."); } byte[] content = pfile.getVirtualFile().contentsToByteArray(); String result = removeHeaderComment(new String(content)); assertEquals("", "package test.pkg\n" + "\nenhancement CalendarEnhancement : java.util.Calendar {\n" + "\n" + "}\n", result); } catch (Exception e) { e.printStackTrace(); fail(e.getMessage()); } } public void testEnhanceGosuClass() { try { File testRootDir = createTempDirectory(); final PsiDirectory rootDir = PsiDirectoryFactory.getInstance(getProject()).createDirectory(getVirtualFile(testRootDir)); final PsiDirectory pkgDir = PackageUtil.findOrCreateDirectoryForPackage(getModule(), "test.pkg", rootDir, false); final String className = "SomeEnhancement"; final String enhancedClassName = "some.pkg.SomeClass"; final String templateName = "GosuEnhancement.gsx"; configureByText("some/pkg/SomeClass.gs", "package some.pkg class SomeClass{}"); ApplicationManager.getApplication().runWriteAction(new Runnable() { @Override public void run() { TestAction action = new TestAction(pkgDir, className, enhancedClassName, templateName); action.runTest(); } }); // verify result PsiFile pfile = pkgDir.findFile("SomeEnhancement.gsx"); if (pfile == null) { fail("File SomeEnhancement.gsx did not get created. Check log file for details."); } byte[] content = pfile.getVirtualFile().contentsToByteArray(); String result = removeHeaderComment(new String(content)); assertEquals("", "package test.pkg\n" + "\nenhancement SomeEnhancement : some.pkg.SomeClass {\n" + "\n" + "}\n", result); } catch (Exception e) { e.printStackTrace(); fail(e.getMessage()); } } public void testEnhancementCreationWithInvalidClass() { try { File testRootDir = createTempDirectory(); final PsiDirectory rootDir = PsiDirectoryFactory.getInstance(getProject()).createDirectory(getVirtualFile(testRootDir)); final PsiDirectory pkgDir = PackageUtil.findOrCreateDirectoryForPackage(getModule(), "test.pkg", rootDir, false); final String className = "EnhancementWithInvalidClass"; final String enhancedClassName = "java.util.ThisClassIsInvalid"; final String templateName = "GosuEnhancement.gsx"; final Throwable[] caught = new Throwable[1]; caught[0] = null; ApplicationManager.getApplication().runWriteAction(new Runnable() { @Override public void run() { try { TestAction action = new TestAction(pkgDir, className, enhancedClassName, templateName); action.runTest(); } catch (Throwable t) { caught[0] = t; } } }); assertNotNull(caught[0]); assertTrue(caught[0] instanceof IncorrectOperationException); assertTrue(caught[0].getMessage().contains("Cannot create enhancement for invalid type : java.util.ThisClassIsInvalid")); } catch (Exception e) { fail(e.getMessage()); e.printStackTrace(); } } public void testDuplicateEnhancementCreation() { try { File testRootDir = createTempDirectory(); final PsiDirectory rootDir = PsiDirectoryFactory.getInstance(getProject()).createDirectory(getVirtualFile(testRootDir)); final PsiDirectory pkgDir = PackageUtil.findOrCreateDirectoryForPackage(getModule(), "test.pkg", rootDir, false); final String className = "ListEnhancement"; final String enhancedClassName = "List"; final String templateName = "GosuEnhancement.gsx"; final Throwable[] caught = new Throwable[1]; caught[0] = null; ApplicationManager.getApplication().runWriteAction(new Runnable() { @Override public void run() { try { TestAction action = new TestAction(pkgDir, className, enhancedClassName, templateName); action.runTest(); action.runTest(); // run a second time on purpose } catch (Throwable t) { caught[0] = t; } } }); assertNotNull(caught[0]); assertTrue(caught[0] instanceof IncorrectOperationException); assertTrue(caught[0].getMessage().contains(" already exists")); } catch (Exception e) { fail(e.getMessage()); e.printStackTrace(); } } public void testEnhancementCreationWithJavaConflict() { try { File testRootDir = createTempDirectory(); final PsiDirectory rootDir = PsiDirectoryFactory.getInstance(getProject()).createDirectory(getVirtualFile(testRootDir)); final PsiDirectory pkgDir = PackageUtil.findOrCreateDirectoryForPackage(getModule(), "test.pkg", rootDir, false); final String className = "ListEnhancement"; final String enhancedClassName = "List"; final String templateName = "GosuEnhancement.gsx"; final Throwable[] caught = new Throwable[1]; caught[0] = null; ApplicationManager.getApplication().runWriteAction(new Runnable() { @Override public void run() { try { TestAction action = new TestAction(pkgDir, className, enhancedClassName, templateName); pkgDir.createFile(className + ".java"); action.runTest(); } catch (Throwable t) { caught[0] = t; } } }); assertNotNull(caught[0]); assertTrue(caught[0] instanceof IncorrectOperationException); assertTrue(caught[0].getMessage().contains("Cannot create ListEnhancement.gsx. A Java class with the same name already exists.")); } catch (Exception e) { fail(e.getMessage()); e.printStackTrace(); } } public void testEnhancementCreationWithTypeConflict() { try { File testRootDir = createTempDirectory(); final PsiDirectory rootDir = PsiDirectoryFactory.getInstance(getProject()).createDirectory(getVirtualFile(testRootDir)); final PsiDirectory pkgDir = PackageUtil.findOrCreateDirectoryForPackage(getModule(), "test.pkg", rootDir, false); final String className = "EnhancementProgramNameConflict"; final String enhancedClassName = "List"; final String templateName = "GosuEnhancement.gsx"; final Throwable[] caught = new Throwable[1]; caught[0] = null; ApplicationManager.getApplication().runWriteAction(new Runnable() { @Override public void run() { try { TestAction action = new TestAction(pkgDir, className, enhancedClassName, templateName); pkgDir.createFile(className + ".gsp"); action.runTest(); } catch (Throwable t) { caught[0] = t; } } }); assertNotNull(caught[0]); assertTrue(caught[0] instanceof IncorrectOperationException); assertTrue(caught[0].getMessage().contains("Cannot create EnhancementProgramNameConflict.gsx. A type with the same name already exists.")); } catch (Exception e) { fail(e.getMessage()); e.printStackTrace(); } } private class TestAction extends CreateEnhancementAction { @Nullable PsiDirectory _dir = null; @Nullable String _className = null; @Nullable String _enhancedClassName = null; @Nullable String _templateName = null; public TestAction(PsiDirectory dir, String className, String enhancedClassName, String templateName) { super(); _dir = dir; _className = className; _enhancedClassName = enhancedClassName; _templateName = templateName; } public void runTest() { checkBeforeCreate(_className, _enhancedClassName, _templateName, _dir); createFile(_className, _enhancedClassName, _templateName, _dir); } } }