001package org.apache.maven.doxia.module.docbook; 002 003/* 004 * Licensed to the Apache Software Foundation (ASF) under one 005 * or more contributor license agreements. See the NOTICE file 006 * distributed with this work for additional information 007 * regarding copyright ownership. The ASF licenses this file 008 * to you under the Apache License, Version 2.0 (the 009 * "License"); you may not use this file except in compliance 010 * with the License. You may obtain a copy of the License at 011 * 012 * http://www.apache.org/licenses/LICENSE-2.0 013 * 014 * Unless required by applicable law or agreed to in writing, 015 * software distributed under the License is distributed on an 016 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 017 * KIND, either express or implied. See the License for the 018 * specific language governing permissions and limitations 019 * under the License. 020 */ 021 022import java.io.IOException; 023import java.io.Reader; 024import java.io.Writer; 025 026import java.util.Iterator; 027 028import org.apache.maven.doxia.parser.AbstractParserTest; 029import org.apache.maven.doxia.parser.Parser; 030import org.apache.maven.doxia.parser.ParseException; 031import org.apache.maven.doxia.sink.Sink; 032import org.apache.maven.doxia.sink.impl.SinkEventElement; 033import org.apache.maven.doxia.sink.impl.SinkEventTestingSink; 034import org.codehaus.plexus.util.IOUtil; 035 036/** 037 * @author <a href="mailto:lars@trieloff.net">Lars Trieloff</a> 038 * @version $Id$ 039 */ 040public class DocBookParserTest extends AbstractParserTest 041{ 042 /** The parser to test. */ 043 private DocBookParser parser; 044 045 @Override 046 protected void setUp() 047 throws Exception 048 { 049 super.setUp(); 050 051 parser = (DocBookParser) lookup( Parser.ROLE, "docbook" ); 052 } 053 054 /** {@inheritDoc} */ 055 protected Parser createParser() 056 { 057 return parser; 058 } 059 060 /** {@inheritDoc} */ 061 protected String outputExtension() 062 { 063 return "xml"; 064 } 065 066 /** 067 * Parses the test document test.xml and re-emits it into test.docbook. 068 * 069 * @throws IOException if something goes wrong 070 * @throws ParseException if something goes wrong 071 */ 072 public void testTestDocument() 073 throws IOException, ParseException 074 { 075 Writer writer = null; 076 Reader reader = null; 077 078 try 079 { 080 writer = getTestWriter( "test", "docbook" ); 081 reader = getTestReader( "test" ); 082 083 Sink sink = new DocBookSink( writer ); 084 085 createParser().parse( reader, sink ); 086 087 writer = getTestWriter( "sdocbook_full", "docbook" ); 088 reader = getTestReader( "sdocbook_full" ); 089 090 sink = new DocBookSink( writer ); 091 092 createParser().parse( reader, sink ); 093 } 094 finally 095 { 096 IOUtil.close( reader ); 097 IOUtil.close( writer ); 098 } 099 } 100 101 /** @throws Exception */ 102 public void testSignificantWhiteSpace() 103 throws Exception 104 { 105 // NOTE significant white space 106 String text = "<para><command>word</command> <emphasis>word</emphasis></para>"; 107 108 SinkEventTestingSink sink = new SinkEventTestingSink(); 109 110 parser.parse( text, sink ); 111 112 Iterator<SinkEventElement> it = sink.getEventList().iterator(); 113 114 assertEquals( "paragraph", ( it.next() ).getName() ); 115 assertEquals( "bold", ( it.next() ).getName() ); 116 assertEquals( "text", ( it.next() ).getName() ); 117 assertEquals( "bold_", ( it.next() ).getName() ); 118 119 SinkEventElement el = it.next(); 120 assertEquals( "text", el.getName() ); 121 assertEquals( " ", (String) el.getArgs()[0] ); 122 123 assertEquals( "italic", ( it.next() ).getName() ); 124 assertEquals( "text", ( it.next() ).getName() ); 125 assertEquals( "italic_", ( it.next() ).getName() ); 126 assertEquals( "paragraph_", ( it.next() ).getName() ); 127 assertFalse( it.hasNext() ); 128 129 130 // same test with EOL 131 text = "<para><command>word</command>" + EOL + "<emphasis>word</emphasis></para>"; 132 133 sink.reset(); 134 parser.parse( text, sink ); 135 it = sink.getEventList().iterator(); 136 137 assertEquals( "paragraph", ( it.next() ).getName() ); 138 assertEquals( "bold", ( it.next() ).getName() ); 139 assertEquals( "text", ( it.next() ).getName() ); 140 assertEquals( "bold_", ( it.next() ).getName() ); 141 142 el = it.next(); 143 assertEquals( "text", el.getName() ); 144 assertEquals( EOL, (String) el.getArgs()[0] ); 145 146 assertEquals( "italic", ( it.next() ).getName() ); 147 assertEquals( "text", ( it.next() ).getName() ); 148 assertEquals( "italic_", ( it.next() ).getName() ); 149 assertEquals( "paragraph_", ( it.next() ).getName() ); 150 assertFalse( it.hasNext() ); 151 } 152 153 /** @throws Exception */ 154 public void testIds() 155 throws Exception 156 { 157 final String text = "<article id=\"article\"><section id=\"section\">" 158 + "<title id=\"title\">Title</title><para id=\"para\">Paragraph</para></section></article>"; 159 160 final SinkEventTestingSink sink = new SinkEventTestingSink(); 161 parser.parse( text, sink ); 162 Iterator<SinkEventElement> it = sink.getEventList().iterator(); 163 164 SinkEventElement event = it.next(); 165 assertEquals( "head", event.getName() ); 166 assertEquals( " id=article", event.getArgs()[0].toString() ); 167 assertEquals( "head_", ( it.next() ).getName() ); 168 assertEquals( "body", ( it.next() ).getName() ); 169 170 event = it.next(); 171 assertEquals( "section1", event.getName() ); 172 assertEquals( " id=section", event.getArgs()[0].toString() ); 173 174 event = it.next(); 175 assertEquals( "sectionTitle1", event.getName() ); 176 assertEquals( " id=title", event.getArgs()[0].toString() ); 177 assertEquals( "text", ( it.next() ).getName() ); 178 assertEquals( "sectionTitle1_", ( it.next() ).getName() ); 179 180 event = it.next(); 181 assertEquals( "paragraph", event.getName() ); 182 assertEquals( " id=para", event.getArgs()[0].toString() ); 183 assertEquals( "text", ( it.next() ).getName() ); 184 assertEquals( "paragraph_", ( it.next() ).getName() ); 185 assertEquals( "section1_", ( it.next() ).getName() ); 186 assertEquals( "body_", ( it.next() ).getName() ); 187 188 assertFalse( it.hasNext() ); 189 } 190 191 /** @throws Exception */ 192 public void testFigure() 193 throws Exception 194 { 195 String text = "<mediaobject><imageobject>" 196 + "<imagedata fileref=\"fileref\" format=\"PNG\" /></imageobject>" 197 + "<caption><para>Figure caption</para></caption></mediaobject>"; 198 199 final SinkEventTestingSink sink = new SinkEventTestingSink(); 200 parser.parse( text, sink ); 201 Iterator<SinkEventElement> it = sink.getEventList().iterator(); 202 203 assertEquals( "figure", ( it.next() ).getName() ); 204 assertEquals( "figureGraphics", ( it.next() ).getName() ); 205 assertEquals( "figureCaption", ( it.next() ).getName() ); 206 assertEquals( "text", ( it.next() ).getName() ); 207 assertEquals( "figureCaption_", ( it.next() ).getName() ); 208 assertEquals( "figure_", ( it.next() ).getName() ); 209 assertFalse( it.hasNext() ); 210 211 sink.reset(); 212 text = "<figure><title>Title</title><mediaobject><imageobject>" 213 + "<imagedata fileref=\"fileref\" format=\"PNG\"/></imageobject>" 214 + "<textobject><phrase>text</phrase></textobject></mediaobject></figure>"; 215 parser.parse( text, sink ); 216 it = sink.getEventList().iterator(); 217 218 assertEquals( "bold", ( it.next() ).getName() ); 219 assertEquals( "text", ( it.next() ).getName() ); 220 assertEquals( "bold_", ( it.next() ).getName() ); 221 assertEquals( "figure", ( it.next() ).getName() ); 222 assertEquals( "figureGraphics", ( it.next() ).getName() ); 223 assertEquals( "text", ( it.next() ).getName() ); 224 assertEquals( "figure_", ( it.next() ).getName() ); 225 assertFalse( it.hasNext() ); 226 } 227 228 /** @throws Exception */ 229 public void testLinks() 230 throws Exception 231 { 232 final String text = "<para><anchor id=\"Anchor\" />Anchor<!-- anchor_end -->." 233 + "Link to <link linkend=\"Anchor\">Anchor</link>." 234 + "Link to <ulink url=\"url.com\">url.com</ulink>.</para>"; 235 236 final SinkEventTestingSink sink = new SinkEventTestingSink(); 237 parser.parse( text, sink ); 238 final Iterator<SinkEventElement> it = sink.getEventList().iterator(); 239 240 assertEquals( "paragraph", ( it.next() ).getName() ); 241 assertEquals( "anchor", ( it.next() ).getName() ); 242 assertEquals( "text", ( it.next() ).getName() ); 243 assertEquals( "anchor_", ( it.next() ).getName() ); 244 assertEquals( "text", ( it.next() ).getName() ); 245 246 SinkEventElement event = it.next(); 247 assertEquals( "link", event.getName() ); 248 assertEquals( "#Anchor", event.getArgs()[0].toString() ); 249 250 assertEquals( "text", ( it.next() ).getName() ); 251 assertEquals( "link_", ( it.next() ).getName() ); 252 assertEquals( "text", ( it.next() ).getName() ); 253 254 event = it.next(); 255 assertEquals( "link", event.getName() ); 256 assertEquals( "url.com", event.getArgs()[0].toString() ); 257 assertEquals( "text", ( it.next() ).getName() ); 258 assertEquals( "link_", ( it.next() ).getName() ); 259 assertEquals( "text", ( it.next() ).getName() ); 260 assertEquals( "paragraph_", ( it.next() ).getName() ); 261 assertFalse( it.hasNext() ); 262 } 263 264 /** @throws Exception */ 265 public void testStyles() 266 throws Exception 267 { 268 final String text = "<para><emphasis>Italic</emphasis><emphasis role=\"bold\">Bold</emphasis>" 269 + "<literal>Monospaced</literal></para>"; 270 271 final SinkEventTestingSink sink = new SinkEventTestingSink(); 272 parser.parse( text, sink ); 273 final Iterator<SinkEventElement> it = sink.getEventList().iterator(); 274 275 assertEquals( "paragraph", ( it.next() ).getName() ); 276 assertEquals( "italic", ( it.next() ).getName() ); 277 assertEquals( "text", ( it.next() ).getName() ); 278 assertEquals( "italic_", ( it.next() ).getName() ); 279 assertEquals( "bold", ( it.next() ).getName() ); 280 assertEquals( "text", ( it.next() ).getName() ); 281 assertEquals( "bold_", ( it.next() ).getName() ); 282 assertEquals( "monospaced", ( it.next() ).getName() ); 283 assertEquals( "text", ( it.next() ).getName() ); 284 assertEquals( "monospaced_", ( it.next() ).getName() ); 285 assertEquals( "paragraph_", ( it.next() ).getName() ); 286 assertFalse( it.hasNext() ); 287 } 288 289 /** @throws Exception */ 290 public void testLists() 291 throws Exception 292 { 293 String text = "<itemizedlist><listitem><para>item</para></listitem></itemizedlist>"; 294 295 final SinkEventTestingSink sink = new SinkEventTestingSink(); 296 parser.parse( text, sink ); 297 Iterator<SinkEventElement> it = sink.getEventList().iterator(); 298 299 assertEquals( "list", ( it.next() ).getName() ); 300 assertEquals( "listItem", ( it.next() ).getName() ); 301 assertEquals( "text", ( it.next() ).getName() ); 302 assertEquals( "listItem_", ( it.next() ).getName() ); 303 assertEquals( "list_", ( it.next() ).getName() ); 304 assertFalse( it.hasNext() ); 305 306 text = "<orderedlist numeration=\"upperalpha\"><listitem><para>item</para></listitem></orderedlist>"; 307 sink.reset(); 308 parser.parse( text, sink ); 309 it = sink.getEventList().iterator(); 310 311 SinkEventElement event = it.next(); 312 assertEquals( "numberedList", event.getName() ); 313 assertEquals( Sink.NUMBERING_UPPER_ALPHA, ( (Integer) event.getArgs()[0] ).intValue() ); 314 assertEquals( "numberedListItem", ( it.next() ).getName() ); 315 assertEquals( "text", ( it.next() ).getName() ); 316 assertEquals( "numberedListItem_", ( it.next() ).getName() ); 317 assertEquals( "numberedList_", ( it.next() ).getName() ); 318 assertFalse( it.hasNext() ); 319 320 text = "<variablelist><varlistentry><term>term</term><listitem><para>definition</para>" 321 + "</listitem></varlistentry></variablelist>"; 322 sink.reset(); 323 parser.parse( text, sink ); 324 it = sink.getEventList().iterator(); 325 326 assertEquals( "definitionList", ( it.next() ).getName() ); 327 assertEquals( "definitionListItem", ( it.next() ).getName() ); 328 assertEquals( "definedTerm", ( it.next() ).getName() ); 329 assertEquals( "text", ( it.next() ).getName() ); 330 assertEquals( "definedTerm_", ( it.next() ).getName() ); 331 assertEquals( "definition", ( it.next() ).getName() ); 332 assertEquals( "text", ( it.next() ).getName() ); 333 assertEquals( "definition_", ( it.next() ).getName() ); 334 assertEquals( "definitionListItem_", ( it.next() ).getName() ); 335 assertEquals( "definitionList_", ( it.next() ).getName() ); 336 assertFalse( it.hasNext() ); 337 } 338 339 /** @throws Exception */ 340 public void testTables() 341 throws Exception 342 { 343 String text = "<informaltable frame=\"none\"><tgroup cols=\"2\">" 344 + "<colspec colwidth=\"0.5in\"/><colspec colwidth=\"0.5in\"/>" 345 + "<thead><row><entry>head 1</entry><entry>head 2</entry></row></thead>" 346 + "<tbody><row><entry>1</entry><entry>2</entry></row></tbody></tgroup></informaltable>"; 347 348 final SinkEventTestingSink sink = new SinkEventTestingSink(); 349 parser.parse( text, sink ); 350 final Iterator<SinkEventElement> it = sink.getEventList().iterator(); 351 352 assertEquals( "table", ( it.next() ).getName() ); 353 assertEquals( "tableRows", ( it.next() ).getName() ); 354 assertEquals( "tableRow", ( it.next() ).getName() ); 355 assertEquals( "tableHeaderCell", ( it.next() ).getName() ); 356 assertEquals( "text", ( it.next() ).getName() ); 357 assertEquals( "tableHeaderCell_", ( it.next() ).getName() ); 358 assertEquals( "tableHeaderCell", ( it.next() ).getName() ); 359 assertEquals( "text", ( it.next() ).getName() ); 360 assertEquals( "tableHeaderCell_", ( it.next() ).getName() ); 361 assertEquals( "tableRow_", ( it.next() ).getName() ); 362 assertEquals( "tableRow", ( it.next() ).getName() ); 363 assertEquals( "tableCell", ( it.next() ).getName() ); 364 assertEquals( "text", ( it.next() ).getName() ); 365 assertEquals( "tableCell_", ( it.next() ).getName() ); 366 assertEquals( "tableCell", ( it.next() ).getName() ); 367 assertEquals( "text", ( it.next() ).getName() ); 368 assertEquals( "tableCell_", ( it.next() ).getName() ); 369 assertEquals( "tableRow_", ( it.next() ).getName() ); 370 assertEquals( "tableRows_", ( it.next() ).getName() ); 371 assertEquals( "table_", ( it.next() ).getName() ); 372 assertFalse( it.hasNext() ); 373 } 374 375 /** @throws Exception */ 376 public void testHead() 377 throws Exception 378 { 379 String text = "<article><articleinfo><title>Title</title>" 380 + "<corpauthor>CorpAuthor</corpauthor><date>Date</date></articleinfo>" 381 + "<para>Paragraph</para></article>"; 382 383 final SinkEventTestingSink sink = new SinkEventTestingSink(); 384 parser.parse( text, sink ); 385 386 final Iterator<SinkEventElement> it = sink.getEventList().iterator(); 387 388 assertEquals( "head", ( it.next() ).getName() ); 389 assertEquals( "title", ( it.next() ).getName() ); 390 assertEquals( "text", ( it.next() ).getName() ); 391 assertEquals( "title_", ( it.next() ).getName() ); 392 assertEquals( "author", ( it.next() ).getName() ); 393 assertEquals( "text", ( it.next() ).getName() ); 394 assertEquals( "author_", ( it.next() ).getName() ); 395 assertEquals( "date", ( it.next() ).getName() ); 396 assertEquals( "text", ( it.next() ).getName() ); 397 assertEquals( "date_", ( it.next() ).getName() ); 398 assertEquals( "head_", ( it.next() ).getName() ); 399 assertEquals( "body", ( it.next() ).getName() ); 400 assertEquals( "paragraph", ( it.next() ).getName() ); 401 assertEquals( "text", ( it.next() ).getName() ); 402 assertEquals( "paragraph_", ( it.next() ).getName() ); 403 assertEquals( "body_", ( it.next() ).getName() ); 404 assertFalse( it.hasNext() ); 405 } 406}