001 /*
002 * Copyright 2005,2009 Ivan SZKIBA
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 * http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 */
016 package org.ini4j.test;
017
018 import org.ini4j.sample.BeanEventSample;
019 import org.ini4j.sample.BeanSample;
020 import org.ini4j.sample.DumpSample;
021 import org.ini4j.sample.Dwarf;
022 import org.ini4j.sample.DwarfBean;
023 import org.ini4j.sample.Dwarfs;
024 import org.ini4j.sample.DwarfsBean;
025 import org.ini4j.sample.FromSample;
026 import org.ini4j.sample.IniSample;
027 import org.ini4j.sample.ListenerSample;
028 import org.ini4j.sample.NoImportSample;
029 import org.ini4j.sample.PyReadSample;
030 import org.ini4j.sample.ReadPrimitiveSample;
031 import org.ini4j.sample.ReadStringSample;
032 import org.ini4j.sample.StreamSample;
033 import org.ini4j.sample.ToSample;
034
035 import org.ini4j.tutorial.BeanTutorial;
036 import org.ini4j.tutorial.IniTutorial;
037 import org.ini4j.tutorial.OneMinuteTutorial;
038 import org.ini4j.tutorial.OptTutorial;
039 import org.ini4j.tutorial.PrefsTutorial;
040 import org.ini4j.tutorial.RegTutorial;
041 import org.ini4j.tutorial.WindowsRegistryTutorial;
042
043 import org.junit.Test;
044
045 import org.junit.runner.RunWith;
046
047 import org.junit.runners.Parameterized;
048 import org.junit.runners.Parameterized.Parameters;
049
050 import java.io.File;
051 import java.io.FileInputStream;
052 import java.io.FileOutputStream;
053 import java.io.FileReader;
054 import java.io.FileWriter;
055 import java.io.InputStream;
056 import java.io.InputStreamReader;
057 import java.io.LineNumberReader;
058 import java.io.PrintStream;
059 import java.io.PrintWriter;
060 import java.io.Reader;
061
062 import java.lang.reflect.Method;
063
064 import java.nio.charset.Charset;
065
066 import java.util.Arrays;
067 import java.util.Collection;
068 import java.util.regex.Matcher;
069 import java.util.regex.Pattern;
070
071 @RunWith(Parameterized.class)
072 public class SampleRunnerTest
073 {
074 private static final String DOC_PATH = "generated-site/apt";
075 private static final String JAVA_SUFFIX = ".java";
076 private static final String PACKAGE_INFO = "package-info" + JAVA_SUFFIX;
077 private static final String APT_SUFFIX = ".apt";
078 private static final String APT_INDEX = "index" + APT_SUFFIX;
079 private static final String CODE_BEGIN = "\n+----+\n";
080 private static final String CODE_END = "+----+\n\n";
081 private static File _documentDir;
082
083 static
084 {
085 System.setProperty("java.util.prefs.PreferencesFactory", "org.ini4j.IniPreferencesFactory");
086 _documentDir = new File(Helper.getBuildDirectory(), DOC_PATH);
087 _documentDir.mkdirs();
088 try
089 {
090 document(sourceFile(Dwarf.class), "//");
091 document(sourceFile(DwarfBean.class), "//");
092 document(sourceFile(Dwarfs.class), "//");
093 document(sourceFile(DwarfsBean.class), "//");
094 document(sourceFile(IniTutorial.class.getPackage()), "//");
095 document(sourceFile(IniSample.class.getPackage()), "//");
096 }
097 catch (Exception x)
098 {
099 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 }