@Test
 public void shouldCloseBothStreams() {
   idAndVersionStreamVerifier.verify(
       primaryStream, secondayStream, idAndVersionStreamVerifierListener);
   verify(primaryStream).close();
   verify(secondayStream).close();
 }
 @Test
 public void shouldNotReportErrorsIfStreamsAreEqual() {
   idAndVersionStreamVerifier.verify(
       streamOf(item(1), item(2), item(3)),
       streamOf(item(1), item(2), item(3)),
       idAndVersionStreamVerifierListener);
   verifyZeroInteractions(idAndVersionStreamVerifierListener);
 }
 @Test
 public void shouldReportMissingValuesIfPrimaryStreamIsEmpty() {
   idAndVersionStreamVerifier.verify(
       streamOf(), streamOf(item(1), item(2)), idAndVersionStreamVerifierListener);
   verify(idAndVersionStreamVerifierListener)
       .onMissingInPrimaryStream(argThat(hasIdAndVersion("1", 1)));
   verify(idAndVersionStreamVerifierListener)
       .onMissingInPrimaryStream(argThat(hasIdAndVersion("2", 2)));
   verifyNoMoreInteractions(idAndVersionStreamVerifierListener);
 }
 @Test
 public void shouldReportMismatchedAtEndOfStream() {
   idAndVersionStreamVerifier.verify(
       streamOf(item(1), item(2), item("3", 55)),
       streamOf(item(1), item(2), item("3", 33)),
       idAndVersionStreamVerifierListener);
   verify(idAndVersionStreamVerifierListener)
       .onVersionMisMatch(argThat(hasIdAndVersion("3", 55)), argThat(hasIdAndVersion("3", 33)));
   verifyNoMoreInteractions(idAndVersionStreamVerifierListener);
 }
 @Test
 public void shouldReportVersionMisMatches() {
   idAndVersionStreamVerifier.verify(
       streamOf(item(1), item("2", 2), item(3), item(4)),
       streamOf(item(1), item("2", 5), item(3), item(4)),
       idAndVersionStreamVerifierListener);
   verify(idAndVersionStreamVerifierListener)
       .onVersionMisMatch(argThat(hasIdAndVersion("2", 2)), argThat(hasIdAndVersion("2", 5)));
   verifyNoMoreInteractions(idAndVersionStreamVerifierListener);
 }
 @Test
 public void shouldReportMissingItemsInTheMiddleOfThePrimaryStream() {
   idAndVersionStreamVerifier.verify(
       streamOf(item(1), item(3), item(4)),
       streamOf(item(1), item(2), item(3), item(4)),
       idAndVersionStreamVerifierListener);
   verify(idAndVersionStreamVerifierListener)
       .onMissingInPrimaryStream(argThat(hasIdAndVersion("2", 2)));
   verifyNoMoreInteractions(idAndVersionStreamVerifierListener);
 }
 @Test
 public void shouldReportMissingItemsAtTheStartOfTheSecondaryStream() {
   idAndVersionStreamVerifier.verify(
       streamOf(item(1), item(2), item(3), item(4)),
       streamOf(item(2), item(3), item(4)),
       idAndVersionStreamVerifierListener);
   verify(idAndVersionStreamVerifierListener)
       .onMissingInSecondaryStream(argThat(hasIdAndVersion("1", 1)));
   verifyNoMoreInteractions(idAndVersionStreamVerifierListener);
 }
 @Test
 public void shouldCloseSecondaryWhenPrimaryCloseThrowsException() {
   doThrow(new RuntimeException()).when(primaryStream).close();
   try {
     idAndVersionStreamVerifier.verify(
         primaryStream, secondayStream, idAndVersionStreamVerifierListener);
   } catch (RuntimeException e) {
     // Expected
   }
   verify(secondayStream).close();
 }
 @Test
 public void shouldReportMismatchIfPreceededByMissingItem() {
   idAndVersionStreamVerifier.verify(
       streamOf(item(1), item("2", 2), item(3), item(4)),
       streamOf(item(1), item("3", 42), item(4)),
       idAndVersionStreamVerifierListener);
   verify(idAndVersionStreamVerifierListener)
       .onMissingInSecondaryStream(argThat(hasIdAndVersion("2", 2)));
   verify(idAndVersionStreamVerifierListener)
       .onVersionMisMatch(argThat(hasIdAndVersion("3", 3)), argThat(hasIdAndVersion("3", 42)));
   verifyNoMoreInteractions(idAndVersionStreamVerifierListener);
 }
 @Test
 public void shouldNotReportErrorsIfStreamsAreEmpty() {
   idAndVersionStreamVerifier.verify(streamOf(), streamOf(), idAndVersionStreamVerifierListener);
   verifyZeroInteractions(idAndVersionStreamVerifierListener);
 }