@Test public void testRemove0() { IntOpenHashSet s = new IntOpenHashSet(Hash.DEFAULT_INITIAL_SIZE); for (int i = -1; i <= 1; i++) assertTrue(s.add(i)); assertTrue(s.remove(0)); IntIterator iterator = s.iterator(); IntOpenHashSet z = new IntOpenHashSet(); z.add(iterator.nextInt()); z.add(iterator.nextInt()); assertFalse(iterator.hasNext()); assertEquals(new IntOpenHashSet(new int[] {-1, 1}), z); s = new IntOpenHashSet(Hash.DEFAULT_INITIAL_SIZE); for (int i = -1; i <= 1; i++) assertTrue(s.add(i)); iterator = s.iterator(); while (iterator.hasNext()) if (iterator.nextInt() == 0) iterator.remove(); assertFalse(s.contains(0)); iterator = s.iterator(); int[] content = new int[2]; content[0] = iterator.nextInt(); content[1] = iterator.nextInt(); assertFalse(iterator.hasNext()); Arrays.sort(content); assertArrayEquals(new int[] {-1, 1}, content); }
@Test public void testWrapAround3() { IntOpenHashSet s = new IntOpenHashSet(4, .75f); assertEquals(8, s.n); // The following code inverts HashCommon.phiMix() and places strategically keys in slots 5, 6, // 7, 0 and 1 s.add(HashCommon.invMix(5)); s.add(HashCommon.invMix(5 + 8)); s.add(HashCommon.invMix(5 + 16)); s.add(HashCommon.invMix(5 + 32)); s.add(HashCommon.invMix(5 + 64)); assertNotEquals(0, s.key[5]); assertNotEquals(0, s.key[6]); assertNotEquals(0, s.key[7]); assertNotEquals(0, s.key[0]); assertNotEquals(0, s.key[1]); // System.err.println(Arrays.toString( s.key )); IntOpenHashSet keys = s.clone(); IntIterator iterator = s.iterator(); IntOpenHashSet t = new IntOpenHashSet(); assertTrue(t.add(iterator.nextInt())); iterator.remove(); // System.err.println(Arrays.toString( s.key )); assertTrue(t.add(iterator.nextInt())); iterator.remove(); // System.err.println(Arrays.toString( s.key )); // Originally, this remove would move the entry in slot 0 in slot 6 and we would return the // entry in 0 twice assertTrue(t.add(iterator.nextInt())); iterator.remove(); // System.err.println(Arrays.toString( s.key )); assertTrue(t.add(iterator.nextInt())); iterator.remove(); // System.err.println(Arrays.toString( s.key )); assertTrue(t.add(iterator.nextInt())); iterator.remove(); assertEquals(0, s.size()); assertEquals(keys, t); }
@Test public void testWrapAround() { IntOpenHashSet s = new IntOpenHashSet(4, .5f); assertEquals(8, s.n); // The following code inverts HashCommon.phiMix() and places strategically keys in slots 6, 7 // and 0 s.add(HashCommon.invMix(6)); s.add(HashCommon.invMix(7)); s.add(HashCommon.invMix(6 + 8)); assertNotEquals(0, s.key[0]); assertNotEquals(0, s.key[6]); assertNotEquals(0, s.key[7]); IntOpenHashSet keys = s.clone(); IntIterator iterator = s.iterator(); IntOpenHashSet t = new IntOpenHashSet(); t.add(iterator.nextInt()); t.add(iterator.nextInt()); // Originally, this remove would move the entry in slot 0 in slot 6 and we would return the // entry in 0 twice iterator.remove(); t.add(iterator.nextInt()); assertEquals(keys, t); }
@SuppressWarnings({"unchecked", "boxing"}) private static void test(int n, float f) throws IOException, ClassNotFoundException { int c; IntOpenHashSet m = new IntOpenHashSet(Hash.DEFAULT_INITIAL_SIZE, f); java.util.Set t = new java.util.HashSet(); /* First of all, we fill t with random data. */ for (int i = 0; i < Math.ceil(f * n); i++) t.add((Integer.valueOf(genKey()))); /* Now we add to m the same data */ m.addAll(t); checkTable(m); assertTrue("Error: !m.equals(t) after insertion", m.equals(t)); assertTrue("Error: !t.equals(m) after insertion", t.equals(m)); printProbes(m); /* Now we check that m actually holds that data. */ for (java.util.Iterator i = t.iterator(); i.hasNext(); ) { Object e = i.next(); assertTrue( "Error: m and t differ on a key (" + e + ") after insertion (iterating on t)", m.contains(e)); } /* Now we check that m actually holds that data, but iterating on m. */ c = 0; for (java.util.Iterator i = m.iterator(); i.hasNext(); ) { Object e = i.next(); c++; assertTrue( "Error: m and t differ on a key (" + e + ") after insertion (iterating on m)", t.contains(e)); } assertEquals( "Error: m has only " + c + " keys instead of " + t.size() + " after insertion (iterating on m)", c, t.size()); /* * Now we check that inquiries about random data give the same answer in m and t. For m we * use the polymorphic method. */ for (int i = 0; i < n; i++) { int T = genKey(); assertEquals( "Error: divergence in keys between t and m (polymorphic method)", m.contains(T), t.contains((Integer.valueOf(T)))); } /* * Again, we check that inquiries about random data give the same answer in m and t, but for * m we use the standard method. */ for (int i = 0; i < n; i++) { int T = genKey(); assertFalse( "Error: divergence between t and m (standard method)", m.contains((Integer.valueOf(T))) != t.contains((Integer.valueOf(T)))); } /* Now we put and remove random data in m and t, checking that the result is the same. */ for (int i = 0; i < 20 * n; i++) { int T = genKey(); assertFalse( "Error: divergence in add() between t and m", m.add((Integer.valueOf(T))) != t.add((Integer.valueOf(T)))); T = genKey(); assertFalse( "Error: divergence in remove() between t and m", m.remove((Integer.valueOf(T))) != t.remove((Integer.valueOf(T)))); } checkTable(m); assertTrue("Error: !m.equals(t) after removal", m.equals(t)); assertTrue("Error: !t.equals(m) after removal", t.equals(m)); /* Now we check that m actually holds that data. */ for (java.util.Iterator i = t.iterator(); i.hasNext(); ) { Object e = i.next(); assertFalse( "Error: m and t differ on a key (" + e + ") after removal (iterating on t)", !m.contains(e)); } /* Now we check that m actually holds that data, but iterating on m. */ for (java.util.Iterator i = m.iterator(); i.hasNext(); ) { Object e = i.next(); assertFalse( "Error: m and t differ on a key (" + e + ") after removal (iterating on m)", !t.contains(e)); } /* Now we make m into an array, make it again a set and check it is OK. */ int a[] = m.toIntArray(); assertTrue( "Error: toArray() output (or array-based constructor) is not OK", new IntOpenHashSet(a).equals(m)); /* Now we check cloning. */ assertTrue("Error: m does not equal m.clone()", m.equals(m.clone())); assertTrue("Error: m.clone() does not equal m", m.clone().equals(m)); int h = m.hashCode(); /* Now we save and read m. */ java.io.File ff = new java.io.File("it.unimi.dsi.fastutil.test"); java.io.OutputStream os = new java.io.FileOutputStream(ff); java.io.ObjectOutputStream oos = new java.io.ObjectOutputStream(os); oos.writeObject(m); oos.close(); java.io.InputStream is = new java.io.FileInputStream(ff); java.io.ObjectInputStream ois = new java.io.ObjectInputStream(is); m = (IntOpenHashSet) ois.readObject(); ois.close(); ff.delete(); assertEquals("Error: hashCode() changed after save/read", h, m.hashCode()); printProbes(m); checkTable(m); /* Now we check that m actually holds that data, but iterating on m. */ for (java.util.Iterator i = m.iterator(); i.hasNext(); ) { Object e = i.next(); assertFalse("Error: m and t differ on a key (" + e + ") after save/read", !t.contains(e)); } /* Now we put and remove random data in m and t, checking that the result is the same. */ for (int i = 0; i < 20 * n; i++) { int T = genKey(); assertFalse( "Error: divergence in add() between t and m after save/read", m.add((Integer.valueOf(T))) != t.add((Integer.valueOf(T)))); T = genKey(); assertFalse( "Error: divergence in remove() between t and m after save/read", m.remove((Integer.valueOf(T))) != t.remove((Integer.valueOf(T)))); } assertTrue("Error: !m.equals(t) after post-save/read removal", m.equals(t)); assertTrue("Error: !t.equals(m) after post-save/read removal", t.equals(m)); /* Now we take out of m everything, and check that it is empty. */ for (java.util.Iterator i = m.iterator(); i.hasNext(); ) { i.next(); i.remove(); } assertFalse("Error: m is not empty (as it should be)", !m.isEmpty()); m = new IntOpenHashSet(n, f); t.clear(); /* Now we torture-test the hash table. This part is implemented only for integers and longs. */ for (int i = n; i-- != 0; ) m.add(i); t.addAll(m); printProbes(m); checkTable(m); for (int i = n; i-- != 0; ) assertEquals( "Error: m and t differ on a key during torture-test insertion.", m.add(i), t.add((Integer.valueOf(i)))); assertTrue("Error: !m.equals(t) after torture-test insertion", m.equals(t)); assertTrue("Error: !t.equals(m) after torture-test insertion", t.equals(m)); for (int i = n; i-- != 0; ) assertEquals( "Error: m and t differ on a key during torture-test insertion.", m.remove(i), t.remove((Integer.valueOf(i)))); assertTrue("Error: !m.equals(t) after torture-test removal", m.equals(t)); assertTrue("Error: !t.equals(m) after torture-test removal", t.equals(m)); assertTrue("Error: !m.equals(m.clone()) after torture-test removal", m.equals(m.clone())); assertTrue("Error: !m.clone().equals(m) after torture-test removal", m.clone().equals(m)); return; }