// Copyright (C) 2003-2009 by Object Mentor, Inc. All rights reserved. // Released under the terms of the CPL Common Public License version 1.0. package fitnesse.slimTables; import static org.junit.Assert.assertEquals; import static util.ListUtility.list; import java.util.ArrayList; import java.util.List; import java.util.Map; import org.junit.Before; import org.junit.Test; import fitnesse.responders.run.slimResponder.MockSlimTestContext; import fitnesse.slim.SlimClient; import fitnesse.wiki.InMemoryPage; import fitnesse.wiki.WikiPage; import fitnesse.wiki.WikiPageUtil; public class TableTableTest { private WikiPage root; private List<Object> instructions; private final String tableTableHeader = "|Table:fixture|argument|\n"; public TableTable tt; private MockSlimTestContext testContext; @Before public void setUp() throws Exception { root = InMemoryPage.makeRoot("root"); instructions = new ArrayList<Object>(); } private TableTable makeTableTableAndBuildInstructions(String pageContents) throws Exception { tt = makeTableTable(pageContents); tt.appendInstructions(instructions); return tt; } private TableTable makeTableTable(String tableText) throws Exception { WikiPageUtil.setPageContents(root, tableText); TableScanner ts = new HtmlTableScanner(root.getData().getHtml()); Table t = ts.getTable(0); testContext = new MockSlimTestContext(); return new TableTable(t, "id", testContext); } private void assertTableResults(String tableRows, List<Object> tableResults, String table) throws Exception { makeTableTableAndBuildInstructions(tableTableHeader + tableRows); Map<String, Object> pseudoResults = SlimClient.resultToMap( list( list("tableTable_id_0", "OK"), list("tableTable_id_1", tableResults) ) ); testContext.evaluateExpectations(pseudoResults); tt.evaluateReturnValues(pseudoResults); assertEquals(table, tt.getTable().toString()); } @Test public void instructionsForEmptyTableTable() throws Exception { makeTableTableAndBuildInstructions(tableTableHeader); List<Object> expectedInstructions = list( list("tableTable_id_0", "make", "tableTable_id", "fixture", "argument"), list("tableTable_id_1", "call", "tableTable_id", "doTable", list()) ); assertEquals(expectedInstructions, instructions); } @Test public void instructionsForTableTable() throws Exception { makeTableTableAndBuildInstructions(tableTableHeader + "|a|b|\n|x|y|\n"); List<Object> expectedInstructions = list( list("tableTable_id_0", "make", "tableTable_id", "fixture", "argument"), list("tableTable_id_1", "call", "tableTable_id", "doTable", list(list("a", "b"), list("x", "y"))) ); assertEquals(expectedInstructions, instructions); } @Test public void oneRowThatPassesUnchanged() throws Exception { assertTableResults("|2|4|\n", list( list("pass", "pass") ), "[[pass(Table:fixture), argument], [pass(2), pass(4)]]" ); } @Test public void oneRowThatPassesChanged() throws Exception { assertTableResults("|2|4|\n", list( list("pass:x", "pass:y") ), "[[pass(Table:fixture), argument], [pass(x), pass(y)]]" ); } @Test public void oneRowThatPassesWithManyColons() throws Exception { assertTableResults("|2|4|\n", list( list("pass:x:z", "pass:http://me") ), "[[pass(Table:fixture), argument], [pass(x:z), pass(http://me)]]" ); } @Test public void oneRowThatImplicitlyFails() throws Exception { assertTableResults("|2|4|\n", list( list("bad", "boy") ), "[[pass(Table:fixture), argument], [fail(bad), fail(boy)]]" ); } @Test public void oneRowThatImplicitlyFailsWithColon() throws Exception { assertTableResults("|2|4|\n", list( list("x:bad", "x:boy") ), "[[pass(Table:fixture), argument], [fail(x:bad), fail(x:boy)]]" ); } @Test public void oneRowThatExplicitlyFails() throws Exception { assertTableResults("|2|4|\n", list( list("fail:bad", "fail:boy") ), "[[pass(Table:fixture), argument], [fail(bad), fail(boy)]]" ); } @Test public void oneRowThatExplicitlyFailsNoChange() throws Exception { assertTableResults("|2|4|\n", list( list("fail", "fail") ), "[[pass(Table:fixture), argument], [fail(2), fail(4)]]" ); } @Test public void oneRowThatExplicitlyIgnoresNoChange() throws Exception { assertTableResults("|2|4|\n", list( list("ignore", "ignore") ), "[[pass(Table:fixture), argument], [ignore(2), ignore(4)]]" ); } @Test public void oneRowThatExplicitlyIgnoresWithChange() throws Exception { assertTableResults("|2|4|\n", list( list("ignore:x", "ignore:y") ), "[[pass(Table:fixture), argument], [ignore(x), ignore(y)]]" ); } @Test public void oneRowThatReports() throws Exception { assertTableResults("|2|4|\n", list( list("report:x", "report:y") ), "[[pass(Table:fixture), argument], [x, y]]" ); } @Test public void noChange() throws Exception { assertTableResults("|2|4|\n", list( list("no change", "no change") ), "[[pass(Table:fixture), argument], [2, 4]]" ); } @Test public void blankNoChange() throws Exception { assertTableResults("|2|4|\n", list( list("", "") ), "[[pass(Table:fixture), argument], [2, 4]]" ); } @Test public void error() throws Exception { assertTableResults("|2|4|\n", list( list("error:myError", "error:anError") ), "[[pass(Table:fixture), argument], [error(myError), error(anError)]]" ); } @Test public void surplusErrors() throws Exception { assertTableResults("|2|4|\n", list( list("", "", "error:surplus A"), list("error:surplus B", "error:surplus C") ), "[[pass(Table:fixture), argument], [2, 4, error(surplus A)], [error(surplus B), error(surplus C)]]" ); } @Test public void surplusFailures() throws Exception { assertTableResults("|2|4|\n", list( list("", "", "fail:surplus A"), list("fail:surplus B", "fail:surplus C") ), "[[pass(Table:fixture), argument], [2, 4, fail(surplus A)], [fail(surplus B), fail(surplus C)]]" ); } @Test public void surplusImplicitFailures() throws Exception { assertTableResults("|2|4|\n", list( list("", "", "fail"), list("fail", "fail") ), "[[pass(Table:fixture), argument], [2, 4, fail(fail)], [fail(fail), fail(fail)]]" ); } @Test public void surplusImplicitPasses() throws Exception { assertTableResults("|2|4|\n", list( list("", "", "pass"), list("pass", "pass") ), "[[pass(Table:fixture), argument], [2, 4, pass(pass)], [pass(pass), pass(pass)]]" ); } @Test public void surplusExplicitPasses() throws Exception { assertTableResults("|2|4|\n", list( list("", "", "pass:x"), list("pass:y", "pass:z") ), "[[pass(Table:fixture), argument], [2, 4, pass(x)], [pass(y), pass(z)]]" ); } @Test public void emptyTableWithResults() throws Exception { assertTableResults("", list( list("", "pass:x"), list("pass:y", "pass:z") ), "[[pass(Table:fixture), argument], [, pass(x)], [pass(y), pass(z)]]" ); } @Test public void tableWithSymbols() throws Exception { makeTableTableAndBuildInstructions(tableTableHeader + "|$X|$X|\n"); tt.setSymbol("X", "value"); Map<String, Object> pseudoResults = SlimClient.resultToMap( list( list("tableTable_id_0", "OK"), list("tableTable_id_1", list( list("pass", "fail") )) ) ); testContext.evaluateExpectations(pseudoResults); tt.evaluateReturnValues(pseudoResults); assertEquals("[[pass(Table:fixture), argument], [pass($X->[value]), fail($X->[value])]]", tt.getTable().toString()); } @Test public void tableMethodReturnsNull() throws Exception { assertTableResults("|2|4|\n", null, "[[pass(Table:fixture), argument ignore(Test not run)], [2, 4]]" ); } @Test public void tableMethodThrowsException() throws Exception { makeTableTableAndBuildInstructions(tableTableHeader + "|2|4|\n"); Map<String, Object> pseudoResults = SlimClient.resultToMap( list( list("tableTable_id_0", "OK"), list("tableTable_id_1", "Exception: except") ) ); testContext.evaluateExpectations(pseudoResults); tt.evaluateReturnValues(pseudoResults); assertEquals("[[pass(Table:fixture)error(Exception: except), argument], [2, 4]]", tt.getTable().toString()); } }