NIHVIVO-1564 Add sorting to map keys in dump
This commit is contained in:
parent
83ac0750b5
commit
6375161d5a
2 changed files with 159 additions and 99 deletions
|
@ -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
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue