aboutsummaryrefslogtreecommitdiffstats
path: root/guava-tests/test/com/google/common/collect/MultisetCollectionTest.java
diff options
context:
space:
mode:
Diffstat (limited to 'guava-tests/test/com/google/common/collect/MultisetCollectionTest.java')
-rw-r--r--guava-tests/test/com/google/common/collect/MultisetCollectionTest.java234
1 files changed, 234 insertions, 0 deletions
diff --git a/guava-tests/test/com/google/common/collect/MultisetCollectionTest.java b/guava-tests/test/com/google/common/collect/MultisetCollectionTest.java
new file mode 100644
index 0000000..47a94d3
--- /dev/null
+++ b/guava-tests/test/com/google/common/collect/MultisetCollectionTest.java
@@ -0,0 +1,234 @@
+/*
+ * Copyright (C) 2008 The Guava Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.google.common.collect;
+
+import static com.google.common.collect.testing.google.AbstractMultisetSetCountTester.getSetCountDuplicateInitializingMethods;
+import static com.google.common.collect.testing.google.MultisetIteratorTester.getIteratorDuplicateInitializingMethods;
+import static com.google.common.collect.testing.google.MultisetReadsTester.getReadsDuplicateInitializingMethods;
+import static java.util.Arrays.asList;
+
+import com.google.common.annotations.GwtIncompatible;
+import com.google.common.collect.testing.AnEnum;
+import com.google.common.collect.testing.features.CollectionFeature;
+import com.google.common.collect.testing.features.CollectionSize;
+import com.google.common.collect.testing.google.MultisetTestSuiteBuilder;
+import com.google.common.collect.testing.google.SortedMultisetTestSuiteBuilder;
+import com.google.common.collect.testing.google.TestEnumMultisetGenerator;
+import com.google.common.collect.testing.google.TestStringMultisetGenerator;
+
+import junit.framework.Test;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * Collection tests for {@link Multiset} implementations.
+ *
+ * @author Jared Levy
+ */
+@GwtIncompatible("suite") // TODO(cpovirk): set up collect/gwt/suites version
+public class MultisetCollectionTest extends TestCase {
+
+ public static Test suite() {
+ TestSuite suite = new TestSuite();
+
+ suite.addTest(MultisetTestSuiteBuilder.using(hashMultisetGenerator())
+ .withFeatures(CollectionSize.ANY,
+ CollectionFeature.ALLOWS_NULL_VALUES,
+ CollectionFeature.GENERAL_PURPOSE)
+ .named("HashMultiset")
+ .createTestSuite());
+
+ suite.addTest(MultisetTestSuiteBuilder.using(
+ unmodifiableMultisetGenerator())
+ .withFeatures(CollectionSize.ANY, CollectionFeature.KNOWN_ORDER,
+ CollectionFeature.ALLOWS_NULL_QUERIES)
+ .named("UnmodifiableTreeMultiset")
+ .createTestSuite());
+
+ suite.addTest(SortedMultisetTestSuiteBuilder
+ .using(new TestStringMultisetGenerator() {
+ @Override
+ protected Multiset<String> create(String[] elements) {
+ return TreeMultiset.create(Arrays.asList(elements));
+ }
+
+ @Override
+ public List<String> order(List<String> insertionOrder) {
+ return Ordering.natural().sortedCopy(insertionOrder);
+ }
+ })
+ .withFeatures(CollectionSize.ANY, CollectionFeature.KNOWN_ORDER,
+ CollectionFeature.GENERAL_PURPOSE,
+ CollectionFeature.ALLOWS_NULL_QUERIES)
+ .named("TreeMultiset, Ordering.natural")
+ .createTestSuite());
+
+
+ suite.addTest(SortedMultisetTestSuiteBuilder
+ .using(new TestStringMultisetGenerator() {
+ @Override
+ protected Multiset<String> create(String[] elements) {
+ Multiset<String> result = TreeMultiset.create(Ordering.natural().nullsFirst());
+ result.addAll(Arrays.asList(elements));
+ return result;
+ }
+
+ @Override
+ public List<String> order(List<String> insertionOrder) {
+ return Ordering.natural().nullsFirst().sortedCopy(insertionOrder);
+ }
+ })
+ .withFeatures(CollectionSize.ANY, CollectionFeature.KNOWN_ORDER,
+ CollectionFeature.GENERAL_PURPOSE,
+ CollectionFeature.ALLOWS_NULL_VALUES)
+ .named("TreeMultiset, Ordering.natural.nullsFirst")
+ .createTestSuite());
+
+ suite.addTest(MultisetTestSuiteBuilder.using(forSetGenerator())
+ .withFeatures(CollectionSize.ANY, CollectionFeature.ALLOWS_NULL_VALUES,
+ CollectionFeature.REMOVE_OPERATIONS)
+ .suppressing(getReadsDuplicateInitializingMethods())
+ .suppressing(getSetCountDuplicateInitializingMethods())
+ .suppressing(getIteratorDuplicateInitializingMethods())
+ .named("ForSetMultiset")
+ .createTestSuite());
+
+ suite.addTest(MultisetTestSuiteBuilder.using(
+ concurrentMultisetGenerator())
+ .withFeatures(CollectionSize.ANY,
+ CollectionFeature.GENERAL_PURPOSE,
+ CollectionFeature.ALLOWS_NULL_QUERIES)
+ .named("ConcurrentHashMultiset")
+ .createTestSuite());
+
+ suite.addTest(MultisetTestSuiteBuilder.using(enumMultisetGenerator())
+ .withFeatures(CollectionSize.ANY,
+ CollectionFeature.KNOWN_ORDER,
+ CollectionFeature.GENERAL_PURPOSE,
+ CollectionFeature.ALLOWS_NULL_QUERIES)
+ .named("EnumMultiset")
+ .createTestSuite());
+
+ suite.addTest(MultisetTestSuiteBuilder.using(intersectionGenerator())
+ .withFeatures(CollectionSize.ANY,
+ CollectionFeature.ALLOWS_NULL_VALUES,
+ CollectionFeature.KNOWN_ORDER)
+ .named("IntersectionMultiset")
+ .createTestSuite());
+
+ suite.addTest(SortedMultisetTestSuiteBuilder.using(unmodifiableSortedMultisetGenerator())
+ .withFeatures(CollectionSize.ANY, CollectionFeature.KNOWN_ORDER,
+ CollectionFeature.ALLOWS_NULL_QUERIES)
+ .named("UnmodifiableSortedTreeMultiset")
+ .createTestSuite());
+
+ return suite;
+ }
+
+ private static TestStringMultisetGenerator hashMultisetGenerator() {
+ return new TestStringMultisetGenerator() {
+ @Override protected Multiset<String> create(String[] elements) {
+ return HashMultiset.create(asList(elements));
+ }
+ };
+ }
+
+ private static TestStringMultisetGenerator unmodifiableMultisetGenerator() {
+ return new TestStringMultisetGenerator() {
+ @Override protected Multiset<String> create(String[] elements) {
+ return Multisets.unmodifiableMultiset(
+ TreeMultiset.create(asList(elements)));
+ }
+ @Override public List<String> order(List<String> insertionOrder) {
+ Collections.sort(insertionOrder);
+ return insertionOrder;
+ }
+ };
+ }
+
+ private static TestStringMultisetGenerator unmodifiableSortedMultisetGenerator() {
+ return new TestStringMultisetGenerator() {
+ @Override protected Multiset<String> create(String[] elements) {
+ return Multisets.unmodifiableSortedMultiset(
+ TreeMultiset.create(asList(elements)));
+ }
+ @Override public List<String> order(List<String> insertionOrder) {
+ Collections.sort(insertionOrder);
+ return insertionOrder;
+ }
+ };
+ }
+
+ private static TestStringMultisetGenerator forSetGenerator() {
+ return new TestStringMultisetGenerator() {
+ @Override protected Multiset<String> create(String[] elements) {
+ return Multisets.forSet(Sets.newHashSet(elements));
+ }
+ };
+ }
+
+ private static TestStringMultisetGenerator concurrentMultisetGenerator() {
+ return new TestStringMultisetGenerator() {
+ @Override protected Multiset<String> create(String[] elements) {
+ return ConcurrentHashMultiset.create(asList(elements));
+ }
+ };
+ }
+
+ private static TestEnumMultisetGenerator enumMultisetGenerator() {
+ return new TestEnumMultisetGenerator() {
+ @Override protected Multiset<AnEnum> create(AnEnum[] elements) {
+ return (elements.length == 0)
+ ? EnumMultiset.create(AnEnum.class)
+ : EnumMultiset.create(asList(elements));
+ }
+ };
+ }
+
+ private static TestStringMultisetGenerator intersectionGenerator() {
+ return new TestStringMultisetGenerator() {
+ @Override protected Multiset<String> create(String[] elements) {
+ Multiset<String> multiset1 = LinkedHashMultiset.create();
+ Multiset<String> multiset2 = LinkedHashMultiset.create();
+ multiset1.add("only1");
+ multiset2.add("only2");
+ for (int i = 0; i < elements.length; i++) {
+ multiset1.add(elements[i]);
+ multiset2.add(elements[elements.length - 1 - i]);
+ }
+ if (elements.length > 0) {
+ multiset1.add(elements[0]);
+ }
+ if (elements.length > 1) {
+ /*
+ * When a test requests a multiset with duplicates, our plan of
+ * "add an extra item 0 to A and an extra item 1 to B" really means
+ * "add an extra item 0 to A and B," which isn't what we want.
+ */
+ if (!elements[0].equals(elements[1])) {
+ multiset2.add(elements[1], 2);
+ }
+ }
+ return Multisets.intersection(multiset1, multiset2);
+ }
+ };
+ }
+}