// Copyright (c) 2001 Dustin Sallings <dustin@spy.net> package net.spy.util; import java.util.Iterator; import java.util.NoSuchElementException; import java.util.Set; import junit.framework.TestCase; /** * Test the reference hash set implementations. */ public class ReferenceSetsTest extends TestCase { /** * Get an instance of ReferenceSetsTest. */ public ReferenceSetsTest(String name) { super(name); } /** * Test the basic functionality of the weak hash set. * -- this test is disabled, as it doesn't seem to work reliably on my * -- core duo. I wouldn't necessarily expect it to. */ @SuppressWarnings("unchecked") public void xtestGCWeakHash() { Set<String> s=new java.util.HashSet<String>(); for(int i=0; i<100; i++) { s.add("Blah" + i); } WeakHashSet<String> whs=new WeakHashSet<String>(s); assertEquals("Size didn't match", whs.size(), s.size()); // Remove some items. int i=0; for(Iterator it=s.iterator(); it.hasNext();) { it.next(); if( (i++%2) == 0) { it.remove(); } } // Do a garbage collection. System.gc(); // Recompare the sizes. assertEquals("Size didn't match after removals", whs.size(), s.size()); } private void equalityTestFor(Set<String> rhs) { Set<String> s=new java.util.HashSet<String>(); for(int i=0; i<100; i++) { s.add("Blah" + i); } assertTrue(rhs.isEmpty()); rhs.addAll(s); // Add it again, since it should end up being the same rhs.addAll(s); assertFalse(rhs.isEmpty()); // Recompare the sizes. assertEquals("Size didn't match after adds", s.size(), rhs.size()); for(String ob : s) { assertTrue(rhs.contains(ob)); } for(String ob : rhs) { assertTrue(s.contains(ob)); } } private void basicTestFor(Set<String> s) { assertFalse(s.contains("a")); assertFalse(s.contains(null)); s.add("a"); assertTrue(s.contains("a")); // I'm not testing null adds yet because it's not supported by // SoftHashSet. } public void testBasicSetStuff() { basicTestFor(new WeakHashSet<String>()); basicTestFor(new SoftHashSet<String>()); } /** * Verify equality (lookup, etc...) works. */ public void testEquality() { equalityTestFor(new WeakHashSet<String>(100)); equalityTestFor(new SoftHashSet<String>(100)); } private void removalTestFor(Set<String> rhs) { Set<String> s=new java.util.HashSet<String>(); for(int i=0; i<100; i++) { s.add("Blah" + i); } assertTrue(rhs.isEmpty()); rhs.addAll(s); assertFalse(rhs.isEmpty()); assertFalse(rhs.remove("TestObject")); for(String ob : s) { assertTrue(rhs.remove(ob)); } assertTrue(rhs.isEmpty()); rhs.addAll(s); assertFalse(rhs.isEmpty()); rhs.clear(); assertTrue(rhs.isEmpty()); } /** * Test refset removal. */ public void testRemoval() { removalTestFor(new WeakHashSet<String>(100)); try { removalTestFor(new SoftHashSet<String>(100)); fail("I didn't know SoftHashSet supported iterator removal!?"); } catch(UnsupportedOperationException e) { // pass } } @SuppressWarnings("unchecked") private void runIteratorTest(Set s) { Iterator i=null; for(i=s.iterator(); i.hasNext();) { i.next(); } try { i.next(); fail("Iterator let me have more stuff than it had."); } catch(NoSuchElementException e) { // pass } } /** * Test the iterators. */ public void testIterators() { Set<String> s=new java.util.HashSet<String>(); for(int i=0; i<10; i++) { s.add("Blah" + i); } runIteratorTest(new SoftHashSet<String>(s)); runIteratorTest(new WeakHashSet<String>(s)); } /** * Constructor tests. */ public void testConstructors() { Set<String> s=new java.util.HashSet<String>(); for(int i=0; i<10; i++) { s.add("Blah" + i); } SoftHashSet<String> shs=new SoftHashSet<String>(s); WeakHashSet<String> whs=new WeakHashSet<String>(s); assertTrue(shs.containsAll(s)); assertTrue(s.containsAll(shs)); assertTrue(whs.containsAll(s)); assertTrue(s.containsAll(whs)); shs=new SoftHashSet<String>(); shs.addAll(s); whs=new WeakHashSet<String>(); whs.addAll(s); assertTrue(shs.containsAll(s)); assertTrue(s.containsAll(shs)); assertTrue(whs.containsAll(s)); assertTrue(s.containsAll(whs)); try { SoftHashSet<String> nshs=new SoftHashSet<String>(null); fail("Made a SoftHashSet from null: " + nshs); } catch(NullPointerException e) { assertEquals("Null collection provided to ReferenceSet", e.getMessage()); } try { WeakHashSet<String> nwhs=new WeakHashSet<String>(null); fail("Made a WeakHashSet from null: " + nwhs); } catch(NullPointerException e) { assertEquals("Null collection provided to WeakHashSet", e.getMessage()); } } }