1/*
2 * Copyright (C) 2007 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.collect;
18
19import static java.util.Arrays.asList;
20import static org.junit.contrib.truth.Truth.ASSERT;
21
22import com.google.common.annotations.GwtCompatible;
23import com.google.common.annotations.GwtIncompatible;
24import com.google.common.testing.NullPointerTester;
25
26import junit.framework.TestCase;
27
28import java.util.Collection;
29import java.util.Collections;
30
31/**
32 * Common tests for a {@code Collection}.
33 *
34 * @author Kevin Bourrillion
35 * @author Mike Bostock
36 */
37@GwtCompatible(emulated = true)
38public abstract class AbstractCollectionTest extends TestCase {
39
40  protected abstract <E> Collection<E> create();
41
42  protected Collection<String> c;
43
44  // public for GWT
45  @Override public void setUp() throws Exception {
46    super.setUp();
47    c = create();
48  }
49
50  public void testIsEmptyYes() {
51    assertTrue(c.isEmpty());
52  }
53
54  public void testIsEmptyNo() {
55    c.add("a");
56    assertFalse(c.isEmpty());
57  }
58
59  public void testAddOne() {
60    assertTrue(c.add("a"));
61    assertContents("a");
62  }
63
64  public void testAddSeveralTimes() {
65    assertTrue(c.add("a"));
66    assertTrue(c.add("b"));
67    c.add("a");
68    c.add("b");
69    assertTrue(c.contains("a"));
70    assertTrue(c.contains("b"));
71  }
72
73  public void testRemoveOneFromNoneStandard() {
74    assertFalse(c.remove("a"));
75    assertContents();
76  }
77
78  public void testRemoveOneFromOneStandard() {
79    c.add("a");
80    assertTrue(c.remove("a"));
81    assertContents();
82  }
83
84  public void testContainsNo() {
85    c.add("a");
86    assertFalse(c.contains("b"));
87  }
88
89  public void testContainsOne() {
90    c.add("a");
91    assertTrue(c.contains(new String("a")));
92  }
93
94  public void testContainsAfterRemoval() {
95    c.add("a");
96    c.remove("a");
97    assertFalse(c.contains("a"));
98  }
99
100  public void testContainsAllVacuous() {
101    assertTrue(c.containsAll(Collections.emptySet()));
102  }
103
104  public void testRemoveAllVacuous() {
105    assertFalse(c.removeAll(Collections.emptySet()));
106  }
107
108  public void testRetainAllVacuous() {
109    assertFalse(c.retainAll(asList("a")));
110    assertContents();
111  }
112
113  public void testRetainAllOfNothing() {
114    c.add("a");
115    assertTrue(c.retainAll(Collections.emptySet()));
116    assertContents();
117  }
118
119  public void testClearNothing() {
120    c.clear();
121    assertContents();
122  }
123
124  public void testClear() {
125    c = createSample();
126    c.clear();
127    assertContents();
128  }
129
130  public void testEqualsNo() {
131    c.add("a");
132
133    Collection<String> c2 = create();
134    c2.add("b");
135
136    assertFalse(c.equals(c2));
137  }
138
139  public void testEqualsYes() {
140    c.add("a");
141    c.add("b");
142    c.add("b");
143
144    Collection<String> c2 = create();
145    c2.add("a");
146    c2.add("b");
147    c2.add("b");
148
149    assertEquals(c, c2);
150  }
151
152  public void testEqualsSelf() {
153    c.add("a");
154    c.add("b");
155    c.add("b");
156
157    assertEquals(c, c);
158  }
159
160  public void testEqualsTricky() {
161    c.add("a");
162    c.add("a");
163
164    Collection<String> c2 = create();
165    c2.add("a");
166    c2.add("a");
167    c2.add("b");
168    c2.add("b");
169    c2.remove("b");
170    c2.remove("b");
171
172    assertEquals(c, c2);
173  }
174
175  public void testEqualsPartial() {
176    c.add("a");
177    c.add("b");
178
179    Collection<String> c2 = create();
180    c2.add("a");
181    c2.add("c");
182
183    assertFalse(c.equals(c2));
184
185    Collection<String> c3 = create();
186    c2.add("b");
187    c2.add("c");
188
189    assertFalse(c2.equals(c3));
190  }
191
192  public void testEqualsDifferentTypes() {
193    c.add("a");
194    assertFalse(c.equals("a"));
195  }
196
197  public void testToArrayOne() {
198    c.add("a");
199    String[] array = new String[3];
200    assertSame(array, c.toArray(array));
201    assertEquals("a", array[0]);
202    assertNull(array[1]);
203  }
204
205  @GwtIncompatible("NullPointerTester")
206  public void testNullPointerExceptions() throws Exception {
207    NullPointerTester tester = new NullPointerTester();
208    tester.testAllPublicInstanceMethods(c);
209  }
210
211  protected Collection<String> createSample() {
212    Collection<String> c = create();
213    c.add("a");
214    c.add("b");
215    c.add("b");
216    c.add("c");
217    c.add("d");
218    c.add("d");
219    c.add("d");
220    return c;
221  }
222
223  protected void assertContents(String... expected) {
224    ASSERT.that(c).hasContentsAnyOrder(expected);
225  }
226}
227