package org.jetbrains.kotlin.maven;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.util.text.StringUtil;
import org.jetbrains.annotations.NotNull;
import org.junit.Assert;
import java.io.File;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
class MavenExecutionResult {
@NotNull
private final String stdout;
@NotNull
private final File workingDir;
private int exitCode;
MavenExecutionResult(
@NotNull String output,
@NotNull File workingDir,
int exitCode
) {
this.stdout = output;
this.workingDir = workingDir;
this.exitCode = exitCode;
}
MavenExecutionResult check(@NotNull Action<MavenExecutionResult> fn) throws Exception {
try {
fn.run(this);
}
catch (Throwable t) {
System.out.println(stdout);
throw new RuntimeException(t);
}
return this;
}
MavenExecutionResult succeeded() throws Exception {
return check(new Action<MavenExecutionResult>() {
@Override
public void run(MavenExecutionResult execResult) {
Assert.assertEquals("Maven process was expected to succeeded", 0, exitCode);
}
});
}
MavenExecutionResult failed() throws Exception {
return check(new Action<MavenExecutionResult>() {
@Override
public void run(MavenExecutionResult execResult) {
Assert.assertNotEquals("Maven process was expected to fail", 0, exitCode);
}
});
}
MavenExecutionResult contains(@NotNull final String str) throws Exception {
return check(new Action<MavenExecutionResult>() {
@Override
public void run(MavenExecutionResult execResult) {
if (!stdout.contains(str)) {
throw new AssertionError("Maven output should contain '" + str + "'");
}
}
});
}
MavenExecutionResult notContains(@NotNull final String str) throws Exception {
return check(new Action<MavenExecutionResult>() {
@Override
public void run(MavenExecutionResult execResult) {
if (stdout.contains(str)) {
throw new AssertionError("Maven output should not contain '" + str + "'");
}
}
});
}
MavenExecutionResult compiledKotlin(@NotNull final String... expectedPaths) throws Exception {
return check(new Action<MavenExecutionResult>() {
@Override
public void run(MavenExecutionResult execResult) {
Pattern kotlinCompileIteration = Pattern.compile("(?m)Kotlin compile iteration: (.*)$");
Matcher m = kotlinCompileIteration.matcher(stdout);
Set<String> normalizedActualPaths = new HashSet<String>();
while (m.find()) {
String[] compiledFiles = m.group(1).split(",");
for (String path : compiledFiles) {
File file = new File(path.trim());
String relativePath = FileUtil.getRelativePath(workingDir, file);
normalizedActualPaths.add(FileUtil.normalize(relativePath));
}
}
String[] actualPaths = normalizedActualPaths.toArray(new String[normalizedActualPaths.size()]);
Arrays.sort(actualPaths);
for (int i = 0; i < expectedPaths.length; i++) {
expectedPaths[i] = FileUtil.normalize(expectedPaths[i]);
}
Arrays.sort(expectedPaths);
String expected = StringUtil.join(expectedPaths, "\n");
String actual = StringUtil.join(actualPaths, "\n");
Assert.assertEquals("Compiled files differ", expected, actual);
}
});
}
}