1 package test.net.sourceforge.pmd.jsp.ast; 2 3 import static org.junit.Assert.assertEquals; 4 import net.sourceforge.pmd.jsp.ast.ASTAttribute; 5 import net.sourceforge.pmd.jsp.ast.ASTAttributeValue; 6 import net.sourceforge.pmd.jsp.ast.ASTCData; 7 import net.sourceforge.pmd.jsp.ast.ASTCommentTag; 8 import net.sourceforge.pmd.jsp.ast.ASTDoctypeDeclaration; 9 import net.sourceforge.pmd.jsp.ast.ASTDoctypeExternalId; 10 import net.sourceforge.pmd.jsp.ast.ASTElement; 11 12 import org.junit.Test; 13 14 import java.util.ArrayList; 15 import java.util.Collections; 16 import java.util.Comparator; 17 import java.util.List; 18 import java.util.Set; 19 /** 20 * Test parsing of a JSP in document style, by checking the generated AST. 21 * 22 * @author pieter_van_raemdonck - Application Engineers NV/SA - www.ae.be 23 * 24 */ 25 public class JspDocStyleTest extends AbstractJspNodesTst { 26 27 /** 28 * Smoke test for JSP parser. 29 * 30 * @throws Throwable 31 */ 32 @Test 33 public void testSimplestJsp() throws Throwable { 34 assertNumberOfNodes(ASTElement.class, TEST_SIMPLEST_HTML, 1); 35 } 36 37 /** 38 * Test the information on a Element and Attribute. 39 * 40 * @throws Throwable 41 */ 42 @Test 43 public void testElementAttributeAndNamespace() throws Throwable { 44 Set nodes = getNodes(null, TEST_ELEMENT_AND_NAMESPACE); 45 46 Set<ASTElement> elementNodes = getNodesOfType(ASTElement.class, nodes); 47 assertEquals("One element node expected!", 1, elementNodes.size()); 48 ASTElement element = elementNodes.iterator().next(); 49 assertEquals("Correct name expected!", "h:html", element.getName()); 50 assertEquals("Has namespace prefix!", true, element.isHasNamespacePrefix()); 51 assertEquals("Element is empty!", true, element.isEmpty()); 52 assertEquals("Correct namespace prefix of element expected!", "h", element 53 .getNamespacePrefix()); 54 assertEquals("Correct local name of element expected!", "html", element 55 .getLocalName()); 56 57 Set attributeNodes = getNodesOfType(ASTAttribute.class, nodes); 58 assertEquals("One attribute node expected!", 1, attributeNodes.size()); 59 ASTAttribute attribute = (ASTAttribute) attributeNodes.iterator().next(); 60 assertEquals("Correct name expected!", "MyNsPrefix:MyAttr", attribute 61 .getName()); 62 assertEquals("Has namespace prefix!", true, attribute.isHasNamespacePrefix()); 63 assertEquals("Correct namespace prefix of element expected!", "MyNsPrefix", 64 attribute.getNamespacePrefix()); 65 assertEquals("Correct local name of element expected!", "MyAttr", attribute 66 .getLocalName()); 67 68 } 69 70 /** 71 * Test exposing a bug of parsing error when having a hash as last character 72 * in an attribute value. 73 * 74 */ 75 @Test 76 public void testAttributeValueContainingHash() 77 { 78 Set nodes = getNodes(null, TEST_ATTRIBUTE_VALUE_CONTAINING_HASH); 79 80 Set<ASTAttribute> attributes = getNodesOfType(ASTAttribute.class, nodes); 81 assertEquals("Three attributes expected!", 3, attributes.size()); 82 83 List<ASTAttribute> attrsList = new ArrayList<ASTAttribute>(attributes); 84 Collections.sort(attrsList, new Comparator<ASTAttribute>() { 85 public int compare(ASTAttribute arg0, ASTAttribute arg1) { 86 return arg0.getName().compareTo(arg1.getName()); 87 } 88 }); 89 90 ASTAttribute attr = attrsList.get(0); 91 assertEquals("Correct attribute name expected!", 92 "foo", attr.getName()); 93 assertEquals("Correct attribute value expected!", 94 "CREATE", attr.getFirstChildOfType(ASTAttributeValue.class).getImage()); 95 96 attr = attrsList.get(1); 97 assertEquals("Correct attribute name expected!", 98 "href", attr.getName()); 99 assertEquals("Correct attribute value expected!", 100 "#", attr.getFirstChildOfType(ASTAttributeValue.class).getImage()); 101 102 attr = attrsList.get(2); 103 assertEquals("Correct attribute name expected!", 104 "something", attr.getName()); 105 assertEquals("Correct attribute value expected!", 106 "#yes#", attr.getFirstChildOfType(ASTAttributeValue.class).getImage()); 107 } 108 109 /** 110 * Test correct parsing of CDATA. 111 */ 112 @Test 113 public void testCData() { 114 Set cdataNodes = getNodes(ASTCData.class, TEST_CDATA); 115 116 assertEquals("One CDATA node expected!", 1, cdataNodes.size()); 117 ASTCData cdata = (ASTCData) cdataNodes.iterator().next(); 118 assertEquals("Content incorrectly parsed!", " some <cdata> ]] ]> ", cdata 119 .getImage()); 120 } 121 122 /** 123 * Test parsing of Doctype declaration. 124 */ 125 @Test 126 public void testDoctype() { 127 Set nodes = getNodes(null, TEST_DOCTYPE); 128 129 Set<ASTDoctypeDeclaration> docTypeDeclarations = getNodesOfType(ASTDoctypeDeclaration.class, nodes); 130 assertEquals("One doctype declaration expected!", 1, docTypeDeclarations 131 .size()); 132 ASTDoctypeDeclaration docTypeDecl = docTypeDeclarations 133 .iterator().next(); 134 assertEquals("Correct doctype-name expected!", "html", docTypeDecl.getName()); 135 136 Set externalIds = getNodesOfType(ASTDoctypeExternalId.class, nodes); 137 assertEquals("One doctype external id expected!", 1, externalIds 138 .size()); 139 ASTDoctypeExternalId externalId = (ASTDoctypeExternalId) externalIds 140 .iterator().next(); 141 assertEquals("Correct external public id expected!", "-//W3C//DTD XHTML 1.1//EN", 142 externalId.getPublicId()); 143 assertEquals("Correct external uri expected!", "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd", 144 externalId.getUri()); 145 146 } 147 148 /** 149 * Test parsing of a XML comment. 150 * 151 */ 152 @Test 153 public void testComment() { 154 Set comments = getNodes(ASTCommentTag.class, TEST_COMMENT); 155 assertEquals("One comment expected!", 1, comments.size()); 156 ASTCommentTag comment = (ASTCommentTag) comments.iterator().next(); 157 assertEquals("Correct comment content expected!", "comment", comment.getImage()); 158 } 159 160 private static final String TEST_SIMPLEST_HTML = "<html/>"; 161 162 private static final String TEST_ELEMENT_AND_NAMESPACE = "<h:html MyNsPrefix:MyAttr='MyValue'/>"; 163 164 private static final String TEST_CDATA = "<html><![CDATA[ some <cdata> ]] ]> ]]></html>"; 165 166 private static final String TEST_DOCTYPE = "<?xml version=\"1.0\" standalone='yes'?>\n" 167 + "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.1//EN\" " 168 + "\"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd\">\n" 169 + "<greeting>Hello, world!</greeting>"; 170 171 private static final String TEST_COMMENT = "<html><!-- comment --></html>"; 172 173 private static final String TEST_ATTRIBUTE_VALUE_CONTAINING_HASH = 174 "<tag:if something=\"#yes#\" foo=\"CREATE\"> <a href=\"#\">foo</a> </tag:if>"; 175 176 public static junit.framework.Test suite() { 177 return new junit.framework.JUnit4TestAdapter(JspDocStyleTest.class); 178 } 179 }