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