@Test
  public void testMaterialize2() {
    final TestAsyncErrorObservable o1 = new TestAsyncErrorObservable("one", "two", "three");

    TestObserver NbpObserver = new TestObserver();
    NbpObservable<Try<Optional<String>>> m = NbpObservable.create(o1).materialize();
    m.subscribe(NbpObserver);

    try {
      o1.t.join();
    } catch (InterruptedException e) {
      throw new RuntimeException(e);
    }

    assertFalse(NbpObserver.onError);
    assertTrue(NbpObserver.onCompleted);
    assertEquals(4, NbpObserver.notifications.size());
    assertEquals("one", Notification.getValue(NbpObserver.notifications.get(0)));
    assertTrue(Notification.isNext(NbpObserver.notifications.get(0)));
    assertEquals("two", Notification.getValue(NbpObserver.notifications.get(1)));
    assertTrue(Notification.isNext(NbpObserver.notifications.get(1)));
    assertEquals("three", Notification.getValue(NbpObserver.notifications.get(2)));
    assertTrue(Notification.isNext(NbpObserver.notifications.get(2)));
    assertTrue(Notification.isComplete(NbpObserver.notifications.get(3)));
  }
  @Test
  public void testMaterialize1() {
    // null will cause onError to be triggered before "three" can be
    // returned
    final TestAsyncErrorObservable o1 = new TestAsyncErrorObservable("one", "two", null, "three");

    TestObserver NbpObserver = new TestObserver();
    NbpObservable<Try<Optional<String>>> m = NbpObservable.create(o1).materialize();
    m.subscribe(NbpObserver);

    try {
      o1.t.join();
    } catch (InterruptedException e) {
      throw new RuntimeException(e);
    }

    assertFalse(NbpObserver.onError);
    assertTrue(NbpObserver.onCompleted);
    assertEquals(3, NbpObserver.notifications.size());
    assertEquals("one", NbpObserver.notifications.get(0).value().get());
    assertTrue(Notification.isNext(NbpObserver.notifications.get(0)));
    assertEquals("two", Notification.getValue(NbpObserver.notifications.get(1)));
    assertTrue(Notification.isNext(NbpObserver.notifications.get(1)));
    assertEquals(NullPointerException.class, NbpObserver.notifications.get(2).error().getClass());
    assertTrue(Notification.isError(NbpObserver.notifications.get(2)));
  }
  @Test
  public void testMultipleSubscribes() throws InterruptedException, ExecutionException {
    final TestAsyncErrorObservable o = new TestAsyncErrorObservable("one", "two", null, "three");

    NbpObservable<Try<Optional<String>>> m = NbpObservable.create(o).materialize();

    assertEquals(3, m.toList().toBlocking().toFuture().get().size());
    assertEquals(3, m.toList().toBlocking().toFuture().get().size());
  }
 @Test
 public void testWithCompletionCausingError() {
   NbpTestSubscriber<Try<Optional<Integer>>> ts = new NbpTestSubscriber<>();
   final RuntimeException ex = new RuntimeException("boo");
   NbpObservable.<Integer>empty()
       .materialize()
       .doOnNext(
           new Consumer<Object>() {
             @Override
             public void accept(Object t) {
               throw ex;
             }
           })
       .subscribe(ts);
   ts.assertError(ex);
   ts.assertNoValues();
   ts.assertTerminated();
 }