1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.apache.commons.lang3.builder;
19
20 import static org.junit.jupiter.api.Assertions.assertEquals;
21 import static org.junit.jupiter.api.Assertions.assertThrows;
22 import static org.junit.jupiter.api.Assertions.assertTrue;
23
24 import java.util.ArrayList;
25 import java.util.Collection;
26 import java.util.List;
27
28 import org.apache.commons.lang3.ArrayUtils;
29 import org.junit.jupiter.api.Test;
30
31 class ReflectionToStringBuilderIncludeTest extends AbstractBuilderTest {
32
33 final class TestFeature {
34 @SuppressWarnings("unused")
35 private final String field1 = VALUES[0];
36
37 @SuppressWarnings("unused")
38 private final String field2 = VALUES[1];
39
40 @SuppressWarnings("unused")
41 private final String field3 = VALUES[2];
42
43 @SuppressWarnings("unused")
44 private final String field4 = VALUES[3];
45
46 @SuppressWarnings("unused")
47 private final String field5 = VALUES[4];
48 }
49
50 private static final String[] FIELDS = {"field1", "field2", "field3", "field4", "field5"};
51
52 private static final String[] VALUES = {"value 1", "value 2", "value 3", "value 4", "value 5"};
53
54 private static final String SINGLE_FIELD_TO_SHOW = FIELDS[2];
55
56 private static final String SINGLE_FIELD_VALUE_TO_SHOW = VALUES[2];
57
58 private static final String[] FIELDS_TO_SHOW = {FIELDS[0], FIELDS[3]};
59
60 private static final String[] FIELDS_VALUES_TO_SHOW = {VALUES[0], VALUES[3]};
61
62 @Test
63 void test_toStringDefaultBehavior() {
64 final ReflectionToStringBuilder builder = new ReflectionToStringBuilder(new TestFeature());
65 final String toString = builder.toString();
66 validateAllFieldsPresent(toString);
67 }
68
69 @Test
70 void test_toStringInclude() {
71 final String toString = ReflectionToStringBuilder.toStringInclude(new TestFeature(), SINGLE_FIELD_TO_SHOW);
72 validateIncludeFieldsPresent(toString, new String[]{ SINGLE_FIELD_TO_SHOW }, new String[]{ SINGLE_FIELD_VALUE_TO_SHOW });
73 }
74
75 @Test
76 void test_toStringIncludeArray() {
77 final String toString = ReflectionToStringBuilder.toStringInclude(new TestFeature(), FIELDS_TO_SHOW);
78 validateIncludeFieldsPresent(toString, FIELDS_TO_SHOW, FIELDS_VALUES_TO_SHOW);
79 }
80
81 @Test
82 void test_toStringIncludeArrayWithNull() {
83 final String toString = ReflectionToStringBuilder.toStringInclude(new TestFeature(), new String[]{null});
84 validateAllFieldsPresent(toString);
85 }
86
87 @Test
88 void test_toStringIncludeArrayWithNulls() {
89 final String toString = ReflectionToStringBuilder.toStringInclude(new TestFeature(), null, null);
90 validateAllFieldsPresent(toString);
91 }
92
93 @Test
94 void test_toStringIncludeCollection() {
95 final List<String> includeList = new ArrayList<>();
96 includeList.add(SINGLE_FIELD_TO_SHOW);
97 final String toString = ReflectionToStringBuilder.toStringInclude(new TestFeature(), includeList);
98 validateIncludeFieldsPresent(toString, new String[]{ SINGLE_FIELD_TO_SHOW }, new String[]{ SINGLE_FIELD_VALUE_TO_SHOW });
99 }
100
101 @Test
102 void test_toStringIncludeCollectionWithNull() {
103 final List<String> includeList = new ArrayList<>();
104 includeList.add(null);
105 final String toString = ReflectionToStringBuilder.toStringInclude(new TestFeature(), includeList);
106 validateAllFieldsPresent(toString);
107 }
108
109 @Test
110 void test_toStringIncludeCollectionWithNulls() {
111 final List<String> includeList = new ArrayList<>();
112 includeList.add(null);
113 includeList.add(null);
114 final String toString = ReflectionToStringBuilder.toStringInclude(new TestFeature(), includeList);
115 validateAllFieldsPresent(toString);
116 }
117
118 @Test
119 void test_toStringIncludeEmptyArray() {
120 final String toString = ReflectionToStringBuilder.toStringInclude(new TestFeature(), ArrayUtils.EMPTY_STRING_ARRAY);
121 validateAllFieldsPresent(toString);
122 }
123
124 @Test
125 void test_toStringIncludeEmptyCollection() {
126 final String toString = ReflectionToStringBuilder.toStringInclude(new TestFeature(), new ArrayList<>());
127 validateAllFieldsPresent(toString);
128 }
129
130 @Test
131 void test_toStringIncludeNullArray() {
132 final String toString = ReflectionToStringBuilder.toStringInclude(new TestFeature(), (String[]) null);
133 validateAllFieldsPresent(toString);
134 }
135
136 @Test
137 void test_toStringIncludeNullArrayMultiplesValues() {
138 final String toString = ReflectionToStringBuilder.toStringInclude(new TestFeature(), null, null, null, null);
139 validateAllFieldsPresent(toString);
140 }
141
142 @Test
143 void test_toStringIncludeNullCollection() {
144 final String toString = ReflectionToStringBuilder.toStringInclude(new TestFeature(), (Collection<String>) null);
145 validateAllFieldsPresent(toString);
146 }
147
148 @Test
149 void test_toStringIncludeWithoutInformingFields() {
150 final String toString = ReflectionToStringBuilder.toStringInclude(new TestFeature());
151 validateAllFieldsPresent(toString);
152 }
153
154 @Test
155 void test_toStringSetIncludeAndExcludeWithIntersection() {
156 final ReflectionToStringBuilder builder = new ReflectionToStringBuilder(new TestFeature());
157 builder.setExcludeFieldNames(FIELDS[1], FIELDS[4]);
158 builder.setIncludeFieldNames(FIELDS[0], FIELDS[1]);
159 assertThrows(IllegalStateException.class, () -> builder.toString());
160 }
161
162 @Test
163 void test_toStringSetIncludeAndExcludeWithoutIntersection() {
164 final ReflectionToStringBuilder builder = new ReflectionToStringBuilder(new TestFeature());
165 builder.setExcludeFieldNames(FIELDS[1], FIELDS[4]);
166 builder.setIncludeFieldNames(FIELDS_TO_SHOW);
167 final String toString = builder.toString();
168 validateIncludeFieldsPresent(toString, FIELDS_TO_SHOW, FIELDS_VALUES_TO_SHOW);
169 }
170
171 @Test
172 void test_toStringSetIncludeAndExcludeWithRandomFieldsWithIntersection() {
173 final ReflectionToStringBuilder builder = new ReflectionToStringBuilder(new TestFeature());
174 builder.setExcludeFieldNames(FIELDS[1], "random1");
175 builder.setIncludeFieldNames("random1");
176 assertThrows(IllegalStateException.class, () -> builder.toString());
177 }
178
179 @Test
180 void test_toStringSetIncludeAndExcludeWithRandomFieldsWithoutIntersection() {
181 final ReflectionToStringBuilder builder = new ReflectionToStringBuilder(new TestFeature());
182 builder.setExcludeFieldNames(FIELDS[1], "random1");
183 builder.setIncludeFieldNames("random2", FIELDS[2]);
184 final String toString = builder.toString();
185 validateIncludeFieldsPresent(toString, new String[]{FIELDS[2]}, new String[]{VALUES[2]});
186 }
187
188 @Test
189 void test_toStringSetIncludeWithArrayWithMultipleNullFields() {
190 final ReflectionToStringBuilder builder = new ReflectionToStringBuilder(new TestFeature());
191 builder.setExcludeFieldNames(FIELDS[1], FIELDS[4]);
192 builder.setIncludeFieldNames(null, null, null);
193 final String toString = builder.toString();
194 validateIncludeFieldsPresent(toString, new String[]{FIELDS[0], FIELDS[2], FIELDS[3]}, new String[]{VALUES[0], VALUES[2], VALUES[3]});
195 }
196
197 @Test
198 void test_toStringSetIncludeWithMultipleNullFields() {
199 final ReflectionToStringBuilder builder = new ReflectionToStringBuilder(new TestFeature());
200 builder.setExcludeFieldNames(FIELDS[1], FIELDS[4]);
201 builder.setIncludeFieldNames(null, null, null);
202 final String toString = builder.toString();
203 validateIncludeFieldsPresent(toString, new String[]{FIELDS[0], FIELDS[2], FIELDS[3]}, new String[]{VALUES[0], VALUES[2], VALUES[3]});
204 }
205
206 private void validateAllFieldsPresent(final String toString) {
207 validateIncludeFieldsPresent(toString, FIELDS, VALUES);
208 }
209
210 private void validateIncludeFieldsPresent(final String toString, final String[] fieldsToShow, final String[] valuesToShow) {
211 for (final String includeField : fieldsToShow) {
212 assertTrue(toString.indexOf(includeField) > 0);
213 }
214
215 for (final String includeValue : valuesToShow) {
216 assertTrueIfAccessible(toString.indexOf(includeValue) > 0);
217 }
218
219 validateNonIncludeFieldsAbsent(toString, fieldsToShow, valuesToShow);
220 }
221
222 private void validateNonIncludeFieldsAbsent(final String toString, final String[] IncludeFields, final String[] IncludeFieldsValues) {
223 final String[] nonIncludeFields = ArrayUtils.removeElements(FIELDS.clone(), IncludeFields);
224 final String[] nonIncludeFieldsValues = ArrayUtils.removeElements(VALUES.clone(), IncludeFieldsValues);
225
226 for (final String nonIncludeField : nonIncludeFields) {
227 assertEquals(ArrayUtils.INDEX_NOT_FOUND, toString.indexOf(nonIncludeField));
228 }
229
230 for (final String nonIncludeValue : nonIncludeFieldsValues) {
231 assertEquals(ArrayUtils.INDEX_NOT_FOUND, toString.indexOf(nonIncludeValue));
232 }
233 }
234 }