• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
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.annotations.J2ktIncompatible;
24 import com.google.common.collect.testing.AnEnum;
25 import com.google.common.collect.testing.features.CollectionFeature;
26 import com.google.common.collect.testing.features.CollectionSize;
27 import com.google.common.collect.testing.google.MultisetFeature;
28 import com.google.common.collect.testing.google.MultisetTestSuiteBuilder;
29 import com.google.common.collect.testing.google.TestEnumMultisetGenerator;
30 import com.google.common.testing.ClassSanityTester;
31 import com.google.common.testing.NullPointerTester;
32 import com.google.common.testing.SerializableTester;
33 import java.util.Collection;
34 import java.util.EnumSet;
35 import java.util.Set;
36 import junit.framework.Test;
37 import junit.framework.TestCase;
38 import junit.framework.TestSuite;
39 
40 /**
41  * Tests for an {@link EnumMultiset}.
42  *
43  * @author Jared Levy
44  */
45 @GwtCompatible(emulated = true)
46 @J2ktIncompatible // EnumMultiset
47 public class EnumMultisetTest extends TestCase {
48 
49   @J2ktIncompatible
50   @GwtIncompatible // suite
suite()51   public static Test suite() {
52     TestSuite suite = new TestSuite();
53     suite.addTest(
54         MultisetTestSuiteBuilder.using(enumMultisetGenerator())
55             .withFeatures(
56                 CollectionSize.ANY,
57                 CollectionFeature.KNOWN_ORDER,
58                 CollectionFeature.GENERAL_PURPOSE,
59                 CollectionFeature.SUPPORTS_ITERATOR_REMOVE,
60                 CollectionFeature.ALLOWS_NULL_QUERIES,
61                 MultisetFeature.ENTRIES_ARE_VIEWS)
62             .named("EnumMultiset")
63             .createTestSuite());
64     suite.addTestSuite(EnumMultisetTest.class);
65     return suite;
66   }
67 
enumMultisetGenerator()68   private static TestEnumMultisetGenerator enumMultisetGenerator() {
69     return new TestEnumMultisetGenerator() {
70       @Override
71       protected Multiset<AnEnum> create(AnEnum[] elements) {
72         return (elements.length == 0)
73             ? EnumMultiset.create(AnEnum.class)
74             : EnumMultiset.create(asList(elements));
75       }
76     };
77   }
78 
79   private enum Color {
80     BLUE,
81     RED,
82     YELLOW,
83     GREEN,
84     WHITE
85   }
86 
87   private enum Gender {
88     MALE,
89     FEMALE
90   }
91 
92   public void testClassCreate() {
93     Multiset<Color> ms = EnumMultiset.create(Color.class);
94     ms.add(Color.RED);
95     ms.add(Color.YELLOW);
96     ms.add(Color.RED);
97     assertEquals(0, ms.count(Color.BLUE));
98     assertEquals(1, ms.count(Color.YELLOW));
99     assertEquals(2, ms.count(Color.RED));
100   }
101 
102   public void testCollectionCreate() {
103     Multiset<Color> ms = EnumMultiset.create(asList(Color.RED, Color.YELLOW, Color.RED));
104     assertEquals(0, ms.count(Color.BLUE));
105     assertEquals(1, ms.count(Color.YELLOW));
106     assertEquals(2, ms.count(Color.RED));
107   }
108 
109   public void testIllegalCreate() {
110     Collection<Color> empty = EnumSet.noneOf(Color.class);
111     try {
112       EnumMultiset.create(empty);
113       fail();
114     } catch (IllegalArgumentException expected) {
115     }
116   }
117 
118   public void testCreateEmptyWithClass() {
119     Multiset<Color> ms = EnumMultiset.create(ImmutableList.<Color>of(), Color.class);
120     ms.add(Color.RED);
121   }
122 
123   public void testCreateEmptyWithoutClassFails() {
124     try {
125       EnumMultiset.create(ImmutableList.<Color>of());
126       fail("Expected IllegalArgumentException");
127     } catch (IllegalArgumentException expected) {
128     }
129   }
130 
131   public void testToString() {
132     Multiset<Color> ms = EnumMultiset.create(Color.class);
133     ms.add(Color.BLUE, 3);
134     ms.add(Color.YELLOW, 1);
135     ms.add(Color.RED, 2);
136     assertEquals("[BLUE x 3, RED x 2, YELLOW]", ms.toString());
137   }
138 
139   @GwtIncompatible // SerializableTester
140   public void testSerializable() {
141     Multiset<Color> ms = EnumMultiset.create(asList(Color.RED, Color.YELLOW, Color.RED));
142     assertEquals(ms, SerializableTester.reserialize(ms));
143   }
144 
145   public void testEntrySet() {
146     Multiset<Color> ms = EnumMultiset.create(Color.class);
147     ms.add(Color.BLUE, 3);
148     ms.add(Color.YELLOW, 1);
149     ms.add(Color.RED, 2);
150 
151     Set<Object> uniqueEntries = Sets.newIdentityHashSet();
152     uniqueEntries.addAll(ms.entrySet());
153     assertEquals(3, uniqueEntries.size());
154   }
155 
156   // Wrapper of EnumMultiset factory methods, because we need to skip create(Class).
157   // create(Enum1.class) is equal to create(Enum2.class) but testEquals() expects otherwise.
158   // For the same reason, we need to skip create(Iterable, Class).
159   private static class EnumMultisetFactory {
160     public static <E extends Enum<E>> EnumMultiset<E> create(Iterable<E> elements) {
161       return EnumMultiset.create(elements);
162     }
163   }
164 
165   @J2ktIncompatible
166   @GwtIncompatible // reflection
167   public void testEquals() throws Exception {
168     new ClassSanityTester()
169         .setDistinctValues(Class.class, Color.class, Gender.class)
170         .setDistinctValues(Enum.class, Color.BLUE, Color.RED)
171         .forAllPublicStaticMethods(EnumMultisetFactory.class)
172         .testEquals();
173   }
174 
175   @J2ktIncompatible
176   @GwtIncompatible // reflection
177   public void testNulls() throws Exception {
178     new NullPointerTester()
179         .setDefault(Class.class, Color.class)
180         .setDefault(Iterable.class, EnumSet.allOf(Color.class))
181         .testAllPublicStaticMethods(EnumMultiset.class);
182   }
183 }
184