/******************************************************************************* * Copyright (c) 2012 VMWare, Inc. * All rights reserved. This program and the accompanying materials * are 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: * VMWare, Inc. - initial API and implementation *******************************************************************************/ package org.grails.ide.eclipse.test.gsp; import java.util.Map; import org.codehaus.groovy.ast.ClassNode; import org.grails.ide.eclipse.core.internal.plugins.GrailsCore; import org.grails.ide.eclipse.editor.groovy.controllers.ControllerCache; import org.grails.ide.eclipse.editor.groovy.controllers.PerProjectControllerCache; import org.grails.ide.eclipse.groovy.debug.tests.GroovyUtils; import org.grails.ide.eclipse.test.GrailsTestsActivator; /** * * @author Andrew Eisenberg * @since 2.7.0 */ public class ControllerCacheTests extends AbstractGSPTagsTest { public void testControllerCacheEmpty1() throws Exception { assertControllerCacheContents("def index = { }"); } public void testControllerCacheEmpty2() throws Exception { assertControllerCacheContents("def index2 = { [foo:'', bar:9] }\ndef index = { }"); } public void testControllerCacheEmpty3() throws Exception { assertControllerCacheContents("def index = { }\ndef index2 = { [foo:'', bar:9] }"); } public void testControllerCacheEmpty4() throws Exception { assertControllerCacheContents("def index = { 999 }"); } public void testControllerCacheSimple1() throws Exception { assertControllerCacheContents("def index = { [foo:'', bar:9] }", "foo", "java.lang.String", "bar", "java.lang.Integer"); } public void testControllerCacheSimple2() throws Exception { assertControllerCacheContents("def index = { def x = ''\ndef y = 9\n [foo:x, bar:y] }", "foo", "java.lang.String", "bar", "java.lang.Integer"); } public void testControllerCacheMultipleReturn1() throws Exception { assertControllerCacheContents("def index = { \n" + "def x = ''\n" + "def y = 9\n " + "if (true) {\n" + " [foo:x, bar:y]\n" + "} else {" + " [foo:x, bar:y]\n" + "} }", "foo", "java.lang.String", "bar", "java.lang.Integer"); } public void testControllerCacheMultipleReturn2() throws Exception { assertControllerCacheContents("def index = { \n" + "def x = ''\n" + "def y = 9\n " + "if (true) {\n" + " [foo:x, bar:y]\n" + "} else {" + " [foo2:x, bar2:y]\n" + "} }", "foo", "java.lang.String", "bar", "java.lang.Integer", "foo2", "java.lang.String", "bar2", "java.lang.Integer"); } public void testControllerCacheGenerics1() throws Exception { assertControllerCacheContents("def index = { [foo:[''], bar:[9:9] ] }", "foo", "java.util.List<java.lang.String>", "bar", "java.util.Map<java.lang.Integer,java.lang.Integer>"); } public void testControllerCacheRedirect1() throws Exception { assertControllerCacheContents("def index = { redirect(action: 'other') }\n def other = { [foo:[''], bar:[9:9] ] }", "foo", "java.util.List<java.lang.String>", "bar", "java.util.Map<java.lang.Integer,java.lang.Integer>"); } public void testControllerCacheRedirect2() throws Exception { assertControllerCacheContents( "def index = { redirect(action: 'other')\n" + " [baz : 9 ] }\n " + "def other = { [foo:[''], bar:[9:9] ] }", "baz", "java.lang.Integer", "foo", "java.util.List<java.lang.String>", "bar", "java.util.Map<java.lang.Integer,java.lang.Integer>"); } public void testControllerCacheRedirect3() throws Exception { assertControllerCacheContents( "def index = {\n" + " redirect(action: 'other')\n" + " redirect(action: 'other2')\n" + " [baz : 9 ] }\n " + "def other = { [foo:[''], bar:[9:9] ] }\n" + "def other2 = { [foo1:[''], bar1:[9:9] ] }", "baz", "java.lang.Integer", "foo", "java.util.List<java.lang.String>", "bar", "java.util.Map<java.lang.Integer,java.lang.Integer>", "foo1", "java.util.List<java.lang.String>", "bar1", "java.util.Map<java.lang.Integer,java.lang.Integer>"); } public void testControllerCacheRedirect4() throws Exception { assertControllerCacheContents( "def other2 = {\n" + " redirect(action: 'other')\n" + " redirect(action: 'other2')\n" + " [baz : 9 ] }\n " + "def other = { [foo:[''], bar:[9:9] ] }\n" + "def index = { [foo1:[''], bar1:[9:9] ] }", "foo1", "java.util.List<java.lang.String>", "bar1", "java.util.Map<java.lang.Integer,java.lang.Integer>"); } // these tests are of the PerProjectControllerCache public void testPerProjectCC1() throws Exception { assertPerProjectCacheContents("def index = { def x = ''\ndef y = 9\n [foo:x, bar:y] }", "java.lang.String foo;\njava.lang.Integer bar;\n"); } public void testPerProjectCC2() throws Exception { assertPerProjectCacheContents("def index2 = { [fsdfsafd : 888 ]}\n def index = { def x = ''\ndef y = 9\n [foo:x, bar:y] }", "java.lang.String foo;\njava.lang.Integer bar;\n"); } public void testPerProjectCC3() throws Exception { assertPerProjectCacheContents("def index = { def x = new String[0]\ndef y = new int[0]\n [foo:x, bar:y] }", "java.lang.String[] foo;\njava.lang.Integer[] bar;\n"); } public void testPerProjectCC4() throws Exception { assertPerProjectCacheContents("def index = { def x = new String[0][]\ndef y = new int[0][]\n [foo:x, bar:y] }", "java.lang.String[][] foo;\njava.lang.Integer[][] bar;\n"); } private void assertControllerCacheContents(String controllerContents, String...nameClassPairs) throws Exception { if (GrailsTestsActivator.isGrails200OrLater()) { // controllers are now methods controllerContents = controllerContents.replaceAll(" = \\{", " () {"); } ControllerCache cache = new ControllerCache(createController(controllerContents)); Map<String, ClassNode> returnValues = cache.findReturnValuesForAction("index"); assertEquals("Wrong number of values found in map: " + returnValues, nameClassPairs.length / 2, returnValues.size()); for (int i = 0; i < nameClassPairs.length; i+=2) { assertEquals("Wrong class name", nameClassPairs[i+1], printTypeName(returnValues.get(nameClassPairs[i]))); } } private void assertPerProjectCacheContents(String controllerContents, String expectedReturnVals) throws Exception { createController(controllerContents); PerProjectControllerCache cache = GrailsCore.get().connect(testProject.getProject(), PerProjectControllerCache.class); String returnVals = cache.findReturnValuesAsDeclarations("nuthin", "index"); assertEquals(expectedReturnVals, returnVals); } }