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;
20
21/**
22 * Unit test for {@link ConcurrentHashMultiset}.
23 *
24 * @author Kevin Bourrillion
25 * @author Jared Levy
26 */
27public abstract class AbstractConcurrentHashMultisetTest
28    extends AbstractMultisetTest {
29  // we don't support null
30  @Override public void testToStringNull() {}
31
32  // our entries are snapshots, not live views. at least for now.
33
34  @Override public void testEntryAfterRemove() {}
35  @Override public void testEntryAfterClear() {}
36  @Override public void testEntryAfterEntrySetClear() {}
37  @Override public void testEntryAfterEntrySetIteratorRemove() {}
38  @Override public void testEntryAfterElementSetIteratorRemove() {}
39
40  public void testCopyConstructor() {
41    ms = ConcurrentHashMultiset.create(asList("a", "b", "a", "c"));
42    assertEquals(4, ms.size());
43    assertEquals(2, ms.count("a"));
44    assertEquals(1, ms.count("b"));
45    assertEquals(1, ms.count("c"));
46  }
47
48  public void testSetCount() {
49    ConcurrentHashMultiset<String> cms = ConcurrentHashMultiset.create();
50    cms.add("a", 2);
51    cms.add("b", 3);
52
53    try {
54      cms.setCount("a", -1);
55      fail();
56    } catch (IllegalArgumentException expected) {}
57    assertEquals(2, cms.count("a"));
58
59    assertEquals(2, cms.setCount("a", 0));
60    assertEquals(0, cms.count("a"));
61    assertEquals(3, cms.setCount("b", 4));
62    assertEquals(4, cms.count("b"));
63    assertEquals(0, cms.setCount("c", 5));
64    assertEquals(5, cms.count("c"));
65  }
66
67  public void testSetCountConditional() {
68    ConcurrentHashMultiset<String> cms = ConcurrentHashMultiset.create();
69    cms.add("a", 2);
70    cms.add("b", 3);
71
72    try {
73      cms.setCount("a", -1, 1);
74      fail();
75    } catch (IllegalArgumentException expected) {}
76    try {
77      cms.setCount("a", 1, -1);
78      fail();
79    } catch (IllegalArgumentException expected) {}
80    assertEquals(2, cms.count("a"));
81
82    assertTrue(cms.setCount("c", 0, 0));
83    assertEquals(0, cms.count("c"));
84    assertFalse(cms.setCount("c", 1, 0));
85    assertEquals(0, cms.count("c"));
86    assertFalse(cms.setCount("a", 0, 0));
87    assertEquals(2, cms.count("a"));
88    assertFalse(cms.setCount("a", 1, 0));
89    assertEquals(2, cms.count("a"));
90    assertTrue(cms.setCount("a", 2, 0));
91    assertEquals(0, cms.count("a"));
92
93    assertTrue(cms.setCount("d", 0, 4));
94    assertEquals(4, cms.count("d"));
95    assertFalse(cms.setCount("b", 0, 5));
96    assertEquals(3, cms.count("b"));
97    assertFalse(cms.setCount("b", 1, 5));
98    assertEquals(3, cms.count("b"));
99    assertTrue(cms.setCount("b", 3, 5));
100    assertEquals(5, cms.count("b"));
101  }
102
103  public void testRemoveExactly() {
104    ConcurrentHashMultiset<String> cms = ConcurrentHashMultiset.create();
105    cms.add("a", 2);
106    cms.add("b", 3);
107
108    try {
109      cms.removeExactly("a", -2);
110    } catch (IllegalArgumentException expected) {}
111
112    assertTrue(cms.removeExactly("a", 0));
113    assertEquals(2, cms.count("a"));
114    assertTrue(cms.removeExactly("c", 0));
115    assertEquals(0, cms.count("c"));
116
117    assertFalse(cms.removeExactly("a", 4));
118    assertEquals(2, cms.count("a"));
119    assertTrue(cms.removeExactly("a", 2));
120    assertEquals(0, cms.count("a"));
121    assertTrue(cms.removeExactly("b", 2));
122    assertEquals(1, cms.count("b"));
123  }
124}
125