View Javadoc

1   package org.apache.maven.doxia;
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 org.apache.maven.doxia.markup.Markup;
23  
24  import org.codehaus.plexus.PlexusTestCase;
25  import org.codehaus.plexus.util.WriterFactory;
26  
27  import java.io.File;
28  import java.io.IOException;
29  import java.io.InputStream;
30  import java.io.InputStreamReader;
31  import java.io.Reader;
32  import java.io.Writer;
33  
34  /**
35   * Provide some common convenience methods to test Doxia modules (parsers and sinks).
36   *
37   * @version $Id: AbstractModuleTest.java 1410898 2012-11-18 15:33:17Z hboutemy $
38   * @since 1.0
39   */
40  public abstract class AbstractModuleTest
41      extends PlexusTestCase
42      implements Markup
43  {
44      /**
45       * Set the system properties:
46       * <ul>
47       * <li><code>line.separator</code> to <code>\n</code> (Unix) to prevent
48       * failure on windows.</li>
49       * </ul>
50       */
51      static
52      {
53          // Safety
54          System.setProperty( "line.separator", "\n" );
55      }
56  
57      // ----------------------------------------------------------------------
58      // Methods for creating test reader and writer
59      // ----------------------------------------------------------------------
60  
61      /**
62       * Returns a FileWriter to write to a file with the given name
63       * in the test target output directory.
64       *
65       * @param baseName The name of the target file.
66       * @param extension The file extension of the file to write.
67       * @return A FileWriter.
68       * @throws IOException If the FileWriter could not be generated.
69       * @see WriterFactory#newWriter(File, String)
70       */
71      protected Writer getTestWriter( String baseName, String extension )
72          throws IOException
73      {
74          File outputFile = getTestWriterFile( baseName, extension );
75  
76          if ( !outputFile.getParentFile().exists() )
77          {
78              outputFile.getParentFile().mkdirs();
79          }
80  
81          return WriterFactory.newWriter( outputFile, "UTF-8" );
82      }
83  
84      protected File getTestWriterFile( String baseName, String extension )
85      {
86          File outputDirectory = new File( getBasedirFile(), outputBaseDir() + getOutputDir() );
87          return new File( outputDirectory, baseName + '.' + extension );
88      }
89  
90      /**
91       * Returns an XML FileWriter to write to a file with the given name
92       * in the test target output directory.
93       *
94       * @param baseName The name of the target file.
95       * @return An XML FileWriter.
96       * @throws IOException If the FileWriter could not be generated.
97       * @see #getXmlTestWriter(String, String)
98       */
99      protected Writer getXmlTestWriter( String baseName )
100         throws IOException
101     {
102         return getXmlTestWriter( baseName, outputExtension() );
103     }
104 
105     /**
106      * Returns an XML FileWriter to write to a file with the given name
107      * in the test target output directory.
108      *
109      * @param baseName The name of the target file.
110      * @param extension The file extension of the file to write.
111      * @return An XML FileWriter.
112      * @throws IOException If the FileWriter could not be generated.
113      * @see WriterFactory#newXmlWriter(File)
114      */
115     protected Writer getXmlTestWriter( String baseName, String extension )
116         throws IOException
117     {
118         File outputFile = getTestWriterFile( baseName, extension );
119 
120         if ( !outputFile.getParentFile().exists() )
121         {
122             outputFile.getParentFile().mkdirs();
123         }
124 
125         return WriterFactory.newXmlWriter( outputFile );
126     }
127 
128     /**
129      * Returns a FileWriter to write to a file with the given name
130      * in the test target output directory.
131      *
132      * @param baseName The name of the target file.
133      * @return A FileWriter.
134      * @throws IOException If the FileWriter could not be generated.
135      * @see #getTestWriter(String, String)
136      */
137     protected Writer getTestWriter( String baseName )
138         throws IOException
139     {
140         return getTestWriter( baseName, outputExtension() );
141     }
142 
143     protected File getTestWriterFile( String baseName )
144     {
145         return getTestWriterFile( baseName, outputExtension() );
146     }
147 
148     /**
149      * Returns an InputStreamReader to read a resource from a file
150      * in the test target output directory.
151      *
152      * @param baseName The name of the resource file to read.
153      * @param extension The file extension of the resource file to read.
154      * @return An InputStreamReader.
155      */
156     protected Reader getTestReader( String baseName, String extension )
157     {
158         InputStream is =
159             Thread.currentThread().getContextClassLoader().getResourceAsStream(
160                 baseName + "." + extension );
161 
162         assertNotNull( "Could not find resource: " + baseName + "." + extension, is );
163 
164         InputStreamReader reader = new InputStreamReader( is );
165 
166         return reader;
167     }
168 
169     /**
170      * Returns an InputStreamReader to read a resource from a file
171      * in the test target output directory.
172      *
173      * @param baseName The name of the resource file to read.
174      * @return An InputStreamReader.
175      * @see #getTestReader(String, String)
176      */
177     protected Reader getTestReader( String baseName )
178     {
179         return getTestReader( baseName, outputExtension() );
180     }
181 
182 
183     // ----------------------------------------------------------------------
184     // Utility methods
185     // ----------------------------------------------------------------------
186 
187     /**
188      * Returns the common base directory.
189      *
190      * @return The common base directory as a File.
191      */
192     protected File getBasedirFile()
193     {
194         return new File( getBasedir() );
195     }
196 
197     /**
198      * Returns the base directory where all test output will go.
199      *
200      * @return The test output directory.
201      */
202     protected final String outputBaseDir()
203     {
204         return "target/test-output/";
205     }
206 
207 
208     // ----------------------------------------------------------------------
209     // Abstract methods the individual ModuleTests must provide
210     // ----------------------------------------------------------------------
211 
212     /**
213      * Determines the default file extension for the current module.
214      *
215      * @return The default file extension.
216      */
217     protected abstract String outputExtension();
218 
219     /**
220      * Returns the directory where test output will go.
221      * Should be relative to outputBaseDir().
222      *
223      * @return The test output directory, relative to outputBaseDir().
224      */
225     protected abstract String getOutputDir();
226 }