/*******************************************************************************
* 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.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import org.codehaus.jdt.groovy.model.GroovyCompilationUnit;
import org.eclipse.jdt.core.IField;
import org.grails.ide.eclipse.editor.gsp.tags.GSPTagJavaDocParser;
import org.grails.ide.eclipse.editor.gsp.tags.GSPTagJavaDocParser.GSPTagDescription;
/**
* test {@link GSPTagJavaDocParser}
* @author Andrew Eisenberg
* @since 2.5.2
*/
public class GSPTagDocParserTests extends AbstractGSPTagsTest {
public void testNoJavaDoc() throws Exception {
checkTagDescription("def x = { }", "",
createAttrMap(), createRequired(), false);
}
public void testEmptyDoc() throws Exception {
checkTagDescription("/** */\ndef x = { }", "",
createAttrMap(), createRequired(), false);
}
public void testDescriptionOnly() throws Exception {
checkTagDescription("/** Description */\ndef x = { }", "Description",
createAttrMap(), createRequired(), false);
}
public void testDescriptionOnly2() throws Exception {
checkTagDescription("/**\n* Description \n */\ndef x = { }", "Description",
createAttrMap(), createRequired(), false);
}
public void testAttr1() throws Exception {
checkTagDescription("/**\n* @attr attr1 */\ndef x = { }", "<b>Known Attributes</b><br/>\n<b>attr1</b><br/>\n",
createAttrMap("attr1", "<b>attr1</b>"), createRequired(), false);
}
public void testAttr2() throws Exception {
checkTagDescription("/**\n* @attr attr1 some stuff */\ndef x = { }", "<b>Known Attributes</b><br/>\n<b>attr1</b> : some stuff<br/>\n",
createAttrMap("attr1", "<b>attr1</b><br/><br/>\nsome stuff"), createRequired(), false);
}
public void testAttr3() throws Exception {
checkTagDescription("/**\n* @attr attr1 REQUIRED some stuff */\ndef x = { }", "<b>Known Attributes</b><br/>\n<b>attr1</b> : <b>REQUIRED </b>some stuff<br/>\n",
createAttrMap("attr1", "<b>attr1</b><br/>\n<b>REQUIRED </b><br/><br/>\nsome stuff"), createRequired("attr1"), false);
}
public void testAttr4() throws Exception {
checkTagDescription("/**\n* @attr attr1 required some stuff */\ndef x = { }", "<b>Known Attributes</b><br/>\n<b>attr1</b> : <b>REQUIRED </b>some stuff<br/>\n",
createAttrMap(
"attr1", "<b>attr1</b><br/>\n<b>REQUIRED </b><br/><br/>\nsome stuff"),
createRequired("attr1"), false);
}
public void testAttr5() throws Exception {
checkTagDescription("/**\n* @attr attr1 required some stuff\n@attr \n\nattr2\n\n second attr */\ndef x = { }",
"<b>Known Attributes</b><br/>\n" +
"<b>attr1</b> : <b>REQUIRED </b>some stuff<br/>\n" +
"<b>attr2</b> : second attr<br/>\n",
createAttrMap(
"attr1", "<b>attr1</b><br/>\n<b>REQUIRED </b><br/><br/>\nsome stuff",
"attr2", "<b>attr2</b><br/><br/>\nsecond attr"),
createRequired("attr1"), false);
}
public void testDescriptionAndAttrs() throws Exception {
checkTagDescription("/**\n* A very, very long\n* description\n * @attr attr1 required some stuff\n@attr \n\nattr2\n\n second attr \n*/\ndef x = { }",
"A very, very long description<br/><br/>\n" +
"<b>Known Attributes</b><br/>\n" +
"<b>attr1</b> : <b>REQUIRED </b>some stuff<br/>\n" +
"<b>attr2</b> : second attr<br/>\n",
createAttrMap(
"attr1", "<b>attr1</b><br/>\n<b>REQUIRED </b><br/><br/>\nsome stuff",
"attr2", "<b>attr2</b><br/><br/>\nsecond attr"),
createRequired("attr1"), false);
}
public void testIsEmpty1() throws Exception {
checkTagDescription("/**\n* @emptyTag */\ndef x = { }", "",
createAttrMap(), createRequired(), true);
}
public void testIsEmpty2() throws Exception {
checkTagDescription("/**\n* @emptyTag\n * @attr attr1 */\ndef x = { }", "<b>Known Attributes</b><br/>\n<b>attr1</b><br/>\n",
createAttrMap("attr1", "<b>attr1</b>"), createRequired(), true);
}
public void testIsEmpty3() throws Exception {
checkTagDescription("/**\n * @attr attr1\n* @emptyTag */\ndef x = { }", "<b>Known Attributes</b><br/>\n<b>attr1</b><br/>\n",
createAttrMap("attr1", "<b>attr1</b>"), createRequired(), true);
}
public void testOtherTags1() throws Exception {
checkTagDescription("/**\n* A very, very long\n* description\n* @attr attr1 required some stuff\n@attr \n\nattr2\n\n second attr \n@see nuthin*/\ndef x = { }",
"A very, very long description<br/><br/>\n" +
"<b>Known Attributes</b><br/>\n" +
"<b>attr1</b> : <b>REQUIRED </b>some stuff<br/>\n" +
"<b>attr2</b> : second attr<br/>\n",
createAttrMap(
"attr1", "<b>attr1</b><br/>\n<b>REQUIRED </b><br/><br/>\nsome stuff",
"attr2", "<b>attr2</b><br/><br/>\nsecond attr"),
createRequired("attr1"), false);
}
public void testOtherTags2() throws Exception {
checkTagDescription("/**\n* A very, very long\n* description\n@author Me\n @attr attr1 required some stuff\n@attr \n\nattr2\n\n second attr \n@see nuthin*/\ndef x = { }",
"A very, very long description<br/><br/>\n" +
"<b>Known Attributes</b><br/>\n" +
"<b>attr1</b> : <b>REQUIRED </b>some stuff<br/>\n" +
"<b>attr2</b> : second attr<br/>\n",
createAttrMap(
"attr1", "<b>attr1</b><br/>\n<b>REQUIRED </b><br/><br/>\nsome stuff",
"attr2", "<b>attr2</b><br/><br/>\nsecond attr"),
createRequired("attr1"), false);
}
public void testOtherTags3() throws Exception {
checkTagDescription("/**\n* A very, very long\n* description <b>bold</b> {@link Foo}\n@author Me\n @attr attr1 required some stuff\n@attr \n\nattr2\n\n second attr \n@see nuthin*/\ndef x = { }",
"A very, very long description <b>bold</b> {@link Foo}<br/><br/>\n" +
"<b>Known Attributes</b><br/>\n" +
"<b>attr1</b> : <b>REQUIRED </b>some stuff<br/>\n" +
"<b>attr2</b> : second attr<br/>\n",
createAttrMap(
"attr1", "<b>attr1</b><br/>\n<b>REQUIRED </b><br/><br/>\nsome stuff",
"attr2", "<b>attr2</b><br/><br/>\nsecond attr"),
createRequired("attr1"), false);
}
public void testSTS2344() throws Exception {
checkTagDescription("/**\n* </head><head>A very, very long\n* description <b>bold</b> {@link Foo}\n@author Me\n @attr attr1 required some stuff\n@attr \n\nattr2\n\n second attr \n@see nuthin*/\ndef x = { }",
"</head><head>A very, very long description <b>bold</b> {@link Foo}<br/><br/>\n" +
"<b>Known Attributes</b><br/>\n" +
"<b>attr1</b> : <b>REQUIRED </b>some stuff<br/>\n" +
"<b>attr2</b> : second attr<br/>\n",
createAttrMap(
"attr1", "<b>attr1</b><br/>\n<b>REQUIRED </b><br/><br/>\nsome stuff",
"attr2", "<b>attr2</b><br/><br/>\nsecond attr"),
createRequired("attr1"), false);
}
// STS-2344
public void testHeadRegex() throws Exception {
assertEquals("<head>", GSPTagJavaDocParser.OPEN_HEAD_PATTERN.matcher("<head>").replaceFirst(GSPTagJavaDocParser.OPEN_HEAD_REPLACE));
assertEquals("fdsaafds<head>fdsafsd", GSPTagJavaDocParser.OPEN_HEAD_PATTERN.matcher("fdsaafds<head>fdsafsd").replaceFirst(GSPTagJavaDocParser.OPEN_HEAD_REPLACE));
assertEquals("<head>", GSPTagJavaDocParser.OPEN_HEAD_PATTERN.matcher("<HEAD>").replaceFirst(GSPTagJavaDocParser.OPEN_HEAD_REPLACE));
assertEquals("<head>", GSPTagJavaDocParser.OPEN_HEAD_PATTERN.matcher("<HeAd>").replaceFirst(GSPTagJavaDocParser.OPEN_HEAD_REPLACE));
assertEquals("</head>", GSPTagJavaDocParser.OPEN_HEAD_PATTERN.matcher("</head>").replaceFirst(GSPTagJavaDocParser.OPEN_HEAD_REPLACE));
assertEquals("</head>", GSPTagJavaDocParser.CLOSE_HEAD_PATTERN.matcher("</head>").replaceFirst(GSPTagJavaDocParser.CLOSE_HEAD_REPLACE));
assertEquals("fdsaafds</head>fdsafsd", GSPTagJavaDocParser.CLOSE_HEAD_PATTERN.matcher("fdsaafds</head>fdsafsd").replaceFirst(GSPTagJavaDocParser.CLOSE_HEAD_REPLACE));
assertEquals("</head>", GSPTagJavaDocParser.CLOSE_HEAD_PATTERN.matcher("</HEAD>").replaceFirst(GSPTagJavaDocParser.CLOSE_HEAD_REPLACE));
assertEquals("</head>", GSPTagJavaDocParser.CLOSE_HEAD_PATTERN.matcher("</HeAd>").replaceFirst(GSPTagJavaDocParser.CLOSE_HEAD_REPLACE));
assertEquals("<head>", GSPTagJavaDocParser.CLOSE_HEAD_PATTERN.matcher("<head>").replaceFirst(GSPTagJavaDocParser.CLOSE_HEAD_REPLACE));
}
private void checkNullTagDescription(String contents) throws Exception {
GroovyCompilationUnit unit = createTagLib(contents);
IField field = unit.getTypes()[0].getField("x");
assertTagDescription(null, field);
}
private void checkTagDescription(String contents, String description, Map<String,String> attributes, Set<String> requiredAttributes, boolean isEmpty) throws Exception {
GroovyCompilationUnit unit = createTagLib(contents);
IField field = unit.getTypes()[0].getField("x");
assertTagDescription(new GSPTagDescription(description, attributes, requiredAttributes, isEmpty), field);
}
private Map<String,String> createAttrMap(String...attrNameDescPairs) {
Map<String,String> attrs = new HashMap<String, String>();
for (int i = 0; i < attrNameDescPairs.length; i++) {
attrs.put(attrNameDescPairs[i], attrNameDescPairs[++i]);
}
return attrs;
}
private Set<String> createRequired(String...required) {
Set<String> requiredSet = new HashSet<String>();
for (String req : required) {
requiredSet.add(req);
}
return requiredSet;
}
private void assertTagDescription(GSPTagDescription expected, IField field) {
GSPTagJavaDocParser parser = new GSPTagJavaDocParser();
GSPTagDescription actual = parser.parseJavaDoc(field, null);
if (expected == null) {
assertNull(actual);
return;
}
assertNotNull(actual);
assertEquals("Description", expected.description, actual.description);
assertEquals("Attributes", expected.attributes, actual.attributes);
assertEquals("Required attributes", expected.requiredAttributes, actual.requiredAttributes);
assertEquals("IsEmpty", expected.isEmpty, actual.isEmpty);
}
}