11d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/*
21d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Copyright (C) 2007 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 Bringert
221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.WrongType;
231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.features.CollectionFeature;
241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.features.CollectionSize;
251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/**
271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Common parent class for {@link ListIndexOfTester} and
281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * {@link ListLastIndexOfTester}.
291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <p>This class is GWT compatible.
311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @author Chris Povirk
331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */
341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertpublic abstract class AbstractListIndexOfTester<E>
351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    extends AbstractListTester<E> {
361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /** Override to call {@code indexOf()} or {@code lastIndexOf()}. */
371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  protected abstract int find(Object o);
381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Override to return "indexOf" or "lastIndexOf()" for use in failure
411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * messages.
421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  protected abstract String getMethodName();
441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionSize.Require(absent = ZERO)
461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testFind_yes() {
471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(getMethodName() + "(firstElement) should return 0",
481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        0, find(samples.e0));
491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testFind_no() {
521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(getMethodName() + "(notPresent) should return -1",
531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        -1, find(samples.e3));
541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionFeature.Require(ALLOWS_NULL_VALUES)
571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testFind_nullNotContainedButSupported() {
581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(getMethodName() + "(nullNotPresent) should return -1",
591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        -1, find(null));
601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionFeature.Require(absent = ALLOWS_NULL_VALUES)
631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testFind_nullNotContainedAndUnsupported() {
641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertEquals(
661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          getMethodName() + "(nullNotPresent) should return -1 or throw",
671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          -1, find(null));
681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (NullPointerException tolerated) {
691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionFeature.Require(ALLOWS_NULL_VALUES)
731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionSize.Require(absent = ZERO)
741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testFind_nonNullWhenNullContained() {
751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    initCollectionWithNullElement();
761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(getMethodName() + "(notPresent) should return -1",
771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        -1, find(samples.e3));
781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionFeature.Require(ALLOWS_NULL_VALUES)
811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionSize.Require(absent = ZERO)
821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testFind_nullContained() {
831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    initCollectionWithNullElement();
841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(getMethodName() + "(null) should return " + getNullLocation(),
851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        getNullLocation(), find(null));
861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testFind_wrongType() {
891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertEquals(getMethodName() + "(wrongType) should return -1 or throw",
911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          -1, find(WrongType.VALUE));
921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (ClassCastException tolerated) {
931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert}
96