/* * Created by IntelliJ IDEA. * User: user * Date: Sep 22, 2002 * Time: 2:45:20 PM * To change template for new class use * Code Style | Class Templates options (Tools | IDE Options). */ package com.intellij; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.util.text.StringUtil; import com.intellij.testFramework.LightPlatformTestCase; import com.intellij.util.ArrayUtil; import junit.framework.TestSuite; import consulo.annotations.RequiredDispatchThread; import java.io.File; import java.util.ArrayList; import java.util.List; import java.util.regex.Pattern; public abstract class FileSetTestCase extends TestSuite { private final File[] myFiles; protected Project myProject; private Pattern myPattern; public FileSetTestCase(String path) { File f = new File(path); if (f.isDirectory()) { myFiles = f.listFiles(); } else if (f.exists()) { myFiles = new File[] {f}; } else { throw new IllegalArgumentException("invalid path: " + path); } final String pattern = System.getProperty("fileset.pattern"); myPattern = pattern != null ? Pattern.compile(pattern) : null; addAllTests(); } protected void setUp() { } protected void tearDown() { } private void addAllTests() { for (File file : myFiles) { if (file.isFile()) { addFileTest(file); } } } public abstract String transform(String testName, String[] data) throws Exception; protected FileSetTestCase(File[] files) { myFiles = files; addAllTests(); } @Override public String getName() { return getClass().getName(); } private void addFileTest(File file) { if (!StringUtil.startsWithChar(file.getName(), '_') && !"CVS".equals(file.getName())) { if (myPattern != null && !myPattern.matcher(file.getPath()).matches()){ return; } final ActualTest t = new ActualTest(file, createTestName(file)); addTest(t); } } protected String getDelimiter() { return "---"; } private static String createTestName(File testFile) { return testFile.getName(); } private class ActualTest extends LightPlatformTestCase { private final File myTestFile; private final String myTestName; public ActualTest(File testFile, String testName) { myTestFile = testFile; myTestName = testName; } @RequiredDispatchThread @Override protected void setUp() throws Exception { super.setUp(); FileSetTestCase.this.setUp(); } @Override protected void tearDown() throws Exception { FileSetTestCase.this.tearDown(); super.tearDown(); } @Override public int countTestCases() { return 1; } @Override protected void runTest() throws Throwable { String content = FileUtil.loadFile(myTestFile); assertNotNull(content); List<String> input = new ArrayList<String>(); int separatorIndex; content = StringUtil.replace(content, "\r", ""); while ((separatorIndex = content.indexOf(getDelimiter())) >= 0) { input.add(content.substring(0, separatorIndex)); content = content.substring(separatorIndex); while (StringUtil.startsWithChar(content, '-') || StringUtil.startsWithChar(content, '\n')) content = content.substring(1); } String result = content; assertTrue("No data found in source file", input.size() > 0); while (StringUtil.startsWithChar(result, '-') || StringUtil.startsWithChar(result, '\n') || StringUtil.startsWithChar(result, '\r')) { result = result.substring(1); } final String transformed; FileSetTestCase.this.myProject = getProject(); String testName = myTestFile.getName(); final int dotIdx = testName.indexOf('.'); if (dotIdx >= 0) { testName = testName.substring(0, dotIdx); } transformed = StringUtil.replace(transform(testName, ArrayUtil.toStringArray(input)), "\r", ""); result = StringUtil.replace(result, "\r", ""); assertEquals(result.trim(),transformed.trim()); } @Override protected String getTestName(final boolean lowercaseFirstLetter) { return ""; } public String toString() { return myTestFile.getAbsolutePath() + " "; } @Override protected void resetAllFields() { // Do nothing otherwise myTestFile will be nulled out before getName() is called. } @Override public String getName() { return myTestName; } } }