package com.wealthfront.magellan; import android.app.Activity; import android.app.Dialog; import android.content.Context; import android.os.Bundle; import android.os.Parcelable; import android.util.SparseArray; import android.view.View; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; import org.mockito.Captor; import org.mockito.Mock; import org.mockito.invocation.InvocationOnMock; import org.mockito.stubbing.Answer; import org.robolectric.RobolectricTestRunner; import org.robolectric.annotation.Config; import static com.google.common.truth.Truth.assertThat; import static org.mockito.Matchers.isA; import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.MockitoAnnotations.initMocks; @Config(manifest = Config.NONE) @RunWith(RobolectricTestRunner.class) public class ScreenTest { @Mock BaseScreenView<DummyScreen> view; @Mock Dialog dialog; @Captor ArgumentCaptor<SparseArray<Parcelable>> sparseArrayCaptor; private DummyScreen screen; @Before public void setUp() { initMocks(this); screen = new DummyScreen(view); } @Test public void recreateView() { View v = screen.recreateView(null, null); assertThat(screen.getView()).isEqualTo(v); assertThat(view).isEqualTo(v); assertThat(view.getScreen()).isEqualTo(screen); } @Test public void destroyView() { screen.recreateView(null, null); screen.destroyView(); verify(view).saveHierarchyState(isA(SparseArray.class)); } @Test public void createDialog() { screen.showDialog(new DialogCreator() { @Override public Dialog createDialog(Activity activity) { return dialog; } }); screen.createDialog(); verify(dialog, times(2)).show(); } @Test public void destroyDialog() { screen.showDialog(new DialogCreator() { @Override public Dialog createDialog(Activity activity) { return dialog; } }); screen.destroyDialog(); verify(dialog).setOnDismissListener(null); verify(dialog).dismiss(); } @Test public void saveRestore() { final Bundle state42 = new Bundle(); state42.putString("key", "value"); doAnswer(new Answer() { @Override public Object answer(InvocationOnMock invocation) throws Throwable { sparseArrayCaptor.getValue().put(42, state42); return null; } }).when(view).saveHierarchyState(sparseArrayCaptor.capture()); screen.recreateView(null, null); Bundle bundle = new Bundle(); screen.save(bundle); screen.restore(bundle); screen.recreateView(null, null); verify(view).saveHierarchyState(isA(SparseArray.class)); verify(view).restoreHierarchyState(sparseArrayCaptor.capture()); assertThat(((Bundle) sparseArrayCaptor.getValue().get(42)).getString("key")).isEqualTo("value"); } private static class DummyScreen extends Screen<BaseScreenView<DummyScreen>> { private BaseScreenView<DummyScreen> view; DummyScreen(BaseScreenView<DummyScreen> view) { this.view = view; } @Override protected BaseScreenView<DummyScreen> createView(Context context) { return view; } } }