View Javadoc

1   /*
2    * Copyright 2005,2009 Ivan SZKIBA
3    *
4    * Licensed under the Apache License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    *
8    *      http://www.apache.org/licenses/LICENSE-2.0
9    *
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   * See the License for the specific language governing permissions and
14   * limitations under the License.
15   */
16  package org.ini4j.test;
17  
18  import org.ini4j.sample.BeanEventSample;
19  import org.ini4j.sample.BeanSample;
20  import org.ini4j.sample.DumpSample;
21  import org.ini4j.sample.Dwarf;
22  import org.ini4j.sample.DwarfBean;
23  import org.ini4j.sample.Dwarfs;
24  import org.ini4j.sample.DwarfsBean;
25  import org.ini4j.sample.FromSample;
26  import org.ini4j.sample.IniSample;
27  import org.ini4j.sample.ListenerSample;
28  import org.ini4j.sample.NoImportSample;
29  import org.ini4j.sample.PyReadSample;
30  import org.ini4j.sample.ReadPrimitiveSample;
31  import org.ini4j.sample.ReadStringSample;
32  import org.ini4j.sample.StreamSample;
33  import org.ini4j.sample.ToSample;
34  
35  import org.ini4j.tutorial.BeanTutorial;
36  import org.ini4j.tutorial.IniTutorial;
37  import org.ini4j.tutorial.OneMinuteTutorial;
38  import org.ini4j.tutorial.OptTutorial;
39  import org.ini4j.tutorial.PrefsTutorial;
40  import org.ini4j.tutorial.RegTutorial;
41  import org.ini4j.tutorial.WindowsRegistryTutorial;
42  
43  import org.junit.Test;
44  
45  import org.junit.runner.RunWith;
46  
47  import org.junit.runners.Parameterized;
48  import org.junit.runners.Parameterized.Parameters;
49  
50  import java.io.File;
51  import java.io.FileInputStream;
52  import java.io.FileOutputStream;
53  import java.io.FileReader;
54  import java.io.FileWriter;
55  import java.io.InputStream;
56  import java.io.InputStreamReader;
57  import java.io.LineNumberReader;
58  import java.io.PrintStream;
59  import java.io.PrintWriter;
60  import java.io.Reader;
61  
62  import java.lang.reflect.Method;
63  
64  import java.nio.charset.Charset;
65  
66  import java.util.Arrays;
67  import java.util.Collection;
68  import java.util.regex.Matcher;
69  import java.util.regex.Pattern;
70  
71  @RunWith(Parameterized.class)
72  public class SampleRunnerTest
73  {
74      private static final String DOC_PATH = "generated-site/apt";
75      private static final String JAVA_SUFFIX = ".java";
76      private static final String PACKAGE_INFO = "package-info" + JAVA_SUFFIX;
77      private static final String APT_SUFFIX = ".apt";
78      private static final String APT_INDEX = "index" + APT_SUFFIX;
79      private static final String CODE_BEGIN = "\n+----+\n";
80      private static final String CODE_END = "+----+\n\n";
81      private static File _documentDir;
82  
83      static
84      {
85          System.setProperty("java.util.prefs.PreferencesFactory", "org.ini4j.IniPreferencesFactory");
86          _documentDir = new File(Helper.getBuildDirectory(), DOC_PATH);
87          _documentDir.mkdirs();
88          try
89          {
90              document(sourceFile(Dwarf.class), "//");
91              document(sourceFile(DwarfBean.class), "//");
92              document(sourceFile(Dwarfs.class), "//");
93              document(sourceFile(DwarfsBean.class), "//");
94              document(sourceFile(IniTutorial.class.getPackage()), "//");
95              document(sourceFile(IniSample.class.getPackage()), "//");
96          }
97          catch (Exception x)
98          {
99              throw new IllegalStateException(x);
100         }
101     }
102 
103     private final Class _clazz;
104     private final File _sourceFile;
105 
106     public SampleRunnerTest(Class sampleClass) throws Exception
107     {
108         _clazz = sampleClass;
109         _sourceFile = sourceFile(_clazz);
110     }
111 
112     @Parameters public static Collection data()
113     {
114         return Arrays.asList(
115                 new Object[][]
116                 {
117 
118                     // samples
119                     { ReadStringSample.class },
120                     { ReadPrimitiveSample.class },
121                     { IniSample.class },
122                     { StreamSample.class },
123                     { DumpSample.class },
124                     { NoImportSample.class },
125                     { ListenerSample.class },
126                     { BeanSample.class },
127                     { BeanEventSample.class },
128                     { FromSample.class },
129                     { ToSample.class },
130                     { PyReadSample.class },
131 
132                     // tutorials
133                     { OneMinuteTutorial.class },
134                     { IniTutorial.class },
135                     { RegTutorial.class },
136                     { WindowsRegistryTutorial.class },
137                     { OptTutorial.class },
138                     { BeanTutorial.class },
139                     { PrefsTutorial.class },
140                 });
141     }
142 
143     @Test public void test() throws Exception
144     {
145         System.out.println("Executing " + _clazz.getName());
146         PrintStream saved = System.out;
147         File tmp = File.createTempFile(getClass().getSimpleName(), ".out");
148         PrintStream out = new PrintStream(new FileOutputStream(tmp));
149 
150         System.setOut(out);
151         try
152         {
153             execute();
154         }
155         finally
156         {
157             System.setOut(saved);
158             out.flush();
159         }
160 
161         document(_sourceFile, "//");
162         index(source2document(_sourceFile), source2index(_clazz));
163         if (tmp.length() > 0)
164         {
165             append(tmp);
166         }
167 
168         tmp.delete();
169     }
170 
171     private static void document(File src, String comment) throws Exception
172     {
173         Pattern docPattern = Pattern.compile(String.format("^\\s*%s\\|(.*)$", comment));
174         Pattern beginPattern = Pattern.compile(String.format("^\\s*%s\\{.*$", comment));
175         Pattern endPattern = Pattern.compile(String.format("^\\s*%s\\}.*$", comment));
176         LineNumberReader reader = new LineNumberReader(openReader(src));
177         PrintWriter writer = new PrintWriter(new FileWriter(source2document(src)));
178         boolean in = false;
179 
180         for (String line = reader.readLine(); line != null; line = reader.readLine())
181         {
182             if (in)
183             {
184                 if (endPattern.matcher(line).matches())
185                 {
186                     in = false;
187                     writer.println(CODE_END);
188                 }
189                 else
190                 {
191                     writer.println(line);
192                 }
193             }
194             else
195             {
196                 if (beginPattern.matcher(line).matches())
197                 {
198                     in = true;
199                     writer.println(CODE_BEGIN);
200                 }
201                 else
202                 {
203                     Matcher m = docPattern.matcher(line);
204 
205                     if (m.matches())
206                     {
207                         writer.println(m.group(1));
208                     }
209                 }
210             }
211         }
212 
213         reader.close();
214         writer.close();
215     }
216 
217     private static void index(File src, File dst) throws Exception
218     {
219         LineNumberReader reader = new LineNumberReader(new FileReader(src));
220         PrintWriter writer = new PrintWriter(new FileWriter(dst, true));
221         String name = src.getName().replace(".apt", ".html");
222         boolean h1 = false;
223         boolean p = false;
224 
225         for (String line = reader.readLine(); line != null; line = reader.readLine())
226         {
227             if (line.length() == 0)
228             {
229                 if (p)
230                 {
231                     writer.println();
232 
233                     break;
234                 }
235                 else if (h1)
236                 {
237                     p = true;
238                 }
239             }
240             else
241             {
242                 if (Character.isSpaceChar(line.charAt(0)))
243                 {
244                     if (p)
245                     {
246                         writer.println(line);
247                     }
248                 }
249                 else
250                 {
251                     if (!h1)
252                     {
253                         h1 = true;
254                         writer.print(String.format(" *{{{%s}%s}}", name, line));
255                         writer.println();
256                         writer.println();
257                     }
258                 }
259             }
260         }
261 
262         writer.close();
263         reader.close();
264     }
265 
266     private static Reader openReader(File src) throws Exception
267     {
268         InputStream stream = new FileInputStream(src);
269         byte[] head = new byte[2];
270         int n = stream.read(head);
271 
272         stream.close();
273         Charset charset;
274 
275         if ((n == 2) && (head[0] == -1) && (head[1] == -2))
276         {
277             charset = Charset.forName("UnicodeLittle");
278         }
279         else
280         {
281             charset = Charset.forName("UTF-8");
282         }
283 
284         return new InputStreamReader(new FileInputStream(src), charset);
285     }
286 
287     private static File source2document(File sourceFile) throws Exception
288     {
289         String name = sourceFile.getName();
290         File dir = new File(_documentDir, sourceFile.getParentFile().getName());
291 
292         dir.mkdir();
293 
294         return new File(dir, name.equals(PACKAGE_INFO) ? APT_INDEX : (name + APT_SUFFIX));
295     }
296 
297     private static File source2index(Class clazz) throws Exception
298     {
299         return source2document(sourceFile(clazz.getPackage()));
300     }
301 
302     private static File sourceFile(Class clazz) throws Exception
303     {
304         return Helper.getSourceFile(clazz.getName().replaceAll("\\.", "/") + JAVA_SUFFIX);
305     }
306 
307     private static File sourceFile(Package pkg) throws Exception
308     {
309         return Helper.getSourceFile(pkg.getName().replaceAll("\\.", "/") + '/' + PACKAGE_INFO);
310     }
311 
312     private void append(File stdout) throws Exception
313     {
314         PrintWriter writer = new PrintWriter(new FileWriter(source2document(_sourceFile), true));
315 
316         writer.println("\n Standard output:\n");
317         writer.println(CODE_BEGIN);
318         LineNumberReader reader = new LineNumberReader(new FileReader(stdout));
319 
320         for (String line = reader.readLine(); line != null; line = reader.readLine())
321         {
322             writer.println(line);
323         }
324 
325         writer.println(CODE_END);
326         reader.close();
327         writer.close();
328     }
329 
330     @SuppressWarnings("unchecked")
331     private void execute() throws Exception
332     {
333         Method main = _clazz.getMethod("main", String[].class);
334         String[] args;
335 
336         try
337         {
338             File argument = new File(_sourceFile.getParentFile(), (String) _clazz.getField("FILENAME").get(null));
339 
340             document(argument, "[#;!]");
341             args = new String[] { argument.getCanonicalPath() };
342         }
343         catch (NoSuchFieldException x)
344         {
345             args = new String[] {};
346         }
347 
348         main.invoke(null, (Object) args);
349     }
350 }