@Test
  public void testProcessEvent() {
    new Expectations() {
      {
        for (int i = 0; i < parallelism; i++) {
          processor.newProcessor(processor);
          result = processor;

          processor.onCreate(anyInt);
        }
      }
    };
    pi.setupInstances();

    instance = pi.getProcessingItemInstances().get(counter);
    new NonStrictExpectations() {
      {
        ThreadsEngine.getThreadWithIndex(anyInt);
        result = threadPool;
      }
    };
    new Expectations() {
      {
        task = new ThreadsEventRunnable(instance, event);
        threadPool.submit(task);
      }
    };
    pi.processEvent(event, counter);
  }
  @Test
  public void testSetupInstances() {
    new Expectations() {
      {
        for (int i = 0; i < parallelism; i++) {
          processor.newProcessor(processor);
          result = processor;

          processor.onCreate(anyInt);
        }
      }
    };
    pi.setupInstances();
    List<ThreadsProcessingItemInstance> instances = pi.getProcessingItemInstances();
    assertNotNull("List of PI instances is null.", instances);
    assertEquals(
        "Number of instances does not match parallelism.", parallelism, instances.size(), 0);
    for (int i = 0; i < instances.size(); i++) {
      assertNotNull("Instance " + i + " is null.", instances.get(i));
      assertEquals(
          "Instance " + i + " is not a ThreadsWorkerProcessingItem.",
          ThreadsProcessingItemInstance.class,
          instances.get(i).getClass());
    }
  }
 @Test
 public void testConnectInputKeyStream() {
   new Expectations() {
     {
       destination = new StreamDestination(pi, parallelism, PartitioningScheme.GROUP_BY_KEY);
       stream.addDestination(destination);
     }
   };
   pi.connectInputKeyStream(stream);
 }
 @Test
 public void testConnectInputShuffleStream() {
   new Expectations() {
     {
       destination = new StreamDestination(pi, parallelism, PartitioningScheme.SHUFFLE);
       stream.addDestination(destination);
     }
   };
   pi.connectInputShuffleStream(stream);
 }
 @Test
 public void testConnectInputAllStream() {
   new Expectations() {
     {
       destination = new StreamDestination(pi, parallelism, PartitioningScheme.BROADCAST);
       stream.addDestination(destination);
     }
   };
   pi.connectInputAllStream(stream);
 }
 @Test
 public void testConstructor() {
   assertSame("Processor was not set correctly.", processor, pi.getProcessor());
   assertEquals("Parallelism was not set correctly.", parallelism, pi.getParallelism(), 0);
 }
 @Test(expected = IllegalStateException.class)
 public void testProcessEventError() {
   pi.processEvent(event, counter);
 }