OptionalTest.java revision dbd967a6e5c96cc1a97c5521f88dc1564ba2f81b
1/*
2 * Copyright (C) 2011 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
17package com.google.common.base;
18
19import static org.junit.contrib.truth.Truth.ASSERT;
20
21import com.google.common.annotations.GwtCompatible;
22import com.google.common.annotations.GwtIncompatible;
23import com.google.common.collect.ImmutableList;
24import com.google.common.testing.NullPointerTester;
25import com.google.common.testing.SerializableTester;
26
27import junit.framework.TestCase;
28
29import java.util.Collections;
30import java.util.List;
31import java.util.Set;
32
33/**
34 * Unit test for {@link Optional}.
35 *
36 * @author Kurt Alfred Kluever
37 */
38@GwtCompatible(emulated = true)
39public final class OptionalTest extends TestCase {
40  public void testAbsent() {
41    Optional<String> optionalName = Optional.absent();
42    assertFalse(optionalName.isPresent());
43  }
44
45  public void testOf() {
46    assertEquals("training", Optional.of("training").get());
47  }
48
49  public void testOf_null() {
50    try {
51      Optional.of(null);
52      fail();
53    } catch (NullPointerException expected) {
54    }
55  }
56
57  public void testFromNullable() {
58    Optional<String> optionalName = Optional.fromNullable("bob");
59    assertEquals("bob", optionalName.get());
60  }
61
62  public void testFromNullable_null() {
63    // not promised by spec, but easier to test
64    assertSame(Optional.absent(), Optional.fromNullable(null));
65  }
66
67  public void testIsPresent_no() {
68    assertFalse(Optional.absent().isPresent());
69  }
70
71  public void testIsPresent_yes() {
72    assertTrue(Optional.of("training").isPresent());
73  }
74
75  public void testGet_absent() {
76    Optional<String> optional = Optional.absent();
77    try {
78      optional.get();
79      fail();
80    } catch (IllegalStateException expected) {
81    }
82  }
83
84  public void testGet_present() {
85    assertEquals("training", Optional.of("training").get());
86  }
87
88  public void testOr_T_present() {
89    assertEquals("a", Optional.of("a").or("default"));
90  }
91
92  public void testOr_T_absent() {
93    assertEquals("default", Optional.absent().or("default"));
94  }
95
96  public void testOr_Supplier_present() {
97    assertEquals("a", Optional.of("a").or(Suppliers.ofInstance("fallback")));
98  }
99
100  public void testOr_Supplier_absent() {
101    assertEquals("fallback", Optional.absent().or(Suppliers.ofInstance("fallback")));
102  }
103
104  public void testOr_NullSupplier_absent() {
105    Supplier<Object> nullSupplier = Suppliers.ofInstance(null);
106    Optional<Object> absentOptional = Optional.absent();
107    try {
108      absentOptional.or(nullSupplier);
109      fail();
110    } catch (NullPointerException expected) {
111    }
112  }
113
114  public void testOr_Optional_present() {
115    assertEquals(Optional.of("a"), Optional.of("a").or(Optional.of("fallback")));
116  }
117
118  public void testOr_Optional_absent() {
119    assertEquals(Optional.of("fallback"), Optional.absent().or(Optional.of("fallback")));
120  }
121
122  public void testOrNull_present() {
123    assertEquals("a", Optional.of("a").orNull());
124  }
125
126  public void testOrNull_absent() {
127    assertNull(Optional.absent().orNull());
128  }
129
130  public void testAsSet_present() {
131    Set<String> expected = Collections.singleton("a");
132    assertEquals(expected, Optional.of("a").asSet());
133  }
134
135  public void testAsSet_absent() {
136    assertTrue("Returned set should be empty", Optional.absent().asSet().isEmpty());
137  }
138
139  public void testAsSet_presentIsImmutable() {
140    Set<String> presentAsSet = Optional.of("a").asSet();
141    try {
142      presentAsSet.add("b");
143      fail();
144    } catch (UnsupportedOperationException expected) {
145    }
146  }
147
148  public void testAsSet_absentIsImmutable() {
149    Set<Object> absentAsSet = Optional.absent().asSet();
150    try {
151      absentAsSet.add("foo");
152      fail();
153    } catch (UnsupportedOperationException expected) {
154    }
155  }
156
157  // TODO(kevinb): use EqualsTester
158
159  public void testEqualsAndHashCode_absent() {
160    assertEquals(Optional.<String>absent(), Optional.<Integer>absent());
161    assertEquals(Optional.absent().hashCode(), Optional.absent().hashCode());
162  }
163
164  public void testEqualsAndHashCode_present() {
165    assertEquals(Optional.of("training"), Optional.of("training"));
166    assertFalse(Optional.of("a").equals(Optional.of("b")));
167    assertFalse(Optional.of("a").equals(Optional.absent()));
168    assertEquals(Optional.of("training").hashCode(), Optional.of("training").hashCode());
169  }
170
171  public void testToString_absent() {
172    assertEquals("Optional.absent()", Optional.absent().toString());
173  }
174
175  public void testToString_present() {
176    assertEquals("Optional.of(training)", Optional.of("training").toString());
177  }
178
179  public void testPresentInstances_allPresent() {
180    List<Optional<String>> optionals =
181        ImmutableList.of(Optional.of("a"), Optional.of("b"), Optional.of("c"));
182    ASSERT.that(Optional.presentInstances(optionals)).hasContentsInOrder("a", "b", "c");
183  }
184
185  public void testPresentInstances_allAbsent() {
186    List<Optional<Object>> optionals =
187        ImmutableList.of(Optional.absent(), Optional.absent());
188    ASSERT.that(Optional.presentInstances(optionals)).isEmpty();
189  }
190
191  public void testPresentInstances_somePresent() {
192    List<Optional<String>> optionals =
193        ImmutableList.of(Optional.of("a"), Optional.<String>absent(), Optional.of("c"));
194    ASSERT.that(Optional.presentInstances(optionals)).hasContentsInOrder("a", "c");
195  }
196
197  public void testPresentInstances_callingIteratorTwice() {
198    List<Optional<String>> optionals =
199        ImmutableList.of(Optional.of("a"), Optional.<String>absent(), Optional.of("c"));
200    Iterable<String> onlyPresent = Optional.presentInstances(optionals);
201    ASSERT.that(onlyPresent).hasContentsInOrder("a", "c");
202    ASSERT.that(onlyPresent).hasContentsInOrder("a", "c");
203  }
204
205  @GwtIncompatible("SerializableTester")
206  public void testSerialization() {
207    SerializableTester.reserializeAndAssert(Optional.absent());
208    SerializableTester.reserializeAndAssert(Optional.of("foo"));
209  }
210
211  @GwtIncompatible("NullPointerTester")
212  public void testNullPointers() throws Exception {
213    NullPointerTester npTester = new NullPointerTester();
214    npTester.testAllPublicConstructors(Optional.class);
215    npTester.testAllPublicStaticMethods(Optional.class);
216    npTester.testAllPublicInstanceMethods(Optional.absent());
217    npTester.testAllPublicInstanceMethods(Optional.of("training"));
218  }
219}
220