11d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/*
21d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Copyright (C) 2008 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 com.google.common.collect.testing.google.AbstractMultisetSetCountTester.getSetCountDuplicateInitializingMethods;
201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.collect.testing.google.MultisetIteratorTester.getIteratorDuplicateInitializingMethods;
211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.collect.testing.google.MultisetReadsTester.getReadsDuplicateInitializingMethods;
221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static java.util.Arrays.asList;
231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.annotations.GwtIncompatible;
251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.AnEnum;
261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.features.CollectionFeature;
271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.features.CollectionSize;
281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.google.MultisetTestSuiteBuilder;
291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.google.SortedMultisetTestSuiteBuilder;
301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.google.TestEnumMultisetGenerator;
311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.google.TestStringMultisetGenerator;
321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport junit.framework.Test;
341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport junit.framework.TestCase;
351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport junit.framework.TestSuite;
361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Arrays;
381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Collections;
391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.List;
401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/**
421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Collection tests for {@link Multiset} implementations.
431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @author Jared Levy
451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */
461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert@GwtIncompatible("suite") // TODO(cpovirk): set up collect/gwt/suites version
471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertpublic class MultisetCollectionTest extends TestCase {
481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static Test suite() {
501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    TestSuite suite = new TestSuite();
511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    suite.addTest(MultisetTestSuiteBuilder.using(hashMultisetGenerator())
531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .withFeatures(CollectionSize.ANY,
541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            CollectionFeature.ALLOWS_NULL_VALUES,
551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            CollectionFeature.GENERAL_PURPOSE)
561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .named("HashMultiset")
571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .createTestSuite());
581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    suite.addTest(MultisetTestSuiteBuilder.using(
601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        unmodifiableMultisetGenerator())
611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .withFeatures(CollectionSize.ANY, CollectionFeature.KNOWN_ORDER,
621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            CollectionFeature.ALLOWS_NULL_QUERIES)
631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .named("UnmodifiableTreeMultiset")
641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .createTestSuite());
651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    suite.addTest(SortedMultisetTestSuiteBuilder
671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .using(new TestStringMultisetGenerator() {
681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          @Override
691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          protected Multiset<String> create(String[] elements) {
701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            return TreeMultiset.create(Arrays.asList(elements));
711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          }
721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          @Override
741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          public List<String> order(List<String> insertionOrder) {
751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            return Ordering.natural().sortedCopy(insertionOrder);
761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          }
771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        })
781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .withFeatures(CollectionSize.ANY, CollectionFeature.KNOWN_ORDER,
791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            CollectionFeature.GENERAL_PURPOSE,
801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            CollectionFeature.ALLOWS_NULL_QUERIES)
811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .named("TreeMultiset, Ordering.natural")
821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .createTestSuite());
831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    suite.addTest(SortedMultisetTestSuiteBuilder
861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .using(new TestStringMultisetGenerator() {
871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          @Override
881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          protected Multiset<String> create(String[] elements) {
891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            Multiset<String> result = TreeMultiset.create(Ordering.natural().nullsFirst());
901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            result.addAll(Arrays.asList(elements));
911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            return result;
921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          }
931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          @Override
951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          public List<String> order(List<String> insertionOrder) {
961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            return Ordering.natural().nullsFirst().sortedCopy(insertionOrder);
971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          }
981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        })
991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .withFeatures(CollectionSize.ANY, CollectionFeature.KNOWN_ORDER,
1001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            CollectionFeature.GENERAL_PURPOSE,
1011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            CollectionFeature.ALLOWS_NULL_VALUES)
1021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .named("TreeMultiset, Ordering.natural.nullsFirst")
1031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .createTestSuite());
1041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    suite.addTest(MultisetTestSuiteBuilder.using(forSetGenerator())
1061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .withFeatures(CollectionSize.ANY, CollectionFeature.ALLOWS_NULL_VALUES,
1071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            CollectionFeature.REMOVE_OPERATIONS)
1081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .suppressing(getReadsDuplicateInitializingMethods())
1091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .suppressing(getSetCountDuplicateInitializingMethods())
1101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .suppressing(getIteratorDuplicateInitializingMethods())
1111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .named("ForSetMultiset")
1121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .createTestSuite());
1131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    suite.addTest(MultisetTestSuiteBuilder.using(
1151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        concurrentMultisetGenerator())
1161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .withFeatures(CollectionSize.ANY,
1171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            CollectionFeature.GENERAL_PURPOSE,
1181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            CollectionFeature.ALLOWS_NULL_QUERIES)
1191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .named("ConcurrentHashMultiset")
1201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .createTestSuite());
1211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    suite.addTest(MultisetTestSuiteBuilder.using(enumMultisetGenerator())
1231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .withFeatures(CollectionSize.ANY,
1241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            CollectionFeature.KNOWN_ORDER,
1251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            CollectionFeature.GENERAL_PURPOSE,
1261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            CollectionFeature.ALLOWS_NULL_QUERIES)
1271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .named("EnumMultiset")
1281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .createTestSuite());
1291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    suite.addTest(MultisetTestSuiteBuilder.using(intersectionGenerator())
1311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .withFeatures(CollectionSize.ANY,
1321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            CollectionFeature.ALLOWS_NULL_VALUES,
1331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            CollectionFeature.KNOWN_ORDER)
1341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .named("IntersectionMultiset")
1351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .createTestSuite());
1361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    suite.addTest(SortedMultisetTestSuiteBuilder.using(unmodifiableSortedMultisetGenerator())
1381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .withFeatures(CollectionSize.ANY, CollectionFeature.KNOWN_ORDER,
1391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            CollectionFeature.ALLOWS_NULL_QUERIES)
1401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .named("UnmodifiableSortedTreeMultiset")
1411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .createTestSuite());
1421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return suite;
1441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static TestStringMultisetGenerator hashMultisetGenerator() {
1471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return new TestStringMultisetGenerator() {
1481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      @Override protected Multiset<String> create(String[] elements) {
1491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        return HashMultiset.create(asList(elements));
1501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
1511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    };
1521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static TestStringMultisetGenerator unmodifiableMultisetGenerator() {
1551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return new TestStringMultisetGenerator() {
1561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      @Override protected Multiset<String> create(String[] elements) {
1571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        return Multisets.unmodifiableMultiset(
1581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            TreeMultiset.create(asList(elements)));
1591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
1601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      @Override public List<String> order(List<String> insertionOrder) {
1611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Collections.sort(insertionOrder);
1621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        return insertionOrder;
1631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
1641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    };
1651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static TestStringMultisetGenerator unmodifiableSortedMultisetGenerator() {
1681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return new TestStringMultisetGenerator() {
1691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      @Override protected Multiset<String> create(String[] elements) {
1701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        return Multisets.unmodifiableSortedMultiset(
1711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            TreeMultiset.create(asList(elements)));
1721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
1731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      @Override public List<String> order(List<String> insertionOrder) {
1741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Collections.sort(insertionOrder);
1751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        return insertionOrder;
1761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
1771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    };
1781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static TestStringMultisetGenerator forSetGenerator() {
1811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return new TestStringMultisetGenerator() {
1821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      @Override protected Multiset<String> create(String[] elements) {
1831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        return Multisets.forSet(Sets.newHashSet(elements));
1841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
1851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    };
1861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static TestStringMultisetGenerator concurrentMultisetGenerator() {
1891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return new TestStringMultisetGenerator() {
1901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      @Override protected Multiset<String> create(String[] elements) {
1911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        return ConcurrentHashMultiset.create(asList(elements));
1921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
1931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    };
1941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static TestEnumMultisetGenerator enumMultisetGenerator() {
1971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return new TestEnumMultisetGenerator() {
1981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      @Override protected Multiset<AnEnum> create(AnEnum[] elements) {
1991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        return (elements.length == 0)
2001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            ? EnumMultiset.create(AnEnum.class)
2011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            : EnumMultiset.create(asList(elements));
2021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
2031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    };
2041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static TestStringMultisetGenerator intersectionGenerator() {
2071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return new TestStringMultisetGenerator() {
2081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      @Override protected Multiset<String> create(String[] elements) {
2091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Multiset<String> multiset1 = LinkedHashMultiset.create();
2101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Multiset<String> multiset2 = LinkedHashMultiset.create();
2111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        multiset1.add("only1");
2121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        multiset2.add("only2");
2131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        for (int i = 0; i < elements.length; i++) {
2141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          multiset1.add(elements[i]);
2151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          multiset2.add(elements[elements.length - 1 - i]);
2161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        }
2171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        if (elements.length > 0) {
2181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          multiset1.add(elements[0]);
2191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        }
2201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        if (elements.length > 1) {
2211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          /*
2221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert           * When a test requests a multiset with duplicates, our plan of
2231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert           * "add an extra item 0 to A and an extra item 1 to B" really means
2241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert           * "add an extra item 0 to A and B," which isn't what we want.
2251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert           */
2261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          if (!elements[0].equals(elements[1])) {
2271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            multiset2.add(elements[1], 2);
2281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          }
2291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        }
2301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        return Multisets.intersection(multiset1, multiset2);
2311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
2321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    };
2331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert}
235