Notes on Java Queues

See also Java Queues.

WorkQueue.java:
package com.etretatlogiciels.queue;

/**
 * This is a queue element of work.
 */
public class WorkQueue
{
  int workToDo;

  public WorkQueue() { }
  public WorkQueue( int work ) { this.workToDo = work; }
  public int getWorkToDo() { return workToDo; }
  public void setWorkToDo( int work ) { workToDo = work; }
}
WorkQueueElementNotFoundException.java:
package com.etretatlogiciels.queue;

public class WorkQueueElementNotFoundException extends Exception
{
  private String message;

  public WorkQueueElementNotFoundException( String message )
  {
    this.message = message;
  }

  @Override
  public String getMessage() { return this.message; }
}
WorkQueueTest.java:
package com.etretatlogiciels.queue;

import java.util.List;
import java.util.NoSuchElementException;
import java.util.Queue;
import java.util.ArrayList;
import java.util.concurrent.ConcurrentLinkedQueue;

import static org.junit.Assert.fail;
import static org.junit.Assert.assertTrue;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;

public class WorkQueueTest
{
  private static final boolean  PRINT = true;
  private static int            RESERVE = 10;

  private static final List< Integer > workList = new ArrayList< Integer >( RESERVE );
  static
  {
    for( int i = 0; i < RESERVE; i++ )
      workList.add( i );
  }

  private Queue< WorkQueue > queue = null;

  @Before
  public void setUp() throws Exception
  {
//    queue = new LinkedList< WorkQueue >();          // not thread-safe
//    queue = new LinkedBlockingQueue< WorkQueue >(); // thread-safe, blocks waiting for the queue not to be empty
    queue = new ConcurrentLinkedQueue< WorkQueue >(); // like LinkedList, but thread safe

    /* Simulate creating RESERVE number of elements ahead.
     */
    for( int element = 0; element < RESERVE; element++ )
      queue.add( new WorkQueue( element ) );
  }

  @Test
  public void test()
  {
    fail( "Not yet implemented" );
  }

  @Test
  public void testCreateAhead()
  {
    assertTrue( queue.size() == 10 );

    for( WorkQueue q : queue )
      assertTrue( workList.contains( q.getWorkToDo() ) );
  }

  @Test( expected = WorkQueueElementNotFoundException.class )
  public void testRunOutOfElements() throws WorkQueueElementNotFoundException
  {
    int expected = 0;

    while( true )
    {
      try
      {
        int work = removeElement( expected );
        expected = work + 1;
      }
      catch( WorkQueueElementNotFoundException e )
      {
        System.out.println( e.getMessage() );
        System.out.println( "Crash, bang, boom! Ran out of elements in queue!" );
        break;
      }
    }
  }

  private int removeElement( int expected ) throws WorkQueueElementNotFoundException
  {
    try
    {
      int work;

      WorkQueue q = queue.remove();
      printOrNot( work = q.getWorkToDo() );
      return work;
    }
    catch( NoSuchElementException e )
    {
      throw new WorkQueueElementNotFoundException( String.format( "Expecting element %d...", expected ) );
    }
  }

  private static void printOrNot( Object o )
  {
    if( !PRINT )
      return;
    if( o instanceof String )
      System.out.println( o );
    else
      System.out.println( "" + o );
  }
}