Integrate new MapIterator tests into DualBidiMap tests

git-svn-id: https://svn.apache.org/repos/asf/jakarta/commons/proper/collections/trunk@131322 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Stephen Colebourne 2003-11-02 19:48:39 +00:00
parent 1bec2d62d7
commit 559db22fc2
2 changed files with 66 additions and 105 deletions

View File

@ -1,5 +1,5 @@
/*
* $Header: /home/jerenkrantz/tmp/commons/commons-convert/cvs/home/cvs/jakarta-commons//collections/src/java/org/apache/commons/collections/Attic/AbstractDualBidiMap.java,v 1.7 2003/11/02 15:27:53 scolebourne Exp $
* $Header: /home/jerenkrantz/tmp/commons/commons-convert/cvs/home/cvs/jakarta-commons//collections/src/java/org/apache/commons/collections/Attic/AbstractDualBidiMap.java,v 1.8 2003/11/02 19:48:39 scolebourne Exp $
* ====================================================================
*
* The Apache Software License, Version 1.1
@ -67,7 +67,7 @@ import org.apache.commons.collections.decorators.AbstractIteratorDecorator;
import org.apache.commons.collections.decorators.AbstractMapEntryDecorator;
import org.apache.commons.collections.iterators.MapIterator;
import org.apache.commons.collections.iterators.ResetableMapIterator;
import org.apache.commons.collections.pairs.AbstractMapEntry;
import org.apache.commons.collections.pairs.TiedMapEntry;
/**
* Abstract <code>BidiMap</code> implemented using two maps.
@ -76,7 +76,7 @@ import org.apache.commons.collections.pairs.AbstractMapEntry;
* <code>createMap</code> method.
*
* @since Commons Collections 3.0
* @version $Id: AbstractDualBidiMap.java,v 1.7 2003/11/02 15:27:53 scolebourne Exp $
* @version $Id: AbstractDualBidiMap.java,v 1.8 2003/11/02 19:48:39 scolebourne Exp $
*
* @author Matthew Hawthorne
* @author Stephen Colebourne
@ -225,6 +225,10 @@ public abstract class AbstractDualBidiMap implements BidiMap {
* Obtains a <code>MapIterator</code> over the map.
* The iterator implements <code>ResetableMapIterator</code>.
* This implementation relies on the entrySet iterator.
* <p>
* The setValue() methods only allow a new value to be set.
* If the value being set is already in the map, an IllegalArgumentException
* is thrown (as setValue cannot change the size of the map).
*
* @return a map iterator
*/
@ -268,6 +272,17 @@ public abstract class AbstractDualBidiMap implements BidiMap {
return values;
}
/**
* Gets an entrySet view of the map.
* Changes made on the set are reflected in the map.
* The set supports remove and clear but not add.
* <p>
* The Map Entry setValue() method only allow a new value to be set.
* If the value being set is already in the map, an IllegalArgumentException
* is thrown (as setValue cannot change the size of the map).
*
* @return the entrySet view
*/
public Set entrySet() {
if (entrySet == null) {
entrySet = new EntrySet(this);
@ -601,9 +616,12 @@ public abstract class AbstractDualBidiMap implements BidiMap {
}
public Map.Entry asMapEntry() {
return new AbstractMapEntry(getKey(), getValue()) {
return new TiedMapEntry(map, getKey()) {
public Object setValue(Object value) {
BidiMapIterator.this.setValue(value);
if (map.maps[1].containsKey(value) &&
map.maps[1].get(value) != last.getKey()) {
throw new IllegalArgumentException("Cannot use setValue() when the object being set is already in the map");
}
return super.setValue(value);
}
};

View File

@ -1,5 +1,5 @@
/*
* $Header: /home/jerenkrantz/tmp/commons/commons-convert/cvs/home/cvs/jakarta-commons//collections/src/test/org/apache/commons/collections/Attic/AbstractTestBidiMap.java,v 1.6 2003/11/02 18:29:33 scolebourne Exp $
* $Header: /home/jerenkrantz/tmp/commons/commons-convert/cvs/home/cvs/jakarta-commons//collections/src/test/org/apache/commons/collections/Attic/AbstractTestBidiMap.java,v 1.7 2003/11/02 19:48:39 scolebourne Exp $
* ====================================================================
*
* The Apache Software License, Version 1.1
@ -61,15 +61,15 @@ import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.NoSuchElementException;
import java.util.Set;
import org.apache.commons.collections.iterators.AbstractTestMapIterator;
import org.apache.commons.collections.iterators.MapIterator;
/**
* Abstract test class for {@link BidiMap} methods and contracts.
*
* @version $Revision: 1.6 $ $Date: 2003/11/02 18:29:33 $
* @version $Revision: 1.7 $ $Date: 2003/11/02 19:48:39 $
*
* @author Matthew Hawthorne
* @author Stephen Colebourne
@ -430,7 +430,7 @@ public abstract class AbstractTestBidiMap extends AbstractTestMap {
return new TestInverseBidiMap(this);
}
class TestInverseBidiMap extends AbstractTestBidiMap {
public class TestInverseBidiMap extends AbstractTestBidiMap {
final AbstractTestBidiMap main;
public TestInverseBidiMap(AbstractTestBidiMap main) {
@ -475,76 +475,48 @@ public abstract class AbstractTestBidiMap extends AbstractTestMap {
}
//-----------------------------------------------------------------------
public void testBidiMapIteratorEmpty() {
resetEmpty();
BidiMap bidi = (BidiMap) map;
MapIterator it = bidi.mapIterator();
assertEquals(false, it.hasNext());
try {
it.next();
fail();
} catch (NoSuchElementException ex) {}
try {
it.getKey();
fail();
} catch (IllegalStateException ex) {
}
try {
it.getValue();
fail();
} catch (IllegalStateException ex) {
}
try {
it.remove();
fail();
} catch (IllegalStateException ex) {
}
try {
it.setValue(null);
fail();
} catch (IllegalStateException ex) {
}
try {
it.asMapEntry();
fail();
} catch (IllegalStateException ex) {
}
verify();
public BulkTest bulkTestBidiMapIterator() {
return new TestBidiMapIterator();
}
//-----------------------------------------------------------------------
public void testBidiMapIteratorFull() {
resetFull();
BidiMap bidi = (BidiMap) map;
MapIterator it = bidi.mapIterator();
assertEquals(true, it.hasNext());
Map.Entry lastEntry = null;
Object lastKey = null;
Object lastValue = null;
while (it.hasNext()) {
Object key = it.next();
assertSame(key, it.getKey());
Object value = it.getValue();
assertSame(bidi.get(key), value);
Map.Entry entry = it.asMapEntry();
assertTrue(entry != lastEntry);
if (lastKey != null && lastValue != null) {
assertSame(lastKey, lastEntry.getKey());
assertSame(lastValue, lastEntry.getValue());
}
assertSame(key, entry.getKey());
assertSame(value, entry.getValue());
lastEntry = entry;
lastKey = key;
lastValue = value;
public class TestBidiMapIterator extends AbstractTestMapIterator {
public TestBidiMapIterator() {
super("TestBidiMapIterator");
}
protected Object addSetValue() {
return AbstractTestBidiMap.this.getNewSampleValues()[0];
}
protected boolean supportsRemove() {
return AbstractTestBidiMap.this.isRemoveSupported();
}
verify();
}
protected boolean supportsSetValue() {
return AbstractTestBidiMap.this.isSetValueSupported();
}
protected MapIterator makeEmptyMapIterator() {
resetEmpty();
return ((BidiMap) AbstractTestBidiMap.this.map).mapIterator();
}
protected MapIterator makeFullMapIterator() {
resetFull();
return ((BidiMap) AbstractTestBidiMap.this.map).mapIterator();
}
protected Map getMap() {
// assumes makeFullMapIterator() called first
return AbstractTestBidiMap.this.map;
}
protected void verify() {
super.verify();
AbstractTestBidiMap.this.verifyInverse();
}
}
//-----------------------------------------------------------------------
public void testBidiMapIteratorRemove() {
resetFull();
@ -647,33 +619,4 @@ public abstract class AbstractTestBidiMap extends AbstractTestMap {
}
}
//-----------------------------------------------------------------------
public void testBidiMapIteratorSetRemoveSet() {
if (isSetValueSupported() == false || isRemoveSupported() == false) {
return;
}
Object newValue1 = getOtherValues()[0];
resetFull();
BidiMap bidi = (BidiMap) map;
MapIterator it = bidi.mapIterator();
assertEquals(true, it.hasNext());
Object key = it.next();
it.setValue(newValue1);
confirmed.put(key, newValue1);
verify();
it.remove();
confirmed.remove(key);
verify();
try {
it.setValue(newValue1);
fail();
} catch (IllegalStateException ex) {
}
verify();
}
}