package org.jctools.sets; import org.junit.After; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; import java.util.*; import static org.junit.Assert.*; @RunWith(Parameterized.class) public class HashSetTest { static class Key { @Override public String toString() { return "Key [hash=" + hash + "]"; } final int hash; Key(int i) { hash = i; } public int hashCode() { return hash; } public boolean equals(Object obj) { return this == obj; } } @Parameterized.Parameters public static Collection sets() { return Arrays.asList(a(new OpenHashSet<Key>(128)), a(new SingleWriterHashSet<Key>(128)), a(new IdentityOpenHashSet<Key>(128))); } private static Object[] a(Set<Key> set) { return new Object[] { set }; } final Set<Key> set; public HashSetTest(Set<Key> set) { super(); this.set = set; } @After public void clear() { Iterator it = set.iterator(); int i = set.size(); while (it.hasNext() && i-- > 0) { it.next(); it.remove(); } assertEquals(set.toString(),0, set.size()); } @Test public void testAddRemove() { Key e = new Key(1024); Key j = new Key(2048); assertTrue(set.add(e)); assertTrue(set.contains(e)); assertFalse(set.contains(j)); assertFalse(set.add(e)); assertTrue(set.remove(e)); assertFalse(set.contains(e)); assertFalse(set.remove(e)); } @Test public void testIterator() { int sum = 0; for (int i = 0; i < 1024; i += 63) { assertTrue(set.add(new Key(i))); sum += i; } Iterator<Key> iter = set.iterator(); while (iter.hasNext()) { sum -= iter.next().hashCode(); iter.remove(); } assertEquals(0, set.size()); assertEquals(0, sum); } @Test public void testRandom() { Random r = new Random(); final long seed = r.nextLong(); r.setSeed(seed); Key[] keys = new Key[1024]; for (int i = 0; i < keys.length; i++) { final int hash = r.nextInt(keys.length); keys[i] = new Key(hash); } HashSet<Key> setRef = new HashSet<>(); long until = System.currentTimeMillis() + 1000; while (System.currentTimeMillis() < until) { Key e = keys[r.nextInt(keys.length)]; assertEquals(setRef.add(e), set.add(e)); e = keys[r.nextInt(keys.length)]; assertEquals(setRef.remove(e), set.remove(e)); } assertEquals(setRef.size(), set.size()); assertTrue(setRef.containsAll(set)); assertTrue(set.containsAll(setRef)); } }