📄 abstracttestlist.java
字号:
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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 org.apache.commons.collections.list;
import java.io.IOException;
import java.io.Serializable;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.AbstractCollection;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.ConcurrentModificationException;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
import java.util.NoSuchElementException;
import org.apache.commons.collections.BulkTest;
import org.apache.commons.collections.collection.AbstractTestCollection;
import org.apache.commons.collections.iterators.AbstractTestListIterator;
/**
* Abstract test class for {@link java.util.List} methods and contracts.
* <p>
* To use, simply extend this class, and implement
* the {@link #makeEmptyList} method.
* <p>
* If your {@link List} fails one of these tests by design,
* you may still use this base set of cases. Simply override the
* test case (method) your {@link List} fails or override one of the
* protected methods from AbstractTestCollection.
*
* @version $Revision: 646780 $ $Date: 2008-04-10 13:48:07 +0100 (Thu, 10 Apr 2008) $
*
* @author Rodney Waldhoff
* @author Paul Jack
* @author Stephen Colebourne
* @author Neil O'Toole
*/
public abstract class AbstractTestList extends AbstractTestCollection {
/**
* JUnit constructor.
*
* @param testName the test class name
*/
public AbstractTestList(String testName) {
super(testName);
}
//-----------------------------------------------------------------------
/**
* Returns true if the collections produced by
* {@link #makeCollection()} and {@link #makeFullCollection()}
* support the <code>set operation.<p>
* Default implementation returns true. Override if your collection
* class does not support set.
*/
public boolean isSetSupported() {
return true;
}
//-----------------------------------------------------------------------
/**
* Verifies that the test list implementation matches the confirmed list
* implementation.
*/
public void verify() {
super.verify();
List list1 = getList();
List list2 = getConfirmedList();
assertEquals("List should equal confirmed", list1, list2);
assertEquals("Confirmed should equal list", list2, list1);
assertEquals("Hash codes should be equal", list1.hashCode(), list2.hashCode());
int i = 0;
Iterator iterator1 = list1.iterator();
Iterator iterator2 = list2.iterator();
Object[] array = list1.toArray();
while (iterator2.hasNext()) {
assertTrue("List iterator should have next", iterator1.hasNext());
Object o1 = iterator1.next();
Object o2 = iterator2.next();
assertEquals("Iterator elements should be equal", o1, o2);
o2 = list1.get(i);
assertEquals("get should return correct element", o1, o2);
o2 = array[i];
assertEquals("toArray should have correct element", o1, o2);
i++;
}
}
//-----------------------------------------------------------------------
/**
* List equals method is defined.
*/
public boolean isEqualsCheckable() {
return true;
}
/**
* Returns an empty {@link ArrayList}.
*/
public Collection makeConfirmedCollection() {
ArrayList list = new ArrayList();
return list;
}
/**
* Returns a full {@link ArrayList}.
*/
public Collection makeConfirmedFullCollection() {
ArrayList list = new ArrayList();
list.addAll(Arrays.asList(getFullElements()));
return list;
}
/**
* Return a new, empty {@link List} to be used for testing.
*
* @return an empty list for testing.
*/
public abstract List makeEmptyList();
/**
* Return a new, full {@link List} to be used for testing.
*
* @return a full list for testing
*/
public List makeFullList() {
// only works if list supports optional "addAll(Collection)"
List list = makeEmptyList();
list.addAll(Arrays.asList(getFullElements()));
return list;
}
/**
* Returns {@link #makeEmptyList()}.
*
* @return an empty list to be used for testing
*/
public final Collection makeCollection() {
return makeEmptyList();
}
/**
* Returns {@link #makeFullList()}.
*
* @return a full list to be used for testing
*/
public final Collection makeFullCollection() {
return makeFullList();
}
//-----------------------------------------------------------------------
/**
* Returns the {@link #collection} field cast to a {@link List}.
*
* @return the collection field as a List
*/
public List getList() {
return (List) collection;
}
/**
* Returns the {@link #confirmed} field cast to a {@link List}.
*
* @return the confirmed field as a List
*/
public List getConfirmedList() {
return (List) confirmed;
}
//-----------------------------------------------------------------------
/**
* Tests bounds checking for {@link List#add(int, Object)} on an
* empty list.
*/
public void testListAddByIndexBoundsChecking() {
if (!isAddSupported()) {
return;
}
List list;
Object element = getOtherElements()[0];
try {
list = makeEmptyList();
list.add(Integer.MIN_VALUE, element);
fail("List.add should throw IndexOutOfBoundsException [Integer.MIN_VALUE]");
} catch (IndexOutOfBoundsException e) {
// expected
}
try {
list = makeEmptyList();
list.add(-1, element);
fail("List.add should throw IndexOutOfBoundsException [-1]");
} catch (IndexOutOfBoundsException e) {
// expected
}
try {
list = makeEmptyList();
list.add(1, element);
fail("List.add should throw IndexOutOfBoundsException [1]");
} catch (IndexOutOfBoundsException e) {
// expected
}
try {
list = makeEmptyList();
list.add(Integer.MAX_VALUE, element);
fail("List.add should throw IndexOutOfBoundsException [Integer.MAX_VALUE]");
} catch (IndexOutOfBoundsException e) {
// expected
}
}
/**
* Tests bounds checking for {@link List#add(int, Object)} on a
* full list.
*/
public void testListAddByIndexBoundsChecking2() {
if (!isAddSupported()) {
return;
}
List list;
Object element = getOtherElements()[0];
try {
list = makeFullList();
list.add(Integer.MIN_VALUE, element);
fail("List.add should throw IndexOutOfBoundsException [Integer.MIN_VALUE]");
} catch (IndexOutOfBoundsException e) {
// expected
}
try {
list = makeFullList();
list.add(-1, element);
fail("List.add should throw IndexOutOfBoundsException [-1]");
} catch (IndexOutOfBoundsException e) {
// expected
}
try {
list = makeFullList();
list.add(list.size() + 1, element);
fail("List.add should throw IndexOutOfBoundsException [size + 1]");
} catch (IndexOutOfBoundsException e) {
// expected
}
try {
list = makeFullList();
list.add(Integer.MAX_VALUE, element);
fail("List.add should throw IndexOutOfBoundsException [Integer.MAX_VALUE]");
} catch (IndexOutOfBoundsException e) {
// expected
}
}
/**
* Tests {@link List#add(int,Object)}.
*/
public void testListAddByIndex() {
if (!isAddSupported()) {
return;
}
Object element = getOtherElements()[0];
int max = getFullElements().length;
for (int i = 0; i <= max; i++) {
resetFull();
((List) collection).add(i, element);
((List) confirmed).add(i, element);
verify();
}
}
/**
* Tests {@link List#equals(Object)}.
*/
public void testListEquals() {
resetEmpty();
List list = getList();
assertEquals("Empty lists should be equal", true, list.equals(confirmed));
verify();
assertEquals("Empty list should equal self", true, list.equals(list));
verify();
List list2 = Arrays.asList(getFullElements());
assertEquals("Empty list shouldn't equal full", false, list.equals(list2));
verify();
list2 = Arrays.asList(getOtherElements());
assertEquals("Empty list shouldn't equal other", false, list.equals(list2));
verify();
resetFull();
list = getList();
assertEquals("Full lists should be equal", true, list.equals(confirmed));
verify();
assertEquals("Full list should equal self", true, list.equals(list));
verify();
list2 = makeEmptyList();
assertEquals("Full list shouldn't equal empty", false, list.equals(list2));
verify();
list2 = Arrays.asList(getOtherElements());
assertEquals("Full list shouldn't equal other", false, list.equals(list2));
verify();
list2 = Arrays.asList(getFullElements());
if (list2.size() < 2 && isAddSupported()) {
// main list is only size 1, so lets add other elements to get a better list
list.addAll(Arrays.asList(getOtherElements()));
confirmed.addAll(Arrays.asList(getOtherElements()));
list2 = new ArrayList(list2);
list2.addAll(Arrays.asList(getOtherElements()));
}
if (list2.size() > 1) {
Collections.reverse(list2);
assertEquals(
"Full list shouldn't equal full list with same elements but different order",
false, list.equals(list2));
verify();
}
resetFull();
list = getList();
assertEquals("List shouldn't equal String", false, list.equals(""));
verify();
final List listForC = Arrays.asList(getFullElements());
Collection c = new AbstractCollection() {
public int size() {
return listForC.size();
}
public Iterator iterator() {
return listForC.iterator();
}
};
assertEquals("List shouldn't equal nonlist with same elements in same order", false, list.equals(c));
verify();
}
/**
* Tests {@link List#hashCode()}.
*/
public void testListHashCode() {
resetEmpty();
int hash1 = collection.hashCode();
int hash2 = confirmed.hashCode();
assertEquals("Empty lists should have equal hashCodes", hash1, hash2);
verify();
resetFull();
hash1 = collection.hashCode();
hash2 = confirmed.hashCode();
assertEquals("Full lists should have equal hashCodes", hash1, hash2);
verify();
}
/**
* Tests {@link List#get(int)}.
*/
public void testListGetByIndex() {
resetFull();
List list = getList();
Object[] elements = getFullElements();
for (int i = 0; i < elements.length; i++) {
assertEquals("List should contain correct elements", elements[i], list.get(i));
verify();
}
}
/**
* Tests bounds checking for {@link List#get(int)} on an
* empty list.
*/
public void testListGetByIndexBoundsChecking() {
List list = makeEmptyList();
try {
list.get(Integer.MIN_VALUE);
fail("List.get should throw IndexOutOfBoundsException [Integer.MIN_VALUE]");
} catch (IndexOutOfBoundsException e) {
// expected
}
try {
list.get(-1);
fail("List.get should throw IndexOutOfBoundsException [-1]");
} catch (IndexOutOfBoundsException e) {
// expected
}
try {
list.get(0);
fail("List.get should throw IndexOutOfBoundsException [0]");
} catch (IndexOutOfBoundsException e) {
// expected
}
try {
list.get(1);
fail("List.get should throw IndexOutOfBoundsException [1]");
} catch (IndexOutOfBoundsException e) {
// expected
}
try {
list.get(Integer.MAX_VALUE);
fail("List.get should throw IndexOutOfBoundsException [Integer.MAX_VALUE]");
} catch (IndexOutOfBoundsException e) {
// expected
}
}
/**
* Tests bounds checking for {@link List#get(int)} on a
* full list.
*/
public void testListGetByIndexBoundsChecking2() {
List list = makeFullList();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -