package dtool.parser;
import static melnorme.utilbox.core.Assert.AssertNamespace.assertTrue;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.regex.Pattern;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
import dtool.tests.CommonParameterizedTest;
import dtool.tests.DToolTestResources;
import dtool.tests.DToolTests;
import melnorme.lang.utils.MiscFileUtils;
import java.util.function.Predicate;
import melnorme.utilbox.core.fntypes.VoidFunction;
import melnorme.utilbox.misc.ArrayUtil;
import melnorme.utilbox.misc.FileUtil;
import melnorme.utilbox.misc.Location;
import melnorme.utilbox.tests.CommonTest;
import melnorme.utilbox.tests.CommonTestUtils;
import melnorme.utilbox.tests.TestsWorkingDir;
/**
* Test conversion of common sources (Phobos, Tango)
*/
@RunWith(Parameterized.class)
public class Parser_MassParseTest extends CommonParameterizedTest {
public static final String MASSPARSE_ZIPFOLDER = "parser-massParse";
// zip filename marker to indicate that files can have syntax errors:
protected static final String BAD_SYNTAX = "#BAD_SYNTAX";
protected static final String COMMON_UNPACK = "_common-unpack";
@Parameters(name="{index}: {0}")
public static Collection<Object[]> testParameters() throws IOException {
return collectTestParameters();
}
public static Collection<Object[]> collectTestParameters() throws IOException {
final Collection<Object[]> testList = new ArrayList<>();
FileUtil.deleteDir(getMassParseUnpackedResource()); // Allways delete unpackFolder
File massParseZipFilesFolder = DToolTestResources.getTestResourceFile(MASSPARSE_ZIPFOLDER);
for (File zipFile : collectZipFiles(massParseZipFilesFolder)) {
File unzippedFolder = unzipSource(zipFile);
testList.add(array(unzippedFolder.getName(), new MassParseTestRunnable(unzippedFolder, zipFile)));
}
return testList;
}
public static ArrayList<File> collectZipFiles(File folder) throws IOException {
final ArrayList<File> fileList = new ArrayList<>();
VoidFunction<File> fileVisitor = new VoidFunction<File>() {
@Override
public void accept(File file) {
if(file.isFile() && file.getName().endsWith(".zip")) {
fileList.add(file);
}
}
};
MiscFileUtils.traverseFiles(folder, false, fileVisitor);
return fileList;
}
protected static File unzipSource(File zipFile) throws IOException {
File outDir = getMassParseUnpackedResource(zipFile.getName()).toFile();
if(!DToolTests.TESTS_LITE_MODE) {
MiscFileUtils.unzipFile(zipFile, outDir, CommonTest.testsLogger);
} else {
assertTrue(outDir.mkdirs());
}
return outDir;
}
public static Location getMassParseUnpackedResource(String... segments) {
Location unpackedRoot = TestsWorkingDir.getWorkingDir().resolve_fromValid(COMMON_UNPACK);
return Location.fromAbsolutePath(MiscFileUtils.getFile(unpackedRoot.toFile(), segments).toPath());
}
/* ------------------------------------ */
public Parser_MassParseTest(String testDescription, Runnable testRunnable) {
super(testDescription, testRunnable);
}
public static final Pattern LINE_SPLITTER = Pattern.compile("\n|(\r\n)|\r");
public static class MassParseTestRunnable extends CommonTestUtils implements Runnable {
public final File unpackedFolder;
public final File zipFile;
public MassParseTestRunnable(File unpackedFolder, File zipFile) {
this.unpackedFolder = unpackedFolder;
this.zipFile = zipFile;
}
@Override
public void run() {
ArrayList<File> moduleList = getDeeModuleList(unpackedFolder);
boolean canHaveSyntaxErrors = unpackedFolder.getName().contains(BAD_SYNTAX);
String[] exclusions = getExclusions();
for (File file : moduleList) {
testFileParse(canHaveSyntaxErrors, file, exclusions);
}
}
public String[] getExclusions() {
File exclusionsFiles = new File(zipFile.toString() + ".EXCLUSIONS");
if(!exclusionsFiles.exists())
return new String[0];
String exclusionsFileSource = readStringFromFile(exclusionsFiles);
String[] exclusions = LINE_SPLITTER.split(exclusionsFileSource);
exclusions = ArrayUtil.filter(exclusions, new Predicate<String>() {
@Override
public boolean test(String obj) {
return obj.trim().isEmpty() == false;
}
});
return exclusions;
}
public void testFileParse(boolean canHaveSyntaxErrors, File file, String[] exclusions) {
testsLogVerbose.println("----------> " + DToolTestResources.resourceFileToString(file, COMMON_UNPACK));
String fileName = file.getName().toLowerCase();
if(!(fileName.endsWith(".d") || fileName.endsWith(".di")) ) {
canHaveSyntaxErrors = true;
}
if(canHaveSyntaxErrors == false) {
for (String exclusion : exclusions) {
String uriString = file.toURI().toString();
if(uriString.endsWith(exclusion)) {
canHaveSyntaxErrors = true;
break;
}
}
}
String source = readStringFromFile_PreserveBOM(file);
int count = System.getProperty("PerformanceTests") != null ? 5 : 1;
for (int i = 0; i < count; i++) {
Boolean expectErrors = canHaveSyntaxErrors ? null : false;
DeeParsingChecks.runSimpleSourceParseTest(source, "_massParse", expectErrors, false);
}
}
}
}