package com.jdroid.java.marshaller;
import com.jdroid.java.collections.Lists;
import com.jdroid.java.collections.Maps;
import com.jdroid.java.json.JsonMap;
import org.testng.Assert;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
public class MarshallerProviderTest {
private MarshallerProvider marshallerProvider;
public MarshallerProviderTest() {
marshallerProvider = MarshallerProvider.get();
marshallerProvider.addMarshaller(DummyClass.class, new DummyClassMarshaller());
}
@DataProvider
public Iterator<Object[]> marshallDataProvider() {
List<Object[]> cases = Lists.newArrayList();
cases.add(new Object[] { 1, "1" });
cases.add(new Object[] { "1", "1" });
cases.add(new Object[] { Lists.newArrayList(1, 2, 3), "[1,2,3]" });
cases.add(new Object[] { Lists.newArrayList("1", "2", "3"), "[\"1\",\"2\",\"3\"]" });
DummyClass dummyClass = new DummyClass();
dummyClass.stringProperty = "1";
String dummyJson = "{\"stringProperty\":\"1\"}";
cases.add(new Object[] { dummyClass, dummyJson });
cases.add(new Object[] { Lists.newArrayList(dummyClass, dummyClass), "[" + dummyJson + "," + dummyJson + "]" });
dummyClass = new DummyClass();
dummyClass.longProperty = 2L;
dummyJson = "{\"longProperty\":2}";
cases.add(new Object[] { dummyClass, dummyJson });
cases.add(new Object[] { Lists.newArrayList(dummyClass, dummyClass), "[" + dummyJson + "," + dummyJson + "]" });
dummyClass = new DummyClass();
dummyClass.stringListProperty = Lists.newArrayList("3", "4");
dummyJson = "{\"stringListProperty\":[\"3\",\"4\"]}";
cases.add(new Object[] { Lists.newArrayList(dummyClass, dummyClass), "[" + dummyJson + "," + dummyJson + "]" });
dummyClass = new DummyClass();
dummyClass.longListProperty = Lists.newArrayList(5L, 6L);
dummyJson = "{\"longListProperty\":[5,6]}";
cases.add(new Object[] { dummyClass, dummyJson });
cases.add(new Object[] { Lists.newArrayList(dummyClass, dummyClass), "[" + dummyJson + "," + dummyJson + "]" });
dummyClass = new DummyClass();
dummyClass.stringMapProperty = Maps.newLinkedHashMap();
dummyJson = "{}";
cases.add(new Object[] { dummyClass, dummyJson });
cases.add(new Object[] { Lists.newArrayList(dummyClass, dummyClass), "[" + dummyJson + "," + dummyJson + "]" });
dummyClass = new DummyClass();
dummyClass.stringMapProperty = Maps.newLinkedHashMap();
dummyClass.stringMapProperty.put("a", "b");
dummyJson = "{\"stringMapProperty\":{\"a\":\"b\"}}";
cases.add(new Object[] { dummyClass, dummyJson });
cases.add(new Object[] { Lists.newArrayList(dummyClass, dummyClass), "[" + dummyJson + "," + dummyJson + "]" });
dummyClass = new DummyClass();
dummyClass.longMapProperty = Maps.newLinkedHashMap();
dummyClass.longMapProperty.put("a", 1L);
dummyJson = "{\"longMapProperty\":{\"a\":1}}";
cases.add(new Object[] { dummyClass, dummyJson });
cases.add(new Object[] { Lists.newArrayList(dummyClass, dummyClass), "[" + dummyJson + "," + dummyJson + "]" });
dummyClass = new DummyClass();
dummyClass.dummyClassMapProperty = Maps.newLinkedHashMap();
DummyClass innerDummyClass = new DummyClass();
innerDummyClass.stringProperty = "2";
innerDummyClass.longProperty = 1L;
dummyClass.dummyClassMapProperty.put("a", innerDummyClass);
dummyJson = "{\"dummyClassMapProperty\":{\"a\":{\"longProperty\":1,\"stringProperty\":\"2\"}}}";
cases.add(new Object[] { dummyClass, dummyJson });
cases.add(new Object[] { Lists.newArrayList(dummyClass, dummyClass), "[" + dummyJson + "," + dummyJson + "]" });
cases.add(new Object[] { new DummyClass(), "{}" });
return cases.iterator();
}
@Test(dataProvider = "marshallDataProvider")
public void marshall(Object data, String expectedJson) {
String result = marshallerProvider.marshall(data, null, null).toString();
Assert.assertEquals(result.replace(" ", ""), expectedJson);
}
private class DummyClass {
protected String stringProperty;
protected Long longProperty;
protected List<String> stringListProperty;
protected List<Long> longListProperty;
protected Map<String, String> stringMapProperty;
protected Map<String, Long> longMapProperty;
protected Map<String, DummyClass> dummyClassMapProperty;
}
public class DummyClassMarshaller implements Marshaller<DummyClass, JsonMap> {
@Override
public JsonMap marshall(DummyClass dummyClass, MarshallerMode mode, Map<String, String> extras) {
JsonMap map = new JsonMap(mode, extras);
map.put("stringProperty", dummyClass.stringProperty);
map.put("longProperty", dummyClass.longProperty);
map.put("stringListProperty", dummyClass.stringListProperty);
map.put("longListProperty", dummyClass.longListProperty);
map.put("stringMapProperty", dummyClass.stringMapProperty);
map.put("longMapProperty", dummyClass.longMapProperty);
map.put("dummyClassMapProperty", dummyClass.dummyClassMapProperty);
return map;
}
}
}