package edu.stanford.nlp.classify; import java.io.BufferedReader; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.PrintStream; import java.util.ArrayList; import java.util.List; import edu.stanford.nlp.io.IOUtils; import junit.framework.TestCase; /** * This is a really rough ColumnDataClassifierITest. * * It works by calling the main method of ColumnDataClassifier * directly with various args, capturing the stdout, and comparing * it to the expected stdout for those commands. * * This expects the output to be exactly the same, which means that if * numbers change (which can happen for various reasons) the test will * fail and no one will look at this comment to figure out why. * * If the only problem is that the numbers are slightly different, you * can always just check the new output of the CDC commands and update * the gold data files if the changed numbers still look reasonable. * It is easy enough to figure out what the command line to run * is... just use the args in the various test cases as the command * line flags. * * See more/.../ColumnDataClassifierITest2.java for more testing fun. * * @author John Bauer */ public class ColumnDataClassifierITest extends TestCase { public static void runAndTestCDC(String goldFileName, String ... args) throws IOException { PrintStream oldOut = System.out; PrintStream oldErr = System.err; ByteArrayOutputStream outStream = new ByteArrayOutputStream(); ByteArrayOutputStream errStream = new ByteArrayOutputStream(); PrintStream outPrint = new PrintStream(outStream); PrintStream errPrint = new PrintStream(errStream); System.setOut(outPrint); System.setErr(errPrint); ColumnDataClassifier.main(args); System.setOut(oldOut); System.setErr(oldErr); BufferedReader goldFile = IOUtils.readerFromString(goldFileName); List<String> lines = new ArrayList<>(); for (String line; (line = goldFile.readLine()) != null; ) { lines.add(line.trim().replaceAll("\\s+", " ")); } String[] result = outStream.toString().trim().split("\n"); assertEquals(lines.size(), result.length); for (int i = 0; i < result.length; ++i) { String goldLine = lines.get(i); String resultLine = result[i].trim().replaceAll("\\s+", " "); assertEquals(goldLine, resultLine); } } public void testNoArgClassify() throws IOException { runAndTestCDC("projects/core/data/edu/stanford/nlp/classify/iris.gold", "-prop", "projects/core/data/edu/stanford/nlp/classify/iris.prop"); } }