@Test(timeout = 1000)
  public void testUnsubscriptionCase() {
    BehaviorRelay<String> src = BehaviorRelay.create((String) null);

    for (int i = 0; i < 10; i++) {
      @SuppressWarnings("unchecked")
      final Observer<Object> o = mock(Observer.class);
      InOrder inOrder = inOrder(o);
      String v = "" + i;
      src.call(v);
      System.out.printf("Turn: %d%n", i);
      src.first()
          .flatMap(
              new Func1<String, Observable<String>>() {

                @Override
                public Observable<String> call(String t1) {
                  return Observable.just(t1 + ", " + t1);
                }
              })
          .subscribe(o);

      inOrder.verify(o).onNext(v + ", " + v);
      inOrder.verify(o).onCompleted();
      verify(o, never()).onError(any(Throwable.class));
    }
  }
  @Test
  public void testBehaviorRelayValueRelayIncomplete() {
    BehaviorRelay<Integer> async = BehaviorRelay.create();
    async.call(1);

    assertFalse(async.hasObservers());
    assertEquals((Integer) 1, async.getValue());
    assertTrue(async.hasValue());
    assertArrayEquals(new Object[] {1}, async.getValues());
    assertArrayEquals(new Integer[] {1}, async.getValues(new Integer[0]));
    assertArrayEquals(new Integer[] {1}, async.getValues(new Integer[] {0}));
    assertArrayEquals(new Integer[] {1, null}, async.getValues(new Integer[] {0, 0}));
  }
  @Test
  public void testTakeOneSubscriber() {
    BehaviorRelay<Integer> source = BehaviorRelay.create(1);
    @SuppressWarnings("unchecked")
    final Observer<Object> o = mock(Observer.class);

    source.take(1).subscribe(o);

    verify(o).onNext(1);
    verify(o).onCompleted();
    verifyNoMoreInteractions(o);

    assertEquals(0, source.subscriberCount());
    assertFalse(source.hasObservers());
  }
  @Test
  public void testBehaviorRelayIncompleteEmpty() {
    BehaviorRelay<Integer> async = BehaviorRelay.create();

    assertFalse(async.hasObservers());
    assertNull(async.getValue());
    assertFalse(async.hasValue());
    assertArrayEquals(new Object[] {}, async.getValues());
    assertArrayEquals(new Integer[] {}, async.getValues(new Integer[0]));
    assertArrayEquals(new Integer[] {null}, async.getValues(new Integer[] {0}));
    assertArrayEquals(new Integer[] {null, 0}, async.getValues(new Integer[] {0, 0}));
  }
  @Test
  public void testThatObserverReceivesDefaultValueAndSubsequentEvents() {
    BehaviorRelay<String> relay = BehaviorRelay.create("default");

    @SuppressWarnings("unchecked")
    Observer<String> observer = mock(Observer.class);
    relay.subscribe(observer);

    relay.call("one");
    relay.call("two");
    relay.call("three");

    verify(observer, times(1)).onNext("default");
    verify(observer, times(1)).onNext("one");
    verify(observer, times(1)).onNext("two");
    verify(observer, times(1)).onNext("three");
    verifyNoMoreInteractions(observer);
  }
  @Test
  public void testStartEmpty() {
    BehaviorRelay<Integer> source = BehaviorRelay.create();
    @SuppressWarnings("unchecked")
    final Observer<Object> o = mock(Observer.class);
    InOrder inOrder = inOrder(o);

    source.subscribe(o);

    inOrder.verify(o, never()).onNext(any());
    inOrder.verify(o, never()).onCompleted();

    source.call(1);

    verify(o, never()).onError(any(Throwable.class));
    verify(o, never()).onCompleted();

    inOrder.verify(o).onNext(1);
    inOrder.verifyNoMoreInteractions();
  }