package com.fasterxml.jackson.databind.deser.merge; import org.junit.Assert; import com.fasterxml.jackson.annotation.JsonMerge; import com.fasterxml.jackson.annotation.OptBoolean; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.*; public class ArrayMergeTest extends BaseMapTest { static class MergedX { @JsonMerge(OptBoolean.TRUE) public T value; public MergedX(T v) { value = v; } protected MergedX() { } } /* /******************************************************** /* Test methods /******************************************************** */ private final ObjectMapper MAPPER = jsonMapperBuilder() // 26-Oct-2016, tatu: Make sure we'll report merge problems by default .disable(MapperFeature.IGNORE_MERGE_FOR_UNMERGEABLE) .build(); public void testObjectArrayMerging() throws Exception { MergedX input = new MergedX(new Object[] { "foo" }); final JavaType type = MAPPER.getTypeFactory().constructType(new TypeReference>() {}); MergedX result = MAPPER.readerFor(type) .withValueToUpdate(input) .readValue(aposToQuotes("{'value':['bar']}")); assertSame(input, result); assertEquals(2, result.value.length); assertEquals("foo", result.value[0]); assertEquals("bar", result.value[1]); // and with one trick result = MAPPER.readerFor(type) .with(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY) .withValueToUpdate(input) .readValue(aposToQuotes("{'value':'zap'}")); assertSame(input, result); assertEquals(3, result.value.length); assertEquals("foo", result.value[0]); assertEquals("bar", result.value[1]); assertEquals("zap", result.value[2]); } public void testStringArrayMerging() throws Exception { MergedX input = new MergedX(new String[] { "foo" }); MergedX result = MAPPER .readerFor(new TypeReference>() {}) .withValueToUpdate(input) .readValue(aposToQuotes("{'value':['bar']}")); assertSame(input, result); assertEquals(2, result.value.length); assertEquals("foo", result.value[0]); assertEquals("bar", result.value[1]); } public void testBooleanArrayMerging() throws Exception { MergedX input = new MergedX(new boolean[] { true, false }); MergedX result = MAPPER .readerFor(new TypeReference>() {}) .withValueToUpdate(input) .readValue(aposToQuotes("{'value':[true]}")); assertSame(input, result); assertEquals(3, result.value.length); Assert.assertArrayEquals(new boolean[] { true, false, true }, result.value); } public void testByteArrayMerging() throws Exception { MergedX input = new MergedX(new byte[] { 1, 2 }); MergedX result = MAPPER .readerFor(new TypeReference>() {}) .withValueToUpdate(input) .readValue(aposToQuotes("{'value':[4, 6.0, null]}")); assertSame(input, result); assertEquals(5, result.value.length); Assert.assertArrayEquals(new byte[] { 1, 2, 4, 6, 0 }, result.value); } public void testShortArrayMerging() throws Exception { MergedX input = new MergedX(new short[] { 1, 2 }); MergedX result = MAPPER .readerFor(new TypeReference>() {}) .withValueToUpdate(input) .readValue(aposToQuotes("{'value':[4, 6]}")); assertSame(input, result); assertEquals(4, result.value.length); Assert.assertArrayEquals(new short[] { 1, 2, 4, 6 }, result.value); } public void testCharArrayMerging() throws Exception { MergedX input = new MergedX(new char[] { 'a', 'b' }); MergedX result = MAPPER .readerFor(new TypeReference>() {}) .withValueToUpdate(input) .readValue(aposToQuotes("{'value':['c']}")); assertSame(input, result); Assert.assertArrayEquals(new char[] { 'a', 'b', 'c' }, result.value); // also some variation input = new MergedX(new char[] { }); result = MAPPER .readerFor(new TypeReference>() {}) .withValueToUpdate(input) .readValue(aposToQuotes("{'value':['c']}")); assertSame(input, result); Assert.assertArrayEquals(new char[] { 'c' }, result.value); } public void testIntArrayMerging() throws Exception { MergedX input = new MergedX(new int[] { 1, 2 }); MergedX result = MAPPER .readerFor(new TypeReference>() {}) .withValueToUpdate(input) .readValue(aposToQuotes("{'value':[4, 6]}")); assertSame(input, result); assertEquals(4, result.value.length); Assert.assertArrayEquals(new int[] { 1, 2, 4, 6 }, result.value); // also some variation input = new MergedX(new int[] { 3, 4, 6 }); result = MAPPER .readerFor(new TypeReference>() {}) .withValueToUpdate(input) .readValue(aposToQuotes("{'value':[ ]}")); assertSame(input, result); Assert.assertArrayEquals(new int[] { 3, 4, 6 }, result.value); } public void testLongArrayMerging() throws Exception { MergedX input = new MergedX(new long[] { 1, 2 }); MergedX result = MAPPER .readerFor(new TypeReference>() {}) .withValueToUpdate(input) .readValue(aposToQuotes("{'value':[4, 6]}")); assertSame(input, result); assertEquals(4, result.value.length); Assert.assertArrayEquals(new long[] { 1, 2, 4, 6 }, result.value); } }