11d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/* 21d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Copyright (C) 2007 The Guava Authors 31d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 41d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Licensed under the Apache License, Version 2.0 (the "License"); 51d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * you may not use this file except in compliance with the License. 61d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * You may obtain a copy of the License at 71d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 81d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * http://www.apache.org/licenses/LICENSE-2.0 91d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Unless required by applicable law or agreed to in writing, software 111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * distributed under the License is distributed on an "AS IS" BASIS, 121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * See the License for the specific language governing permissions and 141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * limitations under the License. 151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertpackage com.google.common.collect; 181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static java.util.Arrays.asList; 201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.annotations.GwtCompatible; 221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.annotations.GwtIncompatible; 237dd252788645e940eada959bdde927426e2531c9Paul Duffinimport com.google.common.collect.testing.AnEnum; 247dd252788645e940eada959bdde927426e2531c9Paul Duffinimport com.google.common.collect.testing.features.CollectionFeature; 257dd252788645e940eada959bdde927426e2531c9Paul Duffinimport com.google.common.collect.testing.features.CollectionSize; 260888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport com.google.common.collect.testing.google.MultisetFeature; 277dd252788645e940eada959bdde927426e2531c9Paul Duffinimport com.google.common.collect.testing.google.MultisetTestSuiteBuilder; 287dd252788645e940eada959bdde927426e2531c9Paul Duffinimport com.google.common.collect.testing.google.TestEnumMultisetGenerator; 297dd252788645e940eada959bdde927426e2531c9Paul Duffinimport com.google.common.testing.ClassSanityTester; 307dd252788645e940eada959bdde927426e2531c9Paul Duffinimport com.google.common.testing.NullPointerTester; 311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.testing.SerializableTester; 321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 337dd252788645e940eada959bdde927426e2531c9Paul Duffinimport junit.framework.Test; 347dd252788645e940eada959bdde927426e2531c9Paul Duffinimport junit.framework.TestCase; 357dd252788645e940eada959bdde927426e2531c9Paul Duffinimport junit.framework.TestSuite; 367dd252788645e940eada959bdde927426e2531c9Paul Duffin 370888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport java.util.Collection; 380888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport java.util.EnumSet; 390888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport java.util.Set; 400888a09821a98ac0680fad765217302858e70fa4Paul Duffin 411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/** 421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Tests for an {@link EnumMultiset}. 431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @author Jared Levy 451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert@GwtCompatible(emulated = true) 471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertpublic class EnumMultisetTest extends TestCase { 487dd252788645e940eada959bdde927426e2531c9Paul Duffin 497dd252788645e940eada959bdde927426e2531c9Paul Duffin @GwtIncompatible("suite") 507dd252788645e940eada959bdde927426e2531c9Paul Duffin public static Test suite() { 517dd252788645e940eada959bdde927426e2531c9Paul Duffin TestSuite suite = new TestSuite(); 527dd252788645e940eada959bdde927426e2531c9Paul Duffin suite.addTest(MultisetTestSuiteBuilder.using(enumMultisetGenerator()) 537dd252788645e940eada959bdde927426e2531c9Paul Duffin .withFeatures(CollectionSize.ANY, 547dd252788645e940eada959bdde927426e2531c9Paul Duffin CollectionFeature.KNOWN_ORDER, 557dd252788645e940eada959bdde927426e2531c9Paul Duffin CollectionFeature.GENERAL_PURPOSE, 560888a09821a98ac0680fad765217302858e70fa4Paul Duffin CollectionFeature.SUPPORTS_ITERATOR_REMOVE, 570888a09821a98ac0680fad765217302858e70fa4Paul Duffin CollectionFeature.ALLOWS_NULL_QUERIES, 580888a09821a98ac0680fad765217302858e70fa4Paul Duffin MultisetFeature.ENTRIES_ARE_VIEWS) 597dd252788645e940eada959bdde927426e2531c9Paul Duffin .named("EnumMultiset") 607dd252788645e940eada959bdde927426e2531c9Paul Duffin .createTestSuite()); 617dd252788645e940eada959bdde927426e2531c9Paul Duffin suite.addTestSuite(EnumMultisetTest.class); 627dd252788645e940eada959bdde927426e2531c9Paul Duffin return suite; 637dd252788645e940eada959bdde927426e2531c9Paul Duffin } 647dd252788645e940eada959bdde927426e2531c9Paul Duffin 657dd252788645e940eada959bdde927426e2531c9Paul Duffin private static TestEnumMultisetGenerator enumMultisetGenerator() { 667dd252788645e940eada959bdde927426e2531c9Paul Duffin return new TestEnumMultisetGenerator() { 677dd252788645e940eada959bdde927426e2531c9Paul Duffin @Override protected Multiset<AnEnum> create(AnEnum[] elements) { 687dd252788645e940eada959bdde927426e2531c9Paul Duffin return (elements.length == 0) 697dd252788645e940eada959bdde927426e2531c9Paul Duffin ? EnumMultiset.create(AnEnum.class) 707dd252788645e940eada959bdde927426e2531c9Paul Duffin : EnumMultiset.create(asList(elements)); 717dd252788645e940eada959bdde927426e2531c9Paul Duffin } 727dd252788645e940eada959bdde927426e2531c9Paul Duffin }; 737dd252788645e940eada959bdde927426e2531c9Paul Duffin } 747dd252788645e940eada959bdde927426e2531c9Paul Duffin 750888a09821a98ac0680fad765217302858e70fa4Paul Duffin private enum Color { 761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert BLUE, RED, YELLOW, GREEN, WHITE 771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 790888a09821a98ac0680fad765217302858e70fa4Paul Duffin private enum Gender { 800888a09821a98ac0680fad765217302858e70fa4Paul Duffin MALE, FEMALE 810888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 820888a09821a98ac0680fad765217302858e70fa4Paul Duffin 831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testClassCreate() { 841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Multiset<Color> ms = EnumMultiset.create(Color.class); 851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert ms.add(Color.RED); 861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert ms.add(Color.YELLOW); 871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert ms.add(Color.RED); 881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(0, ms.count(Color.BLUE)); 891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(1, ms.count(Color.YELLOW)); 901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(2, ms.count(Color.RED)); 911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testCollectionCreate() { 941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Multiset<Color> ms = EnumMultiset.create( 951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert asList(Color.RED, Color.YELLOW, Color.RED)); 961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(0, ms.count(Color.BLUE)); 971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(1, ms.count(Color.YELLOW)); 981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(2, ms.count(Color.RED)); 991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testIllegalCreate() { 1021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Collection<Color> empty = EnumSet.noneOf(Color.class); 1031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 1041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert EnumMultiset.create(empty); 1051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert fail(); 1061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (IllegalArgumentException expected) {} 1071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1087dd252788645e940eada959bdde927426e2531c9Paul Duffin 1097dd252788645e940eada959bdde927426e2531c9Paul Duffin public void testCreateEmptyWithClass() { 1107dd252788645e940eada959bdde927426e2531c9Paul Duffin Multiset<Color> ms = EnumMultiset.create(ImmutableList.<Color>of(), Color.class); 1117dd252788645e940eada959bdde927426e2531c9Paul Duffin ms.add(Color.RED); 1127dd252788645e940eada959bdde927426e2531c9Paul Duffin } 1137dd252788645e940eada959bdde927426e2531c9Paul Duffin 1147dd252788645e940eada959bdde927426e2531c9Paul Duffin public void testCreateEmptyWithoutClassFails() { 1157dd252788645e940eada959bdde927426e2531c9Paul Duffin try { 1160888a09821a98ac0680fad765217302858e70fa4Paul Duffin EnumMultiset.create(ImmutableList.<Color> of()); 1177dd252788645e940eada959bdde927426e2531c9Paul Duffin fail("Expected IllegalArgumentException"); 1187dd252788645e940eada959bdde927426e2531c9Paul Duffin } catch (IllegalArgumentException expected) { 1197dd252788645e940eada959bdde927426e2531c9Paul Duffin } 1207dd252788645e940eada959bdde927426e2531c9Paul Duffin } 1211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testToString() { 1231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Multiset<Color> ms = EnumMultiset.create(Color.class); 1241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert ms.add(Color.BLUE, 3); 1251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert ms.add(Color.YELLOW, 1); 1261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert ms.add(Color.RED, 2); 1271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals("[BLUE x 3, RED x 2, YELLOW]", ms.toString()); 1281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @GwtIncompatible("SerializableTester") 1311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testSerializable() { 1321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Multiset<Color> ms = EnumMultiset.create( 1331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert asList(Color.RED, Color.YELLOW, Color.RED)); 1341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(ms, SerializableTester.reserialize(ms)); 1351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1367dd252788645e940eada959bdde927426e2531c9Paul Duffin 1371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testEntrySet() { 1381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Multiset<Color> ms = EnumMultiset.create(Color.class); 1391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert ms.add(Color.BLUE, 3); 1401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert ms.add(Color.YELLOW, 1); 1411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert ms.add(Color.RED, 2); 1427dd252788645e940eada959bdde927426e2531c9Paul Duffin 1431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Set<Object> uniqueEntries = Sets.newIdentityHashSet(); 1441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert uniqueEntries.addAll(ms.entrySet()); 1451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals(3, uniqueEntries.size()); 1461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1477dd252788645e940eada959bdde927426e2531c9Paul Duffin 1480888a09821a98ac0680fad765217302858e70fa4Paul Duffin // Wrapper of EnumMultiset factory methods, because we need to skip create(Class). 1490888a09821a98ac0680fad765217302858e70fa4Paul Duffin // create(Enum1.class) is equal to create(Enum2.class) but testEquals() expects otherwise. 1500888a09821a98ac0680fad765217302858e70fa4Paul Duffin // For the same reason, we need to skip create(Iterable, Class). 1510888a09821a98ac0680fad765217302858e70fa4Paul Duffin private static class EnumMultisetFactory { 1520888a09821a98ac0680fad765217302858e70fa4Paul Duffin public static <E extends Enum<E>> EnumMultiset<E> create(Iterable<E> elements) { 1530888a09821a98ac0680fad765217302858e70fa4Paul Duffin return EnumMultiset.create(elements); 1540888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 1550888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 1560888a09821a98ac0680fad765217302858e70fa4Paul Duffin 1577dd252788645e940eada959bdde927426e2531c9Paul Duffin @GwtIncompatible("reflection") 1587dd252788645e940eada959bdde927426e2531c9Paul Duffin public void testEquals() throws Exception { 1597dd252788645e940eada959bdde927426e2531c9Paul Duffin new ClassSanityTester() 1600888a09821a98ac0680fad765217302858e70fa4Paul Duffin .setDistinctValues(Class.class, Color.class, Gender.class) 1610888a09821a98ac0680fad765217302858e70fa4Paul Duffin .setDistinctValues(Enum.class, Color.BLUE, Color.RED) 1620888a09821a98ac0680fad765217302858e70fa4Paul Duffin .forAllPublicStaticMethods(EnumMultisetFactory.class) 1637dd252788645e940eada959bdde927426e2531c9Paul Duffin .testEquals(); 1647dd252788645e940eada959bdde927426e2531c9Paul Duffin } 1657dd252788645e940eada959bdde927426e2531c9Paul Duffin 1667dd252788645e940eada959bdde927426e2531c9Paul Duffin @GwtIncompatible("reflection") 1677dd252788645e940eada959bdde927426e2531c9Paul Duffin public void testNulls() throws Exception { 1687dd252788645e940eada959bdde927426e2531c9Paul Duffin new NullPointerTester() 1697dd252788645e940eada959bdde927426e2531c9Paul Duffin .setDefault(Class.class, Color.class) 1700888a09821a98ac0680fad765217302858e70fa4Paul Duffin .setDefault(Iterable.class, EnumSet.allOf(Color.class)) 1717dd252788645e940eada959bdde927426e2531c9Paul Duffin .testAllPublicStaticMethods(EnumMultiset.class); 1727dd252788645e940eada959bdde927426e2531c9Paul Duffin } 1731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert} 174