// 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 fitnesse.responders.run.slimResponder.MockSlimTestContext;
import fitnesse.slim.SlimClient;
import fitnesse.slim.converters.VoidConverter;
import fitnesse.wiki.InMemoryPage;
import fitnesse.wiki.WikiPage;
import fitnesse.wiki.WikiPageUtil;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import org.junit.Before;
import org.junit.Test;
import static util.ListUtility.list;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class DecisionTableTest {
private WikiPage root;
private List<Object> instructions;
private final String simpleDecisionTable =
"|DT:fixture|argument|\n" +
"|var|func?|\n" +
"|3|5|\n" +
"|7|9|\n";
private DecisionTable decisionTable;
private MockSlimTestContext testContext;
@Before
public void setUp() throws Exception {
root = InMemoryPage.makeRoot("root");
instructions = new ArrayList<Object>();
testContext = new MockSlimTestContext();
}
private DecisionTable makeDecisionTableAndBuildInstructions(String tableText) throws Exception {
decisionTable = makeDecisionTable(tableText);
decisionTable.appendInstructions(instructions);
return decisionTable;
}
private DecisionTable makeDecisionTable(String tableText) throws Exception {
WikiPageUtil.setPageContents(root, tableText);
TableScanner ts = new HtmlTableScanner(root.getData().getHtml());
Table t = ts.getTable(0);
return new DecisionTable(t, "id", testContext);
}
@Test
public void aDecisionTableWithOnlyTwoRowsIsBad() throws Exception {
assertTableIsBad(makeDecisionTableWithTwoRows());
}
private void assertTableIsBad(DecisionTable decisionTable) {
assertTrue(firstCellOfTable(decisionTable).contains("Bad table"));
}
private String firstCellOfTable(DecisionTable decisionTable) {
return decisionTable.getTable().getCellContents(0, 0);
}
private DecisionTable makeDecisionTableWithTwoRows() throws Exception {
return makeDecisionTableAndBuildInstructions("|x|\n|y|\n");
}
@Test
public void wrongNumberOfColumns() throws Exception {
DecisionTable aDecisionTable = makeDecisionTableAndBuildInstructions(
"|DT:fixture|argument|\n" +
"|var|var2|\n" +
"|3|\n" +
"|7|9|\n"
);
assertTableIsBad(aDecisionTable);
}
@Test
public void decisionTableCanBeConstructorOnly() throws Exception {
makeDecisionTableAndBuildInstructions("|fixture|argument|\n");
List<Object> expectedInstructions = list(
list("decisionTable_id_0", "make", "decisionTable_id", "fixture", "argument"),
list("decisionTable_id_1", "call", "decisionTable_id", "table", list())
);
assertEquals(expectedInstructions, instructions);
Map<String, Object> pseudoResults = SlimClient.resultToMap(
list(
list("decisionTable_id_0", "OK"),
list("decisionTable_id_1", "OK")
)
);
testContext.evaluateExpectations(pseudoResults);
String colorizedTable = decisionTable.getTable().toString();
String expectedColorizedTable =
"[[pass(fixture), argument]]";
assertEquals(expectedColorizedTable, colorizedTable);
}
@Test
public void canBuildInstructionsForSimpleDecisionTable() throws Exception {
makeDecisionTableAndBuildInstructions(simpleDecisionTable);
int n = 0;
List<Object> expectedInstructions = list(
list(id(n++), "make", "decisionTable_id", "fixture", "argument"),
list(id(n++), "call", "decisionTable_id", "table", list(list("var", "func?"), list("3", "5"), list("7", "9"))),
list(id(n++), "call", "decisionTable_id", "beginTable"),
list(id(n++), "call", "decisionTable_id", "reset"),
list(id(n++), "call", "decisionTable_id", "setVar", "3"),
list(id(n++), "call", "decisionTable_id", "execute"),
list(id(n++), "call", "decisionTable_id", "func"),
list(id(n++), "call", "decisionTable_id", "reset"),
list(id(n++), "call", "decisionTable_id", "setVar", "7"),
list(id(n++), "call", "decisionTable_id", "execute"),
list(id(n++), "call", "decisionTable_id", "func"),
list(id(n++), "call", "decisionTable_id", "endTable")
);
assertEquals(expectedInstructions.toString(), instructions.toString());
}
private String id(int n) {
return "decisionTable_id_"+n;
}
@Test
public void canUseBangToCallFunction() throws Exception {
makeDecisionTableAndBuildInstructions(
"|DT:fixture|argument|\n" +
"|var|func!|\n" +
"|3|5|\n" +
"|7|9|\n");
int n=0;
List<Object> expectedInstructions = list(
list(id(n++), "make", "decisionTable_id", "fixture", "argument"),
list(id(n++), "call", "decisionTable_id", "table", list(list("var", "func!"), list("3", "5"), list("7", "9"))),
list(id(n++), "call", "decisionTable_id", "beginTable"),
list(id(n++), "call", "decisionTable_id", "reset"),
list(id(n++), "call", "decisionTable_id", "setVar", "3"),
list(id(n++), "call", "decisionTable_id", "execute"),
list(id(n++), "call", "decisionTable_id", "func"),
list(id(n++), "call", "decisionTable_id", "reset"),
list(id(n++), "call", "decisionTable_id", "setVar", "7"),
list(id(n++), "call", "decisionTable_id", "execute"),
list(id(n++), "call", "decisionTable_id", "func"),
list(id(n++), "call", "decisionTable_id", "endTable")
);
assertEquals(expectedInstructions.toString(), instructions.toString());
}
@SuppressWarnings("unchecked")
@Test
public void settersAreFirstFunnctionsAreLastLeftToRight() throws Exception {
int counter = 0;
Map<String, Integer> counters = new HashMap<String, Integer>();
String functionsInOrder[] = {"setA", "setB", "setC", "setD", "setE", "setF", "fa", "fb", "fc", "fd", "fe", "ff"};
makeDecisionTableAndBuildInstructions("|DT:fixture|\n" +
"|a|fa?|b|fb?|c|fc?|d|e|f|fd?|fe?|ff?|\n" +
"|a|a|b|b|c|c|d|e|f|d|e|f|\n");
for (Object instructionObject : instructions) {
List<Object> instruction = (List<Object>) instructionObject;
for (String function : functionsInOrder) {
if (function.equals(instruction.get(3)))
counters.put(function, counter++);
}
}
assertEquals(functionsInOrder.length, counters.size());
for (int i=0; i<functionsInOrder.length; i++)
assertEquals(functionsInOrder[i], i, (int)counters.get(functionsInOrder[i]));
}
@Test
public void canBuildInstructionsForTableWithVariables() throws Exception {
makeDecisionTableAndBuildInstructions(
"|DT:fixture|\n" +
"|var|func?|\n" +
"|3|$V=|\n" +
"|$V|9|\n"
);
int n=0;
List<Object> expectedInstructions = list(
list(id(n++), "make", "decisionTable_id", "fixture"),
list(id(n++), "call", "decisionTable_id", "table", list(list("var", "func?"), list("3", "$V="), list("$V", "9"))),
list(id(n++), "call", "decisionTable_id", "beginTable"),
list(id(n++), "call", "decisionTable_id", "reset"),
list(id(n++), "call", "decisionTable_id", "setVar", "3"),
list(id(n++), "call", "decisionTable_id", "execute"),
list(id(n++), "callAndAssign", "V", "decisionTable_id", "func"),
list(id(n++), "call", "decisionTable_id", "reset"),
list(id(n++), "call", "decisionTable_id", "setVar", "$V"),
list(id(n++), "call", "decisionTable_id", "execute"),
list(id(n++), "call", "decisionTable_id", "func"),
list(id(n++), "call", "decisionTable_id", "endTable")
);
assertEquals(expectedInstructions.toString(), instructions.toString());
}
@Test
public void canEvaluateReturnValuesAndColorizeTable() throws Exception {
DecisionTable dt = makeDecisionTableAndBuildInstructions(simpleDecisionTable);
int n=0;
Map<String, Object> pseudoResults = SlimClient.resultToMap(
list(
list(id(n++), "OK"),
list(id(n++), VoidConverter.VOID_TAG),
list(id(n++), VoidConverter.VOID_TAG), // beginTable
list(id(n++), VoidConverter.VOID_TAG), //reset
list(id(n++), VoidConverter.VOID_TAG), //set
list(id(n++), VoidConverter.VOID_TAG), //execute
list(id(n++), "5"),
list(id(n++), VoidConverter.VOID_TAG),
list(id(n++), VoidConverter.VOID_TAG),
list(id(n++), VoidConverter.VOID_TAG),
list(id(n++), "5"),
list(id(n++), VoidConverter.VOID_TAG) //endTable
)
);
testContext.evaluateExpectations(pseudoResults);
String colorizedTable = dt.getTable().toString();
String expectedColorizedTable =
"[" +
"[pass(DT:fixture), argument], " +
"[var, func?], " +
"[3, pass(5)], " +
"[7, [5] fail(expected [9])]" +
"]";
assertEquals(expectedColorizedTable, colorizedTable);
}
@Test
public void translatesTestTablesIntoLiteralTables() throws Exception {
DecisionTable dt = makeDecisionTableAndBuildInstructions("!" + simpleDecisionTable);
int n=0;
Map<String, Object> pseudoResults = SlimClient.resultToMap(
list(
list(id(n++), "OK"),
list(id(n++), VoidConverter.VOID_TAG),
list(id(n++), VoidConverter.VOID_TAG), //beginTable
list(id(n++), VoidConverter.VOID_TAG), //reset
list(id(n++), VoidConverter.VOID_TAG), //set
list(id(n++), VoidConverter.VOID_TAG), //execute
list(id(n++), "5"),
list(id(n++), VoidConverter.VOID_TAG),
list(id(n++), VoidConverter.VOID_TAG),
list(id(n++), VoidConverter.VOID_TAG),
list(id(n++), "5"),
list(id(n++), VoidConverter.VOID_TAG) //endTable
)
);
testContext.evaluateExpectations(pseudoResults);
String colorizedTable = dt.getTable().toString();
String expectedColorizedTable =
"[" +
"[pass(DT:fixture), argument], " +
"[var, func?], " +
"[3, pass(5)], " +
"[7, [5] fail(expected [9])]" +
"]";
assertEquals(expectedColorizedTable, colorizedTable);
}
@Test
public void usesDisgracedClassNames() throws Exception {
makeDecisionTableAndBuildInstructions(
"|DT:slim test|\n" +
"|x|\n" +
"|y|\n"
);
List<String> makeInstruction = list("decisionTable_id_0", "make", "decisionTable_id", "SlimTest");
assertEquals(makeInstruction, instructions.get(0));
}
@Test
public void usesDisgracedMethodNames() throws Exception {
makeDecisionTableAndBuildInstructions(
"|DT:fixture|\n" +
"|my var|my func?|\n" +
"|8|7|\n"
);
List<String> setInstruction = list("decisionTable_id_4", "call", "decisionTable_id", "setMyVar", "8");
List<String> callInstruction = list("decisionTable_id_6", "call", "decisionTable_id", "myFunc");
assertEquals(setInstruction, instructions.get(4));
assertEquals(callInstruction, instructions.get(6));
}
}