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.testing.testers; 181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.collect.testing.features.CollectionFeature.ALLOWS_NULL_VALUES; 201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.collect.testing.features.CollectionSize.ZERO; 211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.collect.testing.features.ListFeature.SUPPORTS_SET; 221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.features.CollectionFeature; 241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.features.CollectionSize; 251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.features.ListFeature; 261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.lang.reflect.Method; 281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/** 301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * A generic JUnit test which tests {@code set()} operations on a list. Can't be 311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * invoked directly; please see 321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * {@link com.google.common.collect.testing.ListTestSuiteBuilder}. 331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <p>This class is GWT compatible. 351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @author George van den Driessche 371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertpublic class ListSetTester<E> extends AbstractListTester<E> { 391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @ListFeature.Require(SUPPORTS_SET) 401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @CollectionSize.Require(absent = ZERO) 411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testSet() { 421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert doTestSet(samples.e3); 431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @CollectionSize.Require(absent = ZERO) 461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @CollectionFeature.Require(ALLOWS_NULL_VALUES) 471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @ListFeature.Require(SUPPORTS_SET) 481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testSet_null() { 491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert doTestSet(null); 501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @CollectionSize.Require(absent = ZERO) 531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @CollectionFeature.Require(ALLOWS_NULL_VALUES) 541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @ListFeature.Require(SUPPORTS_SET) 551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testSet_replacingNull() { 561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert E[] elements = createSamplesArray(); 571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert int i = aValidIndex(); 581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert elements[i] = null; 591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert collection = getSubjectGenerator().create(elements); 601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert doTestSet(samples.e3); 621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private void doTestSet(E newValue) { 651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert int index = aValidIndex(); 661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert E initialValue = getList().get(index); 671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals("set(i, x) should return the old element at position i.", 681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert initialValue, getList().set(index, newValue)); 691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals("After set(i, x), get(i) should return x", 701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert newValue, getList().get(index)); 711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert assertEquals("set() should not change the size of a list.", 721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert getNumElements(), getList().size()); 731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @ListFeature.Require(SUPPORTS_SET) 761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testSet_indexTooLow() { 771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert getList().set(-1, samples.e3); 791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert fail("set(-1) should throw IndexOutOfBoundsException"); 801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (IndexOutOfBoundsException expected) { 811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert expectUnchanged(); 831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @ListFeature.Require(SUPPORTS_SET) 861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testSet_indexTooHigh() { 871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert int index = getNumElements(); 881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert getList().set(index, samples.e3); 901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert fail("set(size) should throw IndexOutOfBoundsException"); 911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (IndexOutOfBoundsException expected) { 921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert expectUnchanged(); 941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @CollectionSize.Require(absent = ZERO) 971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @ListFeature.Require(absent = SUPPORTS_SET) 981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testSet_unsupported() { 991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 1001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert getList().set(aValidIndex(), samples.e3); 1011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert fail("set() should throw UnsupportedOperationException"); 1021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UnsupportedOperationException expected) { 1031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert expectUnchanged(); 1051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @CollectionSize.Require(ZERO) 1081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @ListFeature.Require(absent = SUPPORTS_SET) 1091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testSet_unsupportedByEmptyList() { 1101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 1111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert getList().set(0, samples.e3); 1121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert fail("set() should throw UnsupportedOperationException " 1131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert + "or IndexOutOfBoundsException"); 1141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (UnsupportedOperationException tolerated) { 1151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (IndexOutOfBoundsException tolerated) { 1161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert expectUnchanged(); 1181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @CollectionSize.Require(absent = ZERO) 1211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @ListFeature.Require(SUPPORTS_SET) 1221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @CollectionFeature.Require(absent = ALLOWS_NULL_VALUES) 1231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public void testSet_nullUnsupported() { 1241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert try { 1251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert getList().set(aValidIndex(), null); 1261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert fail("set(null) should throw NullPointerException"); 1271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } catch (NullPointerException expected) { 1281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert expectUnchanged(); 1301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private int aValidIndex() { 1331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return getList().size() / 2; 1341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 1371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Returns the {@link java.lang.reflect.Method} instance for 1381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * {@link #testSet_null()} so that tests of {@link 1391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * java.util.Collections#checkedCollection(java.util.Collection, Class)} can 1401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * suppress it with {@code FeatureSpecificTestSuiteBuilder.suppressing()} 1411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * until <a 1421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * href="http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6409434">Sun bug 1431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 6409434</a> is fixed. It's unclear whether nulls were to be permitted or 1441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * forbidden, but presumably the eventual fix will be to permit them, as it 1451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * seems more likely that code would depend on that behavior than on the 1461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * other. Thus, we say the bug is in set(), which fails to support null. 1471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 1481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public static Method getSetNullSupportedMethod() { 1491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return Platform.getMethod(ListSetTester.class, "testSet_null"); 1501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert} 152