1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package com.google.common.collect;
18
19 import static java.util.Arrays.asList;
20
21 import com.google.common.annotations.GwtCompatible;
22 import com.google.common.annotations.GwtIncompatible;
23 import com.google.common.collect.testing.AnEnum;
24 import com.google.common.collect.testing.features.CollectionFeature;
25 import com.google.common.collect.testing.features.CollectionSize;
26 import com.google.common.collect.testing.google.MultisetFeature;
27 import com.google.common.collect.testing.google.MultisetTestSuiteBuilder;
28 import com.google.common.collect.testing.google.TestEnumMultisetGenerator;
29 import com.google.common.testing.ClassSanityTester;
30 import com.google.common.testing.NullPointerTester;
31 import com.google.common.testing.SerializableTester;
32
33 import junit.framework.Test;
34 import junit.framework.TestCase;
35 import junit.framework.TestSuite;
36
37 import java.util.Collection;
38 import java.util.EnumSet;
39 import java.util.Set;
40
41
42
43
44
45
46 @GwtCompatible(emulated = true)
47 public class EnumMultisetTest extends TestCase {
48
49 @GwtIncompatible("suite")
50 public static Test suite() {
51 TestSuite suite = new TestSuite();
52 suite.addTest(MultisetTestSuiteBuilder.using(enumMultisetGenerator())
53 .withFeatures(CollectionSize.ANY,
54 CollectionFeature.KNOWN_ORDER,
55 CollectionFeature.GENERAL_PURPOSE,
56 CollectionFeature.SUPPORTS_ITERATOR_REMOVE,
57 CollectionFeature.ALLOWS_NULL_QUERIES,
58 MultisetFeature.ENTRIES_ARE_VIEWS)
59 .named("EnumMultiset")
60 .createTestSuite());
61 suite.addTestSuite(EnumMultisetTest.class);
62 return suite;
63 }
64
65 private static TestEnumMultisetGenerator enumMultisetGenerator() {
66 return new TestEnumMultisetGenerator() {
67 @Override protected Multiset<AnEnum> create(AnEnum[] elements) {
68 return (elements.length == 0)
69 ? EnumMultiset.create(AnEnum.class)
70 : EnumMultiset.create(asList(elements));
71 }
72 };
73 }
74
75 private enum Color {
76 BLUE, RED, YELLOW, GREEN, WHITE
77 }
78
79 private enum Gender {
80 MALE, FEMALE
81 }
82
83 public void testClassCreate() {
84 Multiset<Color> ms = EnumMultiset.create(Color.class);
85 ms.add(Color.RED);
86 ms.add(Color.YELLOW);
87 ms.add(Color.RED);
88 assertEquals(0, ms.count(Color.BLUE));
89 assertEquals(1, ms.count(Color.YELLOW));
90 assertEquals(2, ms.count(Color.RED));
91 }
92
93 public void testCollectionCreate() {
94 Multiset<Color> ms = EnumMultiset.create(
95 asList(Color.RED, Color.YELLOW, Color.RED));
96 assertEquals(0, ms.count(Color.BLUE));
97 assertEquals(1, ms.count(Color.YELLOW));
98 assertEquals(2, ms.count(Color.RED));
99 }
100
101 public void testIllegalCreate() {
102 Collection<Color> empty = EnumSet.noneOf(Color.class);
103 try {
104 EnumMultiset.create(empty);
105 fail();
106 } catch (IllegalArgumentException expected) {}
107 }
108
109 public void testCreateEmptyWithClass() {
110 Multiset<Color> ms = EnumMultiset.create(ImmutableList.<Color>of(), Color.class);
111 ms.add(Color.RED);
112 }
113
114 public void testCreateEmptyWithoutClassFails() {
115 try {
116 EnumMultiset.create(ImmutableList.<Color> of());
117 fail("Expected IllegalArgumentException");
118 } catch (IllegalArgumentException expected) {
119 }
120 }
121
122 public void testToString() {
123 Multiset<Color> ms = EnumMultiset.create(Color.class);
124 ms.add(Color.BLUE, 3);
125 ms.add(Color.YELLOW, 1);
126 ms.add(Color.RED, 2);
127 assertEquals("[BLUE x 3, RED x 2, YELLOW]", ms.toString());
128 }
129
130 @GwtIncompatible("SerializableTester")
131 public void testSerializable() {
132 Multiset<Color> ms = EnumMultiset.create(
133 asList(Color.RED, Color.YELLOW, Color.RED));
134 assertEquals(ms, SerializableTester.reserialize(ms));
135 }
136
137 public void testEntrySet() {
138 Multiset<Color> ms = EnumMultiset.create(Color.class);
139 ms.add(Color.BLUE, 3);
140 ms.add(Color.YELLOW, 1);
141 ms.add(Color.RED, 2);
142
143 Set<Object> uniqueEntries = Sets.newIdentityHashSet();
144 uniqueEntries.addAll(ms.entrySet());
145 assertEquals(3, uniqueEntries.size());
146 }
147
148
149
150
151 private static class EnumMultisetFactory {
152 public static <E extends Enum<E>> EnumMultiset<E> create(Iterable<E> elements) {
153 return EnumMultiset.create(elements);
154 }
155 }
156
157 @GwtIncompatible("reflection")
158 public void testEquals() throws Exception {
159 new ClassSanityTester()
160 .setDistinctValues(Class.class, Color.class, Gender.class)
161 .setDistinctValues(Enum.class, Color.BLUE, Color.RED)
162 .forAllPublicStaticMethods(EnumMultisetFactory.class)
163 .testEquals();
164 }
165
166 @GwtIncompatible("reflection")
167 public void testNulls() throws Exception {
168 new NullPointerTester()
169 .setDefault(Class.class, Color.class)
170 .setDefault(Iterable.class, EnumSet.allOf(Color.class))
171 .testAllPublicStaticMethods(EnumMultiset.class);
172 }
173 }