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    *      https://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  
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 }