package fitnesse.slim; import org.junit.Test; import java.util.*; import static org.junit.Assert.*; public class HashWidgetConversionTest extends HashWidgetConversionTestBase { public static class MapConstructor extends MapReceptor { public MapConstructor(Map<String, String> map) { theMap = map; } @Override public boolean setMap(Map<String, String> map) { return false; } } public static class MapReceptor { public Map<String, String> theMap; public boolean setMap(Map<String, String> map) { theMap = map; return true; } public List<Object> query() { return queryAsArrayList(); } public ArrayList<Object> queryAsArrayList() { ArrayList<Object> list = new ArrayList<>(); // Make the test stable by ordering the keys TreeSet<String> orderedKeySet = new TreeSet<>(theMap.keySet()); for (String key : orderedKeySet) { list.add(Arrays.asList(key, theMap.get(key))); } return list; } public Object queryAsObject() { return queryAsArrayList(); } } @Override protected StatementExecutorInterface createStatementExecutor() { return new StatementExecutor(); } @Override protected String mapReceptorClassName() { return MapReceptor.class.getName(); } @Override protected String mapConstructorClassName() { return MapConstructor.class.getName(); } @Test public void methodsReturningExactlyListShouldNotBeConverteredToStrings() throws Exception { String instance1Id = "a"; statementExecutor.create(instance1Id, MapReceptor.class.getName()); assertEquals("true", statementExecutor.call(instance1Id, "setMap", "<table>" + "<tr>" + " <td>name</td>" + " <td>Bob</td>" + "</tr>" + "</table>")); Object respQuery = statementExecutor.call(instance1Id, "query"); assertNotNull(respQuery); assertTrue(respQuery instanceof List); Object respObject = statementExecutor.call(instance1Id, "queryAsObject"); String actualQueryObj = checkStringResponse("queryAsObject()", respObject); assertEquals(respQuery.toString(), actualQueryObj); Object respArrayList = statementExecutor.call(instance1Id, "queryAsArrayList"); String actualArrayList = checkStringResponse("queryAsArrayList()", respArrayList); assertEquals(respQuery.toString(), actualArrayList); } @Test public void fromTableWithNestedTables_shouldCreateMapWithThreeEntries() throws Exception { String instance1Id = "a"; statementExecutor.create(instance1Id, NestedMapSender.class.getName()); String expected = "<table class=\"hash_table\">" + "<tr class=\"hash_row\">" + "<td class=\"hash_key\">address</td>" + "<td class=\"hash_value\">1</td>" + "</tr>" + "<tr class=\"hash_row\">" + "<td class=\"hash_key\">nestedMap</td>" + "<td class=\"hash_value\">" + "<table class=\"hash_table\">" + "<tr class=\"hash_row\">" + "<td class=\"hash_key\">name2</td>" + "<td class=\"hash_value\">Bob2</td>" + "</tr>" + "<tr class=\"hash_row\">" + "<td class=\"hash_key\">address2</td>" + "<td class=\"hash_value\">2</td>" + "</tr>" + "</table>" + "</td>" + "</tr>" + "<tr class=\"hash_row\">" + "<td class=\"hash_key\">name</td>" + "<td class=\"hash_value\">Bob</td>" + "</tr>" + "<tr class=\"hash_row\"><td class=\"hash_key\">list</td><td class=\"hash_value\">[a, b]</td></tr>" + "<tr class=\"hash_row\"><td class=\"hash_key\">nullKey</td><td class=\"hash_value\">null</td></tr>" + "</table>"; Object respMap = statementExecutor.call(instance1Id, "getMap"); String actualMap = checkStringResponse("getMap()", respMap); Object respObject = statementExecutor.call(instance1Id, "getMapAsObject"); String actualObj = checkStringResponse("getMapAsObject()", respObject); Object respLinked = statementExecutor.call(instance1Id, "getLinkedMap"); String actualLinked = checkStringResponse("getLinkedMap()", respLinked); assertEquals(actualMap, actualLinked); assertEquals(actualMap, actualObj); assertEquals(expected, actualMap); } private String checkStringResponse(String method, Object resp) { assertTrue("Other object than String result from " + method + ": " + resp.getClass().getName(), resp instanceof String); return ((String) resp).replace("\r", "").replace("\n", "").replace("\t", ""); } public static class NestedMapSender { public LinkedHashMap<String, Object> theMap = new LinkedHashMap<>(); public NestedMapSender() { theMap.put("address", 1); Map<String, Object> nestedMap = new LinkedHashMap<>(); nestedMap.put("name2", "Bob2"); nestedMap.put("address2", 2); theMap.put("nestedMap", nestedMap); theMap.put("name", "Bob"); theMap.put("list", Arrays.asList("a", "b")); theMap.put("nullKey", null); } public Map<String, Object> getMap() { return theMap; } public Object getMapAsObject() { return theMap; } public LinkedHashMap<String, Object> getLinkedMap() { return theMap; } } }