blob: e4d4b1c5513a4601cf3b5d4bb657a3875dabc0c0 [file] [log] [blame]
package org.apache.maven.doxia.parser;
/*
* 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.
*/
import java.util.Iterator;
import org.apache.maven.doxia.logging.Log;
import org.apache.maven.doxia.sink.impl.SinkEventAttributeSet;
import org.apache.maven.doxia.sink.impl.SinkEventElement;
import org.apache.maven.doxia.sink.impl.SinkEventTestingSink;
/**
* Test for XhtmlBaseParser.
*
* @author ltheussl
* @version $Id$
* @since 1.1
*/
public class XhtmlBaseParserTest
extends AbstractParserTest
{
private XhtmlBaseParser parser;
private final SinkEventTestingSink sink = new SinkEventTestingSink();
@Override
protected Parser createParser()
{
parser = new XhtmlBaseParser();
parser.getLog().setLogLevel( Log.LEVEL_ERROR );
return parser;
}
@Override
protected String outputExtension()
{
return "xhtml";
}
@Override
protected void setUp() throws Exception
{
super.setUp();
parser = new XhtmlBaseParser();
parser.getLog().setLogLevel( Log.LEVEL_ERROR );
sink.reset();
}
/** Test Doxia version. */
public void testDoxiaVersion()
{
assertNotNull( XhtmlBaseParser.doxiaVersion() );
assertFalse( "unknown".equals( XhtmlBaseParser.doxiaVersion() ) );
}
/** @throws Exception */
public void testHeadingEventsList()
throws Exception
{
String text = "<p><h2></h2><h3></h3><h4></h4><h5></h5><h6></h6><h2></h2></p>";
parser.parse( text, sink );
Iterator<SinkEventElement> it = sink.getEventList().iterator();
assertEquals( "paragraph", it.next().getName() );
assertEquals( "section1", it.next().getName() );
assertEquals( "sectionTitle1", it.next().getName() );
assertEquals( "sectionTitle1_", it.next().getName() );
assertEquals( "section2", it.next().getName() );
assertEquals( "sectionTitle2", it.next().getName() );
assertEquals( "sectionTitle2_", it.next().getName() );
assertEquals( "section3", it.next().getName() );
assertEquals( "sectionTitle3", it.next().getName() );
assertEquals( "sectionTitle3_", it.next().getName() );
assertEquals( "section4", it.next().getName() );
assertEquals( "sectionTitle4", it.next().getName() );
assertEquals( "sectionTitle4_", it.next().getName() );
assertEquals( "section5", it.next().getName() );
assertEquals( "sectionTitle5", it.next().getName() );
assertEquals( "sectionTitle5_", it.next().getName() );
assertEquals( "section5_", it.next().getName() );
assertEquals( "section4_", it.next().getName() );
assertEquals( "section3_", it.next().getName() );
assertEquals( "section2_", it.next().getName() );
assertEquals( "section1_", it.next().getName() );
assertEquals( "section1", it.next().getName() );
assertEquals( "sectionTitle1", it.next().getName() );
assertEquals( "sectionTitle1_", it.next().getName() );
// this one is missing because we enclose everything in <p> which is not valid xhtml,
// needs to be tested in overriding parser, eg XhtmlParser, XdocParser.
//assertEquals( "section1_", it.next().getName() );
assertEquals( "paragraph_", it.next().getName() );
assertFalse( it.hasNext() );
}
/** @throws Exception */
public void testNestedHeadingEventsList()
throws Exception
{
// DOXIA-241
String text = "<p><h2></h2><h6></h6><h3></h3></p>";
parser.parse( text, sink );
Iterator<SinkEventElement> it = sink.getEventList().iterator();
assertEquals( "paragraph", it.next().getName() );
assertEquals( "section1", it.next().getName() );
assertEquals( "sectionTitle1", it.next().getName() );
assertEquals( "sectionTitle1_", it.next().getName() );
assertEquals( "section2", it.next().getName() );
assertEquals( "section3", it.next().getName() );
assertEquals( "section4", it.next().getName() );
assertEquals( "section5", it.next().getName() );
assertEquals( "sectionTitle5", it.next().getName() );
assertEquals( "sectionTitle5_", it.next().getName() );
assertEquals( "section5_", it.next().getName() );
assertEquals( "section4_", it.next().getName() );
assertEquals( "section3_", it.next().getName() );
assertEquals( "section2_", it.next().getName() );
assertEquals( "section2", it.next().getName() );
assertEquals( "sectionTitle2", it.next().getName() );
assertEquals( "sectionTitle2_", it.next().getName() );
// these two are missing because we enclose everything in <p> which is not valid xhtml,
// needs to be tested in overriding parser, eg XhtmlParser, XdocParser.
//assertEquals( "section2_", it.next().getName() );
//assertEquals( "section1_", it.next().getName() );
assertEquals( "paragraph_", it.next().getName() );
assertFalse( it.hasNext() );
}
/** @throws Exception */
public void testFigureEventsList()
throws Exception
{
String text = "<img src=\"source\" title=\"caption\" />";
parser.parse( text, sink );
Iterator<SinkEventElement> it = sink.getEventList().iterator();
assertEquals( "figureGraphics", it.next().getName() );
assertFalse( it.hasNext() );
}
/** @throws Exception */
public void testTableEventsList()
throws Exception
{
// TODO: table caption, see DOXIA-177
String text = "<table align=\"center\"><tr><th>Header</th></tr><tr><td>cell</td></tr></table>";
parser.parse( text, sink );
Iterator<SinkEventElement> it = sink.getEventList().iterator();
assertEquals( "table", it.next().getName() );
assertEquals( "tableRows", it.next().getName() );
assertEquals( "tableRow", it.next().getName() );
assertEquals( "tableHeaderCell", it.next().getName() );
assertEquals( "text", it.next().getName() );
assertEquals( "tableHeaderCell_", it.next().getName() );
assertEquals( "tableRow_", it.next().getName() );
assertEquals( "tableRow", it.next().getName() );
assertEquals( "tableCell", it.next().getName() );
assertEquals( "text", it.next().getName() );
assertEquals( "tableCell_", it.next().getName() );
assertEquals( "tableRow_", it.next().getName() );
assertEquals( "tableRows_", it.next().getName() );
assertEquals( "table_", it.next().getName() );
assertFalse( it.hasNext() );
}
/** @throws Exception */
public void testSignificantWhiteSpace()
throws Exception
{
// NOTE significant white space
String text = "<p><b>word</b> <i>word</i></p>";
parser.parse( text, sink );
Iterator<SinkEventElement> it = sink.getEventList().iterator();
assertEquals( "paragraph", it.next().getName() );
assertEquals( "inline", it.next().getName() );
assertEquals( "text", it.next().getName() );
assertEquals( "inline_", it.next().getName() );
SinkEventElement el = it.next();
assertEquals( "text", el.getName() );
assertEquals( " ", (String) el.getArgs()[0] );
assertEquals( "inline", it.next().getName() );
assertEquals( "text", it.next().getName() );
assertEquals( "inline_", it.next().getName() );
assertEquals( "paragraph_", it.next().getName() );
assertFalse( it.hasNext() );
// same test with EOL
String eol = System.getProperty( "line.separator" );
text = "<p><b>word</b>" + eol + "<i>word</i></p>";
sink.reset();
parser.parse( text, sink );
it = sink.getEventList().iterator();
assertEquals( "paragraph", it.next().getName() );
assertEquals( "inline", it.next().getName() );
assertEquals( "text", it.next().getName() );
assertEquals( "inline_", it.next().getName() );
el = it.next();
assertEquals( "text", el.getName() );
// according to section 2.11 of the XML spec, parsers must normalize line breaks to "\n"
assertEquals( "\n", (String) el.getArgs()[0] );
assertEquals( "inline", it.next().getName() );
assertEquals( "text", it.next().getName() );
assertEquals( "inline_", it.next().getName() );
assertEquals( "paragraph_", it.next().getName() );
assertFalse( it.hasNext() );
// DOXIA-189: there should be no EOL after closing tag
text = "<p>There should be no space after the last <i>word</i>.</p>";
sink.reset();
parser.parse( text, sink );
it = sink.getEventList().iterator();
assertEquals( "paragraph", it.next().getName() );
assertEquals( "text", it.next().getName() );
assertEquals( "inline", it.next().getName() );
assertEquals( "text", it.next().getName() );
assertEquals( "inline_", it.next().getName() );
el = it.next();
assertEquals( "text", el.getName() );
assertEquals( ".", (String) el.getArgs()[0] );
assertEquals( "paragraph_", it.next().getName() );
assertFalse( it.hasNext() );
}
/** @throws Exception */
public void testPreFormattedText()
throws Exception
{
String text = "<pre><a href=\"what.html\">what</a></pre>";
parser.parse( text, sink );
Iterator<SinkEventElement> it = sink.getEventList().iterator();
assertEquals( "verbatim", it.next().getName() );
assertEquals( "link", it.next().getName() );
assertEquals( "text", it.next().getName() );
assertEquals( "link_", it.next().getName() );
assertEquals( "verbatim_", it.next().getName() );
assertFalse( it.hasNext() );
text = "<pre><![CDATA[<a href=\"what.html\">what</a>]]></pre>";
sink.reset();
parser.parse( text, sink );
it = sink.getEventList().iterator();
assertEquals( "verbatim", it.next().getName() );
assertEquals( "text", it.next().getName() );
assertEquals( "verbatim_", it.next().getName() );
assertFalse( it.hasNext() );
text = "<pre><![CDATA[<pre>what</pre>]]></pre>";
sink.reset();
parser.parse( text, sink );
it = sink.getEventList().iterator();
assertEquals( "verbatim", it.next().getName() );
assertEquals( "text", it.next().getName() );
assertEquals( "verbatim_", it.next().getName() );
assertFalse( it.hasNext() );
}
/** @throws Exception */
public void testPreEOL()
throws Exception
{
// test EOLs within <pre>: the sink MUST receive a text event for the EOL
String text = "<pre><a href=\"what.html\">what</a>" + XhtmlBaseParser.EOL
+ "<a href=\"what.html\">what</a></pre>";
parser.parse( text, sink );
Iterator<SinkEventElement> it = sink.getEventList().iterator();
assertEquals( "verbatim", it.next().getName() );
assertEquals( "link", it.next().getName() );
assertEquals( "text", it.next().getName() );
assertEquals( "link_", it.next().getName() );
assertEquals( "text", it.next().getName() );
assertEquals( "link", it.next().getName() );
assertEquals( "text", it.next().getName() );
assertEquals( "link_", it.next().getName() );
assertEquals( "verbatim_", it.next().getName() );
}
/** @throws Exception */
public void testDoxia250()
throws Exception
{
StringBuilder sb = new StringBuilder();
sb.append( "<!DOCTYPE test [" ).append( XhtmlBaseParser.EOL );
sb.append( "<!ENTITY foo \"&#x159;\">" ).append( XhtmlBaseParser.EOL );
sb.append( "<!ENTITY foo1 \"&nbsp;\">" ).append( XhtmlBaseParser.EOL );
sb.append( "<!ENTITY foo2 \"&#x161;\">" ).append( XhtmlBaseParser.EOL );
sb.append( "<!ENTITY tritPos \"&#x1d7ed;\">" ).append( XhtmlBaseParser.EOL );
sb.append( "]>" ).append( XhtmlBaseParser.EOL );
sb.append( "<b>&foo;&foo1;&foo2;&tritPos;</b>" );
parser.setValidate( false );
parser.parse( sb.toString(), sink );
Iterator<SinkEventElement> it = sink.getEventList().iterator();
SinkEventElement event = it.next();
assertEquals( "inline", event.getName() );
event = it.next();
assertEquals( "text", event.getName() );
assertEquals( "\u0159", (String) event.getArgs()[0] );
event = it.next();
assertEquals( "text", event.getName() );
assertEquals( "\u00A0", (String) event.getArgs()[0] );
event = it.next();
assertEquals( "text", event.getName() );
assertEquals( "\u0161", (String) event.getArgs()[0] );
event = it.next();
assertEquals( "text", event.getName() );
assertEquals( "\uD835\uDFED", (String) event.getArgs()[0] );
event = it.next();
assertEquals( "inline_", event.getName() );
}
/** @throws Exception */
public void testEntities()
throws Exception
{
final String text = "<!DOCTYPE test [<!ENTITY flo \"&#x159;\"><!ENTITY tritPos \"&#x1d7ed;\"><!ENTITY fo \"&#65;\"><!ENTITY myCustom \"&fo;\">]>"
+ "<body><h2>&amp;&flo;&#x159;&tritPos;&#x1d7ed;</h2><p>&amp;&flo;&#x159;&tritPos;&#x1d7ed;&myCustom;</p></body>";
parser.setValidate( false );
parser.parse( text, sink );
Iterator<SinkEventElement> it = sink.getEventList().iterator();
assertEquals( "section1", it.next().getName() );
assertEquals( "sectionTitle1", it.next().getName() );
SinkEventElement textEvt = it.next();
assertEquals( "text", textEvt.getName() );
assertEquals( "&", textEvt.getArgs()[0] );
textEvt = it.next();
assertEquals( "text", textEvt.getName() );
assertEquals( "\u0159", textEvt.getArgs()[0] );
textEvt = it.next();
assertEquals( "text", textEvt.getName() );
assertEquals( "\u0159", textEvt.getArgs()[0] );
textEvt = it.next();
assertEquals( "text", textEvt.getName() );
assertEquals( "\uD835\uDFED", (String) textEvt.getArgs()[0] );
textEvt = it.next();
assertEquals( "text", textEvt.getName() );
assertEquals( "\uD835\uDFED", textEvt.getArgs()[0] );
assertEquals( "sectionTitle1_", it.next().getName() );
assertEquals( "paragraph", it.next().getName() );
textEvt = it.next();
assertEquals( "text", textEvt.getName() );
assertEquals( "&", textEvt.getArgs()[0] );
textEvt = it.next();
assertEquals( "text", textEvt.getName() );
assertEquals( "\u0159", textEvt.getArgs()[0] );
textEvt = it.next();
assertEquals( "text", textEvt.getName() );
assertEquals( "\u0159", textEvt.getArgs()[0] );
textEvt = it.next();
assertEquals( "text", textEvt.getName() );
assertEquals( "\uD835\uDFED", (String) textEvt.getArgs()[0] );
textEvt = it.next();
assertEquals( "text", textEvt.getName() );
assertEquals( "\uD835\uDFED", textEvt.getArgs()[0] );
textEvt = it.next();
assertEquals( "text", textEvt.getName() );
assertEquals( "A", textEvt.getArgs()[0] );
assertEquals( "paragraph_", it.next().getName() );
assertFalse( it.hasNext() );
}
/** @throws Exception */
public void testXhtmlEntities()
throws Exception
{
final String text = "<body><h2>&laquo;&reg;</h2><p>&ldquo;&rsquo;&Phi;&larr;</p></body>";
parser.parse( text, sink );
Iterator<SinkEventElement> it = sink.getEventList().iterator();
assertEquals( "section1", it.next().getName() );
assertEquals( "sectionTitle1", it.next().getName() );
// Couple symbols from Latin-1:
// http://www.w3.org/TR/xhtml1/dtds.html#a_dtd_Latin-1_characters
SinkEventElement textEvt = it.next();
assertEquals( "text", textEvt.getName() );
assertEquals( "\u00AB", textEvt.getArgs()[0] );
textEvt = it.next();
assertEquals( "text", textEvt.getName() );
assertEquals( "\u00AE", textEvt.getArgs()[0] );
assertEquals( "sectionTitle1_", it.next().getName() );
assertEquals( "paragraph", it.next().getName() );
// Couple symbols from Special characters:
// http://www.w3.org/TR/xhtml1/dtds.html#a_dtd_Special_characters
textEvt = it.next();
assertEquals( "text", textEvt.getName() );
assertEquals( "\u201C", textEvt.getArgs()[0] );
textEvt = it.next();
assertEquals( "text", textEvt.getName() );
assertEquals( "\u2019", textEvt.getArgs()[0] );
// Couple symbols from Symbols:
// http://www.w3.org/TR/xhtml1/dtds.html#a_dtd_Symbols
textEvt = it.next();
assertEquals( "text", textEvt.getName() );
assertEquals( "\u03A6", textEvt.getArgs()[0] );
textEvt = it.next();
assertEquals( "text", textEvt.getName() );
assertEquals( "\u2190", textEvt.getArgs()[0] );
assertEquals( "paragraph_", it.next().getName() );
assertFalse( it.hasNext() );
}
/** @throws Exception */
public void testLists()
throws Exception
{
String text = "<div><ul><li></li></ul><ol><li></li></ol><dl><dt></dt><dd></dd></dl></div>";
parser.parse( text, sink );
Iterator<SinkEventElement> it = sink.getEventList().iterator();
assertEquals( "list", it.next().getName() );
assertEquals( "listItem", it.next().getName() );
assertEquals( "listItem_", it.next().getName() );
assertEquals( "list_", it.next().getName() );
assertEquals( "numberedList", it.next().getName() );
assertEquals( "numberedListItem", it.next().getName() );
assertEquals( "numberedListItem_", it.next().getName() );
assertEquals( "numberedList_", it.next().getName() );
assertEquals( "definitionList", it.next().getName() );
assertEquals( "definitionListItem", it.next().getName() );
assertEquals( "definedTerm", it.next().getName() );
assertEquals( "definedTerm_", it.next().getName() );
assertEquals( "definition", it.next().getName() );
assertEquals( "definition_", it.next().getName() );
assertEquals( "definitionListItem_", it.next().getName() );
assertEquals( "definitionList_", it.next().getName() );
}
/** @throws Exception */
public void testSimpleTags()
throws Exception
{
String text = "<div><br/><hr/><img src=\"img.src\"/></div>";
parser.parse( text, sink );
Iterator<SinkEventElement> it = sink.getEventList().iterator();
assertEquals( "lineBreak", it.next().getName() );
assertEquals( "horizontalRule", it.next().getName() );
assertEquals( "figureGraphics", it.next().getName() );
}
/** @throws Exception */
public void testSemanticTags()
throws Exception
{
String text = "<s><i><b><code><samp><sup><sub><u>a text &amp; &#xc6;</u></sub></sup></samp></code></b></i></s>";
parser.parse( text, sink );
Iterator<SinkEventElement> it = sink.getEventList().iterator();
SinkEventElement event = it.next();
assertEquals( "inline", event.getName() );
assertEquals( "semantics=line-through", event.getArgs()[0].toString().trim() );
event = it.next();
assertEquals( "inline", event.getName() );
assertEquals( "semantics=italic", event.getArgs()[0].toString().trim() );
event = it.next();
assertEquals( "inline", event.getName() );
assertEquals( "semantics=bold", event.getArgs()[0].toString().trim() );
event = it.next();
assertEquals( "inline", event.getName() );
assertEquals( "semantics=code", event.getArgs()[0].toString().trim() );
event = it.next();
assertEquals( "inline", event.getName() );
assertEquals( "semantics=code", event.getArgs()[0].toString().trim() );
event = it.next();
assertEquals( "inline", event.getName() );
assertEquals( "semantics=superscript", event.getArgs()[0].toString().trim() );
event = it.next();
assertEquals( "inline", event.getName() );
assertEquals( "semantics=subscript", event.getArgs()[0].toString().trim() );
event = it.next();
assertEquals( "inline", event.getName() );
assertEquals( "semantics=annotation", event.getArgs()[0].toString().trim() );
assertEquals( "text", it.next().getName() );
assertEquals( "text", it.next().getName() );
assertEquals( "text", it.next().getName() );
assertEquals( "text", it.next().getName() );
assertEquals( "inline_", it.next().getName() );
assertEquals( "inline_", it.next().getName() );
assertEquals( "inline_", it.next().getName() );
assertEquals( "inline_", it.next().getName() );
assertEquals( "inline_", it.next().getName() );
assertEquals( "inline_", it.next().getName() );
assertEquals( "inline_", it.next().getName() );
assertEquals( "inline_", it.next().getName() );
}
/** @throws Exception */
public void testSpecial()
throws Exception
{
String text = "<p><!-- a pagebreak: --><!-- PB -->&nbsp;&#160;<unknown /></p>";
parser.parse( text, sink );
Iterator<SinkEventElement> it = sink.getEventList().iterator();
assertEquals( "paragraph", it.next().getName() );
assertEquals( "comment", it.next().getName() );
assertEquals( "pageBreak", it.next().getName() );
assertEquals( "nonBreakingSpace", it.next().getName() );
assertEquals( "nonBreakingSpace", it.next().getName() );
// unknown events are not reported by the base parser
assertEquals( "paragraph_", it.next().getName() );
}
/** @throws Exception */
public void testTable()
throws Exception
{
String text = "<table><caption></caption><tr><th></th></tr><tr><td></td></tr></table>";
parser.parse( text, sink );
Iterator<SinkEventElement> it = sink.getEventList().iterator();
assertEquals( "table", it.next().getName() );
// DOXIA-374
SinkEventElement el = it.next();
assertEquals( "tableRows", el.getName() );
assertFalse( (Boolean) el.getArgs()[1] );
assertEquals( "tableCaption", it.next().getName() );
assertEquals( "tableCaption_", it.next().getName() );
assertEquals( "tableRow", it.next().getName() );
assertEquals( "tableHeaderCell", it.next().getName() );
assertEquals( "tableHeaderCell_", it.next().getName() );
assertEquals( "tableRow_", it.next().getName() );
assertEquals( "tableRow", it.next().getName() );
assertEquals( "tableCell", it.next().getName() );
assertEquals( "tableCell_", it.next().getName() );
assertEquals( "tableRow_", it.next().getName() );
assertEquals( "tableRows_", it.next().getName() );
assertEquals( "table_", it.next().getName() );
}
/** @throws Exception */
public void testFigure()
throws Exception
{
String text = "<div class=\"figure\"><p><img src=\"src.jpg\"/></p><p><i></i></p></div>";
parser.parse( text, sink );
Iterator<SinkEventElement> it = sink.getEventList().iterator();
assertEquals( "figure", it.next().getName() );
assertEquals( "figureGraphics", it.next().getName() );
assertEquals( "figureCaption", it.next().getName() );
assertEquals( "figureCaption_", it.next().getName() );
assertEquals( "figure_", it.next().getName() );
}
/** @throws Exception */
public void testAnchorLink()
throws Exception
{
String text = "<div><a href=\"\"></a>" +
"<a href=\"valid\"></a>" +
"<a href=\"#1invalid\"></a>" +
"<a href=\"http://www.fo.com/index.html#1invalid\"></a>" +
"<a name=\"valid\"></a>" +
"<a name=\"1invalid\"></a>" +
"<a id=\"1invalid\"></a></div>";
parser.parse( text, sink );
Iterator<SinkEventElement> it = sink.getEventList().iterator();
SinkEventElement element = it.next();
assertEquals( "link", element.getName() );
assertEquals( "", element.getArgs()[0] );
assertEquals( "link_", it.next().getName() );
element = it.next();
assertEquals( "link", element.getName() );
assertEquals( "valid", element.getArgs()[0] );
assertEquals( "link_", it.next().getName() );
element = it.next();
assertEquals( "link", element.getName() );
assertEquals( "#a1invalid", element.getArgs()[0] );
assertEquals( "link_", it.next().getName() );
element = it.next();
assertEquals( "link", element.getName() );
assertEquals( "http://www.fo.com/index.html#1invalid", element.getArgs()[0] );
assertEquals( "link_", it.next().getName() );
element = it.next();
assertEquals( "anchor", element.getName() );
assertEquals( "valid", element.getArgs()[0] );
assertEquals( "anchor_", it.next().getName() );
element = it.next();
assertEquals( "anchor", element.getName() );
assertEquals( "a1invalid", element.getArgs()[0] );
assertEquals( "anchor_", it.next().getName() );
element = it.next();
assertEquals( "anchor", element.getName() );
assertEquals( "a1invalid", element.getArgs()[0] );
assertEquals( "anchor_", it.next().getName() );
}
/**
* Test entities in attributes.
*
* @throws java.lang.Exception if any.
*/
public void testAttributeEntities()
throws Exception
{
String text = "<script type=\"text/javascript\" src=\"http://ex.com/ex.js?v=l&amp;l=e\"></script>";
parser.parse( text, sink );
Iterator<SinkEventElement> it = sink.getEventList().iterator();
SinkEventElement event = it.next();
assertEquals( "unknown", event.getName() );
assertEquals( "script", event.getArgs()[0] );
SinkEventAttributeSet attribs = (SinkEventAttributeSet) event.getArgs()[2];
// ampersand should be un-escaped
assertEquals( "http://ex.com/ex.js?v=l&l=e", attribs.getAttribute( "src" ) );
assertEquals( "unknown", it.next().getName() );
assertFalse( it.hasNext() );
sink.reset();
text = "<img src=\"http://ex.com/ex.jpg?v=l&amp;l=e\" alt=\"image\"/>";
parser.parse( text, sink );
it = sink.getEventList().iterator();
event = it.next();
assertEquals( "figureGraphics", event.getName() );
attribs = (SinkEventAttributeSet) event.getArgs()[1];
// ampersand should be un-escaped
assertEquals( "http://ex.com/ex.jpg?v=l&l=e", attribs.getAttribute( "src" ) );
}
public void testUnbalancedDefinitionListItem() throws Exception
{
String text = "<body><dl><dt>key</dt><dd>value</dd></dl>" +
"<dl><dd>value</dd></dl>" +
"<dl><dt>key</dt></dl>" +
"<dl></dl>" +
"<dl><dd>value</dd><dt>key</dt></dl></body>";
parser.parse( text, sink );
Iterator<SinkEventElement> it = sink.getEventList().iterator();
assertStartsWith( it, "definitionList", "definitionListItem", "definedTerm", "text", "definedTerm_",
"definition", "text", "definition_", "definitionListItem_", "definitionList_" );
assertStartsWith( it, "definitionList", "definitionListItem", "definition", "text", "definition_",
"definitionListItem_", "definitionList_" );
assertStartsWith( it, "definitionList", "definitionListItem", "definedTerm", "text", "definedTerm_",
"definitionListItem_", "definitionList_" );
assertStartsWith( it, "definitionList", "definitionList_" );
assertEquals( it, "definitionList", "definitionListItem", "definition", "text", "definition_",
"definitionListItem_", "definitionListItem", "definedTerm", "text", "definedTerm_",
"definitionListItem_", "definitionList_" );
}
}