package com.arellomobile.mvp.tests;
import java.lang.reflect.Field;
import android.os.Bundle;
import com.arellomobile.mvp.MvpDelegate;
import com.arellomobile.mvp.MvpPresenter;
import com.arellomobile.mvp.presenter.InjectViewStatePresenter;
import com.arellomobile.mvp.presenter.NoViewStatePresenter;
import com.arellomobile.mvp.view.DelegateLocalPresenterTestView;
import com.arellomobile.mvp.view.TestView;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.annotation.Config;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotEquals;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.mock;
/**
* Date: 09.02.2016
* Time: 12:37
*
* @author Savin Mikhail
*/
@RunWith(RobolectricTestRunner.class)
@Config(manifest = Config.NONE)
public class LocalPresenterTest {
@Mock
TestView mTestView;
DelegateLocalPresenterTestView mDelegateLocalPresenterTestView = new DelegateLocalPresenterTestView();
DelegateLocalPresenterTestView mDelegateLocalPresenter2TestView = new DelegateLocalPresenterTestView();
MvpDelegate<? extends TestView> mTestViewMvpDelegate = new MvpDelegate<>(mDelegateLocalPresenterTestView);
MvpDelegate<? extends TestView> mTestViewMvpDelegate2 = new MvpDelegate<>(mDelegateLocalPresenter2TestView);
@Before
public void setup() {
mTestView = mock(TestView.class);
mTestViewMvpDelegate.onCreate(null);
mTestViewMvpDelegate.onAttach();
mTestViewMvpDelegate2.onCreate(null);
mTestViewMvpDelegate2.onAttach();
}
@After
public void reset() {
mTestViewMvpDelegate.onDetach();
mTestViewMvpDelegate.onDestroy();
mTestViewMvpDelegate2.onDetach();
mTestViewMvpDelegate2.onDestroy();
}
@Test
public void checkWithInjectViewState() {
InjectViewStatePresenter injectViewStatePresenter = new InjectViewStatePresenter();
injectViewStatePresenter.attachView(mTestView);
try {
Field mViewState = MvpPresenter.class.getDeclaredField("mViewState");
mViewState.setAccessible(true);
assertTrue("ViewState is null for InjectViewStatePresenter", mViewState.get(injectViewStatePresenter) != null);
} catch (IllegalAccessException | NoSuchFieldException e) {
assertFalse(e.getLocalizedMessage(), true);
}
}
@Test
public void checkWithoutViewState() {
NoViewStatePresenter noViewStatePresenter = new NoViewStatePresenter();
noViewStatePresenter.attachView(mTestView);
try {
Field mViewState = MvpPresenter.class.getDeclaredField("mViewState");
mViewState.setAccessible(true);
assertTrue("ViewState is not null for NoViewStatePresenter", mViewState.get(noViewStatePresenter) == null);
} catch (IllegalAccessException | NoSuchFieldException e) {
assertFalse(e.getLocalizedMessage(), true);
}
}
@Test
public void checkDelegatePresenter() {
assertTrue("Presenter is null for delegate", mDelegateLocalPresenterTestView.mInjectViewStatePresenter != null);
}
@Test
public void checkLocalPresenters() {
assertNotEquals("Local Presenters for two different view is equal", mDelegateLocalPresenterTestView.mInjectViewStatePresenter.hashCode(), mDelegateLocalPresenter2TestView.mInjectViewStatePresenter.hashCode());
}
@Test
public void checkSaveState() {
int hashCode = mDelegateLocalPresenterTestView.mInjectViewStatePresenter.hashCode();
Bundle bundle = new Bundle();
mTestViewMvpDelegate.onSaveInstanceState(bundle);
mTestViewMvpDelegate.onDetach();
mTestViewMvpDelegate.onDestroy();
mTestViewMvpDelegate.onCreate(bundle);
mTestViewMvpDelegate.onAttach();
//TODO: should be passed! Or change test
//assertTrue("Local presenter has different hashCode after recreate", hashCode == mDelegateLocalPresenterTestView.mInjectViewStatePresenter.hashCode());
mTestViewMvpDelegate.onDetach();
mTestViewMvpDelegate.onDestroy();
mTestViewMvpDelegate.onCreate();
mTestViewMvpDelegate.onAttach();
assertFalse("Local presenter has same hashCode after creating new view", hashCode == mDelegateLocalPresenterTestView.mInjectViewStatePresenter.hashCode());
}
}