• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2009 The Guava Authors
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.google.common.base;
18 
19 import com.google.common.annotations.GwtCompatible;
20 import com.google.common.annotations.GwtIncompatible;
21 import com.google.common.collect.ImmutableMap;
22 
23 import junit.framework.TestCase;
24 
25 import java.util.Arrays;
26 import java.util.Map;
27 
28 /**
29  * Tests for {@link Objects#toStringHelper(Object)}.
30  *
31  * @author Jason Lee
32  */
33 @GwtCompatible
34 public class ToStringHelperTest extends TestCase {
35 
36   @GwtIncompatible("Class names are obfuscated in GWT")
testConstructor_instance()37   public void testConstructor_instance() {
38     String toTest = Objects.toStringHelper(this).toString();
39     assertEquals("ToStringHelperTest{}", toTest);
40   }
41 
testConstructorLenient_instance()42   public void testConstructorLenient_instance() {
43     String toTest = Objects.toStringHelper(this).toString();
44     assertTrue(toTest, toTest.matches(".*\\{\\}"));
45   }
46 
47   @GwtIncompatible("Class names are obfuscated in GWT")
testConstructor_innerClass()48   public void testConstructor_innerClass() {
49     String toTest = Objects.toStringHelper(new TestClass()).toString();
50     assertEquals("TestClass{}", toTest);
51   }
52 
testConstructorLenient_innerClass()53   public void testConstructorLenient_innerClass() {
54     String toTest = Objects.toStringHelper(new TestClass()).toString();
55     assertTrue(toTest, toTest.matches(".*\\{\\}"));
56   }
57 
58   @GwtIncompatible("Class names are obfuscated in GWT")
testConstructor_anonymousClass()59   public void testConstructor_anonymousClass() {
60     String toTest = Objects.toStringHelper(new Object() {}).toString();
61     assertEquals("{}", toTest);
62   }
63 
testConstructorLenient_anonymousClass()64   public void testConstructorLenient_anonymousClass() {
65     String toTest = Objects.toStringHelper(new Object() {}).toString();
66     assertTrue(toTest, toTest.matches(".*\\{\\}"));
67   }
68 
69   @GwtIncompatible("Class names are obfuscated in GWT")
testConstructor_classObject()70   public void testConstructor_classObject() {
71     String toTest = Objects.toStringHelper(TestClass.class).toString();
72     assertEquals("TestClass{}", toTest);
73   }
74 
testConstructorLenient_classObject()75   public void testConstructorLenient_classObject() {
76     String toTest = Objects.toStringHelper(TestClass.class).toString();
77     assertTrue(toTest, toTest.matches(".*\\{\\}"));
78   }
79 
testConstructor_stringObject()80   public void testConstructor_stringObject() {
81     String toTest = Objects.toStringHelper("FooBar").toString();
82     assertEquals("FooBar{}", toTest);
83   }
84 
85   @GwtIncompatible("Class names are obfuscated in GWT")
testToStringHelper_localInnerClass()86   public void testToStringHelper_localInnerClass() {
87     // Local inner classes have names ending like "Outer.$1Inner"
88     class LocalInnerClass {}
89     String toTest = Objects.toStringHelper(new LocalInnerClass()).toString();
90     assertEquals("LocalInnerClass{}", toTest);
91   }
92 
testToStringHelperLenient_localInnerClass()93   public void testToStringHelperLenient_localInnerClass() {
94     class LocalInnerClass {}
95     String toTest = Objects.toStringHelper(new LocalInnerClass()).toString();
96     assertTrue(toTest, toTest.matches(".*\\{\\}"));
97   }
98 
99   @GwtIncompatible("Class names are obfuscated in GWT")
testToStringHelper_localInnerNestedClass()100   public void testToStringHelper_localInnerNestedClass() {
101     class LocalInnerClass {
102       class LocalInnerNestedClass {}
103     }
104     String toTest = Objects.toStringHelper(new LocalInnerClass().new LocalInnerNestedClass())
105         .toString();
106     assertEquals("LocalInnerNestedClass{}", toTest);
107   }
108 
testToStringHelperLenient_localInnerNestedClass()109   public void testToStringHelperLenient_localInnerNestedClass() {
110     class LocalInnerClass {
111       class LocalInnerNestedClass {}
112     }
113     String toTest = Objects.toStringHelper(new LocalInnerClass().new LocalInnerNestedClass())
114         .toString();
115     assertTrue(toTest, toTest.matches(".*\\{\\}"));
116   }
117 
118   @GwtIncompatible("Class names are obfuscated in GWT")
testToStringHelper_moreThanNineAnonymousClasses()119   public void testToStringHelper_moreThanNineAnonymousClasses() {
120     // The nth anonymous class has a name ending like "Outer.$n"
121     Object o1 = new Object() {};
122     Object o2 = new Object() {};
123     Object o3 = new Object() {};
124     Object o4 = new Object() {};
125     Object o5 = new Object() {};
126     Object o6 = new Object() {};
127     Object o7 = new Object() {};
128     Object o8 = new Object() {};
129     Object o9 = new Object() {};
130     Object o10 = new Object() {};
131     String toTest = Objects.toStringHelper(o10).toString();
132     assertEquals("{}", toTest);
133   }
134 
testToStringHelperLenient_moreThanNineAnonymousClasses()135   public void testToStringHelperLenient_moreThanNineAnonymousClasses() {
136     // The nth anonymous class has a name ending like "Outer.$n"
137     Object o1 = new Object() {};
138     Object o2 = new Object() {};
139     Object o3 = new Object() {};
140     Object o4 = new Object() {};
141     Object o5 = new Object() {};
142     Object o6 = new Object() {};
143     Object o7 = new Object() {};
144     Object o8 = new Object() {};
145     Object o9 = new Object() {};
146     Object o10 = new Object() {};
147     String toTest = Objects.toStringHelper(o10).toString();
148     assertTrue(toTest, toTest.matches(".*\\{\\}"));
149   }
150 
151   // all remaining test are on an inner class with various fields
152   @GwtIncompatible("Class names are obfuscated in GWT")
testToString_oneField()153   public void testToString_oneField() {
154     String toTest = Objects.toStringHelper(new TestClass())
155         .add("field1", "Hello")
156         .toString();
157     assertEquals("TestClass{field1=Hello}", toTest);
158   }
159 
160   @GwtIncompatible("Class names are obfuscated in GWT")
testToString_oneIntegerField()161   public void testToString_oneIntegerField() {
162     String toTest = Objects.toStringHelper(new TestClass())
163         .add("field1", new Integer(42))
164         .toString();
165     assertEquals("TestClass{field1=42}", toTest);
166   }
167 
168   @GwtIncompatible("Class names are obfuscated in GWT")
testToString_nullInteger()169   public void testToString_nullInteger() {
170     String toTest = Objects.toStringHelper(new TestClass())
171         .add("field1", (Integer) null)
172         .toString();
173     assertEquals("TestClass{field1=null}", toTest);
174   }
175 
testToStringLenient_oneField()176   public void testToStringLenient_oneField() {
177     String toTest = Objects.toStringHelper(new TestClass())
178         .add("field1", "Hello")
179         .toString();
180     assertTrue(toTest, toTest.matches(".*\\{field1\\=Hello\\}"));
181   }
182 
testToStringLenient_oneIntegerField()183   public void testToStringLenient_oneIntegerField() {
184     String toTest = Objects.toStringHelper(new TestClass())
185         .add("field1", new Integer(42))
186         .toString();
187     assertTrue(toTest, toTest.matches(".*\\{field1\\=42\\}"));
188   }
189 
testToStringLenient_nullInteger()190   public void testToStringLenient_nullInteger() {
191     String toTest = Objects.toStringHelper(new TestClass())
192         .add("field1", (Integer) null)
193         .toString();
194     assertTrue(toTest, toTest.matches(".*\\{field1\\=null\\}"));
195   }
196 
197   @GwtIncompatible("Class names are obfuscated in GWT")
testToString_complexFields()198   public void testToString_complexFields() {
199 
200     Map<String, Integer> map = ImmutableMap.<String, Integer>builder()
201         .put("abc", 1)
202         .put("def", 2)
203         .put("ghi", 3)
204         .build();
205     String toTest = Objects.toStringHelper(new TestClass())
206         .add("field1", "This is string.")
207         .add("field2", Arrays.asList("abc", "def", "ghi"))
208         .add("field3", map)
209         .toString();
210     final String expected = "TestClass{"
211         + "field1=This is string., field2=[abc, def, ghi], field3={abc=1, def=2, ghi=3}}";
212 
213     assertEquals(expected, toTest);
214   }
215 
testToStringLenient_complexFields()216   public void testToStringLenient_complexFields() {
217 
218     Map<String, Integer> map = ImmutableMap.<String, Integer>builder()
219         .put("abc", 1)
220         .put("def", 2)
221         .put("ghi", 3)
222         .build();
223     String toTest = Objects.toStringHelper(new TestClass())
224         .add("field1", "This is string.")
225         .add("field2", Arrays.asList("abc", "def", "ghi"))
226         .add("field3", map)
227         .toString();
228     final String expectedRegex = ".*\\{"
229         + "field1\\=This is string\\., "
230         + "field2\\=\\[abc, def, ghi\\], "
231         + "field3=\\{abc\\=1, def\\=2, ghi\\=3\\}\\}";
232 
233     assertTrue(toTest, toTest.matches(expectedRegex));
234   }
235 
testToString_addWithNullName()236   public void testToString_addWithNullName() {
237     Objects.ToStringHelper helper = Objects.toStringHelper(new TestClass());
238     try {
239       helper.add(null, "Hello");
240       fail("No exception was thrown.");
241     } catch (NullPointerException expected) {
242     }
243   }
244 
245   @GwtIncompatible("Class names are obfuscated in GWT")
testToString_addWithNullValue()246   public void testToString_addWithNullValue() {
247     final String result = Objects.toStringHelper(new TestClass())
248         .add("Hello", null)
249         .toString();
250 
251     assertEquals("TestClass{Hello=null}", result);
252   }
253 
testToStringLenient_addWithNullValue()254   public void testToStringLenient_addWithNullValue() {
255     final String result = Objects.toStringHelper(new TestClass())
256         .add("Hello", null)
257         .toString();
258     assertTrue(result, result.matches(".*\\{Hello\\=null\\}"));
259   }
260 
261   @GwtIncompatible("Class names are obfuscated in GWT")
testToString_ToStringTwice()262   public void testToString_ToStringTwice() {
263     Objects.ToStringHelper helper = Objects.toStringHelper(new TestClass())
264         .add("field1", 1)
265         .addValue("value1")
266         .add("field2", "value2");
267     final String expected = "TestClass{field1=1, value1, field2=value2}";
268 
269     assertEquals(expected, helper.toString());
270     // Call toString again
271     assertEquals(expected, helper.toString());
272 
273     // Make sure the cached value is reset when we modify the helper at all
274     final String expected2 = "TestClass{field1=1, value1, field2=value2, 2}";
275     helper.addValue(2);
276     assertEquals(expected2, helper.toString());
277   }
278 
279   @GwtIncompatible("Class names are obfuscated in GWT")
testToString_addValue()280   public void testToString_addValue() {
281     String toTest = Objects.toStringHelper(new TestClass())
282         .add("field1", 1)
283         .addValue("value1")
284         .add("field2", "value2")
285         .addValue(2)
286         .toString();
287     final String expected = "TestClass{field1=1, value1, field2=value2, 2}";
288 
289     assertEquals(expected, toTest);
290   }
291 
testToStringLenient_addValue()292   public void testToStringLenient_addValue() {
293     String toTest = Objects.toStringHelper(new TestClass())
294         .add("field1", 1)
295         .addValue("value1")
296         .add("field2", "value2")
297         .addValue(2)
298         .toString();
299     final String expected = ".*\\{field1\\=1, value1, field2\\=value2, 2\\}";
300 
301     assertTrue(toTest, toTest.matches(expected));
302   }
303 
304   @GwtIncompatible("Class names are obfuscated in GWT")
testToString_addValueWithNullValue()305   public void testToString_addValueWithNullValue() {
306     final String result = Objects.toStringHelper(new TestClass())
307         .addValue(null)
308         .addValue("Hello")
309         .addValue(null)
310         .toString();
311     final String expected = "TestClass{null, Hello, null}";
312 
313     assertEquals(expected, result);
314   }
315 
testToStringLenient_addValueWithNullValue()316   public void testToStringLenient_addValueWithNullValue() {
317     final String result = Objects.toStringHelper(new TestClass())
318         .addValue(null)
319         .addValue("Hello")
320         .addValue(null)
321         .toString();
322     final String expected = ".*\\{null, Hello, null\\}";
323 
324     assertTrue(result, result.matches(expected));
325   }
326 
327   @GwtIncompatible("Class names are obfuscated in GWT")
testToStringOmitNullValues_oneField()328   public void testToStringOmitNullValues_oneField() {
329     String toTest = Objects.toStringHelper(new TestClass())
330         .omitNullValues()
331         .add("field1", null)
332         .toString();
333     assertEquals("TestClass{}", toTest);
334   }
335 
336   @GwtIncompatible("Class names are obfuscated in GWT")
testToStringOmitNullValues_manyFieldsFirstNull()337   public void testToStringOmitNullValues_manyFieldsFirstNull() {
338     String toTest = Objects.toStringHelper(new TestClass())
339         .omitNullValues()
340         .add("field1", null)
341         .add("field2", "Googley")
342         .add("field3", "World")
343         .toString();
344     assertEquals("TestClass{field2=Googley, field3=World}", toTest);
345   }
346 
347   @GwtIncompatible("Class names are obfuscated in GWT")
testToStringOmitNullValues_manyFieldsOmitAfterNull()348   public void testToStringOmitNullValues_manyFieldsOmitAfterNull() {
349     String toTest = Objects.toStringHelper(new TestClass())
350         .add("field1", null)
351         .add("field2", "Googley")
352         .add("field3", "World")
353         .omitNullValues()
354         .toString();
355     assertEquals("TestClass{field2=Googley, field3=World}", toTest);
356   }
357 
358   @GwtIncompatible("Class names are obfuscated in GWT")
testToStringOmitNullValues_manyFieldsLastNull()359   public void testToStringOmitNullValues_manyFieldsLastNull() {
360     String toTest = Objects.toStringHelper(new TestClass())
361         .omitNullValues()
362         .add("field1", "Hello")
363         .add("field2", "Googley")
364         .add("field3", null)
365         .toString();
366     assertEquals("TestClass{field1=Hello, field2=Googley}", toTest);
367   }
368 
369   @GwtIncompatible("Class names are obfuscated in GWT")
testToStringOmitNullValues_oneValue()370   public void testToStringOmitNullValues_oneValue() {
371     String toTest = Objects.toStringHelper(new TestClass())
372         .omitNullValues()
373         .addValue(null)
374         .toString();
375     assertEquals("TestClass{}", toTest);
376   }
377 
378   @GwtIncompatible("Class names are obfuscated in GWT")
testToStringOmitNullValues_manyValuesFirstNull()379   public void testToStringOmitNullValues_manyValuesFirstNull() {
380     String toTest = Objects.toStringHelper(new TestClass())
381         .omitNullValues()
382         .addValue(null)
383         .addValue("Googley")
384         .addValue("World")
385         .toString();
386     assertEquals("TestClass{Googley, World}", toTest);
387   }
388 
389   @GwtIncompatible("Class names are obfuscated in GWT")
testToStringOmitNullValues_manyValuesLastNull()390   public void testToStringOmitNullValues_manyValuesLastNull() {
391     String toTest = Objects.toStringHelper(new TestClass())
392         .omitNullValues()
393         .addValue("Hello")
394         .addValue("Googley")
395         .addValue(null)
396         .toString();
397     assertEquals("TestClass{Hello, Googley}", toTest);
398   }
399 
400   @GwtIncompatible("Class names are obfuscated in GWT")
testToStringOmitNullValues_differentOrder()401   public void testToStringOmitNullValues_differentOrder() {
402     String expected = "TestClass{field1=Hello, field2=Googley, field3=World}";
403     String toTest1 = Objects.toStringHelper(new TestClass())
404         .omitNullValues()
405         .add("field1", "Hello")
406         .add("field2", "Googley")
407         .add("field3", "World")
408         .toString();
409     String toTest2 = Objects.toStringHelper(new TestClass())
410         .add("field1", "Hello")
411         .add("field2", "Googley")
412         .omitNullValues()
413         .add("field3", "World")
414         .toString();
415     assertEquals(expected, toTest1);
416     assertEquals(expected, toTest2);
417   }
418 
419   @GwtIncompatible("Class names are obfuscated in GWT")
testToStringOmitNullValues_canBeCalledManyTimes()420   public void testToStringOmitNullValues_canBeCalledManyTimes() {
421     String toTest = Objects.toStringHelper(new TestClass())
422         .omitNullValues()
423         .omitNullValues()
424         .add("field1", "Hello")
425         .omitNullValues()
426         .add("field2", "Googley")
427         .omitNullValues()
428         .add("field3", "World")
429         .toString();
430     assertEquals("TestClass{field1=Hello, field2=Googley, field3=World}",
431         toTest);
432   }
433 
434   /**
435    * Test class for testing formatting of inner classes.
436    */
437   private static class TestClass {}
438 
439 }
440