package org.jctools.maps.nbhs_test; import static org.hamcrest.CoreMatchers.anyOf; import static org.hamcrest.CoreMatchers.is; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.util.Iterator; import org.jctools.maps.NonBlockingHashSet; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; /* * Written by Cliff Click and released to the public domain, as explained at * http://creativecommons.org/licenses/publicdomain */ // Test NonBlockingHashSet via JUnit public class nbhs_tester { static private NonBlockingHashSet<String> _nbhs; @BeforeClass public static void setUp () { _nbhs = new NonBlockingHashSet<String>(); } @AfterClass public static void tearDown() { _nbhs = null; } // Test some basic stuff; add a few keys, remove a few keys @Test public void testBasic() { assertTrue ( _nbhs.isEmpty() ); assertTrue ( _nbhs.add("k1") ); checkSizes (1); assertTrue ( _nbhs.add("k2") ); checkSizes (2); assertFalse( _nbhs.add("k1") ); assertFalse( _nbhs.add("k2") ); checkSizes (2); assertThat ( _nbhs.remove("k1"), is(true ) ); checkSizes (1); assertThat ( _nbhs.remove("k1"), is(false) ); assertTrue ( _nbhs.remove("k2") ); checkSizes (0); assertFalse( _nbhs.remove("k2") ); assertFalse( _nbhs.remove("k3") ); assertTrue ( _nbhs.isEmpty() ); } // Check all iterators for correct size counts private void checkSizes(int expectedSize) { assertEquals( "size()", _nbhs.size(), expectedSize ); Iterator it = _nbhs.iterator(); int result = 0; while (it.hasNext()) { result++; it.next(); } assertEquals( "iterator missed", expectedSize, result ); } @Test public void testIteration() { assertTrue ( _nbhs.isEmpty() ); assertTrue ( _nbhs.add("k1") ); assertTrue ( _nbhs.add("k2") ); StringBuilder buf = new StringBuilder(); for( String val : _nbhs ) buf.append(val); assertThat("found all vals",buf.toString(),anyOf(is("k1k2"),is("k2k1"))); assertThat("toString works",_nbhs.toString(), anyOf(is("[k1, k2]"),is("[k2, k1]"))); _nbhs.clear(); } @Test public void testIterationBig() { for( int i=0; i<100; i++ ) _nbhs.add("a"+i); assertThat( _nbhs.size(), is(100) ); int sz =0; int sum = 0; for( String s : _nbhs ) { sz++; assertThat("",s.charAt(0),is('a')); int x = Integer.parseInt(s.substring(1)); sum += x; assertTrue(x>=0 && x<=99); } assertThat("Found 100 ints",sz,is(100)); assertThat("Found all integers in list",sum,is(100*99/2)); assertThat( "can remove 3", _nbhs.remove("a3"), is(true) ); assertThat( "can remove 4", _nbhs.remove("a4"), is(true) ); sz =0; sum = 0; for( String s : _nbhs ) { sz++; assertThat("",s.charAt(0),is('a')); int x = Integer.parseInt(s.substring(1)); sum += x; assertTrue(x>=0 && x<=99); } assertThat("Found 98 ints",sz,is(98)); assertThat("Found all integers in list",sum,is(100*99/2 - (3+4))); _nbhs.clear(); } @Test public void testSerial() { assertTrue ( _nbhs.isEmpty() ); assertTrue ( _nbhs.add("k1") ); assertTrue ( _nbhs.add("k2") ); // Serialize it out try { FileOutputStream fos = new FileOutputStream("NBHS_test.txt"); ObjectOutputStream out = new ObjectOutputStream(fos); out.writeObject(_nbhs); out.close(); } catch(IOException ex) { ex.printStackTrace(); } // Read it back try { File f = new File("NBHS_test.txt"); FileInputStream fis = new FileInputStream(f); ObjectInputStream in = new ObjectInputStream(fis); NonBlockingHashSet nbhs = (NonBlockingHashSet)in.readObject(); in.close(); assertEquals(_nbhs.toString(),nbhs.toString()); if( !f.delete() ) throw new IOException("delete failed"); } catch(IOException ex) { ex.printStackTrace(); } catch(ClassNotFoundException ex) { ex.printStackTrace(); } } }