package com.prezi.haxe.gradle;
import com.google.common.io.Resources;
import com.prezi.io.BufferedOutputExecFactory;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;
import org.gradle.api.tasks.InputDirectory;
import org.gradle.api.tasks.TaskAction;
import org.gradle.process.internal.ExecAction;
import org.gradle.process.internal.ExecActionFactory;
import javax.inject.Inject;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
public class MUnitNode extends MUnit {
public static final String MUNIT_NODE_RUNNER_JS = "munit_node_runner.js";
private final ExecActionFactory execActionFactory;
private File nodeModulesDirectory;
@InputDirectory
public File getNodeModulesDirectory() {
return nodeModulesDirectory;
}
public void setNodeModulesDirectory(Object nodeModulesDirectory) {
this.nodeModulesDirectory = getProject().file(nodeModulesDirectory);
}
public void nodeModulesDirectory(Object nodeModulesDirectory) {
setNodeModulesDirectory(nodeModulesDirectory);
}
@Inject
public MUnitNode(ExecActionFactory execActionFactory) {
this.execActionFactory = execActionFactory;
}
@Override
protected void prepareEnvironment(File workDir) throws IOException {
copyCompiledTest(workDir);
setupRunner(workDir);
}
@TaskAction
@Override
public void munit() throws IOException, InterruptedException {
File workDir = getWorkingDirectory();
FileUtils.deleteDirectory(workDir);
FileUtils.forceMkdir(workDir);
prepareEnvironment(workDir);
File munitNodeRunner = new File(workDir, MUNIT_NODE_RUNNER_JS);
munitNodeRunner.setExecutable(true);
ExecAction exec = BufferedOutputExecFactory.createExecAction(execActionFactory, this);
exec.workingDir(workDir);
exec.commandLine("./" + munitNodeRunner.getName());
exec.environment("NODE_PATH", getNodeModulesDirectory());
exec.execute();
}
private void setupRunner(File workDir) throws IOException {
FileOutputStream fos = new FileOutputStream(new File(workDir, MUNIT_NODE_RUNNER_JS));
try {
Resources.copy(Resources.getResource(MUnitNode.class, "/munit_node_resources/" + MUNIT_NODE_RUNNER_JS),
fos);
} finally {
IOUtils.closeQuietly(fos);
}
}
@Override
public boolean shouldRunAutomatically() {
return !getProject().hasProperty("munit.usebrowser") || getProject().property("munit.usebrowser").equals("false");
}
}