package org.jetbrains.ether; import junit.framework.TestCase; import junitx.framework.FileAssert; import java.io.*; /** * Created by IntelliJ IDEA. * User: db * Date: 26.07.11 * Time: 0:34 * To change this template use File | Settings | File Templates. */ public abstract class IncrementalTestCase extends TestCase { private final String groupName; private final String tempDir = System.getProperty("java.io.tmpdir"); private String baseDir; private String workDir; protected IncrementalTestCase(final String name) throws Exception { super(name); groupName = name; } @Override protected void setUp() throws Exception { baseDir = "testData" + File.separator + "incremental" + File.separator; for (int i = 0; ; i++) { final File tmp = new File(tempDir + File.separator + "__temp__" + i); if (tmp.mkdir()) { workDir = tmp.getPath() + File.separator; break; } } copy(new File(getBaseDir()), new File(getWorkDir())); } @Override protected void tearDown() throws Exception { // delete(new File(workDir)); } private String getDir(final String prefix) { final String name = getName(); assert (name.startsWith("test")); final String result = Character.toLowerCase(name.charAt("test".length())) + name.substring("test".length() + 1); return prefix + File.separator + groupName + File.separator + result; } private String getBaseDir() { return getDir(baseDir); } private String getWorkDir() { return getDir(workDir); } private void delete(final File file) throws Exception { if (file.isDirectory()) { for (File f : file.listFiles()) { delete(f); } } if (!file.delete()) throw new IOException("could not delete file or directory " + file.getPath()); } private void copy(final File input, final File output) throws Exception { if (input.isDirectory()) { if (output.mkdirs()) { for (File f : input.listFiles()) { copy(f, new File(output.getPath() + File.separator + f.getName())); } } else throw new IOException("unable to create directory " + output.getPath()); } else if (input.isFile()) { final FileReader in = new FileReader(input); final FileWriter out = new FileWriter(output); int c; while ((c = in.read()) != -1) out.write(c); in.close(); out.close(); } } private void modify() throws Exception { final File dir = new File(getBaseDir()); final File[] files = dir.listFiles(new FileFilter() { public boolean accept(final File pathname) { final String name = pathname.getName(); return name.endsWith(".java.new") || name.endsWith(".java.remove"); } } ); for (File input : files) { final String name = input.getName(); final boolean copy = name.endsWith(".java.new"); final String postfix = name.substring(0, name.length() - (copy ? ".new" : ".remove").length()); final int pathSep = postfix.indexOf("$"); final String basename = pathSep == -1 ? postfix : postfix.substring(pathSep+1); final String path = getWorkDir() + File.separator + (pathSep == -1 ? "src" : postfix.substring(0, pathSep).replace('-', File.separatorChar)); final File output = new File (path + File.separator + basename); if (copy) { copy (input, output); } else { output.delete(); } } } public void doTest() throws Exception { final ProjectWrapper first = ProjectWrapper.load(getWorkDir(), "project.builder.useInProcessJavac=true", false); first.rebuild(); first.save(); Thread.sleep(1000); modify(); final ProjectWrapper second = ProjectWrapper.load(getWorkDir(), "project.builder.useInProcessJavac=true", true); final PrintStream stream = new PrintStream(new FileOutputStream(getWorkDir() + ".log"), true); try { second.makeModule(null, new ProjectWrapper.Flags() { public boolean tests() { return false; } public boolean incremental() { return true; } public boolean force() { return false; } public PrintStream logStream() { return stream; } }); } finally { stream.close(); } FileAssert.assertEquals(new File(getBaseDir() + ".log"), new File(getWorkDir() + ".log")); } }