1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.commons.lang3.builder;
18
19 import static org.junit.jupiter.api.Assertions.assertEquals;
20 import static org.junit.jupiter.api.Assertions.assertNotNull;
21
22 import org.apache.commons.lang3.AbstractLangTest;
23 import org.junit.jupiter.api.Test;
24
25 public class ReflectionDiffBuilderTest extends AbstractLangTest {
26
27 @SuppressWarnings("unused")
28 private static final class TypeTestChildClass extends TypeTestClass {
29 String field = "a";
30 }
31
32 @SuppressWarnings("unused")
33 private static class TypeTestClass implements Diffable<TypeTestClass> {
34 private static int staticField;
35 private final ToStringStyle style = SHORT_STYLE;
36 private final boolean booleanField = true;
37 private final boolean[] booleanArrayField = {true};
38 private final byte byteField = (byte) 0xFF;
39 private final byte[] byteArrayField = {(byte) 0xFF};
40 private char charField = 'a';
41 private char[] charArrayField = {'a'};
42 private final double doubleField = 1.0;
43 private final double[] doubleArrayField = {1.0};
44 private final float floatField = 1.0f;
45 private final float[] floatArrayField = {1.0f};
46 int intField = 1;
47 private final int[] intArrayField = {1};
48 private final long longField = 1L;
49 private final long[] longArrayField = {1L};
50 private final short shortField = 1;
51 private final short[] shortArrayField = {1};
52 private final Object objectField = null;
53 private final Object[] objectArrayField = {null};
54 private transient String transientField;
55 @DiffExclude
56 private String annotatedField = "a";
57 private String excludedField = "a";
58
59
60 @Override
61 public DiffResult diff(final TypeTestClass obj) {
62 return new ReflectionDiffBuilder(this, obj, style).setExcludeFieldNames("excludedField").build();
63 }
64
65 @Override
66 public boolean equals(final Object obj) {
67 return EqualsBuilder.reflectionEquals(this, obj, false);
68 }
69
70 @Override
71 public int hashCode() {
72 return HashCodeBuilder.reflectionHashCode(this, false);
73 }
74 }
75
76 private static final ToStringStyle SHORT_STYLE = ToStringStyle.SHORT_PREFIX_STYLE;
77
78 @Test
79 public void test_array_difference() {
80 final TypeTestClass firstObject = new TypeTestClass();
81 firstObject.charArrayField = new char[] { 'c' };
82 final TypeTestClass secondObject = new TypeTestClass();
83
84 final DiffResult list = firstObject.diff(secondObject);
85 assertEquals(1, list.getNumberOfDiffs());
86 }
87
88 @Test
89 public void test_difference_in_inherited_field() {
90 final TypeTestChildClass firstObject = new TypeTestChildClass();
91 firstObject.intField = 99;
92 final TypeTestChildClass secondObject = new TypeTestChildClass();
93
94 final DiffResult list = firstObject.diff(secondObject);
95 assertEquals(1, list.getNumberOfDiffs());
96 }
97
98 @Test
99 public void test_no_differences() {
100 final TypeTestClass firstObject = new TypeTestClass();
101 final TypeTestClass secondObject = new TypeTestClass();
102
103 final DiffResult list = firstObject.diff(secondObject);
104 assertEquals(0, list.getNumberOfDiffs());
105 }
106
107 @Test
108 public void test_no_differences_diff_exclude_annotated_field() {
109 final TypeTestClass firstObject = new TypeTestClass();
110 firstObject.annotatedField = "b";
111 final TypeTestClass secondObject = new TypeTestClass();
112
113 final DiffResult list = firstObject.diff(secondObject);
114 assertEquals(0, list.getNumberOfDiffs());
115 }
116
117 @Test
118 public void test_no_differences_diff_exluded_field_and_exclude_annotated_field() {
119 final TypeTestClass firstObject = new TypeTestClass();
120 firstObject.excludedField = "b";
121 firstObject.annotatedField = "b";
122 final TypeTestClass secondObject = new TypeTestClass();
123
124 final DiffResult list = firstObject.diff(secondObject);
125 assertEquals(0, list.getNumberOfDiffs());
126 }
127
128 @Test
129 public void test_no_differences_excluded_field() {
130 final TypeTestClass firstObject = new TypeTestClass();
131 firstObject.excludedField = "b";
132 final TypeTestClass secondObject = new TypeTestClass();
133
134 final DiffResult list = firstObject.diff(secondObject);
135 assertEquals(0, list.getNumberOfDiffs());
136 }
137
138 @Test
139 public void test_no_differences_inheritance() {
140 final TypeTestChildClass firstObject = new TypeTestChildClass();
141 final TypeTestChildClass secondObject = new TypeTestChildClass();
142
143 final DiffResult list = firstObject.diff(secondObject);
144 assertEquals(0, list.getNumberOfDiffs());
145 }
146
147 @Test
148 public void test_primitive_difference() {
149 final TypeTestClass firstObject = new TypeTestClass();
150 firstObject.charField = 'c';
151 final TypeTestClass secondObject = new TypeTestClass();
152
153 final DiffResult list = firstObject.diff(secondObject);
154 assertEquals(1, list.getNumberOfDiffs());
155 }
156
157 @Test
158 public void test_transient_field_difference() {
159 final TypeTestClass firstObject = new TypeTestClass();
160 firstObject.transientField = "a";
161 final TypeTestClass secondObject = new TypeTestClass();
162 firstObject.transientField = "b";
163
164 final DiffResult list = firstObject.diff(secondObject);
165 assertEquals(0, list.getNumberOfDiffs());
166 }
167
168 @Test
169 public void testGetExcludeFieldNamesWithNullExcludedFieldNames() {
170 final ReflectionDiffBuilder<TypeTestClass> reflectionDiffBuilder = new ReflectionDiffBuilder<>(new TypeTestClass(), new TypeTestChildClass(), SHORT_STYLE);
171 reflectionDiffBuilder.setExcludeFieldNames(null);
172 final String[] excludeFieldNames = reflectionDiffBuilder.getExcludeFieldNames();
173 assertNotNull(excludeFieldNames);
174 assertEquals(0, excludeFieldNames.length);
175 }
176
177 @Test
178 public void testGetExcludeFieldNamesWithNullValuesInExcludedFieldNames() {
179 final ReflectionDiffBuilder<TypeTestClass> reflectionDiffBuilder = new ReflectionDiffBuilder<>(new TypeTestClass(), new TypeTestChildClass(), SHORT_STYLE);
180 reflectionDiffBuilder.setExcludeFieldNames("charField", null);
181 final String[] excludeFieldNames = reflectionDiffBuilder.getExcludeFieldNames();
182 assertNotNull(excludeFieldNames);
183 assertEquals(1, excludeFieldNames.length);
184 assertEquals("charField", excludeFieldNames[0]);
185 }
186
187 }