diff options
Diffstat (limited to 'org.eclipse.jgit.pgm.test/src/org/eclipse/jgit/lib/CLIRepositoryTestCase.java')
-rw-r--r-- | org.eclipse.jgit.pgm.test/src/org/eclipse/jgit/lib/CLIRepositoryTestCase.java | 90 |
1 files changed, 90 insertions, 0 deletions
diff --git a/org.eclipse.jgit.pgm.test/src/org/eclipse/jgit/lib/CLIRepositoryTestCase.java b/org.eclipse.jgit.pgm.test/src/org/eclipse/jgit/lib/CLIRepositoryTestCase.java index 400927e0a0..755174bcbc 100644 --- a/org.eclipse.jgit.pgm.test/src/org/eclipse/jgit/lib/CLIRepositoryTestCase.java +++ b/org.eclipse.jgit.pgm.test/src/org/eclipse/jgit/lib/CLIRepositoryTestCase.java @@ -42,6 +42,8 @@ */ package org.eclipse.jgit.lib; +import static org.junit.Assert.assertEquals; + import java.io.File; import java.io.IOException; import java.util.ArrayList; @@ -83,4 +85,92 @@ public class CLIRepositoryTestCase extends LocalDiskRepositoryTestCase { protected void deleteTrashFile(final String name) throws IOException { JGitTestUtil.deleteTrashFile(db, name); } + + /** + * Execute the given commands and print the output to stdout. Use this + * function instead of the normal {@link #execute(String...)} when preparing + * a test case: the command is executed and then its output is printed on + * stdout, thus making it easier to prepare the correct command and expected + * output for the test case. + * + * @param cmds + * The commands to execute + * @return the result of the command, see {@link #execute(String...)} + * @throws Exception + */ + protected String[] executeAndPrint(String... cmds) throws Exception { + String[] lines = execute(cmds); + for (String line : lines) { + System.out.println(line); + } + return lines; + } + + /** + * Execute the given commands and print test code comparing expected and + * actual output. Use this function instead of the normal + * {@link #execute(String...)} when preparing a test case: the command is + * executed and test code is generated using the command output as a + * template of what is expected. The code generated is printed on stdout and + * can be pasted in the test case function. + * + * @param cmds + * The commands to execute + * @return the result of the command, see {@link #execute(String...)} + * @throws Exception + */ + protected String[] executeAndPrintTestCode(String... cmds) throws Exception { + String[] lines = execute(cmds); + String cmdString = cmdString(cmds); + if (lines.length == 0) + System.out.println("\t\tassertTrue(execute(" + cmdString + + ").length == 0);"); + else { + System.out + .println("\t\tassertArrayOfLinesEquals(new String[] { //"); + System.out.print("\t\t\t\t\t\t\"" + escapeJava(lines[0])); + for (int i=1; i<lines.length; i++) { + System.out.println("\", //"); + System.out.print("\t\t\t\t\t\t\"" + escapeJava(lines[i])); + } + System.out.println("\" //"); + System.out.println("\t\t\t\t}, execute(" + cmdString + ")); //"); + } + return lines; + } + + protected String cmdString(String... cmds) { + if (cmds.length == 0) + return ""; + else if (cmds.length == 1) + return "\"" + escapeJava(cmds[0]) + "\""; + else { + StringBuilder sb = new StringBuilder(cmdString(cmds[0])); + for (int i=1; i<cmds.length; i++) { + sb.append(", "); + sb.append(cmdString(cmds[i])); + } + return sb.toString(); + } + } + + protected String escapeJava(String line) { + // very crude implementation but ok for generating test code + return line.replaceAll("\"", "\\\\\"") // + .replaceAll("\\\\", "\\\\\\") + .replaceAll("\t", "\\\\t"); + } + + protected void assertArrayOfLinesEquals(String[] expected, String[] actual) { + assertEquals(toText(expected), toText(actual)); + } + + private String toText(String[] lines) { + StringBuilder b = new StringBuilder(); + for (String s : lines) { + b.append(s); + b.append('\n'); + } + return b.toString(); + } } |