001: /*
002: * Licensed to the Apache Software Foundation (ASF) under one or more
003: * contributor license agreements. See the NOTICE file distributed with
004: * this work for additional information regarding copyright ownership.
005: * The ASF licenses this file to You under the Apache License, Version 2.0
006: * (the "License"); you may not use this file except in compliance with
007: * the License. You may obtain a copy of the License at
008: *
009: * http://www.apache.org/licenses/LICENSE-2.0
010: *
011: * Unless required by applicable law or agreed to in writing, software
012: * distributed under the License is distributed on an "AS IS" BASIS,
013: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014: * See the License for the specific language governing permissions and
015: * limitations under the License.
016: */
017: package org.apache.wicket.markup;
018:
019: import java.io.IOException;
020: import java.text.ParseException;
021: import java.util.Locale;
022:
023: import junit.framework.Assert;
024:
025: import org.apache.wicket.WicketTestCase;
026: import org.apache.wicket.markup.html.pages.PageExpiredErrorPage;
027: import org.apache.wicket.markup.parser.XmlTag;
028: import org.apache.wicket.markup.parser.filter.WicketTagIdentifier;
029: import org.apache.wicket.util.resource.IResourceStream;
030: import org.apache.wicket.util.resource.ResourceStreamNotFoundException;
031: import org.apache.wicket.util.resource.locator.IResourceStreamLocator;
032: import org.apache.wicket.util.resource.locator.ResourceStreamLocator;
033: import org.apache.wicket.util.string.StringValueConversionException;
034: import org.slf4j.Logger;
035: import org.slf4j.LoggerFactory;
036:
037: /**
038: * Test cases for markup parser.
039: *
040: * @author Jonathan Locke
041: */
042: public final class MarkupParserTest extends WicketTestCase {
043: private static final Logger log = LoggerFactory
044: .getLogger(MarkupParserTest.class);
045:
046: /**
047: * Construct.
048: *
049: * @param name
050: */
051: public MarkupParserTest(String name) {
052: super (name);
053: }
054:
055: /**
056: *
057: * @throws StringValueConversionException
058: * @throws Exception
059: */
060: public final void testTagParsing() throws Exception {
061: final MarkupParser parser = new MarkupParser(
062: "This is a test <a componentName:id=\"a\" href=\"foo.html\"> <b componentName:id=\"b\">Bold!</b> "
063: + "<img componentName:id=\"img\" width=9 height=10 src=\"foo\"> <marker componentName:id=\"marker\"/> </a>");
064: parser.setWicketNamespace("componentName");
065:
066: final Markup markup = parser.parse();
067: final MarkupStream markupStream = new MarkupStream(markup);
068: final ComponentTag aOpen = (ComponentTag) markupStream.next();
069:
070: log.info("", aOpen);
071: Assert.assertTrue(aOpen.getName().equals("a"));
072: Assert.assertEquals("foo.html", aOpen.getAttributes()
073: .getString("href"));
074:
075: markupStream.next();
076:
077: final ComponentTag boldOpen = (ComponentTag) markupStream
078: .next();
079:
080: log.info("", boldOpen);
081: Assert.assertTrue(boldOpen.getName().equals("b"));
082: Assert.assertEquals(XmlTag.OPEN, boldOpen.getType());
083:
084: markupStream.next();
085:
086: final ComponentTag boldClose = (ComponentTag) markupStream
087: .next();
088:
089: log.info("", boldClose);
090: Assert.assertTrue(boldClose.getName().equals("b"));
091: Assert.assertEquals(XmlTag.CLOSE, boldClose.getType());
092:
093: markupStream.next();
094:
095: final ComponentTag img = (ComponentTag) markupStream.next();
096:
097: log.info("", img);
098: Assert.assertTrue(img.getName().equals("img"));
099: Assert.assertEquals(9, img.getAttributes().getInt("width"));
100: Assert.assertEquals(10, img.getAttributes().getInt("height"));
101: Assert.assertEquals(XmlTag.OPEN, img.getType());
102:
103: markupStream.next();
104:
105: final ComponentTag marker = (ComponentTag) markupStream.next();
106:
107: log.info("", marker);
108: Assert.assertTrue(marker.getName().equals("marker"));
109: Assert.assertEquals(XmlTag.OPEN_CLOSE, marker.getType());
110:
111: markupStream.next();
112:
113: final ComponentTag aClose = (ComponentTag) markupStream.next();
114:
115: log.info("", aClose);
116: Assert.assertTrue(aClose.getName().equals("a"));
117:
118: Assert.assertNull(markupStream.next());
119: }
120:
121: /**
122: *
123: * @throws Exception
124: */
125: public final void test() throws Exception {
126: final MarkupParser parser = new MarkupParser(
127: "This is a test <a componentName:id=9> <b>bold</b> <b componentName:id=10/></a> of the emergency broadcasting system");
128: parser.setWicketNamespace("componentName");
129: final Markup tokens = parser.parse();
130:
131: log.info("tok(0)=" + tokens.get(0));
132: log.info("tok(1)=" + tokens.get(1));
133: log.info("tok(2)=" + tokens.get(2));
134: log.info("tok(3)=" + tokens.get(3));
135: log.info("tok(4)=" + tokens.get(4));
136: log.info("tok(5)=" + tokens.get(5));
137:
138: Assert.assertTrue(tokens.get(0).equals("This is a test "));
139:
140: final ComponentTag a = (ComponentTag) tokens.get(1);
141:
142: Assert.assertEquals(9, a.getAttributes().getInt(
143: "componentName:id"));
144: Assert.assertTrue(tokens.get(2).equals(" <b>bold</b> "));
145:
146: final ComponentTag b = (ComponentTag) tokens.get(3);
147:
148: Assert.assertEquals(10, b.getAttributes().getInt(
149: "componentName:id"));
150:
151: final ComponentTag closeA = (ComponentTag) tokens.get(4);
152:
153: Assert.assertEquals("a", closeA.getName());
154: Assert.assertTrue(tokens.get(5).equals(
155: " of the emergency broadcasting system"));
156: }
157:
158: /**
159: *
160: * @throws Exception
161: */
162: public final void testXhtmlDocument() throws Exception {
163: final String docText = ""
164: + "<?xml version='1.0' encoding='iso-8859-1' ?>"
165: + "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.1//EN\" \"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd\">"
166: + "<html>" + "<head><title>Some Page</title></head>"
167: + "<body><h1>XHTML Test</h1></body>" + "</html>";
168: final MarkupParser parser = new MarkupParser(docText);
169: parser.setWicketNamespace("componentName");
170: final Markup tokens = parser.parse();
171:
172: log.info("tok(0)=" + tokens.get(0));
173:
174: // without HtmlHeaderSectionHandler
175: Assert.assertEquals(docText.substring(44), tokens.get(0)
176: .toString());
177: // with HtmlHeaderSectionHandler
178: // Assert.assertEquals(docText.substring(44, 147),
179: // tokens.get(0).toString());
180: }
181:
182: private MarkupResourceStream newMarkupResourceStream(
183: final IResourceStreamLocator locator, final Class c,
184: final String style, final Locale locale,
185: final String extension) {
186: IResourceStream resource = locator.locate(c, c.getName()
187: .replace('.', '/'), style, locale, extension);
188: MarkupResourceStream res = new MarkupResourceStream(resource,
189: null, null);
190: return res;
191: }
192:
193: /**
194: *
195: * @throws ParseException
196: * @throws ResourceStreamNotFoundException
197: * @throws IOException
198: */
199: public final void testFileDocument() throws ParseException,
200: ResourceStreamNotFoundException, IOException {
201: IResourceStreamLocator locator = new ResourceStreamLocator();
202: MarkupResourceStream resource = newMarkupResourceStream(
203: locator, this .getClass(), "1", null, "html");
204:
205: MarkupParser parser = new MarkupParser(resource);
206: parser.setWicketNamespace("wcn");
207:
208: Markup tokens = parser.parse();
209: log.info("tok(0)=" + tokens.get(0));
210: // Assert.assertEquals(docText, tokens.get(0).toString());
211:
212: resource = newMarkupResourceStream(locator, this .getClass(),
213: "2", null, "html");
214: parser = new MarkupParser(resource);
215: parser.setWicketNamespace("wcn");
216: tokens = parser.parse();
217: log.info("tok(0)=" + tokens.get(0));
218: // Assert.assertEquals(docText, tokens.get(0).toString());
219:
220: resource = newMarkupResourceStream(locator, this .getClass(),
221: "3", null, "html");
222: parser = new MarkupParser(resource);
223: parser.setWicketNamespace("wcn");
224: tokens = parser.parse();
225: log.info("tok(0)=" + tokens.get(0));
226: // Assert.assertEquals(docText, tokens.get(0).toString());
227:
228: resource = newMarkupResourceStream(locator, this .getClass(),
229: "4", null, "html");
230: parser = new MarkupParser(resource);
231: parser.setWicketNamespace("wcn");
232: tokens = parser.parse();
233: log.info("tok(0)=" + tokens.get(0));
234: // Assert.assertEquals(docText, tokens.get(0).toString());
235:
236: // File from jar (URL resource)
237: resource = newMarkupResourceStream(locator,
238: PageExpiredErrorPage.class, null, null, "html");
239: parser = new MarkupParser(resource);
240: parser.setWicketNamespace("wcn");
241: tokens = parser.parse();
242: log.info("tok(0)=" + tokens.get(0));
243: // Assert.assertEquals(docText, tokens.get(0).toString());
244:
245: resource = newMarkupResourceStream(locator, this .getClass(),
246: "5", null, "html");
247: parser = new MarkupParser(resource);
248: parser.setWicketNamespace("wcn");
249: tokens = parser.parse();
250: log.info("tok(0)=" + tokens.get(0));
251: // Assert.assertEquals(docText, tokens.get(0).toString());
252:
253: resource = newMarkupResourceStream(locator, this .getClass(),
254: "6", null, "html");
255: parser = new MarkupParser(resource);
256: parser.setWicketNamespace("wcn");
257: tokens = parser.parse();
258: log.info("tok(0)=" + tokens.get(0));
259: // Assert.assertEquals(docText, tokens.get(0).toString());
260:
261: resource = newMarkupResourceStream(locator, this .getClass(),
262: "7", null, "html");
263: parser = new MarkupParser(resource);
264: parser.setWicketNamespace("wcn");
265: tokens = parser.parse();
266: log.info("tok(0)=" + tokens.get(0));
267: // Assert.assertEquals(docText, tokens.get(0).toString());
268:
269: resource = newMarkupResourceStream(locator, this .getClass(),
270: "8", null, "html");
271: parser = new MarkupParser(resource);
272: parser.setWicketNamespace("wcn");
273: tokens = parser.parse();
274: log.info("tok(0)=" + tokens.get(0));
275: // Assert.assertEquals(docText, tokens.get(0).toString());
276:
277: resource = newMarkupResourceStream(locator, this .getClass(),
278: "9", null, "html");
279: parser = new MarkupParser(resource);
280: parser.setWicketNamespace("wcn");
281: tokens = parser.parse();
282: log.info("tok(0)=" + tokens.get(0));
283: // Assert.assertEquals(docText, tokens.get(0).toString());
284: }
285:
286: /**
287: * Test <wicket: .
288: *
289: * @throws ParseException
290: * @throws ResourceStreamNotFoundException
291: * @throws IOException
292: */
293: public final void testWicketTag() throws ParseException,
294: ResourceStreamNotFoundException, IOException {
295: WicketTagIdentifier.registerWellKnownTagName("body");
296: WicketTagIdentifier.registerWellKnownTagName("border");
297: WicketTagIdentifier.registerWellKnownTagName("panel");
298:
299: new MarkupParser("<span wicket:id=\"test\"/>").parse();
300: new MarkupParser("<span wicket:id=\"test\">Body</span>")
301: .parse();
302: new MarkupParser("This is a test <span wicket:id=\"test\"/>")
303: .parse();
304: new MarkupParser(
305: "This is a test <span wicket:id=\"test\">Body</span>")
306: .parse();
307: new MarkupParser(
308: "<a wicket:id=\"[autolink]\" href=\"test.html\">Home</a>")
309: .parse();
310:
311: new MarkupParser("<wicket:body/>").parse();
312: new MarkupParser("<wicket:border/>").parse();
313: new MarkupParser("<wicket:panel/>").parse();
314:
315: try {
316: new MarkupParser("<wicket:remove/>").parse();
317: assertTrue("Should have thrown an exception", false);
318: } catch (MarkupException ex) {
319: // ignore
320: }
321:
322: Markup markup = new MarkupParser(
323: "<wicket:remove> </wicket:remove>").parse();
324: assertEquals(0, markup.size());
325:
326: markup = new MarkupParser(
327: "<wicket:remove> <span id=\"test\"/> </wicket:remove>")
328: .parse();
329: assertEquals(0, markup.size());
330:
331: markup = new MarkupParser(
332: "<div><wicket:remove> <span id=\"test\"/> </wicket:remove></div>")
333: .parse();
334: assertEquals(2, markup.size());
335: assertEquals("<div>", ((RawMarkup) markup.get(0)).toString());
336: assertEquals("</div>", ((RawMarkup) markup.get(1)).toString());
337:
338: try {
339: new MarkupParser(
340: "<wicket:remove> <wicket:remove> </wicket:remove> </wicket:remove>")
341: .parse();
342: assertTrue(
343: "Should have thrown an exception: remove regions must not contain wicket-components",
344: false);
345: } catch (MarkupException ex) {
346: // ignore
347: }
348:
349: new MarkupParser(
350: "<wicket:component name = \"componentName\" class = \"classname\" param1 = \"value1\"/>")
351: .parse();
352: new MarkupParser(
353: "<wicket:component name = \"componentName\" class = \"classname\" param1 = \"value1\"> </wicket:component>")
354: .parse();
355: new MarkupParser(
356: "<wicket:component name = \"componentName\" class = \"classname\" param1 = \"value1\"> <span wicket:id=\"msg\">hello world!</span></wicket:component>")
357: .parse();
358: new MarkupParser(
359: "<wicket:panel><div id=\"definitionsContentBox\"><span wicket:id=\"contentPanel\"/></div></wicket:panel>")
360: .parse();
361: }
362:
363: /**
364: * Test <wicket: .
365: *
366: * @throws ParseException
367: * @throws ResourceStreamNotFoundException
368: * @throws IOException
369: */
370: public final void testDefaultWicketTag() throws ParseException,
371: ResourceStreamNotFoundException, IOException {
372: MarkupParser parser = new MarkupParser(
373: "<span wcn:id=\"test\"/>");
374: parser.setWicketNamespace("wcn");
375:
376: Markup markup = parser.parse();
377: assertEquals(1, markup.size());
378:
379: markup = new MarkupParser("<span wicket:id=\"test\"/>").parse();
380: assertEquals(1, markup.size());
381:
382: WicketTagIdentifier.registerWellKnownTagName("xxx");
383: parser = new MarkupParser("<wcn:xxx> </wcn:xxx>");
384: parser.setWicketNamespace("wcn");
385: markup = parser.parse();
386: assertEquals(3, markup.size());
387: }
388:
389: /**
390: * Test <wicket: .
391: *
392: * @throws ParseException
393: * @throws ResourceStreamNotFoundException
394: * @throws IOException
395: */
396: public final void testScript() throws ParseException,
397: ResourceStreamNotFoundException, IOException {
398: final MarkupParser parser = new MarkupParser(
399: "<html wicket:id=\"test\"><script language=\"JavaScript\">... <x a> ...</script></html>");
400:
401: Markup markup = parser.parse();
402: assertEquals(3, markup.size());
403: assertEquals("html", ((ComponentTag) markup.get(0)).getName());
404: assertEquals("html", ((ComponentTag) markup.get(2)).getName());
405: assertEquals(true, markup.get(1) instanceof RawMarkup);
406: assertEquals(
407: "<script language=\"JavaScript\">... <x a> ...</script>",
408: ((RawMarkup) markup.get(1)).toString());
409: }
410:
411: /**
412: *
413: * @throws IOException
414: * @throws ResourceStreamNotFoundException
415: */
416: public final void testBalancing() throws IOException,
417: ResourceStreamNotFoundException {
418: final MarkupParser parser = new MarkupParser(
419: "<span wicket:id=\"span\"><img wicket:id=\"img\"><span wicket:id=\"span2\"></span></span>");
420:
421: // Note: <img> is one of these none-balanced HTML tags
422: Markup markup = parser.parse();
423:
424: ComponentTag t = (ComponentTag) markup.get(0);
425: assertEquals(t.getId(), "span");
426: assertEquals(t.getPath(), null);
427:
428: t = (ComponentTag) markup.get(1);
429: assertEquals(t.getId(), "img");
430: assertEquals(t.getPath(), "span");
431:
432: t = (ComponentTag) markup.get(2);
433: assertEquals(t.getId(), "span2");
434: assertEquals(t.getPath(), "span");
435: }
436: }
|