/*******************************************************************************
* Copyright (c) 2012, 2012 Andrew Gvozdev and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Andrew Gvozdev - initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.utils;
import junit.framework.Test;
import junit.framework.TestCase;
import junit.framework.TestSuite;
import org.eclipse.cdt.internal.core.WeakHashSet;
import org.eclipse.cdt.internal.core.WeakHashSetSynchronized;
/**
* Test suite to test {@link WeakHashSet}.
*/
public class WeakHashSetTest extends TestCase {
/**
* Sample mock class with specialized hashCode()
*/
private class MockClass {
private String str;
private MockClass(String str) {
super();
this.str = str;
}
@Override
public int hashCode() {
// for test purpose make hashcodes equal for all "str" stating with the same letter
// note that "equals()" still reports difference
String s = str.substring(0,1);
return s.hashCode();
}
@Override
public boolean equals(Object obj) {
MockClass other = (MockClass) obj;
return str.equals(other.str);
}
}
public static Test suite() {
return new TestSuite(WeakHashSetTest.class);
}
/**
* Test basic methods of {@link WeakHashSet}.
*/
public void testHashSetBasic() {
// create sample objects
WeakHashSet<MockClass> weakSet = new WeakHashSet<MockClass>();
MockClass a1 = new MockClass("a");
MockClass a2 = new MockClass("a");
// check contains()
assertEquals(false, weakSet.contains(a1));
assertEquals(null, weakSet.get(a1));
// check add() and get()
assertSame(a1, weakSet.add(a1));
assertSame(a1, weakSet.add(a2));
assertSame(a1, weakSet.get(a1));
assertSame(a1, weakSet.get(a2));
assertEquals(true, weakSet.contains(a1));
assertEquals(true, weakSet.contains(a2));
// check remove()
MockClass aOld = weakSet.remove(a2);
assertSame(a1, aOld);
assertEquals(null, weakSet.get(a1));
assertSame(a2, weakSet.add(a2));
assertSame(a2, weakSet.add(a1));
// create sample objects with the same hashcode
MockClass aa = new MockClass("aa");
MockClass ab = new MockClass("ab");
assertEquals(aa.hashCode(), ab.hashCode());
assertEquals(false, aa.equals(ab));
// check add() and get()
assertEquals(false, weakSet.contains(aa));
assertEquals(false, weakSet.contains(ab));
assertEquals(null, weakSet.get(aa));
assertEquals(null, weakSet.get(ab));
assertSame(aa, weakSet.add(aa));
assertSame(ab, weakSet.add(ab));
assertEquals(true, weakSet.contains(aa));
assertEquals(true, weakSet.contains(ab));
assertSame(aa, weakSet.get(aa));
assertSame(ab, weakSet.get(ab));
}
/**
* Test synchronized {@link WeakHashSetSynchronized}.
* Note that regular {@link WeakHashSet} would fail the test.
*/
public void testHashSetSyncronization() throws Exception {
final WeakHashSet<Integer> weakSet = new WeakHashSetSynchronized<Integer>(1);
Thread[] threads= new Thread[5000];
for (int i = 0; i < threads.length; i++) {
final Integer n = i;
Thread t= new Thread() {
@Override
public void run() {
weakSet.add(n);
}
};
threads[i] = t;
t.start();
}
for (int i = 0; i < threads.length; i++) {
threads[i].join();
}
assertEquals(threads.length, weakSet.size());
for (int i = 0; i < threads.length; i++) {
assertEquals(true, weakSet.contains(i));
}
}
}