package core.framework.api.util;
import org.junit.Test;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlEnumValue;
import java.time.Instant;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import static org.hamcrest.CoreMatchers.containsString;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;
/**
* @author neo
*/
public class JSONTest {
@Test
public void mapField() {
Bean bean = new Bean();
bean.attributes.put("key1", "value1");
bean.attributes.put("key2", "value2");
String json = JSON.toJSON(bean);
assertThat(json, containsString("\"attributes\":{\"key1\":\"value1\",\"key2\":\"value2\"}"));
Bean parsedBean = JSON.fromJSON(Bean.class, json);
assertEquals("value1", parsedBean.attributes.get("key1"));
assertEquals("value2", parsedBean.attributes.get("key2"));
}
@Test
public void dateField() {
Bean bean = new Bean();
bean.instant = Instant.now();
bean.dateTime = LocalDateTime.ofInstant(bean.instant, ZoneId.systemDefault());
bean.date = bean.dateTime.toLocalDate();
bean.zonedDateTime = ZonedDateTime.ofInstant(bean.instant, ZoneId.systemDefault());
String json = JSON.toJSON(bean);
Bean parsedBean = JSON.fromJSON(Bean.class, json);
assertEquals(bean.instant, parsedBean.instant);
assertEquals(bean.date, parsedBean.date);
assertEquals(bean.dateTime, parsedBean.dateTime);
assertEquals(bean.zonedDateTime.toInstant(), parsedBean.zonedDateTime.toInstant());
}
@Test
public void listObject() {
List<Bean> beans = JSON.fromJSON(Types.list(Bean.class), "[{\"name\":\"n1\"},{\"name\":\"n2\"}]");
assertEquals(2, beans.size());
assertEquals("n1", beans.get(0).name);
assertEquals("n2", beans.get(1).name);
}
@Test
public void optionalObject() {
Optional<Bean> parsedBean = JSON.fromJSON(Types.optional(Bean.class), JSON.toJSON(Optional.empty()));
assertFalse(parsedBean.isPresent());
parsedBean = JSON.fromJSON(Types.optional(Bean.class), JSON.toJSON(null));
assertFalse(parsedBean.isPresent());
Bean bean = new Bean();
bean.name = "name";
parsedBean = JSON.fromJSON(Types.optional(Bean.class), JSON.toJSON(Optional.of(bean)));
assertTrue(parsedBean.isPresent());
assertEquals(bean.name, parsedBean.get().name);
}
@Test
public void nullObject() {
String json = JSON.toJSON(null);
Bean bean = JSON.fromJSON(Bean.class, json);
assertNull(bean);
}
@Test
public void enumValue() {
assertEquals(TestEnum.A, JSON.fromEnumValue(TestEnum.class, "A1"));
assertEquals("B1", JSON.toEnumValue(TestEnum.B));
}
enum TestEnum {
@XmlEnumValue("A1")
A,
@XmlEnumValue("B1")
B
}
@XmlAccessorType(XmlAccessType.FIELD)
static class Bean {
@XmlElement(name = "attributes")
public final Map<String, String> attributes = Maps.newHashMap();
@XmlElement(name = "name")
public String name;
@XmlElement(name = "date")
public LocalDate date;
@XmlElement(name = "date_time")
public LocalDateTime dateTime;
@XmlElement(name = "instant")
public Instant instant;
@XmlElement(name = "zoned_date_time")
public ZonedDateTime zonedDateTime;
}
}