View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one or more
3    * contributor license agreements.  See the NOTICE file distributed with
4    * this work for additional information regarding copyright ownership.
5    * The ASF licenses this file to You under the Apache License, Version 2.0
6    * (the "License"); you may not use this file except in compliance with
7    * the License.  You may obtain a copy of the License at
8    *
9    *      http://www.apache.org/licenses/LICENSE-2.0
10   *
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS,
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   * See the License for the specific language governing permissions and
15   * limitations under the License.
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 }