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