/*
* Copyright 2017 Hannes Dorfmann.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
package com.hannesdorfmann.mosby3.mvp;
import com.hannesdorfmann.mosby3.mvp.test.data.TestData;
import com.hannesdorfmann.mosby3.mvp.test.presenter.ParameterlessConstructorMvpPresenter;
import com.hannesdorfmann.mosby3.mvp.test.presenter.SubMvpPresenter;
import com.hannesdorfmann.mosby3.mvp.test.presenter.SubParameterlessConstructorMvpPresenter;
import com.hannesdorfmann.mosby3.mvp.test.presenter.UselessGenericParamsMvpPresenter;
import com.hannesdorfmann.mosby3.mvp.test.view.SubMvpView;
import com.hannesdorfmann.mosby3.mvp.test.view.TestMvpView;
import com.hannesdorfmann.mosby3.mvp.test.view.TestMvpViewWithMultipleInterfaces;
import org.junit.Assert;
import org.junit.Test;
/**
* @author Hannes Dorfmann
*/
public class MvpNullObjectBasePresenterTest {
@Test public void throwsExceptionWhenInteractingWithPresenterButNoViewHasEverAttached() {
MvpNullObjectBasePresenter<MvpView> presenter = new MvpNullObjectBasePresenter<MvpView>() {
};
try {
presenter.getView();
Assert.fail("Exception should be thrown");
} catch (IllegalStateException e) {
// Expected exception
}
}
@Test @SuppressWarnings("unchecked") public void uselessGenericsParamsPresenter() {
TestMvpView view = newTestView();
UselessGenericParamsMvpPresenter presenter = new UselessGenericParamsMvpPresenter<>();
testPickingCorrectViewInterface(presenter);
testAttachDetachView(presenter, view);
presenter.attachView(view);
presenter.viewShowThat();
presenter.detachView(false);
presenter.viewShowThat();
}
@Test public void constructorGenericParameterless() {
ParameterlessConstructorMvpPresenter<TestData> presenter =
new ParameterlessConstructorMvpPresenter<>();
TestMvpView view = newTestView();
testPickingCorrectViewInterface(presenter);
testAttachDetachView(presenter, view);
presenter.attachView(view);
presenter.viewShowThat();
presenter.detachView(false);
presenter.viewShowThat();
}
@Test public void constructorDirectlyBaseClass() {
MvpNullObjectBasePresenter<TestMvpView> presenter =
new MvpNullObjectBasePresenter<TestMvpView>() {
};
TestMvpView view = newTestView();
testPickingCorrectViewInterface(presenter);
testAttachDetachView(presenter, view);
}
@Test public void constructorSubClass() {
SubParameterlessConstructorMvpPresenter presenter =
new SubParameterlessConstructorMvpPresenter();
TestMvpView view = newTestView();
testPickingCorrectViewInterface(presenter);
testAttachDetachView(presenter, view);
presenter.attachView(view);
presenter.viewShowThat();
presenter.detachView(false);
presenter.viewShowThat();
}
@Test public void subviewInterface() {
SubMvpPresenter presenter = new SubMvpPresenter();
SubMvpView view = newSubTestView();
testAttachDetachView(presenter, view);
presenter.attachView(view);
presenter.invokeShowThat();
presenter.detachView(false);
presenter.invokeShowThat();
}
private <V extends MvpView> void testAttachDetachView(
final MvpNullObjectBasePresenter<V> presenter, final V view) {
testAttachView(presenter, view);
testDetachNonRetain(presenter, view);
testAttachView(presenter, view);
testDetachRetain(presenter, view);
}
private <V extends MvpView> void testAttachView(final MvpNullObjectBasePresenter<V> presenter,
final V view) {
presenter.attachView(view);
Assert.assertNotNull(presenter.getView());
Assert.assertTrue(presenter.getView() == view);
}
private <V extends MvpView> void testDetachNonRetain(
final MvpNullObjectBasePresenter<V> presenter, final V view) {
presenter.detachView(false);
Assert.assertNotNull(presenter.getView());
Assert.assertTrue(presenter.getView() != view); // Null Object view;
}
private <V extends MvpView> void testDetachRetain(final MvpNullObjectBasePresenter<V> presenter,
final V view) {
presenter.detachView(true);
Assert.assertNotNull(presenter.getView());
Assert.assertTrue(presenter.getView() != view); // Null Object view;
}
private void testPickingCorrectViewInterface(
final MvpNullObjectBasePresenter<TestMvpView> presenter) {
TestMvpViewWithMultipleInterfaces view = new TestMvpViewWithMultipleInterfaces();
presenter.attachView(view);
Assert.assertNotNull(presenter.getView());
Assert.assertTrue(view == presenter.getView());
presenter.detachView(false);
Assert.assertNotNull(presenter.getView());
Assert.assertFalse(presenter.getView() == view);
// Invoke methods on null object
presenter.getView().showFoo(new TestData());
presenter.getView().showThat();
}
private TestMvpView newTestView() {
return new TestMvpView() {
@Override public void showFoo(TestData data) {
}
@Override public void showThat() {
}
};
}
private SubMvpView newSubTestView() {
return new SubMvpView() {
@Override public void showFoo(TestData data) {
}
@Override public void showThat() {
}
};
}
}