You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by bi...@apache.org on 2009/04/28 04:42:57 UTC

svn commit: r769224 - /commons/proper/math/trunk/src/test/org/apache/commons/math/util/OpenIntToFieldTest.java

Author: billbarker
Date: Tue Apr 28 02:42:57 2009
New Revision: 769224

URL: http://svn.apache.org/viewvc?rev=769224&view=rev
Log:
Adding unit test for OpenIntToFieldHashMap

Added:
    commons/proper/math/trunk/src/test/org/apache/commons/math/util/OpenIntToFieldTest.java   (with props)

Added: commons/proper/math/trunk/src/test/org/apache/commons/math/util/OpenIntToFieldTest.java
URL: http://svn.apache.org/viewvc/commons/proper/math/trunk/src/test/org/apache/commons/math/util/OpenIntToFieldTest.java?rev=769224&view=auto
==============================================================================
--- commons/proper/math/trunk/src/test/org/apache/commons/math/util/OpenIntToFieldTest.java (added)
+++ commons/proper/math/trunk/src/test/org/apache/commons/math/util/OpenIntToFieldTest.java Tue Apr 28 02:42:57 2009
@@ -0,0 +1,300 @@
+package org.apache.commons.math.util;
+
+import java.util.ConcurrentModificationException;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.NoSuchElementException;
+import java.util.Random;
+import java.util.Set;
+import java.util.Map.Entry;
+
+import org.apache.commons.math.Field;
+import org.apache.commons.math.FieldElement;
+import org.apache.commons.math.fraction.Fraction;
+import org.apache.commons.math.fraction.FractionConversionException;
+import org.apache.commons.math.fraction.FractionField;
+
+import junit.framework.TestCase;
+
+public class OpenIntToFieldTest extends TestCase {
+
+    private Map<Integer, Fraction> javaMap = new HashMap<Integer, Fraction>();
+    private FractionField field = FractionField.getInstance();
+
+    @Override
+    protected void setUp() throws Exception {
+        javaMap.put(50, new Fraction(100.0));
+        javaMap.put(75, new Fraction(75.0));
+        javaMap.put(25, new Fraction(500.0));
+        javaMap.put(Integer.MAX_VALUE, new Fraction(Integer.MAX_VALUE));
+        javaMap.put(0, new Fraction(-1.0));
+        javaMap.put(1, new Fraction(0.0));
+        javaMap.put(33, new Fraction(-0.1));
+        javaMap.put(23234234, new Fraction(-242343.0));
+        javaMap.put(23321, new Fraction (Integer.MIN_VALUE));
+        javaMap.put(-4444, new Fraction(332.0));
+        javaMap.put(-1, new Fraction(-2323.0));
+        javaMap.put(Integer.MIN_VALUE, new Fraction(44.0));
+
+        /* Add a few more to cause the table to rehash */
+        javaMap.putAll(generate());
+
+    }
+
+    private Map<Integer, Fraction> generate() {
+        Map<Integer, Fraction> map = new HashMap<Integer, Fraction>();
+        Random r = new Random();
+        double dd=0;
+        for (int i = 0; i < 2000; ++i)
+            dd = r.nextDouble(); 
+            try {
+                map.put(r.nextInt(), new Fraction(dd));
+            } catch (FractionConversionException e) {
+                throw new IllegalStateException("Invalid :"+dd, e);
+            }
+        return map;
+    }
+
+    private OpenIntToFieldHashMap<Fraction> createFromJavaMap(Field<Fraction> field) {
+        OpenIntToFieldHashMap<Fraction> map = new OpenIntToFieldHashMap<Fraction>(field);
+        for (Map.Entry<Integer, Fraction> mapEntry : javaMap.entrySet()) {
+            map.put(mapEntry.getKey(), mapEntry.getValue());
+        }
+        return map;
+    }
+    
+    public void testPutAndGetWith0ExpectedSize() {
+        OpenIntToFieldHashMap<Fraction> map = new OpenIntToFieldHashMap<Fraction>(field,0);
+        assertPutAndGet(map);
+    }
+    
+    public void testPutAndGetWithExpectedSize() {
+        OpenIntToFieldHashMap<Fraction> map = new OpenIntToFieldHashMap<Fraction>(field,500);
+        assertPutAndGet(map);
+    }
+
+    public void testPutAndGet() {
+        OpenIntToFieldHashMap<Fraction> map = new OpenIntToFieldHashMap<Fraction>(field);
+        assertPutAndGet(map);
+    }
+
+    private void assertPutAndGet(OpenIntToFieldHashMap<Fraction> map) {
+        assertPutAndGet(map, 0, new HashSet<Integer>());
+    }
+
+    private void assertPutAndGet(OpenIntToFieldHashMap<Fraction> map, int mapSize,
+            Set<Integer> keysInMap) {
+        assertEquals(mapSize, map.size());
+        for (Map.Entry<Integer, Fraction> mapEntry : javaMap.entrySet()) {
+            map.put(mapEntry.getKey(), mapEntry.getValue());
+            if (!keysInMap.contains(mapEntry.getKey()))
+                ++mapSize;
+            assertEquals(mapSize, map.size());
+            assertEquals(mapEntry.getValue(), map.get(mapEntry.getKey()));
+        }
+    }
+
+    public void testPutAbsentOnExisting() {
+        OpenIntToFieldHashMap<Fraction> map = createFromJavaMap(field);
+        int size = javaMap.size();
+        for (Map.Entry<Integer, Fraction> mapEntry : generateAbsent().entrySet()) {
+            map.put(mapEntry.getKey(), mapEntry.getValue());
+            assertEquals(++size, map.size());
+            assertEquals(mapEntry.getValue(), map.get(mapEntry.getKey()));
+        }
+    }
+
+    public void testPutOnExisting() {
+        OpenIntToFieldHashMap<Fraction> map = createFromJavaMap(field);
+        for (Map.Entry<Integer, Fraction> mapEntry : javaMap.entrySet()) {
+            map.put(mapEntry.getKey(), mapEntry.getValue());
+            assertEquals(javaMap.size(), map.size());
+            assertEquals(mapEntry.getValue(), map.get(mapEntry.getKey()));
+        }
+    }
+
+    public void testGetAbsent() {
+        Map<Integer, Fraction> generated = generateAbsent();
+        OpenIntToFieldHashMap<Fraction> map = createFromJavaMap(field);
+        
+        for (Map.Entry<Integer, Fraction> mapEntry : generated.entrySet())
+            assertTrue(field.getZero().equals(map.get(mapEntry.getKey())));
+    }
+
+    public void testGetFromEmpty() {
+        OpenIntToFieldHashMap<Fraction> map = new OpenIntToFieldHashMap<Fraction>(field);
+        assertTrue(field.getZero().equals(map.get(5)));
+        assertTrue(field.getZero().equals(map.get(0)));
+        assertTrue(field.getZero().equals(map.get(50)));
+    }
+
+    public void testRemove() {
+        OpenIntToFieldHashMap<Fraction> map = createFromJavaMap(field);
+        int mapSize = javaMap.size();
+        assertEquals(mapSize, map.size());
+        for (Map.Entry<Integer, Fraction> mapEntry : javaMap.entrySet()) {
+            map.remove(mapEntry.getKey());
+            assertEquals(--mapSize, map.size());
+            assertTrue(field.getZero().equals(map.get(mapEntry.getKey())));
+        }
+
+        /* Ensure that put and get still work correctly after removals */
+        assertPutAndGet(map);
+    }
+
+    /* This time only remove some entries */
+    public void testRemove2() {
+        OpenIntToFieldHashMap<Fraction> map = createFromJavaMap(field);
+        int mapSize = javaMap.size();
+        int count = 0;
+        Set<Integer> keysInMap = new HashSet<Integer>(javaMap.keySet());
+        for (Map.Entry<Integer, Fraction> mapEntry : javaMap.entrySet()) {
+            keysInMap.remove(mapEntry.getKey());
+            map.remove(mapEntry.getKey());
+            assertEquals(--mapSize, map.size());
+            assertTrue(field.getZero().equals(map.get(mapEntry.getKey())));
+            if (count++ > 5)
+                break;
+        }
+
+        /* Ensure that put and get still work correctly after removals */
+        assertPutAndGet(map, mapSize, keysInMap);
+    }
+
+    public void testRemoveFromEmpty() {
+        OpenIntToFieldHashMap<Fraction> map = new OpenIntToFieldHashMap<Fraction>(field);
+        assertTrue(field.getZero().equals(map.remove(50)));
+    }
+
+    public void testRemoveAbsent() {
+        Map<Integer, Fraction> generated = generateAbsent();
+
+        OpenIntToFieldHashMap<Fraction> map = createFromJavaMap(field);
+        int mapSize = map.size();
+        
+        for (Map.Entry<Integer, Fraction> mapEntry : generated.entrySet()) {
+            map.remove(mapEntry.getKey());
+            assertEquals(mapSize, map.size());
+            assertTrue(field.getZero().equals(map.get(mapEntry.getKey())));
+        }
+    }
+
+    /**
+     * Returns a map with at least 100 elements where each element is absent from javaMap.
+     */
+    private Map<Integer, Fraction> generateAbsent() {
+        Map<Integer, Fraction> generated = new HashMap<Integer, Fraction>();
+        do {
+            generated.putAll(generate());
+            for (Integer key : javaMap.keySet())
+                generated.remove(key);
+        } while (generated.size() < 100);
+        return generated;
+    }
+
+    public void testCopy() {
+        OpenIntToFieldHashMap<Fraction> copy =
+            new OpenIntToFieldHashMap<Fraction>(createFromJavaMap(field));
+        assertEquals(javaMap.size(), copy.size());
+
+        for (Map.Entry<Integer, Fraction> mapEntry : javaMap.entrySet())
+            assertEquals(mapEntry.getValue(), copy.get(mapEntry.getKey()));
+    }
+
+    public void testContainsKey() {
+        OpenIntToFieldHashMap<Fraction> map = createFromJavaMap(field);
+        for (Entry<Integer, Fraction> mapEntry : javaMap.entrySet()) {
+            assertTrue(map.containsKey(mapEntry.getKey()));
+        }
+        for (Map.Entry<Integer, Fraction> mapEntry : generateAbsent().entrySet()) {
+            assertFalse(map.containsKey(mapEntry.getKey()));
+        }
+        for (Entry<Integer, Fraction> mapEntry : javaMap.entrySet()) {
+            int key = mapEntry.getKey();
+            assertTrue(map.containsKey(key));
+            map.remove(key);
+            assertFalse(map.containsKey(key));
+        }
+    }
+
+    public void testIterator() {
+        OpenIntToFieldHashMap<Fraction> map = createFromJavaMap(field);
+        OpenIntToFieldHashMap<Fraction>.Iterator iterator = map.iterator();
+        for (int i = 0; i < map.size(); ++i) {
+            assertTrue(iterator.hasNext());
+            iterator.advance();
+            int key = iterator.key();
+            assertTrue(map.containsKey(key));
+            assertEquals(javaMap.get(key), map.get(key));
+            assertEquals(javaMap.get(key), iterator.value());
+            assertTrue(javaMap.containsKey(key));
+        }
+        assertFalse(iterator.hasNext());
+        try {
+            iterator.advance();
+            fail("an exception should have been thrown");
+        } catch (NoSuchElementException nsee) {
+            // expected
+        }
+    }
+
+    public void testConcurrentModification() {
+        OpenIntToFieldHashMap<Fraction> map = createFromJavaMap(field);
+        OpenIntToFieldHashMap<Fraction>.Iterator iterator = map.iterator();
+        map.put(3, new Fraction(3));
+        try {
+            iterator.advance();
+            fail("an exception should have been thrown");
+        } catch (ConcurrentModificationException cme) {
+            // expected
+        }
+    }
+
+    /**
+     * Regression test for a bug in findInsertionIndex where the hashing in the second probing
+     * loop was inconsistent with the first causing duplicate keys after the right sequence
+     * of puts and removes.
+     */
+    public void testPutKeysWithCollisions() {
+        OpenIntToFieldHashMap<Fraction> map = new OpenIntToFieldHashMap<Fraction>(field);
+        int key1 = -1996012590;
+        Fraction value1 = new Fraction(1);
+        map.put(key1, value1);
+        int key2 = 835099822;
+        map.put(key2, value1);
+        int key3 = 1008859686;
+        map.put(key3, value1);
+        assertEquals(value1, map.get(key3));
+        assertEquals(3, map.size());
+        
+        map.remove(key2);
+        Fraction value2 = new Fraction(2);
+        map.put(key3, value2);
+        assertEquals(value2, map.get(key3));
+        assertEquals(2, map.size());
+    }
+    
+    /**
+     * Similar to testPutKeysWithCollisions() but exercises the codepaths in a slightly
+     * different manner.
+     */
+    public void testPutKeysWithCollision2() {
+        OpenIntToFieldHashMap<Fraction>map = new OpenIntToFieldHashMap<Fraction>(field);
+        int key1 = 837989881;
+        Fraction value1 = new Fraction(1);
+        map.put(key1, value1);
+        int key2 = 476463321;
+        map.put(key2, value1);
+        assertEquals(2, map.size());
+        assertEquals(value1, map.get(key2));
+        
+        map.remove(key1);
+        Fraction value2 = new Fraction(2);
+        map.put(key2, value2);
+        assertEquals(1, map.size());
+        assertEquals(value2, map.get(key2));
+    }
+
+
+}

Propchange: commons/proper/math/trunk/src/test/org/apache/commons/math/util/OpenIntToFieldTest.java
------------------------------------------------------------------------------
    svn:eol-style = native