• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2008 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 static com.google.common.base.Functions.toStringFunction;
20 
21 import com.google.common.annotations.GwtCompatible;
22 import com.google.common.annotations.GwtIncompatible;
23 import com.google.common.annotations.J2ktIncompatible;
24 import com.google.common.collect.ImmutableList;
25 import com.google.common.collect.Lists;
26 import com.google.common.primitives.Longs;
27 import com.google.common.testing.EqualsTester;
28 import com.google.common.testing.SerializableTester;
29 import java.util.Iterator;
30 import java.util.List;
31 import junit.framework.TestCase;
32 
33 /** Unit tests for {@link Converter}. */
34 @GwtCompatible(emulated = true)
35 public class ConverterTest extends TestCase {
36 
37   private static final Converter<String, Long> STR_TO_LONG =
38       new Converter<String, Long>() {
39         @Override
40         protected Long doForward(String object) {
41           return Long.valueOf(object);
42         }
43 
44         @Override
45         protected String doBackward(Long object) {
46           return String.valueOf(object);
47         }
48 
49         @Override
50         public String toString() {
51           return "string2long";
52         }
53       };
54 
55   private static final Long LONG_VAL = 12345L;
56   private static final String STR_VAL = "12345";
57 
58   private static final ImmutableList<String> STRINGS = ImmutableList.of("123", "456");
59   private static final ImmutableList<Long> LONGS = ImmutableList.of(123L, 456L);
60 
testConverter()61   public void testConverter() {
62     assertEquals(LONG_VAL, STR_TO_LONG.convert(STR_VAL));
63     assertEquals(STR_VAL, STR_TO_LONG.reverse().convert(LONG_VAL));
64 
65     Iterable<Long> convertedValues = STR_TO_LONG.convertAll(STRINGS);
66     assertEquals(LONGS, ImmutableList.copyOf(convertedValues));
67   }
68 
testConvertAllIsView()69   public void testConvertAllIsView() {
70     List<String> mutableList = Lists.newArrayList("789", "123");
71     Iterable<Long> convertedValues = STR_TO_LONG.convertAll(mutableList);
72     assertEquals(ImmutableList.of(789L, 123L), ImmutableList.copyOf(convertedValues));
73 
74     Iterator<Long> iterator = convertedValues.iterator();
75     iterator.next();
76     iterator.remove();
77     assertEquals(ImmutableList.of("123"), mutableList);
78   }
79 
testReverse()80   public void testReverse() {
81     Converter<Long, String> reverseConverter = STR_TO_LONG.reverse();
82 
83     assertEquals(STR_VAL, reverseConverter.convert(LONG_VAL));
84     assertEquals(LONG_VAL, reverseConverter.reverse().convert(STR_VAL));
85 
86     Iterable<String> convertedValues = reverseConverter.convertAll(LONGS);
87     assertEquals(STRINGS, ImmutableList.copyOf(convertedValues));
88 
89     assertSame(STR_TO_LONG, reverseConverter.reverse());
90 
91     assertEquals("string2long.reverse()", reverseConverter.toString());
92 
93     new EqualsTester()
94         .addEqualityGroup(STR_TO_LONG, STR_TO_LONG.reverse().reverse())
95         .addEqualityGroup(STR_TO_LONG.reverse(), STR_TO_LONG.reverse())
96         .testEquals();
97   }
98 
testReverseReverse()99   public void testReverseReverse() {
100     Converter<String, Long> converter = STR_TO_LONG;
101     assertEquals(converter, converter.reverse().reverse());
102   }
103 
testApply()104   public void testApply() {
105     assertEquals(LONG_VAL, STR_TO_LONG.apply(STR_VAL));
106   }
107 
108   private static class StringWrapper {
109     private final String value;
110 
StringWrapper(String value)111     public StringWrapper(String value) {
112       this.value = value;
113     }
114   }
115 
116   @GwtIncompatible // J2CL generics problem
testAndThen()117   public void testAndThen() {
118     Converter<StringWrapper, String> first =
119         new Converter<StringWrapper, String>() {
120           @Override
121           protected String doForward(StringWrapper object) {
122             return object.value;
123           }
124 
125           @Override
126           protected StringWrapper doBackward(String object) {
127             return new StringWrapper(object);
128           }
129 
130           @Override
131           public String toString() {
132             return "StringWrapper";
133           }
134         };
135 
136     Converter<StringWrapper, Long> converter = first.andThen(STR_TO_LONG);
137 
138     assertEquals(LONG_VAL, converter.convert(new StringWrapper(STR_VAL)));
139     assertEquals(STR_VAL, converter.reverse().convert(LONG_VAL).value);
140 
141     assertEquals("StringWrapper.andThen(string2long)", converter.toString());
142 
143     assertEquals(first.andThen(STR_TO_LONG), first.andThen(STR_TO_LONG));
144   }
145 
146   @GwtIncompatible // J2CL generics problem
testIdentityConverter()147   public void testIdentityConverter() {
148     Converter<String, String> stringIdentityConverter = Converter.identity();
149 
150     assertSame(stringIdentityConverter, stringIdentityConverter.reverse());
151     assertSame(STR_TO_LONG, stringIdentityConverter.andThen(STR_TO_LONG));
152 
153     assertSame(STR_VAL, stringIdentityConverter.convert(STR_VAL));
154     assertSame(STR_VAL, stringIdentityConverter.reverse().convert(STR_VAL));
155 
156     assertEquals("Converter.identity()", stringIdentityConverter.toString());
157 
158     assertSame(Converter.identity(), Converter.identity());
159   }
160 
testFrom()161   public void testFrom() {
162     Function<String, Integer> forward =
163         new Function<String, Integer>() {
164           @Override
165           public Integer apply(String input) {
166             return Integer.parseInt(input);
167           }
168         };
169     Function<Object, String> backward = toStringFunction();
170 
171     Converter<String, Number> converter = Converter.<String, Number>from(forward, backward);
172 
173     assertNull(converter.convert(null));
174     assertNull(converter.reverse().convert(null));
175 
176     assertEquals((Integer) 5, converter.convert("5"));
177     assertEquals("5", converter.reverse().convert(5));
178   }
179 
180   // Null-passthrough violates our nullness annotations, so we don't support it under J2KT.
181   @J2ktIncompatible
testNullIsPassedThrough()182   public void testNullIsPassedThrough() {
183     Converter<String, String> nullsArePassed = sillyConverter(false);
184     assertEquals("forward", nullsArePassed.convert("foo"));
185     assertEquals("forward", nullsArePassed.convert(null));
186     assertEquals("backward", nullsArePassed.reverse().convert("foo"));
187     assertEquals("backward", nullsArePassed.reverse().convert(null));
188   }
189 
testNullIsNotPassedThrough()190   public void testNullIsNotPassedThrough() {
191     Converter<String, String> nullsAreHandled = sillyConverter(true);
192     assertEquals("forward", nullsAreHandled.convert("foo"));
193     assertEquals(null, nullsAreHandled.convert(null));
194     assertEquals("backward", nullsAreHandled.reverse().convert("foo"));
195     assertEquals(null, nullsAreHandled.reverse().convert(null));
196   }
197 
sillyConverter(final boolean handleNullAutomatically)198   private static Converter<String, String> sillyConverter(final boolean handleNullAutomatically) {
199     return new Converter<String, String>(handleNullAutomatically) {
200       @Override
201       protected String doForward(String string) {
202         return "forward";
203       }
204 
205       @Override
206       protected String doBackward(String string) {
207         return "backward";
208       }
209     };
210   }
211 
212   public void testSerialization_identity() {
213     Converter<String, String> identityConverter = Converter.identity();
214     SerializableTester.reserializeAndAssert(identityConverter);
215   }
216 
217   public void testSerialization_reverse() {
218     Converter<Long, String> reverseConverter = Longs.stringConverter().reverse();
219     SerializableTester.reserializeAndAssert(reverseConverter);
220   }
221 
222   @GwtIncompatible // J2CL generics problem
223   public void testSerialization_andThen() {
224     Converter<String, Long> converterA = Longs.stringConverter();
225     Converter<Long, String> reverseConverter = Longs.stringConverter().reverse();
226     Converter<String, String> composedConverter = converterA.andThen(reverseConverter);
227     SerializableTester.reserializeAndAssert(composedConverter);
228   }
229 
230   public void testSerialization_from() {
231     Converter<String, String> dumb = Converter.from(toStringFunction(), toStringFunction());
232     SerializableTester.reserializeAndAssert(dumb);
233   }
234 }
235