package org.test4j.json.encoder;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.ArrayList;
import java.util.HashMap;
import org.junit.Test;
import org.test4j.json.JSON;
import org.test4j.json.encoder.beans.test.GenicBean;
import org.test4j.json.encoder.beans.test.TestedIntf;
import org.test4j.json.encoder.beans.test.User;
import org.test4j.json.helper.JSONFeature;
import org.test4j.junit.Test4J;
import org.test4j.junit.annotations.DataFrom;
@SuppressWarnings({ "rawtypes", "unchecked" })
public class JSONEncoderTest extends Test4J {
@Test
@DataFrom("objects")
public void testEncode(Object obj, String expected) {
String json = JSON.toJSON(obj, JSONFeature.UseSingleQuote);
want.string(json).contains(expected);
}
public static Object[][] objects() {
return new Object[][] {
{ User.newInstance(12, "darui.wu"), "#class:'org.test4j.json.encoder.beans.test.User@" },// <br>
{ new int[] { 1, 2, 3 }, "#class:'int[]@" },// <br>
{ new HashMap(), "#class:'map@" },// <br>
{ new ArrayList(), "#class:'list@" } // <br>
};
}
@Test
// "对象循环引用,并且不输出class的情况")
public void testRefObject() {
GenicBean bean = new GenicBean();
bean.setName("genicBean");
bean.setRefObject(bean);
String json = JSON.toJSON(bean, JSONFeature.UnMarkClassFlag, JSONFeature.UseSingleQuote);
want.string(json).eqIgnoreSpace("{name:'genicBean',refObject:null}");
}
@Test
// "对象循环引用,且输出class的情况")
public void testRefObject_MarkClazz() {
GenicBean bean = new GenicBean();
bean.setName("genicBean");
bean.setRefObject(bean);
String json = JSON.toJSON(bean, JSONFeature.UseSingleQuote);
want.string(json).contains("#class:'org.test4j.json.encoder.beans.test.GenicBean@")
.contains("refObject:{#refer:@");
}
@Test
// "对象是匿名类")
public void testEncode_ProxyClazz() {
User user = new User() {
{
this.setId(124);
this.setName("my name");
}
};
String json = JSON.toJSON(user, JSONFeature.UseSingleQuote);
System.out.println(json);
want.string(json).contains("#class:'org.test4j.json.encoder.beans.test.User@");
}
@Test
public void testFilterClass() {
Object proxy = Proxy.newProxyInstance(this.getClass().getClassLoader(), new Class[] { TestedIntf.class },
new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
return null;
}
});
GenicBean bean = new GenicBean();
bean.setName("filter proxy");
bean.setRefObject(proxy);
String json = JSON.toJSON(bean, JSONFeature.UseSingleQuote);
want.string(json).contains("refObject:null");
}
}