package org.springframework.data.simpledb.core.entity.json;
import static org.hamcrest.Matchers.*;
import static org.junit.Assert.*;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import org.junit.Before;
import org.junit.Test;
public class JsonMarshallerTest {
private JsonMarshaller marshaller;
@Before
public void setUp() {
marshaller = JsonMarshaller.getInstance();
}
@Test
public void marshal_should_marshal_Object() throws IOException {
// Prepare
User newUser = createSampleUser();
Object object = newUser;
// Exercise
String marshalledUser = marshaller.marshall(object);
User returnedUser = marshaller.unmarshall(marshalledUser, User.class);
// Verify
assertNotNull(returnedUser);
assertEquals(newUser.getName().getFirst(), returnedUser.getName().getFirst());
assertEquals(newUser.getName().getLast(), returnedUser.getName().getLast());
}
@Test
public void marshal_should_marshal_primitive_array() throws IOException {
final long[] longPrimitiveArray = new long[5];
for(int i = 0; i < 5; i++) {
longPrimitiveArray[i] = i;
}
final String marshalledValue = marshaller.marshall(longPrimitiveArray);
assertNotNull(marshalledValue);
/* unmarshall */
final long[] unmarshalledValue = marshaller.unmarshall(marshalledValue, long[].class);
assertNotNull(unmarshalledValue);
assertEquals(longPrimitiveArray.length, unmarshalledValue.length);
for(int i = 0; i < longPrimitiveArray.length; i++) {
assertEquals(longPrimitiveArray[i], unmarshalledValue[i]);
}
}
@Test
public void marshal_should_marshal_Object_as_lists() throws IOException {
// Prepare
List<User> listOfUsers = new LinkedList<User>();
User sampleUser = createSampleUser();
listOfUsers.add(sampleUser);
Object object = listOfUsers;
// Exercise
String marshalledUser = marshaller.marshall(object);
List<User> returnedList = marshaller.unmarshall(marshalledUser, List.class);
// Verify
assertNotNull(returnedList);
User returnedUser = returnedList.get(0);
assertEquals(sampleUser.getName().getFirst(), returnedUser.getName().getFirst());
}
@Test
@SuppressWarnings("unchecked")
public void should_marshal_unmarshal_maps_of_Strings() {
Map<String, String> map = new LinkedHashMap<String, String>();
map.put("TestKey", "Test Value");
String marsahledMap = marshaller.marshall(map);
Map<String, String> unmarshaledMap = (Map<String, String>) marshaller.unmarshall(marsahledMap, Map.class);
assertEquals(map.keySet(), unmarshaledMap.keySet());
String ret = unmarshaledMap.get("TestKey");
assertEquals("Test Value", ret);
}
@Test
public void should_serialize_deserialize() throws Exception {
List<String> strings = new ArrayList<String>(Arrays.asList("one", "two", "three"));
String result = marshaller.marshall(strings);
List<String> unmarshalled = marshaller.unmarshall(result, ArrayList.class);
assertThat(result, is("[\"java.util.ArrayList\",[\"one\",\"two\",\"three\"]]"));
assertThat(unmarshalled, is(strings));
}
@Test
public void should_deserialize_without_serialization() throws Exception {
JsonMarshaller newMarshaller = JsonMarshaller.createNew();
ArrayList<String> result = newMarshaller.unmarshall("[\"java.util.ArrayList\",[\"one\",\"two\",\"three\"]]", ArrayList.class);
assertThat(result, is(new ArrayList<String>(Arrays.asList("one", "two", "three"))));
}
private User createSampleUser() {
User newUser = new User();
newUser.setName(new User.Name());
newUser.getName().setFirst("Joe");
newUser.getName().setLast("Sixpack");
return newUser;
}
}
class User {
public enum Gender {
MALE
}
public static class Name {
private String _first;
private String _last;
public String getFirst() {
return _first;
}
public String getLast() {
return _last;
}
public void setFirst(String s) {
_first = s;
}
public void setLast(String s) {
_last = s;
}
}
private Gender _gender;
private Name _name;
private boolean _isVerified;
private byte[] _userImage;
public Name getName() {
return _name;
}
public Gender getGender() {
return _gender;
}
public byte[] getUserImage() {
return _userImage;
}
public void setName(Name n) {
_name = n;
}
public void setGender(Gender _gender) {
this._gender = _gender;
}
public boolean isVerified() {
return _isVerified;
}
public void setVerified(boolean _isVerified) {
this._isVerified = _isVerified;
}
public void setUserImage(byte[] _userImage) {
this._userImage = _userImage;
}
}