View Javadoc

1   package org.apache.maven.doxia.module.fml;
2   
3   /*
4    * Licensed to the Apache Software Foundation (ASF) under one
5    * or more contributor license agreements.  See the NOTICE file
6    * distributed with this work for additional information
7    * regarding copyright ownership.  The ASF licenses this file
8    * to you under the Apache License, Version 2.0 (the
9    * "License"); you may not use this file except in compliance
10   * with the License.  You may obtain a copy of the License at
11   *
12   *   http://www.apache.org/licenses/LICENSE-2.0
13   *
14   * Unless required by applicable law or agreed to in writing,
15   * software distributed under the License is distributed on an
16   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
17   * KIND, either express or implied.  See the License for the
18   * specific language governing permissions and limitations
19   * under the License.
20   */
21  
22  import java.io.File;
23  import java.io.FileReader;
24  import java.io.Reader;
25  import java.io.Writer;
26  
27  import java.util.Iterator;
28  import java.util.List;
29  
30  import org.apache.maven.doxia.parser.AbstractParserTest;
31  import org.apache.maven.doxia.parser.Parser;
32  import org.apache.maven.doxia.sink.Sink;
33  import org.apache.maven.doxia.sink.SinkEventElement;
34  import org.apache.maven.doxia.sink.SinkEventTestingSink;
35  import org.apache.maven.doxia.sink.XhtmlBaseSink;
36  import org.codehaus.plexus.util.FileUtils;
37  import org.codehaus.plexus.util.IOUtil;
38  
39  /**
40   * @author <a href="mailto:evenisse@codehaus.org">Emmanuel Venisse</a>
41   * @version $Id: FmlParserTest.java 1091053 2011-04-11 12:55:07Z ltheussl $
42   */
43  public class FmlParserTest
44      extends AbstractParserTest
45  {
46      private FmlParser parser;
47  
48      @Override
49      protected void setUp()
50          throws Exception
51      {
52          super.setUp();
53  
54          parser = (FmlParser) lookup( Parser.ROLE, "fml" );
55  
56          // AbstractXmlParser.CachedFileEntityResolver downloads DTD/XSD files in ${java.io.tmpdir}
57          // Be sure to delete them
58          String tmpDir = System.getProperty( "java.io.tmpdir" );
59          String excludes = "fml-*.xsd, xml.xsd";
60          List<String> tmpFiles = FileUtils.getFileNames( new File( tmpDir ), excludes, null, true );
61          for ( Iterator<String> it = tmpFiles.iterator(); it.hasNext(); )
62          {
63              File tmpFile = new File( it.next().toString() );
64              tmpFile.delete();
65          }
66      }
67  
68      /** {@inheritDoc} */
69      protected Parser createParser()
70      {
71          return parser;
72      }
73  
74      /** {@inheritDoc} */
75      protected String outputExtension()
76      {
77          return "fml";
78      }
79  
80      /** @throws Exception */
81      public void testFaqEventsList()
82          throws Exception
83      {
84          SinkEventTestingSink sink = new SinkEventTestingSink();
85  
86          Reader reader = null;
87          try
88          {
89              reader = getTestReader( "simpleFaq" );
90  
91              createParser().parse( reader, sink );
92          }
93          finally
94          {
95              IOUtil.close( reader );
96          }
97  
98          Iterator<SinkEventElement> it = sink.getEventList().iterator();
99  
100         assertEquals( "comment", ( it.next() ).getName() );
101         assertEquals( "head", ( it.next() ).getName() );
102         assertEquals( "title", ( it.next() ).getName() );
103         assertEquals( "text", ( it.next() ).getName() );
104         assertEquals( "title_", ( it.next() ).getName() );
105         assertEquals( "head_", ( it.next() ).getName() );
106         assertEquals( "body", ( it.next() ).getName() );
107         assertEquals( "section1", ( it.next() ).getName() );
108         assertEquals( "sectionTitle1", ( it.next() ).getName() );
109         assertEquals( "anchor", ( it.next() ).getName() );
110         assertEquals( "text", ( it.next() ).getName() );
111         assertEquals( "anchor_", ( it.next() ).getName() );
112         assertEquals( "sectionTitle1_", ( it.next() ).getName() );
113         assertEquals( "paragraph", ( it.next() ).getName() );
114         assertEquals( "bold", ( it.next() ).getName() );
115         assertEquals( "text", ( it.next() ).getName() );
116         assertEquals( "bold_", ( it.next() ).getName() );
117         assertEquals( "paragraph_", ( it.next() ).getName() );
118         assertEquals( "numberedList", ( it.next() ).getName() );
119         assertEquals( "numberedListItem", ( it.next() ).getName() );
120         assertEquals( "link", ( it.next() ).getName() );
121         assertEquals( "text", ( it.next() ).getName() );
122         assertEquals( "link_", ( it.next() ).getName() );
123         assertEquals( "numberedListItem_", ( it.next() ).getName() );
124         assertEquals( "numberedList_", ( it.next() ).getName() );
125         assertEquals( "section1_", ( it.next() ).getName() );
126         assertEquals( "section1", ( it.next() ).getName() );
127         assertEquals( "sectionTitle1", ( it.next() ).getName() );
128         assertEquals( "text", ( it.next() ).getName() );
129         assertEquals( "sectionTitle1_", ( it.next() ).getName() );
130         assertEquals( "definitionList", ( it.next() ).getName() );
131         assertEquals( "definedTerm", ( it.next() ).getName() );
132         assertEquals( "anchor", ( it.next() ).getName() );
133         assertEquals( "text", ( it.next() ).getName() );
134         assertEquals( "anchor_", ( it.next() ).getName() );
135         assertEquals( "definedTerm_", ( it.next() ).getName() );
136         assertEquals( "definition", ( it.next() ).getName() );
137         assertEquals( "paragraph", ( it.next() ).getName() );
138         assertEquals( "text", ( it.next() ).getName() );
139         assertEquals( "paragraph_", ( it.next() ).getName() );
140         assertEquals( "paragraph", ( it.next() ).getName() );
141         assertEquals( "link", ( it.next() ).getName() );
142         assertEquals( "text", ( it.next() ).getName() );
143         assertEquals( "link_", ( it.next() ).getName() );
144         assertEquals( "paragraph_", ( it.next() ).getName() );
145         assertEquals( "definition_", ( it.next() ).getName() );
146         assertEquals( "definitionList_", ( it.next() ).getName() );
147         assertEquals( "section1_", ( it.next() ).getName() );
148         assertEquals( "body_", ( it.next() ).getName() );
149         assertFalse( it.hasNext() );
150     }
151 
152     /** @throws Exception */
153     public void testEntities()
154         throws Exception
155     {
156         final String text = "<!DOCTYPE test [<!ENTITY Alpha \"&#913;\">]>"
157                 + "<faqs title=\"&amp;&Alpha;\"><part id=\"General\"><title>&lt;&Alpha;</title>"
158                 + "<faq id=\"id\"><question>&gt;&Alpha;</question>"
159                 + "<answer><p><code>&lt;img&gt;</code>&quot;&Alpha;</p></answer>"
160                 + "</faq></part></faqs>";
161 
162         SinkEventTestingSink sink = new SinkEventTestingSink();
163 
164         parser.setValidate( false );
165         parser.parse( text, sink );
166 
167         Iterator<SinkEventElement> it = sink.getEventList().iterator();
168 
169         assertEquals( "head", ( it.next() ).getName() );
170         assertEquals( "title", ( it.next() ).getName() );
171 
172         // head title TODO: should be two events
173         assertTextEvent( it.next(), "&&#913;" );
174 
175         assertEquals( "title_", ( it.next() ).getName() );
176         assertEquals( "head_", ( it.next() ).getName() );
177         assertEquals( "body", ( it.next() ).getName() );
178         assertEquals( "section1", ( it.next() ).getName() );
179         assertEquals( "sectionTitle1", ( it.next() ).getName() );
180         assertEquals( "anchor", ( it.next() ).getName() );
181 
182         // faq title TODO: should be two events
183         assertTextEvent( it.next(), "&&#913;" );
184 
185         assertEquals( "anchor_", ( it.next() ).getName() );
186         assertEquals( "sectionTitle1_", ( it.next() ).getName() );
187         assertEquals( "paragraph", ( it.next() ).getName() );
188         assertEquals( "bold", ( it.next() ).getName() );
189 
190         // part title in TOC
191         assertTextEvent( it.next(), "<" );
192         assertTextEvent( it.next(), "\u0391" );
193 
194         assertEquals( "bold_", ( it.next() ).getName() );
195         assertEquals( "paragraph_", ( it.next() ).getName() );
196         assertEquals( "numberedList", ( it.next() ).getName() );
197         assertEquals( "numberedListItem", ( it.next() ).getName() );
198         assertEquals( "link", ( it.next() ).getName() );
199 
200         // question in TOC
201         assertTextEvent( it.next(), ">" );
202         assertTextEvent( it.next(), "\u0391" );
203 
204         assertEquals( "link_", ( it.next() ).getName() );
205         assertEquals( "numberedListItem_", ( it.next() ).getName() );
206         assertEquals( "numberedList_", ( it.next() ).getName() );
207         assertEquals( "section1_", ( it.next() ).getName() );
208         assertEquals( "section1", ( it.next() ).getName() );
209         assertEquals( "sectionTitle1", ( it.next() ).getName() );
210 
211         // part title
212         assertTextEvent( it.next(), "<" );
213         assertTextEvent( it.next(), "\u0391" );
214 
215         assertEquals( "sectionTitle1_", ( it.next() ).getName() );
216         assertEquals( "definitionList", ( it.next() ).getName() );
217         assertEquals( "definedTerm", ( it.next() ).getName() );
218         assertEquals( "anchor", ( it.next() ).getName() );
219 
220         // question
221         assertTextEvent( it.next(), ">" );
222         assertTextEvent( it.next(), "\u0391" );
223 
224         assertEquals( "anchor_", ( it.next() ).getName() );
225         assertEquals( "definedTerm_", ( it.next() ).getName() );
226         assertEquals( "definition", ( it.next() ).getName() );
227         assertEquals( "paragraph", ( it.next() ).getName() );
228 
229         // answer
230         assertEquals( "monospaced", ( it.next() ).getName() );
231         assertTextEvent( it.next(), "<" );
232         assertTextEvent( it.next(), "img" );
233         assertTextEvent( it.next(), ">" );
234         assertEquals( "monospaced_", ( it.next() ).getName() );
235         assertTextEvent( it.next(), "\"" );
236         assertTextEvent( it.next(), "\u0391" );
237 
238         assertEquals( "paragraph_", ( it.next() ).getName() );
239         assertEquals( "paragraph", ( it.next() ).getName() );
240         assertEquals( "link", ( it.next() ).getName() );
241         assertEquals( "text", ( it.next() ).getName() );
242         assertEquals( "link_", ( it.next() ).getName() );
243         assertEquals( "paragraph_", ( it.next() ).getName() );
244         assertEquals( "definition_", ( it.next() ).getName() );
245         assertEquals( "definitionList_", ( it.next() ).getName() );
246         assertEquals( "section1_", ( it.next() ).getName() );
247         assertEquals( "body_", ( it.next() ).getName() );
248 
249         assertFalse( it.hasNext() );
250     }
251 
252     /**
253      * @throws Exception if any
254      * @since 1.1.1
255      */
256     public void testFaqMacro()
257         throws Exception
258     {
259         Writer output = null;
260         Reader reader = null;
261         try
262         {
263             output = getTestWriter( "macro" );
264             reader = getTestReader( "macro" );
265 
266             Sink sink = new XhtmlBaseSink( output );
267             createParser().parse( reader, sink );
268             sink.close();
269         }
270         finally
271         {
272             IOUtil.close( output );
273             IOUtil.close( reader );
274         }
275 
276         File f = getTestFile( getBasedir(), outputBaseDir() + getOutputDir() + "macro.fml" );
277         assertTrue( "The file " + f.getAbsolutePath() + " was not created", f.exists() );
278 
279         String content;
280         try
281         {
282             reader = new FileReader( f );
283             content = IOUtil.toString( reader );
284         }
285         finally
286         {
287             IOUtil.close( reader );
288         }
289 
290         assertTrue( content.indexOf( "<a name=\"macro-definition\">Macro Question</a>" ) != -1 );
291     }
292 
293     private void assertTextEvent( SinkEventElement textEvt, String string )
294     {
295         assertEquals( "text", textEvt.getName() );
296         assertEquals( string, textEvt.getArgs()[0] );
297     }
298 }