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 public 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 public void test_toStringDefaultBehavior() {
65 final ReflectionToStringBuilder builder = new ReflectionToStringBuilder(new TestFeature());
66 final String toString = builder.toString();
67 this.validateAllFieldsPresent(toString);
68 }
69
70 @Test
71 public void test_toStringInclude() {
72 final String toString = ReflectionToStringBuilder.toStringInclude(new TestFeature(), SINGLE_FIELD_TO_SHOW);
73 this.validateIncludeFieldsPresent(toString, new String[]{ SINGLE_FIELD_TO_SHOW }, new String[]{ SINGLE_FIELD_VALUE_TO_SHOW });
74 }
75
76 @Test
77 public void test_toStringIncludeArray() {
78 final String toString = ReflectionToStringBuilder.toStringInclude(new TestFeature(), FIELDS_TO_SHOW);
79 this.validateIncludeFieldsPresent(toString, FIELDS_TO_SHOW, FIELDS_VALUES_TO_SHOW);
80 }
81
82 @Test
83 public void test_toStringIncludeArrayWithNull() {
84 final String toString = ReflectionToStringBuilder.toStringInclude(new TestFeature(), new String[]{null});
85 this.validateAllFieldsPresent(toString);
86 }
87
88 @Test
89 public void test_toStringIncludeArrayWithNulls() {
90 final String toString = ReflectionToStringBuilder.toStringInclude(new TestFeature(), null, null);
91 this.validateAllFieldsPresent(toString);
92 }
93
94 @Test
95 public 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 this.validateIncludeFieldsPresent(toString, new String[]{ SINGLE_FIELD_TO_SHOW }, new String[]{ SINGLE_FIELD_VALUE_TO_SHOW });
100 }
101
102 @Test
103 public void test_toStringIncludeCollectionWithNull() {
104 final List<String> includeList = new ArrayList<>();
105 includeList.add(null);
106 final String toString = ReflectionToStringBuilder.toStringInclude(new TestFeature(), includeList);
107 this.validateAllFieldsPresent(toString);
108 }
109
110 @Test
111 public 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 this.validateAllFieldsPresent(toString);
117 }
118
119 @Test
120 public void test_toStringIncludeEmptyArray() {
121 final String toString = ReflectionToStringBuilder.toStringInclude(new TestFeature(), ArrayUtils.EMPTY_STRING_ARRAY);
122 this.validateAllFieldsPresent(toString);
123 }
124
125 @Test
126 public void test_toStringIncludeEmptyCollection() {
127 final String toString = ReflectionToStringBuilder.toStringInclude(new TestFeature(), new ArrayList<>());
128 this.validateAllFieldsPresent(toString);
129 }
130
131 @Test
132 public void test_toStringIncludeNullArray() {
133 final String toString = ReflectionToStringBuilder.toStringInclude(new TestFeature(), (String[]) null);
134 this.validateAllFieldsPresent(toString);
135 }
136
137 @Test
138 public void test_toStringIncludeNullArrayMultiplesValues() {
139 final String toString = ReflectionToStringBuilder.toStringInclude(new TestFeature(), new String[] {null, null, null, null});
140 this.validateAllFieldsPresent(toString);
141 }
142
143 @Test
144 public void test_toStringIncludeNullCollection() {
145 final String toString = ReflectionToStringBuilder.toStringInclude(new TestFeature(), (Collection<String>) null);
146 this.validateAllFieldsPresent(toString);
147 }
148
149 @Test
150 public void test_toStringIncludeWithoutInformingFields() {
151 final String toString = ReflectionToStringBuilder.toStringInclude(new TestFeature());
152 this.validateAllFieldsPresent(toString);
153 }
154
155 @Test
156 public 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, () -> {
161 builder.toString();
162 });
163 }
164
165 @Test
166 public void test_toStringSetIncludeAndExcludeWithoutIntersection() {
167 final ReflectionToStringBuilder builder = new ReflectionToStringBuilder(new TestFeature());
168 builder.setExcludeFieldNames(FIELDS[1], FIELDS[4]);
169 builder.setIncludeFieldNames(FIELDS_TO_SHOW);
170 final String toString = builder.toString();
171 this.validateIncludeFieldsPresent(toString, FIELDS_TO_SHOW, FIELDS_VALUES_TO_SHOW);
172 }
173
174 @Test
175 public void test_toStringSetIncludeAndExcludeWithRandomFieldsWithIntersection() {
176 final ReflectionToStringBuilder builder = new ReflectionToStringBuilder(new TestFeature());
177 builder.setExcludeFieldNames(FIELDS[1], "random1");
178 builder.setIncludeFieldNames("random1");
179 Assertions.assertThrows(IllegalStateException.class, () -> {
180 builder.toString();
181 });
182 }
183
184 @Test
185 public void test_toStringSetIncludeAndExcludeWithRandomFieldsWithoutIntersection() {
186 final ReflectionToStringBuilder builder = new ReflectionToStringBuilder(new TestFeature());
187 builder.setExcludeFieldNames(FIELDS[1], "random1");
188 builder.setIncludeFieldNames("random2", FIELDS[2]);
189 final String toString = builder.toString();
190 this.validateIncludeFieldsPresent(toString, new String[]{FIELDS[2]}, new String[]{VALUES[2]});
191 }
192
193 @Test
194 public void test_toStringSetIncludeWithArrayWithMultipleNullFields() {
195 final ReflectionToStringBuilder builder = new ReflectionToStringBuilder(new TestFeature());
196 builder.setExcludeFieldNames(new String[] {FIELDS[1], FIELDS[4]});
197 builder.setIncludeFieldNames(new String[] {null, null, null});
198 final String toString = builder.toString();
199 this.validateIncludeFieldsPresent(toString, new String[]{FIELDS[0], FIELDS[2], FIELDS[3]}, new String[]{VALUES[0], VALUES[2], VALUES[3]});
200 }
201
202 @Test
203 public void test_toStringSetIncludeWithMultipleNullFields() {
204 final ReflectionToStringBuilder builder = new ReflectionToStringBuilder(new TestFeature());
205 builder.setExcludeFieldNames(FIELDS[1], FIELDS[4]);
206 builder.setIncludeFieldNames(null, null, null);
207 final String toString = builder.toString();
208 this.validateIncludeFieldsPresent(toString, new String[]{FIELDS[0], FIELDS[2], FIELDS[3]}, new String[]{VALUES[0], VALUES[2], VALUES[3]});
209 }
210
211 private void validateAllFieldsPresent(final String toString) {
212 validateIncludeFieldsPresent(toString, FIELDS, VALUES);
213 }
214
215 private void validateIncludeFieldsPresent(final String toString, final String[] fieldsToShow, final String[] valuesToShow) {
216 for (final String includeField : fieldsToShow) {
217 assertTrue(toString.indexOf(includeField) > 0);
218 }
219
220 for (final String includeValue : valuesToShow) {
221 assertTrue(toString.indexOf(includeValue) > 0);
222 }
223
224 this.validateNonIncludeFieldsAbsent(toString, fieldsToShow, valuesToShow);
225 }
226
227 private void validateNonIncludeFieldsAbsent(final String toString, final String[] IncludeFields, final String[] IncludeFieldsValues) {
228 final String[] nonIncludeFields = ArrayUtils.removeElements(FIELDS.clone(), IncludeFields);
229 final String[] nonIncludeFieldsValues = ArrayUtils.removeElements(VALUES.clone(), IncludeFieldsValues);
230
231 for (final String nonIncludeField : nonIncludeFields) {
232 assertEquals(ArrayUtils.INDEX_NOT_FOUND, toString.indexOf(nonIncludeField));
233 }
234
235 for (final String nonIncludeValue : nonIncludeFieldsValues) {
236 assertEquals(ArrayUtils.INDEX_NOT_FOUND, toString.indexOf(nonIncludeValue));
237 }
238 }
239 }