17dd252788645e940eada959bdde927426e2531c9Paul Duffin/*
27dd252788645e940eada959bdde927426e2531c9Paul Duffin * Copyright (C) 2008 The Guava Authors
37dd252788645e940eada959bdde927426e2531c9Paul Duffin *
47dd252788645e940eada959bdde927426e2531c9Paul Duffin * Licensed under the Apache License, Version 2.0 (the "License");
57dd252788645e940eada959bdde927426e2531c9Paul Duffin * you may not use this file except in compliance with the License.
67dd252788645e940eada959bdde927426e2531c9Paul Duffin * You may obtain a copy of the License at
77dd252788645e940eada959bdde927426e2531c9Paul Duffin *
87dd252788645e940eada959bdde927426e2531c9Paul Duffin * http://www.apache.org/licenses/LICENSE-2.0
97dd252788645e940eada959bdde927426e2531c9Paul Duffin *
107dd252788645e940eada959bdde927426e2531c9Paul Duffin * Unless required by applicable law or agreed to in writing, software
117dd252788645e940eada959bdde927426e2531c9Paul Duffin * distributed under the License is distributed on an "AS IS" BASIS,
127dd252788645e940eada959bdde927426e2531c9Paul Duffin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
137dd252788645e940eada959bdde927426e2531c9Paul Duffin * See the License for the specific language governing permissions and
147dd252788645e940eada959bdde927426e2531c9Paul Duffin * limitations under the License.
157dd252788645e940eada959bdde927426e2531c9Paul Duffin */
167dd252788645e940eada959bdde927426e2531c9Paul Duffin
177dd252788645e940eada959bdde927426e2531c9Paul Duffinpackage com.google.common.collect.testing.testers;
187dd252788645e940eada959bdde927426e2531c9Paul Duffin
197dd252788645e940eada959bdde927426e2531c9Paul Duffinimport static com.google.common.collect.testing.features.CollectionFeature.ALLOWS_NULL_VALUES;
207dd252788645e940eada959bdde927426e2531c9Paul Duffinimport static com.google.common.collect.testing.features.CollectionSize.ZERO;
217dd252788645e940eada959bdde927426e2531c9Paul Duffinimport static com.google.common.collect.testing.features.ListFeature.SUPPORTS_SET;
227dd252788645e940eada959bdde927426e2531c9Paul Duffin
237dd252788645e940eada959bdde927426e2531c9Paul Duffinimport com.google.common.annotations.GwtCompatible;
247dd252788645e940eada959bdde927426e2531c9Paul Duffinimport com.google.common.collect.testing.features.CollectionFeature;
257dd252788645e940eada959bdde927426e2531c9Paul Duffinimport com.google.common.collect.testing.features.CollectionSize;
267dd252788645e940eada959bdde927426e2531c9Paul Duffinimport com.google.common.collect.testing.features.ListFeature;
277dd252788645e940eada959bdde927426e2531c9Paul Duffin
287dd252788645e940eada959bdde927426e2531c9Paul Duffin/**
297dd252788645e940eada959bdde927426e2531c9Paul Duffin * A generic JUnit test which tests {@code set()} operations on a list. Can't be
307dd252788645e940eada959bdde927426e2531c9Paul Duffin * invoked directly; please see
317dd252788645e940eada959bdde927426e2531c9Paul Duffin * {@link com.google.common.collect.testing.ListTestSuiteBuilder}.
327dd252788645e940eada959bdde927426e2531c9Paul Duffin *
337dd252788645e940eada959bdde927426e2531c9Paul Duffin * @author George van den Driessche
347dd252788645e940eada959bdde927426e2531c9Paul Duffin */
357dd252788645e940eada959bdde927426e2531c9Paul Duffin@GwtCompatible(emulated = true)
367dd252788645e940eada959bdde927426e2531c9Paul Duffinpublic class ListSetTester<E> extends AbstractListTester<E> {
377dd252788645e940eada959bdde927426e2531c9Paul Duffin  @ListFeature.Require(SUPPORTS_SET)
387dd252788645e940eada959bdde927426e2531c9Paul Duffin  @CollectionSize.Require(absent = ZERO)
397dd252788645e940eada959bdde927426e2531c9Paul Duffin  public void testSet() {
407dd252788645e940eada959bdde927426e2531c9Paul Duffin    doTestSet(samples.e3);
417dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
427dd252788645e940eada959bdde927426e2531c9Paul Duffin
437dd252788645e940eada959bdde927426e2531c9Paul Duffin  @CollectionSize.Require(absent = ZERO)
447dd252788645e940eada959bdde927426e2531c9Paul Duffin  @CollectionFeature.Require(ALLOWS_NULL_VALUES)
457dd252788645e940eada959bdde927426e2531c9Paul Duffin  @ListFeature.Require(SUPPORTS_SET)
467dd252788645e940eada959bdde927426e2531c9Paul Duffin  public void testSet_null() {
477dd252788645e940eada959bdde927426e2531c9Paul Duffin    doTestSet(null);
487dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
497dd252788645e940eada959bdde927426e2531c9Paul Duffin
507dd252788645e940eada959bdde927426e2531c9Paul Duffin  @CollectionSize.Require(absent = ZERO)
517dd252788645e940eada959bdde927426e2531c9Paul Duffin  @CollectionFeature.Require(ALLOWS_NULL_VALUES)
527dd252788645e940eada959bdde927426e2531c9Paul Duffin  @ListFeature.Require(SUPPORTS_SET)
537dd252788645e940eada959bdde927426e2531c9Paul Duffin  public void testSet_replacingNull() {
547dd252788645e940eada959bdde927426e2531c9Paul Duffin    E[] elements = createSamplesArray();
557dd252788645e940eada959bdde927426e2531c9Paul Duffin    int i = aValidIndex();
567dd252788645e940eada959bdde927426e2531c9Paul Duffin    elements[i] = null;
577dd252788645e940eada959bdde927426e2531c9Paul Duffin    collection = getSubjectGenerator().create(elements);
587dd252788645e940eada959bdde927426e2531c9Paul Duffin
597dd252788645e940eada959bdde927426e2531c9Paul Duffin    doTestSet(samples.e3);
607dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
617dd252788645e940eada959bdde927426e2531c9Paul Duffin
627dd252788645e940eada959bdde927426e2531c9Paul Duffin  private void doTestSet(E newValue) {
637dd252788645e940eada959bdde927426e2531c9Paul Duffin    int index = aValidIndex();
647dd252788645e940eada959bdde927426e2531c9Paul Duffin    E initialValue = getList().get(index);
657dd252788645e940eada959bdde927426e2531c9Paul Duffin    assertEquals("set(i, x) should return the old element at position i.",
667dd252788645e940eada959bdde927426e2531c9Paul Duffin        initialValue, getList().set(index, newValue));
677dd252788645e940eada959bdde927426e2531c9Paul Duffin    assertEquals("After set(i, x), get(i) should return x",
687dd252788645e940eada959bdde927426e2531c9Paul Duffin        newValue, getList().get(index));
697dd252788645e940eada959bdde927426e2531c9Paul Duffin    assertEquals("set() should not change the size of a list.",
707dd252788645e940eada959bdde927426e2531c9Paul Duffin        getNumElements(), getList().size());
717dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
727dd252788645e940eada959bdde927426e2531c9Paul Duffin
737dd252788645e940eada959bdde927426e2531c9Paul Duffin  @ListFeature.Require(SUPPORTS_SET)
747dd252788645e940eada959bdde927426e2531c9Paul Duffin  public void testSet_indexTooLow() {
757dd252788645e940eada959bdde927426e2531c9Paul Duffin    try {
767dd252788645e940eada959bdde927426e2531c9Paul Duffin      getList().set(-1, samples.e3);
777dd252788645e940eada959bdde927426e2531c9Paul Duffin      fail("set(-1) should throw IndexOutOfBoundsException");
787dd252788645e940eada959bdde927426e2531c9Paul Duffin    } catch (IndexOutOfBoundsException expected) {
797dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
807dd252788645e940eada959bdde927426e2531c9Paul Duffin    expectUnchanged();
817dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
827dd252788645e940eada959bdde927426e2531c9Paul Duffin
837dd252788645e940eada959bdde927426e2531c9Paul Duffin  @ListFeature.Require(SUPPORTS_SET)
847dd252788645e940eada959bdde927426e2531c9Paul Duffin  public void testSet_indexTooHigh() {
857dd252788645e940eada959bdde927426e2531c9Paul Duffin    int index = getNumElements();
867dd252788645e940eada959bdde927426e2531c9Paul Duffin    try {
877dd252788645e940eada959bdde927426e2531c9Paul Duffin      getList().set(index, samples.e3);
887dd252788645e940eada959bdde927426e2531c9Paul Duffin      fail("set(size) should throw IndexOutOfBoundsException");
897dd252788645e940eada959bdde927426e2531c9Paul Duffin    } catch (IndexOutOfBoundsException expected) {
907dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
917dd252788645e940eada959bdde927426e2531c9Paul Duffin    expectUnchanged();
927dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
937dd252788645e940eada959bdde927426e2531c9Paul Duffin
947dd252788645e940eada959bdde927426e2531c9Paul Duffin  @CollectionSize.Require(absent = ZERO)
957dd252788645e940eada959bdde927426e2531c9Paul Duffin  @ListFeature.Require(absent = SUPPORTS_SET)
967dd252788645e940eada959bdde927426e2531c9Paul Duffin  public void testSet_unsupported() {
977dd252788645e940eada959bdde927426e2531c9Paul Duffin    try {
987dd252788645e940eada959bdde927426e2531c9Paul Duffin      getList().set(aValidIndex(), samples.e3);
997dd252788645e940eada959bdde927426e2531c9Paul Duffin      fail("set() should throw UnsupportedOperationException");
1007dd252788645e940eada959bdde927426e2531c9Paul Duffin    } catch (UnsupportedOperationException expected) {
1017dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
1027dd252788645e940eada959bdde927426e2531c9Paul Duffin    expectUnchanged();
1037dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
1047dd252788645e940eada959bdde927426e2531c9Paul Duffin
1057dd252788645e940eada959bdde927426e2531c9Paul Duffin  @CollectionSize.Require(ZERO)
1067dd252788645e940eada959bdde927426e2531c9Paul Duffin  @ListFeature.Require(absent = SUPPORTS_SET)
1077dd252788645e940eada959bdde927426e2531c9Paul Duffin  public void testSet_unsupportedByEmptyList() {
1087dd252788645e940eada959bdde927426e2531c9Paul Duffin    try {
1097dd252788645e940eada959bdde927426e2531c9Paul Duffin      getList().set(0, samples.e3);
1107dd252788645e940eada959bdde927426e2531c9Paul Duffin      fail("set() should throw UnsupportedOperationException "
1117dd252788645e940eada959bdde927426e2531c9Paul Duffin          + "or IndexOutOfBoundsException");
1127dd252788645e940eada959bdde927426e2531c9Paul Duffin    } catch (UnsupportedOperationException tolerated) {
1137dd252788645e940eada959bdde927426e2531c9Paul Duffin    } catch (IndexOutOfBoundsException tolerated) {
1147dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
1157dd252788645e940eada959bdde927426e2531c9Paul Duffin    expectUnchanged();
1167dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
1177dd252788645e940eada959bdde927426e2531c9Paul Duffin
1187dd252788645e940eada959bdde927426e2531c9Paul Duffin  @CollectionSize.Require(absent = ZERO)
1197dd252788645e940eada959bdde927426e2531c9Paul Duffin  @ListFeature.Require(SUPPORTS_SET)
1207dd252788645e940eada959bdde927426e2531c9Paul Duffin  @CollectionFeature.Require(absent = ALLOWS_NULL_VALUES)
1217dd252788645e940eada959bdde927426e2531c9Paul Duffin  public void testSet_nullUnsupported() {
1227dd252788645e940eada959bdde927426e2531c9Paul Duffin    try {
1237dd252788645e940eada959bdde927426e2531c9Paul Duffin      getList().set(aValidIndex(), null);
1247dd252788645e940eada959bdde927426e2531c9Paul Duffin      fail("set(null) should throw NullPointerException");
1257dd252788645e940eada959bdde927426e2531c9Paul Duffin    } catch (NullPointerException expected) {
1267dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
1277dd252788645e940eada959bdde927426e2531c9Paul Duffin    expectUnchanged();
1287dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
1297dd252788645e940eada959bdde927426e2531c9Paul Duffin
1307dd252788645e940eada959bdde927426e2531c9Paul Duffin  private int aValidIndex() {
1317dd252788645e940eada959bdde927426e2531c9Paul Duffin    return getList().size() / 2;
1327dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
1337dd252788645e940eada959bdde927426e2531c9Paul Duffin}
1347dd252788645e940eada959bdde927426e2531c9Paul Duffin
135