package com.prezi.haxe.gradle;
import com.google.common.base.Charsets;
import com.google.common.base.Function;
import com.google.common.base.Joiner;
import com.google.common.collect.Iterables;
import com.google.common.io.Files;
import com.prezi.haxe.gradle.incubating.LanguageSourceSet;
import org.apache.commons.io.FileUtils;
import org.gradle.api.DomainObjectSet;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Set;
import java.util.regex.Pattern;
public class HaxeTestCompile extends HaxeCompile {
private static final Pattern EXAMPLE_TEST_LINE = Pattern.compile("(import |\\s*add\\()ExampleTest\\)?;");
private static final Pattern NO_JUNIT_CLIENT = Pattern.compile("\\s+runner.addResultClient.*;");
private static final Pattern JUNIT_CLIENT = Pattern.compile("\\s+//\\s*runner.addResultClient.*;");
private File workingDirectory;
@Override
public void compile() throws IOException, InterruptedException {
File workDir = getWorkingDirectory();
FileUtils.deleteDirectory(workDir);
FileUtils.forceMkdir(workDir);
File testsDir = getTestsDirectory();
for (File sourceDir : super.getSourceDirectories(getSourceSets())) {
if (sourceDir.exists()) {
FileUtils.copyDirectory(sourceDir, testsDir);
}
}
List<String> cmd = Arrays.asList("haxelib", "run", "munit", "gen", testsDir.getName());
CommandExecutor.execute(cmd, workDir, new DefaultExecutionResultHandler(cmd));
postProcessGeneratedSources(testsDir);
super.compile();
}
protected void postProcessGeneratedSources(File testsDir) throws IOException {
// Delete ExampleTest.hx generated by MUnit
FileUtils.deleteQuietly(new File(testsDir, "ExampleTest.hx"));
File suite = new File(testsDir, "TestSuite.hx");
if (suite.exists()) {
List<String> suiteText = Files.readLines(suite, Charsets.UTF_8);
FileUtils.deleteQuietly(suite);
Files.write(Joiner.on("\n").join(Iterables.transform(suiteText, new Function<String, String>() {
@Override
public String apply(String line) {
String result;
if (EXAMPLE_TEST_LINE.matcher(line).matches()) {
result = "// " + line;
} else {
result = line;
}
return result;
}
})), suite, Charsets.UTF_8);
}
File main = new File(testsDir, "TestMain.hx");
if (main.exists()) {
List<String> mainText = Files.readLines(main, Charsets.UTF_8);
FileUtils.deleteQuietly(main);
Files.write(Joiner.on("\n").join(Iterables.transform(mainText, new Function<String, String>() {
@Override
public String apply(String line) {
String result;
if (NO_JUNIT_CLIENT.matcher(line).matches()) {
result = "// " + line;
} else if (JUNIT_CLIENT.matcher(line).matches()) {
result = line.replaceFirst("//", "");
} else {
result = line;
}
return result;
}
})), main, Charsets.UTF_8);
}
}
@Override
protected HaxeCommandBuilder configureHaxeCommandBuilder(File output, DomainObjectSet<LanguageSourceSet> sources) {
HaxeCommandBuilder builder = super.configureHaxeCommandBuilder(output, sources);
if (getProject().hasProperty("munit.debug")) {
builder.withFlags(new ArrayList<String>(Arrays.asList("-D testDebug")));
}
return builder;
}
@Override
protected String getMainClass() {
return "TestMain";
}
@Override
protected Set<File> getSourceDirectories(DomainObjectSet<LanguageSourceSet> sources) {
return Collections.singleton(getTestsDirectory());
}
public File getTestsDirectory() {
return new File(getWorkingDirectory(), "tests");
}
public void workingDirectory(Object workingDirectory) {
setWorkingDirectory(workingDirectory);
}
public File getWorkingDirectory() {
return workingDirectory;
}
public void setWorkingDirectory(Object workingDirectory) {
this.workingDirectory = getProject().file(workingDirectory);
}
}