package com.jsoniter; import com.jsoniter.spi.Binding; import com.jsoniter.spi.ClassDescriptor; import com.jsoniter.spi.JsoniterSpi; import com.jsoniter.spi.TypeLiteral; import junit.framework.TestCase; import java.io.IOException; import java.util.*; import static org.junit.Assert.assertArrayEquals; public class TestGenerics extends TestCase { static { // JsonIterator.setMode(DecodingMode.REFLECTION_MODE); } public void test_int_list() throws IOException { JsonIterator iter = JsonIterator.parse("[1,2,3]"); List<Integer> val = iter.read(new TypeLiteral<ArrayList<Integer>>() { }); assertArrayEquals(new Integer[]{1, 2, 3}, val.toArray(new Integer[0])); } public void test_string_list() throws IOException { JsonIterator iter = JsonIterator.parse("['hello', 'world']".replace('\'', '"')); List<String> val = iter.read(new TypeLiteral<List<String>>() { }); assertArrayEquals(new String[]{"hello", "world"}, val.toArray(new String[0])); } public void test_linked_list() throws IOException { JsonIterator iter = JsonIterator.parse("['hello', 'world']".replace('\'', '"')); List<String> val = iter.read(new TypeLiteral<LinkedList<String>>() { }); assertArrayEquals(new String[]{"hello", "world"}, val.toArray(new String[0])); } public void test_string_set() throws IOException { JsonIterator iter = JsonIterator.parse("['hello']".replace('\'', '"')); Set<String> val = iter.read(new TypeLiteral<Set<String>>() { }); assertArrayEquals(new String[]{"hello"}, val.toArray(new String[0])); } public void test_string_map() throws IOException { JsonIterator iter = JsonIterator.parse("{'hello': 'world'}".replace('\'', '"')); Map<String, String> val = iter.read(new TypeLiteral<Map<String, String>>() { }); assertEquals("world", val.get("hello")); } public void test_integer_map() throws IOException { JsonIterator iter = JsonIterator.parse("{'hello': 1}".replace('\'', '"')); Map<String, Integer> val = iter.read(new TypeLiteral<Map<String, Integer>>() { }); assertEquals(Integer.valueOf(1), val.get("hello")); } public void test_list_of_list() throws Exception { JsonIterator iter = JsonIterator.parse("[[1,2],[3,4]]"); List<List<Integer>> listOfList = iter.read(new TypeLiteral<List<List<Integer>>>() { }); assertEquals(Integer.valueOf(4), listOfList.get(1).get(1)); } public void test_complex_object() throws IOException { JsonIterator iter = JsonIterator.parse("{'field1': 100, 'field2': [[1,2],[3,4]]}".replace('\'', '"')); ComplexObject val = iter.read(ComplexObject.class); assertEquals(100, val.field1); assertEquals(Integer.valueOf(4), val.field2.get(1).get(1)); } public static class Class1<A, B> { public List<A> field1; public B[] field2; public List<B>[] field3; public List<A[]> field4; public List<Map<A, List<B>>> getField6() { return null; } public <T> T getField7() { return null; } public void setField8(List<A> a) { } } public static class Class2<C, D, E> extends Class1<C, D> { public E field5; } public static class Class3 extends Class2<String, Integer, Float> { } public void test_generic_super_class() throws IOException { ClassDescriptor desc = JsoniterSpi.getDecodingClassDescriptor(Class3.class, true); Map<String, String> fieldDecoderCacheKeys = new HashMap<String, String>(); for (Binding field : desc.allDecoderBindings()) { fieldDecoderCacheKeys.put(field.name, field.valueTypeLiteral.getDecoderCacheKey()); } for (Binding field : JsoniterSpi.getEncodingClassDescriptor(Class3.class, true).getters) { fieldDecoderCacheKeys.put(field.name, field.valueTypeLiteral.getDecoderCacheKey()); } assertEquals(new HashMap<String, String>() {{ put("field1", "decoder.java.util.List_java.lang.String"); put("field2", "decoder.java.lang.Integer_array"); put("field3", "decoder.java.util.List_java.lang.Integer_array"); put("field4", "decoder.java.util.List_java.lang.String_array"); put("field5", "decoder.java.lang.Float"); put("field6", "decoder.java.util.List_java.util.Map_java.lang.String_java.util.List_java.lang.Integer"); put("field7", "decoder.java.lang.Object"); put("field8", "decoder.java.util.List_java.lang.String"); }}, fieldDecoderCacheKeys); } }