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}