/* * 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 gw.testharness.Disabled; import gw.testharness.KnownBreak; import org.jetbrains.annotations.Nullable; import java.io.File; public class CreateClassActionTest extends GosuTestCase { public void testClassCreation() { 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 = "TestClassOne"; final String templateName = "GosuClass.gs"; ApplicationManager.getApplication().runWriteAction(new Runnable() { @Override public void run() { TestAction action = new TestAction(pkgDir, className, templateName); action.runTest(); } }); // verify result PsiFile pfile = pkgDir.findFile( "TestClassOne.gs" ); if (pfile == null) { fail("File TestClassOne.gs 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" + "\n" + "class TestClassOne {\n" + "\n" + "}", result); } catch (Exception e) { e.printStackTrace(); fail(e.getMessage()); } } public void testInterfaceCreation() { 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 = "TestInterfaceOne"; final String templateName = "GosuInterface.gs"; final String expectedFileName = className + ".gs"; ApplicationManager.getApplication().runWriteAction(new Runnable() { @Override public void run() { TestAction action = new TestAction(pkgDir, className, templateName); action.runTest(); } }); // verify result PsiFile pfile = pkgDir.findFile( expectedFileName ); if (pfile == null) { fail("File " + expectedFileName + " 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" + "\n" + "interface TestInterfaceOne {\n" + "\n" + "}", result); } catch (Exception e) { e.printStackTrace(); fail(e.getMessage()); } } public void testEnumCreation() { 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 = "TestEnumOne"; final String templateName = "GosuEnum.gs"; final String expectedFileName = className + ".gs"; ApplicationManager.getApplication().runWriteAction(new Runnable() { @Override public void run() { TestAction action = new TestAction(pkgDir, className, templateName); action.runTest(); } }); // verify result PsiFile pfile = pkgDir.findFile( expectedFileName ); if (pfile == null) { fail("File " + expectedFileName + " 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" + "\n" + "enum TestEnumOne {\n" + "\n" + "}", result); } catch (Exception e) { e.printStackTrace(); fail(e.getMessage()); } } public void testAnnotationCreation() { 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 = "TestAnnotationOne"; final String templateName = "GosuAnnotation.gs"; final String expectedFileName = className + ".gs"; ApplicationManager.getApplication().runWriteAction(new Runnable() { @Override public void run() { TestAction action = new TestAction(pkgDir, className, templateName); action.runTest(); } }); // verify result PsiFile pfile = pkgDir.findFile( expectedFileName ); if (pfile == null) { fail("File " + expectedFileName + " 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" + "\n" + "uses gw.lang.IAnnotation\n" + "\n\n" + "class TestAnnotationOne implements IAnnotation {\n" + "\n" + "}", result); } catch (Exception e) { e.printStackTrace(); fail(e.getMessage()); } } @Disabled(assignee = "verastov", reason = "functionality does not implemented") public void testDuplicateClassCreation() { 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 = "TestClassUnique"; final String templateName = "GosuClass.gs"; 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, templateName); action.runTest(); action.runTest(); // run create a second time on purpose } catch (Throwable t) { caught[0] = t; } } }); assertNotNull(caught[0]); assertTrue(caught[0] instanceof IncorrectOperationException); assertTrue(caught[0].getMessage().contains("File already exists")); } catch (Exception e) { e.printStackTrace(); fail(e.getMessage()); } } public void testClassCreationWithJavaConflict() { 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 = "TestJavaClass"; final String templateName = "GosuClass.gs"; 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, templateName); pkgDir.createFile(className + ".java"); action.runTest(); } catch (Throwable t) { caught[0] = t; } } }); assertNotNull(caught[0]); assertTrue("Expecting IllegalArgumentException, but got " + caught[0], caught[0] instanceof IllegalArgumentException); assertTrue(caught[0].getMessage().contains("Cannot create test.pkg.TestJavaClass since it already exists. Use a different name.")); } catch (Exception e) { e.printStackTrace(); fail(e.getMessage()); } } @KnownBreak(targetUser="dpetrusca", targetBranch="eng/emerald/pl/active/eclipse", jira="PL-19089") public void testJavaClassCreationWithGosuConflict() { 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 = "TestJavaClass"; final String templateName = "GosuClass.gs"; 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, templateName); action.runTest(); pkgDir.createFile(className + ".java"); } catch (Throwable t) { caught[0] = t; } } }); assertNotNull(caught[0]); assertTrue(caught[0] instanceof IncorrectOperationException); assertTrue(caught[0].getMessage().contains("Cannot create TestJavaClass.java. A Gosu class with the same name already exists.")); } catch (Exception e) { e.printStackTrace(); fail(e.getMessage()); } } public void testClassCreationWithTypeConflict() { 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 = "ClassTemplateNameConflict"; final String templateName = "GosuClass.gs"; 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, templateName); pkgDir.createFile(className + ".gst"); action.runTest(); } catch (Throwable t) { caught[0] = t; } } }); assertNotNull(caught[0]); assertTrue("Expecting IllegalArgumentException, but got " + caught[0], caught[0] instanceof IllegalArgumentException); assertTrue(caught[0].getMessage().contains("Cannot create test.pkg.ClassTemplateNameConflict since it already exists. Use a different name.")); } catch (Exception e) { e.printStackTrace(); fail(e.getMessage()); } } private class TestAction extends CreateClassAction { @Nullable PsiDirectory _dir = null; @Nullable String _className = null; @Nullable String _templateName = null; public TestAction(PsiDirectory dir, String className, String templateName) { super(); _dir = dir; _className = className; _templateName = templateName; } public void runTest() { createFile(_className, _templateName, _dir); } } }