summaryrefslogtreecommitdiffstats
path: root/tests/client-side
diff options
context:
space:
mode:
authorArtur Signell <artur@vaadin.com>2012-05-14 00:49:15 +0300
committerArtur Signell <artur@vaadin.com>2012-05-14 02:10:37 +0300
commit71e30eb3ef4e3b57cdbfe51d65a3c76181554899 (patch)
tree18a598404898651bb304e418d694bd9eac18b20e /tests/client-side
parent5b355b62abbef49e419440c847501bb939641b98 (diff)
downloadvaadin-framework-71e30eb3ef4e3b57cdbfe51d65a3c76181554899.tar.gz
vaadin-framework-71e30eb3ef4e3b57cdbfe51d65a3c76181554899.zip
Added support for map keys of any type (#8602)
Diffstat (limited to 'tests/client-side')
-rw-r--r--tests/client-side/com/vaadin/terminal/gwt/server/JSONSerializerTest.java146
1 files changed, 146 insertions, 0 deletions
diff --git a/tests/client-side/com/vaadin/terminal/gwt/server/JSONSerializerTest.java b/tests/client-side/com/vaadin/terminal/gwt/server/JSONSerializerTest.java
new file mode 100644
index 0000000000..926f026b40
--- /dev/null
+++ b/tests/client-side/com/vaadin/terminal/gwt/server/JSONSerializerTest.java
@@ -0,0 +1,146 @@
+package com.vaadin.terminal.gwt.server;
+
+/*
+ @VaadinApache2LicenseForJavaFiles@
+ */
+import java.beans.BeanInfo;
+import java.beans.Introspector;
+import java.beans.PropertyDescriptor;
+import java.lang.reflect.Type;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Map;
+
+import junit.framework.TestCase;
+
+import com.vaadin.external.json.JSONArray;
+import com.vaadin.terminal.gwt.client.communication.JsonDecoder;
+import com.vaadin.terminal.gwt.client.communication.JsonEncoder;
+import com.vaadin.terminal.gwt.client.ui.splitpanel.AbstractSplitPanelState;
+
+/**
+ * Tests for {@link JsonCodec}, {@link JsonEncoder}, {@link JsonDecoder}
+ *
+ * @author Vaadin Ltd
+ * @version @VERSION@
+ * @since 7.0
+ *
+ */
+public class JSONSerializerTest extends TestCase {
+ HashMap<String, AbstractSplitPanelState> stringToStateMap;
+ HashMap<AbstractSplitPanelState, String> stateToStringMap;
+
+ public void testStringToBeanMapSerialization() throws Exception {
+ Type mapType = getClass().getDeclaredField("stringToStateMap")
+ .getGenericType();
+ stringToStateMap = new HashMap<String, AbstractSplitPanelState>();
+ AbstractSplitPanelState s = new AbstractSplitPanelState();
+ AbstractSplitPanelState s2 = new AbstractSplitPanelState();
+ s.setCaption("State 1");
+ s.setDebugId("foo");
+ s2.setCaption("State 2");
+ s2.setDebugId("bar");
+ stringToStateMap.put("string - state 1", s);
+ stringToStateMap.put("String - state 2", s2);
+
+ JSONArray encodedMap = JsonCodec.encode(stringToStateMap, null,
+ mapType, null);
+
+ ensureDecodedCorrectly(stringToStateMap, encodedMap, mapType);
+ }
+
+ public void testBeanToStringMapSerialization() throws Exception {
+ Type mapType = getClass().getDeclaredField("stateToStringMap")
+ .getGenericType();
+ stateToStringMap = new HashMap<AbstractSplitPanelState, String>();
+ AbstractSplitPanelState s = new AbstractSplitPanelState();
+ AbstractSplitPanelState s2 = new AbstractSplitPanelState();
+ s.setCaption("State 1");
+ s2.setCaption("State 2");
+ stateToStringMap.put(s, "string - state 1");
+ stateToStringMap.put(s2, "String - state 2");
+
+ JSONArray encodedMap = JsonCodec.encode(stateToStringMap, null,
+ mapType, null);
+
+ ensureDecodedCorrectly(stateToStringMap, encodedMap, mapType);
+ }
+
+ private void ensureDecodedCorrectly(Object original, JSONArray encoded,
+ Type type) throws Exception {
+ Object serverSideDecoded = JsonCodec.decodeInternalOrCustomType(type,
+ encoded, null);
+ assertTrue("Server decoded", equals(original, serverSideDecoded));
+
+ // Object clientSideDecoded = JsonDecoder.decodeValue(
+ // (com.google.gwt.json.client.JSONArray) JSONParser
+ // .parseStrict(encoded.toString()), null, null, null);
+ // assertTrue("Client decoded",
+ // equals(original, clientSideDecoded));
+
+ }
+
+ private boolean equals(Object o1, Object o2) throws Exception {
+ if (o1 == null) {
+ return (o2 == null);
+ }
+ if (o2 == null) {
+ return false;
+ }
+
+ if (o1 instanceof Map) {
+ if (!(o2 instanceof Map)) {
+ return false;
+ }
+ return equalsMap((Map) o1, (Map) o2);
+ }
+
+ if (o1.getClass() != o2.getClass()) {
+ return false;
+ }
+
+ if (o1 instanceof Collection || o1 instanceof Number
+ || o1 instanceof String) {
+ return o1.equals(o2);
+ }
+
+ return equalsBean(o1, o2);
+ }
+
+ private boolean equalsBean(Object o1, Object o2) throws Exception {
+ BeanInfo beanInfo = Introspector.getBeanInfo(o1.getClass());
+ for (PropertyDescriptor pd : beanInfo.getPropertyDescriptors()) {
+ String fieldName = JsonCodec.getTransportFieldName(pd);
+ if (fieldName == null) {
+ continue;
+ }
+
+ Object c1 = pd.getReadMethod().invoke(o1);
+ Object c2 = pd.getReadMethod().invoke(o2);
+ if (!equals(c1, c2)) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ private boolean equalsMap(Map o1, Map o2) throws Exception {
+ for (Object key1 : o1.keySet()) {
+ Object key2 = key1;
+ if (!(o2.containsKey(key2))) {
+ // Try to fins a key that is equal
+ for (Object k2 : o2.keySet()) {
+ if (equals(key1, k2)) {
+ key2 = k2;
+ break;
+ }
+ }
+ }
+ if (!equals(o1.get(key1), o2.get(key2))) {
+ return false;
+ }
+
+ }
+ return true;
+ }
+}