package com.occamlab.te;
import static org.junit.Assert.*;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.PrintStream;
import java.net.URL;
import java.net.URLConnection;
import org.junit.BeforeClass;
import org.junit.Test;
import org.w3c.dom.Element;
import com.occamlab.te.index.Index;
import com.occamlab.te.index.SuiteEntry;
import com.occamlab.te.index.TestEntry;
public class TECoreTest {
static Engine engine;
static Index index;
static RuntimeOptions runOpts;
@BeforeClass
public static void setupFixture() throws Exception {
engine = new Engine();
index = new Index();
runOpts = new RuntimeOptions();
runOpts.setLogDir(null);
}
@Test
public void parseXmlWithNullInstruction() throws Throwable {
URL url = this.getClass().getResource("/article.xml");
URLConnection urlConn = url.openConnection();
TECore iut = new TECore(engine, index, runOpts);
Element result = iut.parse(urlConn, null);
Element content = (Element) result.getElementsByTagName("content")
.item(0);
assertNotNull("Expected content element.", content);
assertTrue("Expected XML content ", content.hasChildNodes());
}
@Test
public void parseTextWithNullInstruction() throws Throwable {
URL url = this.getClass().getResource("/jabberwocky.txt");
URLConnection urlConn = url.openConnection();
TECore iut = new TECore(engine, index, runOpts);
Element result = iut.parse(urlConn, null);
Element content = (Element) result.getElementsByTagName("content")
.item(0);
assertNotNull("Expected content element.", content);
assertTrue("Expected text content starting with 'Twas brillig", content
.getTextContent().startsWith("'Twas brillig"));
}
private Index getTestIndex(File ctlFile) throws Throwable {
assertTrue(ctlFile.exists());
SetupOptions setupOptions = new SetupOptions();
setupOptions.addSource(ctlFile);
Index testIndex = Generator.generateXsl(setupOptions);
assertNotNull(testIndex);
return testIndex;
}
private void assertTestResult(Index index, String testName, int expectedResult) throws Throwable {
TestEntry test = index.getTest(testName);
assertNotNull(test);
assertEquals(expectedResult, test.getResult());
}
@Test
public void testNestedFailure() throws Throwable {
ByteArrayOutputStream outCapture = new ByteArrayOutputStream();
PrintStream origPrintStream = System.out;
System.setOut(new PrintStream(outCapture));
Index testIndex = getTestIndex(new File("src/test/resources/ctl/nested-failure.xml"));
TECore teCore = new TECore(engine, testIndex, runOpts);
assertNotNull(teCore);
try {
teCore.execute();
} finally {
System.setOut(origPrintStream);
}
String output = outCapture.toString();
System.out.print(output);
// Check result of starting test directly since the value of the
// verdict instance variable probably corresponds to some subtest.
TestEntry startingTest = teCore.testStack.getFirst();
assertEquals(TECore.MSG_INHERITED_FAILURE,
TECore.getResultDescription(startingTest.getResult()));
SuiteEntry testSuite = teCore.getIndex().getSuite("test:suite");
assertNotNull(testSuite);
TestEntry mainTest = teCore.getIndex().getTest(testSuite.getStartingTest());
assertNotNull(mainTest);
// Starting test verdict is set by failing subtest(s)
assertEquals(TECore.INHERITED_FAILURE, mainTest.getResult());
assertTestResult(teCore.getIndex(), "testA", TECore.INHERITED_FAILURE);
assertTestResult(teCore.getIndex(), "testB", TECore.PASS);
assertTestResult(teCore.getIndex(), "testA1", TECore.PASS);
assertTestResult(teCore.getIndex(), "testA2", TECore.FAIL);
assertTestResult(teCore.getIndex(), "testA3", TECore.PASS);
assertTestResult(teCore.getIndex(), "testB1", TECore.PASS);
assertTestResult(teCore.getIndex(), "testB2", TECore.PASS);
assertTestResult(teCore.getIndex(), "testB3", TECore.PASS);
//also verify the output messages
verifyOutputContainsResult(output, "suite", TECore.FAIL);
verifyOutputContainsResult(output, "test:main", TECore.INHERITED_FAILURE);
verifyOutputContainsResult(output, "test:testA", TECore.INHERITED_FAILURE);
verifyOutputContainsResult(output, "test:testB", TECore.PASS);
verifyOutputContainsResult(output, "test:testA1", TECore.PASS);
verifyOutputContainsResult(output, "test:testA2", TECore.FAIL);
verifyOutputContainsResult(output, "test:testA3", TECore.PASS);
verifyOutputContainsResult(output, "test:testB1", TECore.PASS);
verifyOutputContainsResult(output, "test:testB2", TECore.PASS);
verifyOutputContainsResult(output, "test:testB3", TECore.PASS);
}
private void verifyOutputContainsResult(String output, String target, int result) {
String expectedResult = TECore.getResultDescription(result);
assertTrue(target + " didn't have result " + expectedResult,
output.contains(target + " " + TECore.getResultDescription(result)));
}
}