blob: ba2afa2f8d868eaf696757680cedb3a3f70c51a4 [file] [log] [blame]
/*
* 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 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;
}
@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;
}
}
}