package com.artemzin.qualitymatters.ui.presenters;

import android.support.annotation.NonNull;

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

import rx.Subscription;

import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.failBecauseExceptionWasNotThrown;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;

public class PresenterTest {

    @NonNull
    private Presenter<Object> presenter;

    @NonNull
    private Object view;

    @Before
    public void beforeEachTest() {
        view = new Object();
        presenter = new Presenter<>();
    }

    @Test
    public void bindView_shouldAttachViewToThePresenter() {
        presenter.bindView(view);
        assertThat(presenter.view()).isSameAs(view);
    }

    @Test
    public void bindView_shouldThrowIfPreviousViewIsNotUnbounded() {
        presenter.bindView(view);

        try {
            presenter.bindView(new Object());
            failBecauseExceptionWasNotThrown(IllegalStateException.class);
        } catch (IllegalStateException expected) {
            assertThat(expected).hasMessage("Previous view is not unbounded! previousView = " + view);
        }
    }

    @Test
    public void view_shouldReturnNullByDefault() {
        assertThat(presenter.view()).isNull();
    }

    @Test
    public void unsubscribeOnUnbindView_shouldWorkAccordingItsContract() {
        presenter.bindView(view);

        Subscription subscription1 = mock(Subscription.class);
        Subscription subscription2 = mock(Subscription.class);
        Subscription subscription3 = mock(Subscription.class);

        presenter.unsubscribeOnUnbindView(subscription1, subscription2, subscription3);
        verify(subscription1, never()).unsubscribe();
        verify(subscription2, never()).unsubscribe();
        verify(subscription3, never()).unsubscribe();

        presenter.unbindView(view);
        verify(subscription1).unsubscribe();
        verify(subscription2).unsubscribe();
        verify(subscription3).unsubscribe();
    }

    @Test
    public void unbindView_shouldNullTheViewReference() {
        presenter.bindView(view);
        assertThat(presenter.view()).isSameAs(view);

        presenter.unbindView(view);
        assertThat(presenter.view()).isNull();
    }

    @Test
    public void unbindView_shouldThrowIfPreviousViewIsNotSameAsExpected() {
        presenter.bindView(view);
        Object unexpectedView = new Object();

        try {
            presenter.unbindView(unexpectedView);
            failBecauseExceptionWasNotThrown(IllegalStateException.class);
        } catch (IllegalStateException expected) {
            assertThat(expected).hasMessage("Unexpected view! previousView = " + view + ", view to unbind = " + unexpectedView);
        }
    }
}
@@ -464,57 +464,195 @@
    @
-NonNull%0A    private Presenter%3CObject%3E presenter;%0A
+SuppressWarnings(%22NullableProblems%22) // Initialized in @Before.%0A    @NonNull%0A    private Presenter%3CObject%3E presenter;%0A%0A    @SuppressWarnings(%22NullableProblems%22) // Initialized in @Before.
 %0A   

Fix TestWarnings in PresenterTest