11d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/* 21d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Copyright (C) 2011 The Guava Authors 31d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 41d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except 51d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * in compliance with the License. You may obtain a copy of the License at 61d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 71d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * http://www.apache.org/licenses/LICENSE-2.0 81d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 91d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Unless required by applicable law or agreed to in writing, software distributed under the License 101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express 111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * or implied. See the License for the specific language governing permissions and limitations under 121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * the License. 131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertpackage com.google.common.collect.testing.google; 161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.collect.testing.features.CollectionFeature.KNOWN_ORDER; 181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.collect.testing.features.CollectionFeature.SUPPORTS_REMOVE; 191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.annotations.GwtCompatible; 211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.IteratorFeature; 221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.IteratorTester; 231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.features.CollectionFeature; 241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.lang.reflect.Method; 261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Arrays; 271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Iterator; 281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.List; 291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/** 311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Tester to make sure the {@code iterator().remove()} implementation of {@code Multiset} works when 321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * there are multiple occurrences of elements. 331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @author Louis Wasserman 351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert@GwtCompatible 371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertpublic class MultisetIteratorTester<E> extends AbstractMultisetTester<E> { 381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @SuppressWarnings("unchecked") 391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @CollectionFeature.Require({SUPPORTS_REMOVE, KNOWN_ORDER}) 401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testRemovingIteratorKnownOrder() { 411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert new IteratorTester<E>(4, IteratorFeature.MODIFIABLE, getSubjectGenerator().order( 421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Arrays.asList(samples.e0, samples.e1, samples.e1, samples.e2)), 431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert IteratorTester.KnownOrder.KNOWN_ORDER) { 441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override 451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert protected Iterator<E> newTargetIterator() { 461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return getSubjectGenerator().create(samples.e0, samples.e1, samples.e1, samples.e2) 471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert .iterator(); 481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert }.test(); 501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @SuppressWarnings("unchecked") 531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @CollectionFeature.Require(value = SUPPORTS_REMOVE, absent = KNOWN_ORDER) 541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testRemovingIteratorUnknownOrder() { 551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert new IteratorTester<E>(4, IteratorFeature.MODIFIABLE, Arrays.asList(samples.e0, samples.e1, 561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert samples.e1, samples.e2), IteratorTester.KnownOrder.UNKNOWN_ORDER) { 571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override 581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert protected Iterator<E> newTargetIterator() { 591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return getSubjectGenerator().create(samples.e0, samples.e1, samples.e1, samples.e2) 601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert .iterator(); 611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert }.test(); 631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @SuppressWarnings("unchecked") 661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @CollectionFeature.Require(value = KNOWN_ORDER, absent = SUPPORTS_REMOVE) 671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testIteratorKnownOrder() { 681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert new IteratorTester<E>(4, IteratorFeature.UNMODIFIABLE, getSubjectGenerator().order( 691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Arrays.asList(samples.e0, samples.e1, samples.e1, samples.e2)), 701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert IteratorTester.KnownOrder.KNOWN_ORDER) { 711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override 721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert protected Iterator<E> newTargetIterator() { 731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return getSubjectGenerator().create(samples.e0, samples.e1, samples.e1, samples.e2) 741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert .iterator(); 751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert }.test(); 771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @SuppressWarnings("unchecked") 801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @CollectionFeature.Require(absent = {SUPPORTS_REMOVE, KNOWN_ORDER}) 811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testIteratorUnknownOrder() { 821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert new IteratorTester<E>(4, IteratorFeature.UNMODIFIABLE, Arrays.asList(samples.e0, samples.e1, 831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert samples.e1, samples.e2), IteratorTester.KnownOrder.UNKNOWN_ORDER) { 841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override 851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert protected Iterator<E> newTargetIterator() { 861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return getSubjectGenerator().create(samples.e0, samples.e1, samples.e1, samples.e2) 871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert .iterator(); 881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert }.test(); 901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Returns {@link Method} instances for the tests that assume multisets support duplicates so that 941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * the test of {@code Multisets.forSet()} can suppress them. 951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public static List<Method> getIteratorDuplicateInitializingMethods() { 971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return Arrays.asList( 981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Platform.getMethod(MultisetIteratorTester.class, "testIteratorKnownOrder"), 991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Platform.getMethod(MultisetIteratorTester.class, "testIteratorUnknownOrder"), 1001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Platform.getMethod(MultisetIteratorTester.class, "testRemovingIteratorKnownOrder"), 1011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Platform.getMethod(MultisetIteratorTester.class, "testRemovingIteratorUnknownOrder")); 1021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert} 104