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