1 package com.fasterxml.jackson.annotation; 2 3 import com.fasterxml.jackson.annotation.JsonInclude.Include; 4 5 /** 6 * Tests to verify that it is possibly to merge {@link JsonInclude.Value} 7 * instances for overrides 8 */ 9 public class IncludeTest extends TestBase 10 { 11 private final JsonInclude.Value EMPTY = JsonInclude.Value.empty(); 12 13 @JsonInclude(value=JsonInclude.Include.NON_EMPTY, content=JsonInclude.Include.NON_DEFAULT) 14 private final static class Bogus { } 15 16 @JsonInclude(value=JsonInclude.Include.CUSTOM, valueFilter=Integer.class, 17 content=JsonInclude.Include.CUSTOM, contentFilter=Long.class) 18 private final static class Custom { } 19 testEquality()20 public void testEquality() { 21 assertTrue(EMPTY.equals(EMPTY)); 22 23 JsonInclude.Value v1 = JsonInclude.Value.construct(Include.NON_ABSENT, null); 24 JsonInclude.Value v2 = JsonInclude.Value.construct(Include.NON_ABSENT, null); 25 JsonInclude.Value v3 = JsonInclude.Value.construct(Include.NON_ABSENT, Include.NON_EMPTY); 26 27 assertTrue(v1.equals(v2)); 28 assertTrue(v2.equals(v1)); 29 30 assertFalse(v1.equals(v3)); 31 assertFalse(v3.equals(v1)); 32 assertFalse(v2.equals(v3)); 33 assertFalse(v3.equals(v2)); 34 } 35 testFromAnnotation()36 public void testFromAnnotation() 37 { 38 JsonInclude ann = Bogus.class.getAnnotation(JsonInclude.class); 39 JsonInclude.Value v = JsonInclude.Value.from(ann); 40 assertEquals(Include.NON_EMPTY, v.getValueInclusion()); 41 assertEquals(Include.NON_DEFAULT, v.getContentInclusion()); 42 } 43 testFromAnnotationWithCustom()44 public void testFromAnnotationWithCustom() 45 { 46 JsonInclude ann = Custom.class.getAnnotation(JsonInclude.class); 47 JsonInclude.Value v = JsonInclude.Value.from(ann); 48 assertEquals(Include.CUSTOM, v.getValueInclusion()); 49 assertEquals(Include.CUSTOM, v.getContentInclusion()); 50 assertEquals(Integer.class, v.getValueFilter()); 51 assertEquals(Long.class, v.getContentFilter()); 52 53 assertEquals( 54 "JsonInclude.Value(value=CUSTOM,content=CUSTOM,valueFilter=java.lang.Integer.class,contentFilter=java.lang.Long.class)", 55 v.toString()); 56 } 57 testStdOverrides()58 public void testStdOverrides() { 59 assertEquals("JsonInclude.Value(value=NON_ABSENT,content=USE_DEFAULTS)", 60 JsonInclude.Value.construct(Include.NON_ABSENT, null).toString()); 61 int x = EMPTY.hashCode(); 62 if (x == 0) { 63 fail(); 64 } 65 assertFalse(EMPTY.equals(null)); 66 assertFalse(EMPTY.equals("")); 67 } 68 testSimpleMerge()69 public void testSimpleMerge() 70 { 71 JsonInclude.Value empty = JsonInclude.Value.empty(); 72 73 assertEquals(Include.USE_DEFAULTS, empty.getValueInclusion()); 74 assertEquals(Include.USE_DEFAULTS, empty.getContentInclusion()); 75 76 JsonInclude.Value v2 = empty.withValueInclusion(Include.NON_ABSENT); 77 78 assertEquals(Include.NON_ABSENT, v2.getValueInclusion()); 79 assertEquals(Include.USE_DEFAULTS, v2.getContentInclusion()); 80 81 JsonInclude.Value v3 = new JsonInclude.Value(Include.NON_EMPTY, Include.ALWAYS, 82 null, null); 83 assertEquals(Include.NON_EMPTY, v3.getValueInclusion()); 84 assertEquals(Include.ALWAYS, v3.getContentInclusion()); 85 86 // Ok; but then overrides, which should skip 'USE_DEFAULT' overrides 87 JsonInclude.Value merged = v3.withOverrides(empty); 88 // no overrides with "empty": 89 assertEquals(v3.getValueInclusion(), merged.getValueInclusion()); 90 assertEquals(v3.getContentInclusion(), merged.getContentInclusion()); 91 92 // but other values ought to be overridden (value, yes, content, no because it's default) 93 merged = JsonInclude.Value.merge(v3, v2); 94 assertEquals(v2.getValueInclusion(), merged.getValueInclusion()); 95 assertEquals(v3.getContentInclusion(), merged.getContentInclusion()); 96 97 merged = JsonInclude.Value.mergeAll(empty, v3); 98 assertEquals(v3.getValueInclusion(), merged.getValueInclusion()); 99 assertEquals(v3.getContentInclusion(), merged.getContentInclusion()); 100 } 101 102 // for [annotations#76] testContentMerge76()103 public void testContentMerge76() 104 { 105 JsonInclude.Value v1 = JsonInclude.Value.empty() 106 .withContentInclusion(JsonInclude.Include.ALWAYS) 107 .withValueInclusion(JsonInclude.Include.NON_ABSENT); 108 JsonInclude.Value v2 = JsonInclude.Value.empty() 109 .withContentInclusion(JsonInclude.Include.NON_EMPTY) 110 .withValueInclusion(JsonInclude.Include.USE_DEFAULTS); 111 112 JsonInclude.Value v12 = v2.withOverrides(v1); // v1 priority 113 JsonInclude.Value v21 = v1.withOverrides(v2); // v2 priority 114 115 assertEquals(JsonInclude.Include.ALWAYS, v12.getContentInclusion()); 116 assertEquals(JsonInclude.Include.NON_ABSENT, v12.getValueInclusion()); 117 118 assertEquals(JsonInclude.Include.NON_EMPTY, v21.getContentInclusion()); 119 assertEquals(JsonInclude.Include.NON_ABSENT, v21.getValueInclusion()); 120 } 121 testFilters()122 public void testFilters() 123 { 124 JsonInclude.Value empty = JsonInclude.Value.empty(); 125 assertNull(empty.getValueFilter()); 126 assertNull(empty.getContentFilter()); 127 128 // note: filter class choices are arbitrary, just confirming assingments 129 JsonInclude.Value v1 = empty.withValueFilter(String.class); 130 assertEquals(JsonInclude.Include.CUSTOM, v1.getValueInclusion()); 131 assertEquals(String.class, v1.getValueFilter()); 132 assertNull(v1.withValueFilter(null).getValueFilter()); 133 assertNull(v1.withValueFilter(Void.class).getValueFilter()); 134 135 JsonInclude.Value v2 = empty.withContentFilter(Long.class); 136 assertEquals(JsonInclude.Include.CUSTOM, v2.getContentInclusion()); 137 assertEquals(Long.class, v2.getContentFilter()); 138 assertNull(v2.withContentFilter(null).getContentFilter()); 139 assertNull(v2.withContentFilter(Void.class).getContentFilter()); 140 } 141 } 142