📄 testlist.java
字号:
* iterator.
*/
public void testListIteratorAdd() {
if (!isAddSupported()) return;
resetEmpty();
List list1 = getList();
List list2 = getConfirmedList();
Object[] elements = getFullElements();
ListIterator iter1 = list1.listIterator();
ListIterator iter2 = list2.listIterator();
for (int i = 0; i < elements.length; i++) {
iter1.add(elements[i]);
iter2.add(elements[i]);
verify();
}
resetFull();
iter1 = getList().listIterator();
iter2 = getConfirmedList().listIterator();
for (int i = 0; i < elements.length; i++) {
iter1.next();
iter2.next();
iter1.add(elements[i]);
iter2.add(elements[i]);
verify();
}
}
/**
* Tests the {@link ListIterator#set(Object)} method of the list
* iterator.
*/
public void testListIteratorSet() {
if (!isAddSupported()) return;
Object[] elements = getFullElements();
resetFull();
ListIterator iter1 = getList().listIterator();
ListIterator iter2 = getConfirmedList().listIterator();
for (int i = 0; i < elements.length; i++) {
iter1.next();
iter2.next();
iter1.set(elements[i]);
iter2.set(elements[i]);
verify();
}
}
public void testEmptyListSerialization()
throws IOException, ClassNotFoundException {
List list = makeEmptyList();
if (!(list instanceof Serializable)) return;
byte[] objekt = writeExternalFormToBytes((Serializable) list);
List list2 = (List) readExternalFormFromBytes(objekt);
assertTrue("Both lists are empty",list.size() == 0);
assertTrue("Both lists are empty",list2.size() == 0);
}
public void testFullListSerialization()
throws IOException, ClassNotFoundException {
List list = makeFullList();
int size = getFullElements().length;
if (!(list instanceof Serializable)) return;
byte[] objekt = writeExternalFormToBytes((Serializable) list);
List list2 = (List) readExternalFormFromBytes(objekt);
assertEquals("Both lists are same size",list.size(), size);
assertEquals("Both lists are same size",list2.size(), size);
}
/**
* Compare the current serialized form of the List
* against the canonical version in CVS.
*/
public void testEmptyListCompatibility() throws IOException, ClassNotFoundException {
/**
* Create canonical objects with this code
List list = makeEmptyList();
if (!(list instanceof Serializable)) return;
writeExternalFormToDisk((Serializable) list, getCanonicalEmptyCollectionName(list));
*/
// test to make sure the canonical form has been preserved
if (!(makeEmptyList() instanceof Serializable)) return;
List list = (List) readExternalFormFromDisk(getCanonicalEmptyCollectionName(makeEmptyList()));
assertTrue("List is empty",list.size() == 0);
}
/**
* Compare the current serialized form of the List
* against the canonical version in CVS.
*/
public void testFullListCompatibility() throws IOException, ClassNotFoundException {
/**
* Create canonical objects with this code
List list = makeFullList();
if (!(list instanceof Serializable)) return;
writeExternalFormToDisk((Serializable) list, getCanonicalFullCollectionName(list));
*/
// test to make sure the canonical form has been preserved
if (!(makeFullList() instanceof Serializable)) return;
List list = (List) readExternalFormFromDisk(getCanonicalFullCollectionName(makeFullList()));
assertEquals("List is the right size",list.size(), 4);
}
/**
* Returns an empty {@link ArrayList}.
*/
protected Collection makeConfirmedCollection() {
ArrayList list = new ArrayList();
return list;
}
/**
* Returns a full {@link ArrayList}.
*/
protected Collection makeConfirmedFullCollection() {
ArrayList list = new ArrayList();
list.addAll(Arrays.asList(getFullElements()));
return list;
}
/**
* Verifies that the test list implementation matches the confirmed list
* implementation.
*/
protected 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++;
}
}
/**
* Returns a {@link BulkTest} for testing {@link List#subList(int,int)}.
* The returned bulk test will run through every <Code>TestList</Code>
* method, <I>including</I> another <Code>bulkTestSubList</Code>.
* Sublists are tested until the size of the sublist is less than 10.
* Each sublist is 6 elements smaller than its parent list.
* (By default this means that two rounds of sublists will be tested).
* The verify() method is overloaded to test that the original list is
* modified when the sublist is.
*/
public BulkTest bulkTestSubList() {
if (getFullElements().length - 6 < 10) return null;
return new BulkTestSubList(this);
}
static class BulkTestSubList extends TestList {
private TestList outer;
BulkTestSubList(TestList outer) {
super("");
this.outer = outer;
}
protected Object[] getFullElements() {
List l = Arrays.asList(outer.getFullElements());
return l.subList(3, l.size() - 3).toArray();
}
protected Object[] getOtherElements() {
return outer.getOtherElements();
}
protected boolean isAddSupported() {
return outer.isAddSupported();
}
protected boolean isRemoveSupported() {
return outer.isRemoveSupported();
}
protected List makeEmptyList() {
return outer.makeFullList().subList(4, 4);
}
protected List makeFullList() {
int size = getFullElements().length;
return outer.makeFullList().subList(3, size - 3);
}
protected void resetEmpty() {
outer.resetFull();
this.collection = outer.getList().subList(4, 4);
this.confirmed = outer.getConfirmedList().subList(4, 4);
}
protected void resetFull() {
outer.resetFull();
int size = outer.confirmed.size();
this.collection = outer.getList().subList(3, size - 3);
this.confirmed = outer.getConfirmedList().subList(3, size - 3);
}
protected void verify() {
super.verify();
outer.verify();
}
}
/**
* Tests that a sublist raises a {@link java.util.ConcurrentModificationException ConcurrentModificationException}
* if elements are added to the original list.
*/
public void testListSubListFailFastOnAdd() {
if (!isAddSupported()) return;
resetFull();
int size = collection.size();
List sub = getList().subList(1, size);
getList().add(getOtherElements()[0]);
failFastAll(sub);
resetFull();
sub = getList().subList(1, size);
getList().add(0, getOtherElements()[0]);
failFastAll(sub);
resetFull();
sub = getList().subList(1, size);
getList().addAll(Arrays.asList(getOtherElements()));
failFastAll(sub);
resetFull();
sub = getList().subList(1, size);
getList().addAll(0, Arrays.asList(getOtherElements()));
failFastAll(sub);
}
/**
* Tests that a sublist raises a {@link java.util.ConcurrentModificationException ConcurrentModificationException}
* if elements are removed from the original list.
*/
public void testListSubListFailFastOnRemove() {
if (!isRemoveSupported()) return;
resetFull();
int size = collection.size();
List sub = getList().subList(1, size);
getList().remove(0);
failFastAll(sub);
resetFull();
sub = getList().subList(1, size);
getList().remove(getFullElements()[2]);
failFastAll(sub);
resetFull();
sub = getList().subList(1, size);
getList().removeAll(Arrays.asList(getFullElements()));
failFastAll(sub);
resetFull();
sub = getList().subList(1, size);
getList().retainAll(Arrays.asList(getOtherElements()));
failFastAll(sub);
resetFull();
sub = getList().subList(1, size);
getList().clear();
failFastAll(sub);
}
/**
* Invokes all the methods on the given sublist to make sure they raise
* a {@link java.util.ConcurrentModificationException ConcurrentModificationException}.
*/
protected void failFastAll(List list) {
Method[] methods = List.class.getMethods();
for (int i = 0; i < methods.length; i++) {
failFastMethod(list, methods[i]);
}
}
/**
* Invokes the given method on the given sublist to make sure it raises
* a {@link java.util.ConcurrentModificationException ConcurrentModificationException}.
*
* Unless the method happens to be the equals() method, in which case
* the test is skipped. There seems to be a bug in
* java.util.AbstractList.subList(int,int).equals(Object) -- it never
* raises a ConcurrentModificationException.
*
* @param list the sublist to test
* @param m the method to invoke
*/
protected void failFastMethod(List list, Method m) {
if (m.getName().equals("equals")) return;
Object element = getOtherElements()[0];
Collection c = Collections.singleton(element);
Class[] types = m.getParameterTypes();
Object[] params = new Object[types.length];
for (int i = 0; i < params.length; i++) {
if (types[i] == Integer.TYPE) params[i] = new Integer(0);
else if (types[i] == Collection.class) params[i] = c;
else if (types[i] == Object.class) params[i] = element;
else if (types[i] == Object[].class) params[i] = new Object[0];
}
try {
m.invoke(list, params);
fail(m.getName() + " should raise ConcurrentModification");
} catch (IllegalAccessException e) {
// impossible
} catch (InvocationTargetException e) {
Throwable t = e.getTargetException();
if (t instanceof ConcurrentModificationException) {
// expected
return;
} else {
fail(m.getName() + " raised unexpected " + e);
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -