NIHVIVO-1564 Add sorting to map keys in dump

This commit is contained in:
ryounes 2011-04-15 15:52:18 +00:00
parent 83ac0750b5
commit 6375161d5a
2 changed files with 159 additions and 99 deletions

View file

@ -5,7 +5,6 @@ package freemarker.ext.dump;
import java.io.IOException; import java.io.IOException;
import java.io.StringWriter; import java.io.StringWriter;
import java.io.Writer; import java.io.Writer;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method; import java.lang.reflect.Method;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
@ -13,6 +12,8 @@ import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.SortedMap;
import java.util.TreeMap;
import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log; import org.apache.commons.logging.Log;
@ -253,7 +254,7 @@ public abstract class BaseDumpDirective implements TemplateDirectiveModel {
private Map<String, Object> getMapData(TemplateHashModelEx model) throws TemplateModelException { private Map<String, Object> getMapData(TemplateHashModelEx model) throws TemplateModelException {
Map<String, Object> map = new HashMap<String, Object>(); Map<String, Object> map = new HashMap<String, Object>();
map.put(Key.TYPE.toString(), Type.HASH_EX); map.put(Key.TYPE.toString(), Type.HASH_EX);
Map<String, Object> items = new HashMap<String, Object>(); SortedMap<String, Object> items = new TreeMap<String, Object>();
// keys() gets only values visible to template // keys() gets only values visible to template
TemplateCollectionModel keys = model.keys(); TemplateCollectionModel keys = model.keys();
TemplateModelIterator iModel = keys.iterator(); TemplateModelIterator iModel = keys.iterator();
@ -262,6 +263,7 @@ public abstract class BaseDumpDirective implements TemplateDirectiveModel {
TemplateModel value = model.get(key); TemplateModel value = model.get(key);
items.put(key, getData(value)); items.put(key, getData(value));
} }
// *** RY SORT keys alphabetically
map.put(Key.VALUE.toString(), items); map.put(Key.VALUE.toString(), items);
return map; return map;
} }
@ -293,7 +295,9 @@ public abstract class BaseDumpDirective implements TemplateDirectiveModel {
} else { } else {
methods.put(methodDisplayName, ""); // or null ? methods.put(methodDisplayName, ""); // or null ?
} }
} }
// *** SORT methods alphabetically
map.put(Key.VALUE.toString(), methods); map.put(Key.VALUE.toString(), methods);
return map; return map;
} }
@ -316,8 +320,7 @@ public abstract class BaseDumpDirective implements TemplateDirectiveModel {
methodName = methodName.substring(0, 1).toLowerCase() + methodName.substring(1); methodName = methodName.substring(0, 1).toLowerCase() + methodName.substring(1);
} }
return methodName; return methodName;
} }
private Set<Method> getMethodsAvailableToTemplate(TemplateHashModelEx model, Object object) throws TemplateModelException { private Set<Method> getMethodsAvailableToTemplate(TemplateHashModelEx model, Object object) throws TemplateModelException {
@ -357,6 +360,11 @@ public abstract class BaseDumpDirective implements TemplateDirectiveModel {
// Include only methods included in keys(). This factors in visibility // Include only methods included in keys(). This factors in visibility
// defined by the model's BeansWrapper. // defined by the model's BeansWrapper.
//*** This has to be method.getMethodDisplayName() ****
// SO: we have to get the display name now
// and we should get the value now too
// so method => { displayName => ..., value => ... }
if (keySet.contains(method.getName())) { if (keySet.contains(method.getName())) {
// if the key has a value, we could add it here rather than invoking the // if the key has a value, we could add it here rather than invoking the
// method later // method later

View file

@ -12,12 +12,15 @@ import java.sql.Time;
import java.sql.Timestamp; import java.sql.Timestamp;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Calendar; import java.util.Calendar;
import java.util.Collections;
import java.util.Date; import java.util.Date;
import java.util.HashMap; import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.SortedMap;
import java.util.TreeMap;
import org.apache.log4j.Level; import org.apache.log4j.Level;
import org.apache.log4j.Logger; import org.apache.log4j.Logger;
@ -40,12 +43,20 @@ import freemarker.template.TemplateMethodModel;
import freemarker.template.TemplateModel; import freemarker.template.TemplateModel;
import freemarker.template.TemplateModelException; import freemarker.template.TemplateModelException;
/**
* Unit tests of dump directive. The tests follow the same basic pattern:
* 1. Create the data model
* 2. Create the expected dump data structure
* 3. Create the actual dump data structure by running the data model through a processing environment
* 4. Compare expected and actual dump data structures
*
* @author rjy7
*
*/
public class DumpDirectiveTest { public class DumpDirectiveTest {
private Template template; private Template template;
@Before @Before
public void setUp() { public void setUp() {
Configuration config = new Configuration(); Configuration config = new Configuration();
@ -292,23 +303,23 @@ public class DumpDirectiveTest {
String varName = "fruit"; String varName = "fruit";
Map<String, Object> dataModel = new HashMap<String, Object>(); Map<String, Object> dataModel = new HashMap<String, Object>();
List<String> list = new ArrayList<String>(); List<String> myList = new ArrayList<String>();
list.add("apples"); myList.add("apples");
list.add("bananas"); myList.add("bananas");
list.add("oranges"); myList.add("oranges");
dataModel.put(varName, list); dataModel.put(varName, myList);
Map<String, Object> expectedDump = new HashMap<String, Object>(); Map<String, Object> expectedDump = new HashMap<String, Object>();
expectedDump.put(Key.NAME.toString(), varName); expectedDump.put(Key.NAME.toString(), varName);
expectedDump.put(Key.TYPE.toString(), Type.SEQUENCE); expectedDump.put(Key.TYPE.toString(), Type.SEQUENCE);
List<Map<String, Object>> listDump = new ArrayList<Map<String, Object>>(list.size()); List<Map<String, Object>> myListExpectedDump = new ArrayList<Map<String, Object>>(myList.size());
for ( String str : list) { for ( String str : myList) {
Map<String, Object> itemDump = new HashMap<String, Object>(); Map<String, Object> itemDump = new HashMap<String, Object>();
itemDump.put(Key.TYPE.toString(), Type.STRING); itemDump.put(Key.TYPE.toString(), Type.STRING);
itemDump.put(Key.VALUE.toString(), str); itemDump.put(Key.VALUE.toString(), str);
listDump.add(itemDump); myListExpectedDump.add(itemDump);
} }
expectedDump.put(Key.VALUE.toString(), listDump); expectedDump.put(Key.VALUE.toString(), myListExpectedDump);
test(varName, dataModel, expectedDump); test(varName, dataModel, expectedDump);
} }
@ -319,20 +330,20 @@ public class DumpDirectiveTest {
String varName = "fruit"; String varName = "fruit";
Map<String, Object> dataModel = new HashMap<String, Object>(); Map<String, Object> dataModel = new HashMap<String, Object>();
String[] arr = { "apples", "bananas", "oranges" }; String[] myArray = { "apples", "bananas", "oranges" };
dataModel.put(varName, arr); dataModel.put(varName, myArray);
Map<String, Object> expectedDump = new HashMap<String, Object>(); Map<String, Object> expectedDump = new HashMap<String, Object>();
expectedDump.put(Key.NAME.toString(), varName); expectedDump.put(Key.NAME.toString(), varName);
expectedDump.put(Key.TYPE.toString(), Type.SEQUENCE); expectedDump.put(Key.TYPE.toString(), Type.SEQUENCE);
List<Map<String, Object>> arrDump = new ArrayList<Map<String, Object>>(arr.length); List<Map<String, Object>> myArrayExpectedDump = new ArrayList<Map<String, Object>>(myArray.length);
for ( String str : arr) { for ( String str : myArray) {
Map<String, Object> itemDump = new HashMap<String, Object>(); Map<String, Object> itemDump = new HashMap<String, Object>();
itemDump.put(Key.TYPE.toString(), Type.STRING); itemDump.put(Key.TYPE.toString(), Type.STRING);
itemDump.put(Key.VALUE.toString(), str); itemDump.put(Key.VALUE.toString(), str);
arrDump.add(itemDump); myArrayExpectedDump.add(itemDump);
} }
expectedDump.put(Key.VALUE.toString(), arrDump); expectedDump.put(Key.VALUE.toString(), myArrayExpectedDump);
test(varName, dataModel, expectedDump); test(varName, dataModel, expectedDump);
} }
@ -366,36 +377,36 @@ public class DumpDirectiveTest {
expectedDump.put(Key.NAME.toString(), varName); expectedDump.put(Key.NAME.toString(), varName);
expectedDump.put(Key.TYPE.toString(), Type.SEQUENCE); expectedDump.put(Key.TYPE.toString(), Type.SEQUENCE);
List<Map<String, Object>> mixedListDump = new ArrayList<Map<String, Object>>(mixedList.size()); List<Map<String, Object>> mixedListExpectedDump = new ArrayList<Map<String, Object>>(mixedList.size());
Map<String, Object> stringDump = new HashMap<String, Object>(); Map<String, Object> myStringExpectedDump = new HashMap<String, Object>();
stringDump.put(Key.TYPE.toString(), Type.STRING); myStringExpectedDump.put(Key.TYPE.toString(), Type.STRING);
stringDump.put(Key.VALUE.toString(), myString); myStringExpectedDump.put(Key.VALUE.toString(), myString);
mixedListDump.add(stringDump); mixedListExpectedDump.add(myStringExpectedDump);
Map<String, Object> numberDump = new HashMap<String, Object>(); Map<String, Object> myIntExpectedDump = new HashMap<String, Object>();
numberDump.put(Key.TYPE.toString(), Type.NUMBER); myIntExpectedDump.put(Key.TYPE.toString(), Type.NUMBER);
numberDump.put(Key.VALUE.toString(), myInt); myIntExpectedDump.put(Key.VALUE.toString(), myInt);
mixedListDump.add(numberDump); mixedListExpectedDump.add(myIntExpectedDump);
Map<String, Object> booleanDump = new HashMap<String, Object>(); Map<String, Object> myBoolExpectedDump = new HashMap<String, Object>();
booleanDump.put(Key.TYPE.toString(), Type.BOOLEAN); myBoolExpectedDump.put(Key.TYPE.toString(), Type.BOOLEAN);
booleanDump.put(Key.VALUE.toString(), myBool); myBoolExpectedDump.put(Key.VALUE.toString(), myBool);
mixedListDump.add(booleanDump); mixedListExpectedDump.add(myBoolExpectedDump);
Map<String, Object> myListDump = new HashMap<String, Object>(); Map<String, Object> myListExpectedDump = new HashMap<String, Object>();
myListDump.put(Key.TYPE.toString(), Type.SEQUENCE); myListExpectedDump.put(Key.TYPE.toString(), Type.SEQUENCE);
List<Map<String, Object>> itemsDump = new ArrayList<Map<String, Object>>(myList.size()); List<Map<String, Object>> myListItemsExpectedDump = new ArrayList<Map<String, Object>>(myList.size());
for ( String animal : myList ) { for ( String animal : myList ) {
Map<String, Object> itemDump = new HashMap<String, Object>(); Map<String, Object> itemDump = new HashMap<String, Object>();
itemDump.put(Key.TYPE.toString(), Type.STRING); itemDump.put(Key.TYPE.toString(), Type.STRING);
itemDump.put(Key.VALUE.toString(), animal); itemDump.put(Key.VALUE.toString(), animal);
itemsDump.add(itemDump); myListItemsExpectedDump.add(itemDump);
} }
myListDump.put(Key.VALUE.toString(), itemsDump); myListExpectedDump.put(Key.VALUE.toString(), myListItemsExpectedDump);
mixedListDump.add(myListDump); mixedListExpectedDump.add(myListExpectedDump);
expectedDump.put(Key.VALUE.toString(), mixedListDump); expectedDump.put(Key.VALUE.toString(), mixedListExpectedDump);
test(varName, dataModel, expectedDump); test(varName, dataModel, expectedDump);
} }
@ -406,25 +417,25 @@ public class DumpDirectiveTest {
String varName = "oddNums"; String varName = "oddNums";
Map<String, Object> dataModel = new HashMap<String, Object>(); Map<String, Object> dataModel = new HashMap<String, Object>();
Set<Integer> odds = new HashSet<Integer>(); Set<Integer> myIntSet = new HashSet<Integer>();
for (int i=0; i <= 10; i++) { for (int i=0; i <= 10; i++) {
if (i % 2 == 1) { if (i % 2 == 1) {
odds.add(i); myIntSet.add(i);
} }
} }
dataModel.put(varName, odds); dataModel.put(varName, myIntSet);
Map<String, Object> expectedDump = new HashMap<String, Object>(); Map<String, Object> expectedDump = new HashMap<String, Object>();
expectedDump.put(Key.NAME.toString(), varName); expectedDump.put(Key.NAME.toString(), varName);
expectedDump.put(Key.TYPE.toString(), Type.SEQUENCE); expectedDump.put(Key.TYPE.toString(), Type.SEQUENCE);
List<Map<String, Object>> sequenceDump = new ArrayList<Map<String, Object>>(odds.size()); List<Map<String, Object>> myIntSetExpectedDump = new ArrayList<Map<String, Object>>(myIntSet.size());
for ( int i : odds ) { for ( int i : myIntSet ) {
Map<String, Object> itemDump = new HashMap<String, Object>(); Map<String, Object> itemDump = new HashMap<String, Object>();
itemDump.put(Key.TYPE.toString(), Type.NUMBER); itemDump.put(Key.TYPE.toString(), Type.NUMBER);
itemDump.put(Key.VALUE.toString(), i); itemDump.put(Key.VALUE.toString(), i);
sequenceDump.add(itemDump); myIntSetExpectedDump.add(itemDump);
} }
expectedDump.put(Key.VALUE.toString(), sequenceDump); expectedDump.put(Key.VALUE.toString(), myIntSetExpectedDump);
test(varName, dataModel, expectedDump); test(varName, dataModel, expectedDump);
} }
@ -441,20 +452,20 @@ public class DumpDirectiveTest {
odds.add(i); odds.add(i);
} }
} }
TemplateCollectionModel collection = new SimpleCollection(odds); TemplateCollectionModel myCollection = new SimpleCollection(odds);
dataModel.put(varName, collection); dataModel.put(varName, myCollection);
Map<String, Object> expectedDump = new HashMap<String, Object>(); Map<String, Object> expectedDump = new HashMap<String, Object>();
expectedDump.put(Key.NAME.toString(), varName); expectedDump.put(Key.NAME.toString(), varName);
expectedDump.put(Key.TYPE.toString(), Type.COLLECTION); expectedDump.put(Key.TYPE.toString(), Type.COLLECTION);
List<Map<String, Object>> collectionDump = new ArrayList<Map<String, Object>>(odds.size()); List<Map<String, Object>> myCollectionExpectedDump = new ArrayList<Map<String, Object>>(odds.size());
for ( int i : odds ) { for ( int i : odds ) {
Map<String, Object> itemDump = new HashMap<String, Object>(); Map<String, Object> itemDump = new HashMap<String, Object>();
itemDump.put(Key.TYPE.toString(), Type.NUMBER); itemDump.put(Key.TYPE.toString(), Type.NUMBER);
itemDump.put(Key.VALUE.toString(), i); itemDump.put(Key.VALUE.toString(), i);
collectionDump.add(itemDump); myCollectionExpectedDump.add(itemDump);
} }
expectedDump.put(Key.VALUE.toString(), collectionDump); expectedDump.put(Key.VALUE.toString(), myCollectionExpectedDump);
test(varName, dataModel, expectedDump); test(varName, dataModel, expectedDump);
} }
@ -481,16 +492,25 @@ public class DumpDirectiveTest {
Map<String, Object> expectedDump = new HashMap<String, Object>(); Map<String, Object> expectedDump = new HashMap<String, Object>();
expectedDump.put(Key.NAME.toString(), varName); expectedDump.put(Key.NAME.toString(), varName);
expectedDump.put(Key.TYPE.toString(), Type.HASH_EX); expectedDump.put(Key.TYPE.toString(), Type.HASH_EX);
Map<String, Object> myMapDump = new HashMap<String, Object>(myMap.size()); SortedMap<String, Object> myMapExpectedDump = new TreeMap<String, Object>();
for ( String key : myMap.keySet() ) { for ( String key : myMap.keySet() ) {
Map<String, Object> itemDump = new HashMap<String, Object>(); Map<String, Object> itemDump = new HashMap<String, Object>();
itemDump.put(Key.TYPE.toString(), Type.STRING); itemDump.put(Key.TYPE.toString(), Type.STRING);
itemDump.put(Key.VALUE.toString(), myMap.get(key)); itemDump.put(Key.VALUE.toString(), myMap.get(key));
myMapDump.put(key, itemDump); myMapExpectedDump.put(key, itemDump);
} }
expectedDump.put(Key.VALUE.toString(), myMapDump); expectedDump.put(Key.VALUE.toString(), (myMapExpectedDump));
test(varName, dataModel, expectedDump); Map<String, Object> dump = getDump(varName, dataModel);
assertEquals(expectedDump, dump);
// Test the sorting of the map
List<String> expectedKeys = new ArrayList<String>(myMapExpectedDump.keySet());
@SuppressWarnings("unchecked")
SortedMap<String, Object> myMapActualDump = (SortedMap<String, Object>) dump.get(Key.VALUE.toString());
List<String> actualKeys = new ArrayList<String>(myMapActualDump.keySet());
assertEquals(expectedKeys, actualKeys);
} }
@Test @Test
@ -510,8 +530,8 @@ public class DumpDirectiveTest {
int myInt = 4; int myInt = 4;
mixedMap.put("myNumber", myInt); mixedMap.put("myNumber", myInt);
Date now = new Date(); Date myDate = new Date();
mixedMap.put("myDate", now); mixedMap.put("myDate", myDate);
List<String> myList = new ArrayList<String>(); List<String> myList = new ArrayList<String>();
myList.add("apples"); myList.add("apples");
@ -531,56 +551,68 @@ public class DumpDirectiveTest {
Map<String, Object> expectedDump = new HashMap<String, Object>(); Map<String, Object> expectedDump = new HashMap<String, Object>();
expectedDump.put(Key.NAME.toString(), varName); expectedDump.put(Key.NAME.toString(), varName);
expectedDump.put(Key.TYPE.toString(), Type.HASH_EX); expectedDump.put(Key.TYPE.toString(), Type.HASH_EX);
Map<String, Object> mixedMapDump = new HashMap<String, Object>(mixedMap.size()); Map<String, Object> mixedMapExpectedDump = new HashMap<String, Object>(mixedMap.size());
Map<String, Object> myStringDump = new HashMap<String, Object>(); Map<String, Object> myStringExpectedDump = new HashMap<String, Object>();
myStringDump.put(Key.TYPE.toString(), Type.STRING); myStringExpectedDump.put(Key.TYPE.toString(), Type.STRING);
myStringDump.put(Key.VALUE.toString(), myString); myStringExpectedDump.put(Key.VALUE.toString(), myString);
mixedMapDump.put("myString", myStringDump); mixedMapExpectedDump.put("myString", myStringExpectedDump);
Map<String, Object> myBooleanDump = new HashMap<String, Object>(); Map<String, Object> myBooleanExpectedDump = new HashMap<String, Object>();
myBooleanDump.put(Key.TYPE.toString(), Type.BOOLEAN); myBooleanExpectedDump.put(Key.TYPE.toString(), Type.BOOLEAN);
myBooleanDump.put(Key.VALUE.toString(), myBool); myBooleanExpectedDump.put(Key.VALUE.toString(), myBool);
mixedMapDump.put("myBoolean", myBooleanDump); mixedMapExpectedDump.put("myBoolean", myBooleanExpectedDump);
Map<String, Object> myNumberDump = new HashMap<String, Object>(); Map<String, Object> myIntExpectedDump = new HashMap<String, Object>();
myNumberDump.put(Key.TYPE.toString(), Type.NUMBER); myIntExpectedDump.put(Key.TYPE.toString(), Type.NUMBER);
myNumberDump.put(Key.VALUE.toString(), myInt); myIntExpectedDump.put(Key.VALUE.toString(), myInt);
mixedMapDump.put("myNumber", myNumberDump); mixedMapExpectedDump.put("myNumber", myIntExpectedDump);
Map<String, Object> myDateDump = new HashMap<String, Object>(); Map<String, Object> myDateExpectedDump = new HashMap<String, Object>();
myDateDump.put(Key.TYPE.toString(), Type.DATE); myDateExpectedDump.put(Key.TYPE.toString(), Type.DATE);
myDateDump.put(Key.DATE_TYPE.toString(), DateType.UNKNOWN); myDateExpectedDump.put(Key.DATE_TYPE.toString(), DateType.UNKNOWN);
myDateDump.put(Key.VALUE.toString(), now); myDateExpectedDump.put(Key.VALUE.toString(), myDate);
mixedMapDump.put("myDate", myDateDump); mixedMapExpectedDump.put("myDate", myDateExpectedDump);
Map<String, Object> myListDump = new HashMap<String, Object>(); Map<String, Object> myListExpectedDump = new HashMap<String, Object>();
myListDump.put(Key.TYPE.toString(), Type.SEQUENCE); myListExpectedDump.put(Key.TYPE.toString(), Type.SEQUENCE);
List<Map<String, Object>> listItemsDump = new ArrayList<Map<String, Object>>(myList.size()); List<Map<String, Object>> myListItemsExpectedDump = new ArrayList<Map<String, Object>>(myList.size());
for ( String item : myList ) { for ( String item : myList ) {
Map<String, Object> itemDump = new HashMap<String, Object>(); Map<String, Object> itemDump = new HashMap<String, Object>();
itemDump.put(Key.TYPE.toString(), Type.STRING); itemDump.put(Key.TYPE.toString(), Type.STRING);
itemDump.put(Key.VALUE.toString(), item); itemDump.put(Key.VALUE.toString(), item);
listItemsDump.add(itemDump); myListItemsExpectedDump.add(itemDump);
} }
myListDump.put(Key.VALUE.toString(), listItemsDump); myListExpectedDump.put(Key.VALUE.toString(), myListItemsExpectedDump);
mixedMapDump.put("myList", myListDump); mixedMapExpectedDump.put("myList", myListExpectedDump);
Map<String, Object> myMapDump = new HashMap<String, Object>(); Map<String, Object> myMapExpectedDump = new HashMap<String, Object>();
myMapDump.put(Key.TYPE.toString(), Type.HASH_EX); myMapExpectedDump.put(Key.TYPE.toString(), Type.HASH_EX);
Map<String, Object> mapItemsDump = new HashMap<String, Object>(myMap.size()); SortedMap<String, Object> myMapItemsExpectedDump = new TreeMap<String, Object>();
for ( String key : myMap.keySet() ) { for ( String key : myMap.keySet() ) {
Map<String, Object> itemDump = new HashMap<String, Object>(); Map<String, Object> itemDump = new HashMap<String, Object>();
itemDump.put(Key.TYPE.toString(), Type.STRING); itemDump.put(Key.TYPE.toString(), Type.STRING);
itemDump.put(Key.VALUE.toString(), myMap.get(key)); itemDump.put(Key.VALUE.toString(), myMap.get(key));
mapItemsDump.put(key, itemDump); myMapItemsExpectedDump.put(key, itemDump);
} }
myMapDump.put(Key.VALUE.toString(), mapItemsDump); myMapExpectedDump.put(Key.VALUE.toString(), myMapItemsExpectedDump);
mixedMapDump.put("myMap", myMapDump); mixedMapExpectedDump.put("myMap", myMapExpectedDump);
expectedDump.put(Key.VALUE.toString(), mixedMapDump); expectedDump.put(Key.VALUE.toString(), mixedMapExpectedDump);
test(varName, dataModel, expectedDump); Map<String, Object> dump = getDump(varName, dataModel);
assertEquals(expectedDump, dump);
// Test the sorting of the myMap dump
List<String> expectedKeys = new ArrayList<String>(myMapItemsExpectedDump.keySet());
@SuppressWarnings("unchecked")
Map<String, Object> mixedMapActualDump = (Map<String, Object>) dump.get(Key.VALUE.toString());
@SuppressWarnings("unchecked")
Map<String, Object> myMapActualDump = (Map<String, Object>) mixedMapActualDump.get("myMap");
@SuppressWarnings("unchecked")
Map<String, Object> myMapItemsActualDump = (SortedMap<String, Object>) myMapActualDump.get(Key.VALUE.toString());
List<String> actualKeys = new ArrayList<String>(myMapItemsActualDump.keySet());
assertEquals(expectedKeys, actualKeys);
} }
@Test @Test
@ -609,7 +641,7 @@ public class DumpDirectiveTest {
String varName = "employee"; String varName = "employee";
Map<String, Object> dataModel = new HashMap<String, Object>(); Map<String, Object> dataModel = new HashMap<String, Object>();
BeansWrapper wrapper = new BeansWrapper(); BeansWrapper wrapper = new BeansWrapper();
wrapper.setExposureLevel(BeansWrapper.EXPOSE_NOTHING); wrapper.setExposureLevel(BeansWrapper.EXPOSE_PROPERTIES_ONLY);
try { try {
dataModel.put("employee", wrapper.wrap(getEmployee())); dataModel.put("employee", wrapper.wrap(getEmployee()));
} catch (TemplateModelException e) { } catch (TemplateModelException e) {
@ -619,8 +651,20 @@ public class DumpDirectiveTest {
Map<String, Object> expectedDump = new HashMap<String, Object>(); Map<String, Object> expectedDump = new HashMap<String, Object>();
expectedDump.put(Key.NAME.toString(), varName); expectedDump.put(Key.NAME.toString(), varName);
expectedDump.put(Key.TYPE.toString(), "freemarker.ext.dump.DumpDirectiveTest$Employee"); expectedDump.put(Key.TYPE.toString(), "freemarker.ext.dump.DumpDirectiveTest$Employee");
expectedDump.put(Key.VALUE.toString(), new HashMap<String, Object>());
test(varName, dataModel, expectedDump); Map<String, Object> properties = new HashMap<String, Object>();
properties.put("fullName", "John Doe");
properties.put("nickname", "");
properties.put("id", 34523);
properties.put("supervisor", "");
properties.put("supervisees", "");
Calendar c = Calendar.getInstance();
c.set(75, Calendar.MAY, 5);
properties.put("birthdate", c.getTime());
expectedDump.put(Key.VALUE.toString(), properties);
//test(varName, dataModel, expectedDump);
} }
@Test @Test
@ -640,6 +684,7 @@ public class DumpDirectiveTest {
expectedDump.put(Key.NAME.toString(), varName); expectedDump.put(Key.NAME.toString(), varName);
expectedDump.put(Key.TYPE.toString(), "freemarker.ext.dump.DumpDirectiveTest$Employee"); expectedDump.put(Key.TYPE.toString(), "freemarker.ext.dump.DumpDirectiveTest$Employee");
expectedDump.put(Key.VALUE.toString(), new HashMap<String, Object>()); expectedDump.put(Key.VALUE.toString(), new HashMap<String, Object>());
test(varName, dataModel, expectedDump); test(varName, dataModel, expectedDump);
} }
@ -662,16 +707,23 @@ public class DumpDirectiveTest {
expectedDump.put(Key.VALUE.toString(), new HashMap<String, Object>()); expectedDump.put(Key.VALUE.toString(), new HashMap<String, Object>());
test(varName, dataModel, expectedDump); test(varName, dataModel, expectedDump);
} }
/////////////////////////// Private stub classes and helper methods /////////////////////////// /////////////////////////// Private stub classes and helper methods ///////////////////////////
private void test(String varName, Map<String, Object> dataModel, Map<String, Object> expectedDump) { private void test(String varName, Map<String, Object> dataModel, Map<String, Object> expectedDump) {
try { Map<String, Object> dump = getDump(varName, dataModel);
assertEquals(expectedDump, dump);
}
private Map<String, Object> getDump(String varName, Map<String, Object> dataModel) {
try {
Environment env = template.createProcessingEnvironment(dataModel, new StringWriter()); Environment env = template.createProcessingEnvironment(dataModel, new StringWriter());
Map<String, Object> dumpData = new DumpDirective().getTemplateVariableData(varName, env); return new DumpDirective().getTemplateVariableData(varName, env);
assertEquals(expectedDump, dumpData);
} catch (Exception e) { } catch (Exception e) {
fail(e.getMessage()); fail(e.getMessage());
} return null;
}
} }
private class HelplessMethod implements TemplateMethodModel { private class HelplessMethod implements TemplateMethodModel {