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
17package com.google.common.collect.testing.testers;
18
19import static com.google.common.collect.testing.features.CollectionSize.SEVERAL;
20import static com.google.common.collect.testing.features.CollectionSize.ZERO;
21import static com.google.common.collect.testing.features.MapFeature.FAILS_FAST_ON_CONCURRENT_MODIFICATION;
22import static com.google.common.collect.testing.features.MapFeature.SUPPORTS_REMOVE;
23
24import com.google.common.annotations.GwtCompatible;
25import com.google.common.collect.testing.AbstractMapTester;
26import com.google.common.collect.testing.features.CollectionSize;
27import com.google.common.collect.testing.features.MapFeature;
28
29import java.util.ConcurrentModificationException;
30import java.util.Iterator;
31import java.util.Map.Entry;
32
33/**
34 * A generic JUnit test which tests {@code clear()} operations on a map.
35 * Can't be invoked directly; please see
36 * {@link com.google.common.collect.testing.MapTestSuiteBuilder}.
37 *
38 * @author George van den Driessche
39 * @author Chris Povirk
40 */
41@GwtCompatible
42public class MapClearTester<K, V> extends AbstractMapTester<K, V> {
43  @MapFeature.Require(SUPPORTS_REMOVE)
44  public void testClear() {
45    getMap().clear();
46    assertTrue("After clear(), a map should be empty.",
47        getMap().isEmpty());
48  }
49
50  @MapFeature.Require({FAILS_FAST_ON_CONCURRENT_MODIFICATION,
51      SUPPORTS_REMOVE})
52  @CollectionSize.Require(SEVERAL)
53  public void testClearConcurrentWithEntrySetIteration() {
54    try {
55      Iterator<Entry<K, V>> iterator = getMap().entrySet().iterator();
56      getMap().clear();
57      iterator.next();
58      fail("Expected ConcurrentModificationException");
59    } catch (ConcurrentModificationException expected) {
60      // success
61    }
62  }
63
64  @MapFeature.Require({FAILS_FAST_ON_CONCURRENT_MODIFICATION,
65      SUPPORTS_REMOVE})
66  @CollectionSize.Require(SEVERAL)
67  public void testClearConcurrentWithKeySetIteration() {
68    try {
69      Iterator<K> iterator = getMap().keySet().iterator();
70      getMap().clear();
71      iterator.next();
72      fail("Expected ConcurrentModificationException");
73    } catch (ConcurrentModificationException expected) {
74      // success
75    }
76  }
77
78  @MapFeature.Require({FAILS_FAST_ON_CONCURRENT_MODIFICATION,
79      SUPPORTS_REMOVE})
80  @CollectionSize.Require(SEVERAL)
81  public void testClearConcurrentWithValuesIteration() {
82    try {
83      Iterator<V> iterator = getMap().values().iterator();
84      getMap().clear();
85      iterator.next();
86      fail("Expected ConcurrentModificationException");
87    } catch (ConcurrentModificationException expected) {
88      // success
89    }
90  }
91
92  @MapFeature.Require(absent = SUPPORTS_REMOVE)
93  @CollectionSize.Require(absent = ZERO)
94  public void testClear_unsupported() {
95    try {
96      getMap().clear();
97      fail("clear() should throw UnsupportedOperation if a map does "
98          + "not support it and is not empty.");
99    } catch (UnsupportedOperationException expected) {
100    }
101    expectUnchanged();
102  }
103
104  @MapFeature.Require(absent = SUPPORTS_REMOVE)
105  @CollectionSize.Require(ZERO)
106  public void testClear_unsupportedByEmptyCollection() {
107    try {
108      getMap().clear();
109    } catch (UnsupportedOperationException tolerated) {
110    }
111    expectUnchanged();
112  }
113}
114