You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@commons.apache.org by ma...@apache.org on 2003/09/27 01:28:43 UTC

cvs commit: jakarta-commons/collections/src/test/org/apache/commons/collections TestBidiMap.java

matth       2003/09/26 16:28:43

  Modified:    collections/src/java/org/apache/commons/collections
                        HashBidiMap.java
               collections/src/test/org/apache/commons/collections
                        TestBidiMap.java
  Log:
  Updated logic in put() to remove pair on duplicate value.  Because of this, TestBidiMap can no longer extend TestMap since this seems to break the Map contract.
  
  Revision  Changes    Path
  1.2       +18 -12    jakarta-commons/collections/src/java/org/apache/commons/collections/HashBidiMap.java
  
  Index: HashBidiMap.java
  ===================================================================
  RCS file: /home/cvs/jakarta-commons/collections/src/java/org/apache/commons/collections/HashBidiMap.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- HashBidiMap.java	23 Sep 2003 20:29:34 -0000	1.1
  +++ HashBidiMap.java	26 Sep 2003 23:28:43 -0000	1.2
  @@ -57,6 +57,7 @@
    */
   package org.apache.commons.collections;
   
  +import java.io.Serializable;
   import java.util.AbstractMap;
   import java.util.AbstractSet;
   import java.util.HashMap;
  @@ -72,10 +73,10 @@
    * 
    * @author Matthew Hawthorne
    */
  -public class HashBidiMap extends AbstractMap implements BidiMap {
  +public class HashBidiMap extends AbstractMap implements BidiMap, Serializable {
   
       /**
  -     * Delegate map array.  The first map contains standards entries, and the 
  +     * Delegate map array.  The first map contains standard entries, and the 
        * second contains inverses.
        */
       final Map[] maps = new Map[] { new HashMap(), new HashMap()};
  @@ -114,31 +115,36 @@
       }
   
       public Object put(Object key, Object value) {
  +        // Removes pair from standard map if a previous inverse entry exists
  +        final Object oldValue = maps[1].put(value, key);
  +        if (oldValue != null) {
  +            maps[0].remove(oldValue);
  +        }
  +        
           final Object obj = maps[0].put(key, value);
  -        maps[1].put(value, key);
           return obj;
       }
   
       public Set entrySet() {
           // The entrySet is the root of most Map methods, care must be taken not 
           // to reference instance methods like size()
  -        
  +
           // Creates anonymous AbstractSet
           return new AbstractSet() {
  -            
  +
               public Iterator iterator() {
                   // Creates anonymous Iterator
                   return new Iterator() {
   
                       // Delegate iterator.
                       final Iterator it = maps[0].entrySet().iterator();
  -                    
  +
                       // Current iterator entry
                       Map.Entry currentEntry;
   
                       public void remove() {
                           // Removes from standard and inverse Maps.
  -                        
  +
                           // Object must be removed using the iterator or a 
                           // ConcurrentModificationException is thrown
                           it.remove();
  @@ -168,7 +174,7 @@
               public int size() {
                   return HashBidiMap.this.maps[0].size();
               }
  -            
  +
           }; // anonymous AbstractSet
   
       } // entrySet()
  @@ -225,8 +231,8 @@
                       }; // anonymous Iterator
                   }
   
  -            };  // anonymous AbstractSet
  -            
  +            }; // anonymous AbstractSet
  +
           } // entrySet()
   
       } // InverseBidiMap
  
  
  
  1.2       +41 -6     jakarta-commons/collections/src/test/org/apache/commons/collections/TestBidiMap.java
  
  Index: TestBidiMap.java
  ===================================================================
  RCS file: /home/cvs/jakarta-commons/collections/src/test/org/apache/commons/collections/TestBidiMap.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- TestBidiMap.java	23 Sep 2003 20:29:34 -0000	1.1
  +++ TestBidiMap.java	26 Sep 2003 23:28:43 -0000	1.2
  @@ -59,6 +59,8 @@
   
   import java.util.Map;
   
  +import junit.framework.TestCase;
  +
   /**
    * JUnit tests.
    * 
  @@ -66,7 +68,7 @@
    * @version $Id$
    * @see org.apache.commons.collections.BidiMap
    */
  -public abstract class TestBidiMap extends TestMap {
  +public abstract class TestBidiMap extends TestCase {
   
       // Test data.
       private static final Object KEY = "key1";
  @@ -130,7 +132,36 @@
               inverseMap.getKey(entries[0][0]));
       }
   
  +    /**
  +     * Ensures that calling:
  +     * 
  +     * <pre>
  +     * map.add(a, c)
  +     * map.add(b, c)
  +     * </pre>
  +     * 
  +     * Removes the entry (a, c)
  +     */
  +    public void testAddDuplicateValue() {
  +        final BidiMap map = createBidiMap();
  +
  +        final Object key1 = "key1";
  +        final Object key2 = "key2";
  +        final Object value = "value";
  +
  +        map.put(key1, value);
  +        map.put(key2, value);
  +
  +        assertTrue(
  +            "Key/value pair was not removed on duplicate value.",
  +            !map.containsKey(key1));
  +            
  +        assertEquals("Key/value mismatch", key2, map.getKey(value));
  +    }
  +
  +    // ----------------------------------------------------------------
       // Removal tests
  +    // ----------------------------------------------------------------
   
       public void testClear() {
           BidiMap map = createBidiMapWithData();
  @@ -153,7 +184,7 @@
       public void testRemove() {
           remove(createBidiMapWithData(), KEY);
           remove(createBidiMapWithData().inverseBidiMap(), VALUE);
  -        
  +
           removeKey(createBidiMapWithData(), VALUE);
           removeKey(createBidiMapWithData().inverseBidiMap(), KEY);
       }
  @@ -163,7 +194,7 @@
           assertTrue("Key was not removed.", !map.containsKey(key));
           assertNull("Value was not removed.", map.getKey(value));
       }
  -    
  +
       private final void removeKey(BidiMap map, Object value) {
           final Object key = map.removeKey(value);
           assertTrue("Key was not removed.", !map.containsKey(key));
  @@ -215,11 +246,15 @@
       // Data generation methods
       // ----------------------------------------------------------------
   
  +    /**
  +     * This classes used to extend collections.TestMap, but can't anymore since 
  +     * put() breaks a contract.
  +     */
       protected Map makeEmptyMap() {
           return createBidiMap();
       }
   
  -    private final BidiMap createBidiMapWithData() {
  +    protected final BidiMap createBidiMapWithData() {
           final BidiMap map = createBidiMap();
           fillMap(map);
           return map;
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: commons-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: commons-dev-help@jakarta.apache.org