package fitnesse.responders.testHistory;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static util.RegexTestCase.assertSubString;
import java.io.StringWriter;
import java.io.Writer;
import java.util.ArrayList;
import org.apache.velocity.app.VelocityEngine;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import util.FileUtil;
import fitnesse.FitNesseContext;
import fitnesse.responders.run.TestExecutionReport;
import fitnesse.testutil.FitNesseUtil;
import fitnesse.wiki.InMemoryPage;
import fitnesse.wiki.PageCrawler;
import fitnesse.wiki.PageData;
import fitnesse.wiki.PathParser;
import fitnesse.wiki.WikiPage;
public class HistoryComparerTest {
private HistoryComparer comparer;
public FitNesseContext context;
public WikiPage root;
public String firstContent;
public String secondContent;
@Before
public void setUp() throws Exception {
comparer = new HistoryComparer() {
public String getFileContent(String filePath) {
if (filePath.equals("TestFolder/FileOne"))
return "this is file one";
else if (filePath.equals("TestFolder/FileTwo"))
return "this is file two";
else
return null;
}
};
context = FitNesseUtil.makeTestContext(root);
root = InMemoryPage.makeRoot("RooT");
firstContent = getContentWith("pass");
secondContent = getContentWith("fail");
comparer.resultContent = new ArrayList<String>();
comparer.firstTableResults = new ArrayList<String>();
comparer.secondTableResults = new ArrayList<String>();
comparer.matchedTables = new ArrayList<HistoryComparer.MatchedPair>();
}
@Test
public void shouldBeAbleToHandleANonexistentFile() throws Exception {
//todo this just tests the mock, not the actual comparer.
String content = comparer.getFileContent("TestFolder/TestFile");
assertNull(content);
}
@Test
public void shouldBeAbleToGrabTwoFilesToBeCompared() throws Exception {
FileUtil.createFile("TestFolder/FileOne", "this is file one");
FileUtil.createFile("TestFolder/FileTwo", "this is file two");
comparer.compare("TestFolder/FileOne", "TestFolder/FileTwo");
assertEquals("this is file one", comparer.firstFileContent);
assertEquals("this is file two", comparer.secondFileContent);
FileUtil.deleteFileSystemDirectory("TestFolder");
}
@Test
public void shouldKnowIfTheTwoFilesAreTheSameFile() throws Exception {
FileUtil.createFile("TestFolder/FileOne", "this is file one");
boolean compareWorked = comparer.compare("TestFolder/FileOne", "TestFolder/FileOne");
assertFalse(compareWorked);
FileUtil.deleteFileSystemDirectory("TestFolder");
}
@Test
public void shouldCompareTwoSetsOfTables() throws Exception {
comparer.firstFileContent = "<table><tr><td>x</td></tr></table><table><tr><td>y</td></tr></table>";
comparer.secondFileContent = "<table><tr><td>x</td></tr></table><table><tr><td>y</td></tr></table>";
assertTrue(comparer.grabAndCompareTablesFromHtml());
assertEquals(2, comparer.getResultContent().size());
assertEquals("pass", comparer.getResultContent().get(0));
assertEquals("pass", comparer.getResultContent().get(1));
}
@Test
public void shouldCompareUnevenAmountsOfTables() throws Exception {
comparer.firstFileContent = "<table><tr><td>x</td></tr></table><table><tr><td>y</td></tr></table>";
comparer.secondFileContent = "<table><tr><td>x</td></tr></table>";
assertTrue(comparer.grabAndCompareTablesFromHtml());
assertEquals(2, comparer.resultContent.size());
assertEquals("pass", comparer.resultContent.get(0));
assertEquals("fail", comparer.resultContent.get(1));
}
@Test
public void findMatchScoreByFirstIndex() throws Exception {
comparer.matchedTables.add(new HistoryComparer.MatchedPair(1, 2, 1.1));
comparer.matchedTables.add(new HistoryComparer.MatchedPair(3, 4, 1.0));
assertEquals(1.1,comparer.findScoreByFirstTableIndex(1),.0001);
assertEquals(1.0,comparer.findScoreByFirstTableIndex(3),.0001);
}
@Test
public void shouldBeAbleToFindMatchScoreByFirstIndexAndReturnAPercentString() throws Exception {
comparer.matchedTables.add(new HistoryComparer.MatchedPair(1, 2, 1.1));
comparer.matchedTables.add(new HistoryComparer.MatchedPair(3, 4, 1.0));
assertSubString("91.67",comparer.findScoreByFirstTableIndexAsStringAsPercent(1));
assertSubString("83.33",comparer.findScoreByFirstTableIndexAsStringAsPercent(3));
}
@Test
public void shouldBeAbleToTellIfTableListsWereACompleteMatch() throws Exception {
assertFalse(comparer.allTablesMatch());
comparer.firstTableResults.add("A");
comparer.firstTableResults.add("B");
comparer.secondTableResults.add("A");
comparer.secondTableResults.add("B");
comparer.matchedTables.add(new HistoryComparer.MatchedPair(0, 0, HistoryComparer.MAX_MATCH_SCORE));
comparer.matchedTables.add(new HistoryComparer.MatchedPair(1, 1, 1.0));
assertFalse(comparer.allTablesMatch());
comparer.matchedTables.remove(new HistoryComparer.MatchedPair(1, 1, 1.0));
comparer.matchedTables.add(new HistoryComparer.MatchedPair(1, 1, HistoryComparer.MAX_MATCH_SCORE));
assertTrue(comparer.allTablesMatch());
comparer.firstTableResults.add("C");
assertFalse(comparer.allTablesMatch());
}
@Test
public void shouldBeAbleToLineUpMisMatchedTables() throws Exception {
comparer.firstTableResults.add("A");
comparer.firstTableResults.add("B");
comparer.firstTableResults.add("C");
comparer.firstTableResults.add("D");
comparer.secondTableResults.add("X");
comparer.secondTableResults.add("Y");
comparer.secondTableResults.add("B");
comparer.secondTableResults.add("Z");
comparer.secondTableResults.add("D");
comparer.matchedTables.add(new HistoryComparer.MatchedPair(1, 2, 1.0));
comparer.matchedTables.add(new HistoryComparer.MatchedPair(3, 4, 1.0));
comparer.lineUpTheTables();
assertEquals("A", comparer.firstTableResults.get(0));
assertEquals("<table><tr><td></td></tr></table>", comparer.firstTableResults.get(1));
assertEquals("B", comparer.firstTableResults.get(2));
assertEquals("D", comparer.firstTableResults.get(4));
assertEquals("X", comparer.secondTableResults.get(0));
assertEquals("D", comparer.secondTableResults.get(4));
}
@Test
public void shouldBeAbleToLineUpMoreMisMatchedTables() throws Exception {
comparer.firstTableResults.add("A");
comparer.firstTableResults.add("B");
comparer.firstTableResults.add("C");
comparer.firstTableResults.add("D");
comparer.secondTableResults.add("B");
comparer.secondTableResults.add("X");
comparer.secondTableResults.add("Y");
comparer.secondTableResults.add("Z");
comparer.secondTableResults.add("D");
comparer.secondTableResults.add("shouldMatchWithBlank");
comparer.matchedTables.add(new HistoryComparer.MatchedPair(1, 0, 1.0));
comparer.matchedTables.add(new HistoryComparer.MatchedPair(3, 4, 1.0));
comparer.lineUpTheTables();
assertEquals("A", comparer.firstTableResults.get(0));
assertEquals("B", comparer.firstTableResults.get(1));
assertEquals("<table><tr><td></td></tr></table>", comparer.firstTableResults.get(3));
assertEquals("<table><tr><td></td></tr></table>", comparer.firstTableResults.get(4));
assertEquals("D", comparer.firstTableResults.get(5));
assertEquals("<table><tr><td></td></tr></table>", comparer.firstTableResults.get(6));
assertEquals("<table><tr><td></td></tr></table>", comparer.secondTableResults.get(0));
assertEquals("B", comparer.secondTableResults.get(1));
assertEquals("Y", comparer.secondTableResults.get(3));
assertEquals("Z", comparer.secondTableResults.get(4));
assertEquals("D", comparer.secondTableResults.get(5));
assertEquals("shouldMatchWithBlank", comparer.secondTableResults.get(6));
}
@Test
public void shouldGuarenteeThatBothResultFilesAreTheSameLength() throws Exception {
comparer.firstTableResults.add("A");
comparer.firstTableResults.add("B");
comparer.firstTableResults.add("C");
comparer.firstTableResults.add("D");
comparer.secondTableResults.add("X");
comparer.secondTableResults.add("Y");
comparer.lineUpTheTables();
assertEquals(comparer.firstTableResults.size(), comparer.secondTableResults.size());
assertEquals("<table><tr><td></td></tr></table>", comparer.secondTableResults.get(2));
assertEquals("<table><tr><td></td></tr></table>", comparer.secondTableResults.get(3));
}
@Test
public void shouldAddBlankRowsForUnmatchedTables() throws Exception {
comparer.firstTableResults.add("A");
comparer.firstTableResults.add("B");
comparer.firstTableResults.add("C");
comparer.firstTableResults.add("D");
comparer.secondTableResults.add("X");
comparer.secondTableResults.add("B");
comparer.secondTableResults.add("Y");
comparer.matchedTables.add(new HistoryComparer.MatchedPair(1, 1, 1.0));
comparer.lineUpTheTables();
comparer.addBlanksToUnmatchingRows();
assertEquals(comparer.firstTableResults.size(), comparer.secondTableResults.size());
assertEquals("A", comparer.firstTableResults.get(0));
assertEquals("<table><tr><td></td></tr></table>", comparer.firstTableResults.get(1));
assertEquals("B", comparer.firstTableResults.get(2));
assertEquals("C", comparer.firstTableResults.get(3));
assertEquals("<table><tr><td></td></tr></table>", comparer.firstTableResults.get(4));
assertEquals("D", comparer.firstTableResults.get(5));
assertEquals("<table><tr><td></td></tr></table>", comparer.secondTableResults.get(0));
assertEquals("X", comparer.secondTableResults.get(1));
assertEquals("B", comparer.secondTableResults.get(2));
assertEquals("<table><tr><td></td></tr></table>", comparer.secondTableResults.get(3));
assertEquals("Y", comparer.secondTableResults.get(4));
assertEquals("<table><tr><td></td></tr></table>", comparer.secondTableResults.get(5));
}
@Test
public void shouldHaveCorrectPassFailResults() throws Exception {
comparer.firstTableResults.add("A");
comparer.firstTableResults.add("B");
comparer.firstTableResults.add("C");
comparer.firstTableResults.add("D");
comparer.secondTableResults.add("X");
comparer.secondTableResults.add("B");
comparer.secondTableResults.add("Y");
comparer.secondTableResults.add("D");
comparer.matchedTables.add(new HistoryComparer.MatchedPair(1, 1, HistoryComparer.MAX_MATCH_SCORE));
comparer.matchedTables.add(new HistoryComparer.MatchedPair(3, 3, HistoryComparer.MAX_MATCH_SCORE));
comparer.lineUpTheTables();
comparer.addBlanksToUnmatchingRows();
comparer.makePassFailResultsFromMatches();
assertEquals("fail", comparer.resultContent.get(0));
assertEquals("fail", comparer.resultContent.get(1));
assertEquals("pass", comparer.resultContent.get(2));
assertEquals("fail", comparer.resultContent.get(3));
assertEquals("fail", comparer.resultContent.get(4));
assertEquals("pass", comparer.resultContent.get(5));
}
@Test
public void compareShouldGetReportHtmlAndSetResultContentWithPassIfTheFilesWereTheSame() throws Exception {
HistoryComparer comparer = new HistoryComparer();
FileUtil.createFile("TestFolder/FirstFile", firstContent);
FileUtil.createFile("TestFolder/SecondFile", firstContent);
boolean worked = comparer.compare("TestFolder/FirstFile", "TestFolder/SecondFile");
assertTrue(worked);
String expectedResult = "pass";
assertEquals(expectedResult, HistoryComparer.resultContent.get(0));
assertEquals(expectedResult, HistoryComparer.resultContent.get(1));
}
@Test
public void compareShouldGetReportFileHtmlAndSetResultContentWithFailIfTheFilesDiffer() throws Exception {
HistoryComparer comparer = new HistoryComparer();
FileUtil.createFile("TestFolder/FirstFile", firstContent);
FileUtil.createFile("TestFolder/SecondFile", secondContent);
boolean worked = comparer.compare("TestFolder/FirstFile", "TestFolder/SecondFile");
assertTrue(worked);
assertEquals("pass", HistoryComparer.resultContent.get(0));
assertEquals("fail", HistoryComparer.resultContent.get(1));
}
public String generateHtmlFromWiki(String passOrFail) throws Exception {
PageCrawler crawler = root.getPageCrawler();
String pageText =
"|myTable|\n" +
"La la\n" +
"|NewTable|\n" +
"|!style_" + passOrFail + "(a)|b|c|\n" +
"La la la";
WikiPage myPage = crawler.addPage(root, PathParser.parse("MyPage"), pageText);
PageData myData = myPage.getData();
String html = myData.getHtml();
return html;
}
private String getContentWith(String passOrFail) throws Exception {
TestExecutionReport report = new TestExecutionReport();
TestExecutionReport.TestResult result = new TestExecutionReport.TestResult();
result.right = "2";
result.wrong = "0";
result.ignores = "0";
result.exceptions = "0";
result.content = generateHtmlFromWiki(passOrFail);
result.relativePageName = "testPageOne";
report.results.add(result);
Writer writer = new StringWriter();
VelocityEngine engine = context.pageFactory.getVelocityEngine();
report.toXml(writer, engine);
return writer.toString();
}
@After
public void tearDown() {
FileUtil.deleteFileSystemDirectory("TestFolder");
}
}