📄 markupparsertest.java
字号:
/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */package org.apache.wicket.markup;import java.io.IOException;import java.text.ParseException;import java.util.Locale;import junit.framework.Assert;import org.apache.wicket.WicketTestCase;import org.apache.wicket.markup.html.pages.PageExpiredErrorPage;import org.apache.wicket.markup.parser.XmlTag;import org.apache.wicket.markup.parser.filter.WicketTagIdentifier;import org.apache.wicket.util.resource.IResourceStream;import org.apache.wicket.util.resource.ResourceStreamNotFoundException;import org.apache.wicket.util.resource.locator.IResourceStreamLocator;import org.apache.wicket.util.resource.locator.ResourceStreamLocator;import org.apache.wicket.util.string.StringValueConversionException;import org.slf4j.Logger;import org.slf4j.LoggerFactory;/** * Test cases for markup parser. * * @author Jonathan Locke */public final class MarkupParserTest extends WicketTestCase{ private static final Logger log = LoggerFactory.getLogger(MarkupParserTest.class); /** * Construct. * * @param name */ public MarkupParserTest(String name) { super(name); } /** * * @throws StringValueConversionException * @throws Exception */ public final void testTagParsing() throws Exception { final MarkupParser parser = new MarkupParser( "This is a test <a componentName:id=\"a\" href=\"foo.html\"> <b componentName:id=\"b\">Bold!</b> " + "<img componentName:id=\"img\" width=9 height=10 src=\"foo\"> <marker componentName:id=\"marker\"/> </a>"); parser.setWicketNamespace("componentName"); final Markup markup = parser.parse(); final MarkupStream markupStream = new MarkupStream(markup); final ComponentTag aOpen = (ComponentTag)markupStream.next(); log.info("", aOpen); Assert.assertTrue(aOpen.getName().equals("a")); Assert.assertEquals("foo.html", aOpen.getAttributes().getString("href")); markupStream.next(); final ComponentTag boldOpen = (ComponentTag)markupStream.next(); log.info("", boldOpen); Assert.assertTrue(boldOpen.getName().equals("b")); Assert.assertEquals(XmlTag.OPEN, boldOpen.getType()); markupStream.next(); final ComponentTag boldClose = (ComponentTag)markupStream.next(); log.info("", boldClose); Assert.assertTrue(boldClose.getName().equals("b")); Assert.assertEquals(XmlTag.CLOSE, boldClose.getType()); markupStream.next(); final ComponentTag img = (ComponentTag)markupStream.next(); log.info("", img); Assert.assertTrue(img.getName().equals("img")); Assert.assertEquals(9, img.getAttributes().getInt("width")); Assert.assertEquals(10, img.getAttributes().getInt("height")); Assert.assertEquals(XmlTag.OPEN, img.getType()); markupStream.next(); final ComponentTag marker = (ComponentTag)markupStream.next(); log.info("", marker); Assert.assertTrue(marker.getName().equals("marker")); Assert.assertEquals(XmlTag.OPEN_CLOSE, marker.getType()); markupStream.next(); final ComponentTag aClose = (ComponentTag)markupStream.next(); log.info("", aClose); Assert.assertTrue(aClose.getName().equals("a")); Assert.assertNull(markupStream.next()); } /** * * @throws Exception */ public final void test() throws Exception { final MarkupParser parser = new MarkupParser( "This is a test <a componentName:id=9> <b>bold</b> <b componentName:id=10></b></a> of the emergency broadcasting system"); parser.setWicketNamespace("componentName"); final Markup tokens = parser.parse(); log.info("tok(0)=" + tokens.get(0)); log.info("tok(1)=" + tokens.get(1)); log.info("tok(2)=" + tokens.get(2)); log.info("tok(3)=" + tokens.get(3)); log.info("tok(4)=" + tokens.get(4)); log.info("tok(5)=" + tokens.get(5)); Assert.assertTrue(tokens.get(0).equals("This is a test ")); final ComponentTag a = (ComponentTag)tokens.get(1); Assert.assertEquals(9, a.getAttributes().getInt("componentName:id")); Assert.assertTrue(tokens.get(2).equals(" <b>bold</b> ")); final ComponentTag b = (ComponentTag)tokens.get(3); Assert.assertEquals(10, b.getAttributes().getInt("componentName:id")); final ComponentTag closeA = (ComponentTag)tokens.get(5); Assert.assertEquals("a", closeA.getName()); Assert.assertTrue(tokens.get(6).equals(" of the emergency broadcasting system")); } /** * * @throws Exception */ public final void testXhtmlDocument() throws Exception { final String docText = "" + "<?xml version='1.0' encoding='iso-8859-1' ?>" + "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.1//EN\" \"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd\">" + "<html>" + "<head><title>Some Page</title></head>" + "<body><h1>XHTML Test</h1></body>" + "</html>"; final MarkupParser parser = new MarkupParser(docText); parser.setWicketNamespace("componentName"); final Markup tokens = parser.parse(); log.info("tok(0)=" + tokens.get(0)); // without HtmlHeaderSectionHandler Assert.assertEquals(docText.substring(44), tokens.get(0).toString()); // with HtmlHeaderSectionHandler // Assert.assertEquals(docText.substring(44, 147), // tokens.get(0).toString()); } private MarkupResourceStream newMarkupResourceStream(final IResourceStreamLocator locator, final Class c, final String style, final Locale locale, final String extension) { IResourceStream resource = locator.locate(c, c.getName().replace('.', '/'), style, locale, extension); MarkupResourceStream res = new MarkupResourceStream(resource, null, null); return res; } /** * * @throws ParseException * @throws ResourceStreamNotFoundException * @throws IOException */ public final void testFileDocument() throws ParseException, ResourceStreamNotFoundException, IOException { IResourceStreamLocator locator = new ResourceStreamLocator(); MarkupResourceStream resource = newMarkupResourceStream(locator, getClass(), "1", null, "html"); MarkupParser parser = new MarkupParser(resource); parser.setWicketNamespace("wcn"); Markup tokens = parser.parse(); log.info("tok(0)=" + tokens.get(0)); // Assert.assertEquals(docText, tokens.get(0).toString()); resource = newMarkupResourceStream(locator, getClass(), "2", null, "html"); parser = new MarkupParser(resource); parser.setWicketNamespace("wcn"); tokens = parser.parse(); log.info("tok(0)=" + tokens.get(0)); // Assert.assertEquals(docText, tokens.get(0).toString()); resource = newMarkupResourceStream(locator, getClass(), "3", null, "html"); parser = new MarkupParser(resource); parser.setWicketNamespace("wcn"); tokens = parser.parse(); log.info("tok(0)=" + tokens.get(0)); // Assert.assertEquals(docText, tokens.get(0).toString()); resource = newMarkupResourceStream(locator, getClass(), "4", null, "html"); parser = new MarkupParser(resource); parser.setWicketNamespace("wcn"); tokens = parser.parse(); log.info("tok(0)=" + tokens.get(0)); // Assert.assertEquals(docText, tokens.get(0).toString()); // File from jar (URL resource) resource = newMarkupResourceStream(locator, PageExpiredErrorPage.class, null, null, "html"); parser = new MarkupParser(resource); parser.setWicketNamespace("wcn"); tokens = parser.parse(); log.info("tok(0)=" + tokens.get(0)); // Assert.assertEquals(docText, tokens.get(0).toString()); resource = newMarkupResourceStream(locator, getClass(), "5", null, "html"); parser = new MarkupParser(resource); parser.setWicketNamespace("wcn"); tokens = parser.parse(); log.info("tok(0)=" + tokens.get(0)); // Assert.assertEquals(docText, tokens.get(0).toString()); resource = newMarkupResourceStream(locator, getClass(), "6", null, "html"); parser = new MarkupParser(resource); parser.setWicketNamespace("wcn"); tokens = parser.parse(); log.info("tok(0)=" + tokens.get(0)); // Assert.assertEquals(docText, tokens.get(0).toString()); resource = newMarkupResourceStream(locator, getClass(), "7", null, "html"); parser = new MarkupParser(resource); parser.setWicketNamespace("wcn"); tokens = parser.parse(); log.info("tok(0)=" + tokens.get(0)); // Assert.assertEquals(docText, tokens.get(0).toString()); resource = newMarkupResourceStream(locator, getClass(), "8", null, "html"); parser = new MarkupParser(resource); parser.setWicketNamespace("wcn"); tokens = parser.parse(); log.info("tok(0)=" + tokens.get(0)); // Assert.assertEquals(docText, tokens.get(0).toString()); resource = newMarkupResourceStream(locator, getClass(), "9", null, "html"); parser = new MarkupParser(resource); parser.setWicketNamespace("wcn"); tokens = parser.parse(); log.info("tok(0)=" + tokens.get(0)); // Assert.assertEquals(docText, tokens.get(0).toString()); } /** * Test <wicket: . * * @throws ParseException * @throws ResourceStreamNotFoundException * @throws IOException */ public final void testWicketTag() throws ParseException, ResourceStreamNotFoundException, IOException { WicketTagIdentifier.registerWellKnownTagName("body"); WicketTagIdentifier.registerWellKnownTagName("border"); WicketTagIdentifier.registerWellKnownTagName("panel"); new MarkupParser("<span wicket:id=\"test\"/>").parse(); new MarkupParser("<span wicket:id=\"test\">Body</span>").parse(); new MarkupParser("This is a test <span wicket:id=\"test\"/>").parse(); new MarkupParser("This is a test <span wicket:id=\"test\">Body</span>").parse(); new MarkupParser("<a wicket:id=\"[autolink]\" href=\"test.html\">Home</a>").parse(); new MarkupParser("<wicket:body/>").parse(); new MarkupParser("<wicket:border/>").parse(); new MarkupParser("<wicket:panel/>").parse(); try { new MarkupParser("<wicket:remove/>").parse(); assertTrue("Should have thrown an exception", false); } catch (MarkupException ex) { // ignore } Markup markup = new MarkupParser("<wicket:remove> </wicket:remove>").parse(); assertEquals(0, markup.size()); markup = new MarkupParser("<wicket:remove> <span id=\"test\"/> </wicket:remove>").parse(); assertEquals(0, markup.size()); markup = new MarkupParser("<div><wicket:remove> <span id=\"test\"/> </wicket:remove></div>") .parse(); assertEquals(2, markup.size()); assertEquals("<div>", ((RawMarkup)markup.get(0)).toString()); assertEquals("</div>", ((RawMarkup)markup.get(1)).toString()); try { new MarkupParser("<wicket:remove> <wicket:remove> </wicket:remove> </wicket:remove>") .parse(); assertTrue( "Should have thrown an exception: remove regions must not contain wicket-components", false); } catch (MarkupException ex) { // ignore } new MarkupParser( "<wicket:component name = \"componentName\" class = \"classname\" param1 = \"value1\"/>") .parse(); new MarkupParser( "<wicket:component name = \"componentName\" class = \"classname\" param1 = \"value1\"> </wicket:component>") .parse(); new MarkupParser( "<wicket:component name = \"componentName\" class = \"classname\" param1 = \"value1\"> <span wicket:id=\"msg\">hello world!</span></wicket:component>") .parse(); new MarkupParser( "<wicket:panel><div id=\"definitionsContentBox\"><span wicket:id=\"contentPanel\"/></div></wicket:panel>") .parse(); } /** * Test <wicket: . * * @throws ParseException * @throws ResourceStreamNotFoundException * @throws IOException */ public final void testDefaultWicketTag() throws ParseException, ResourceStreamNotFoundException, IOException { MarkupParser parser = new MarkupParser("<image wcn:id=\"test\"/>"); parser.setWicketNamespace("wcn"); Markup markup = parser.parse(); assertEquals(1, markup.size()); markup = new MarkupParser("<image wicket:id=\"test\"/>").parse(); assertEquals(1, markup.size()); WicketTagIdentifier.registerWellKnownTagName("xxx"); parser = new MarkupParser("<wcn:xxx> </wcn:xxx>"); parser.setWicketNamespace("wcn"); markup = parser.parse(); assertEquals(3, markup.size()); } /** * Test <wicket: . * * @throws ParseException * @throws ResourceStreamNotFoundException * @throws IOException */ public final void testScript() throws ParseException, ResourceStreamNotFoundException, IOException { final MarkupParser parser = new MarkupParser( "<html wicket:id=\"test\"><script language=\"JavaScript\">... <x a> ...</script></html>"); Markup markup = parser.parse(); assertEquals(3, markup.size()); assertEquals("html", ((ComponentTag)markup.get(0)).getName()); assertEquals("html", ((ComponentTag)markup.get(2)).getName()); assertEquals(true, markup.get(1) instanceof RawMarkup); assertEquals("<script language=\"JavaScript\">... <x a> ...</script>", ((RawMarkup)markup .get(1)).toString()); } /** * * @throws IOException * @throws ResourceStreamNotFoundException */ public final void testBalancing() throws IOException, ResourceStreamNotFoundException { final MarkupParser parser = new MarkupParser( "<span wicket:id=\"span\"><img wicket:id=\"img\"><span wicket:id=\"span2\"></span></span>"); // Note: <img> is one of these none-balanced HTML tags Markup markup = parser.parse(); ComponentTag t = (ComponentTag)markup.get(0); assertEquals(t.getId(), "span"); assertEquals(t.getPath(), null); t = (ComponentTag)markup.get(1); assertEquals(t.getId(), "img"); assertEquals(t.getPath(), "span"); t = (ComponentTag)markup.get(2); assertEquals(t.getId(), "span2"); assertEquals(t.getPath(), "span"); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -