package com.rapidftr.controllers.internal; import com.rapidftr.screens.internal.CustomScreen; import com.rapidftr.screens.internal.UiStack; import org.junit.Before; import org.junit.Test; import static org.mockito.Mockito.*; public class ControllerTest { private CustomScreen screen; private UiStack uiStack; private Controller controller; private Dispatcher dispatcher; @Before public void setup() { screen = mock(CustomScreen.class); uiStack = mock(UiStack.class); dispatcher = mock(Dispatcher.class); controller = new TestController(screen, uiStack, dispatcher); } @Test public void shouldPushCurrentScreenToUiStackWhenItIsInactive() { when(screen.isActive()).thenReturn(false); controller.show(); verify(uiStack).pushScreen(screen); } @Test public void shouldSetupCurrentScreenWhenItIsAlreadyActive() { when(screen.isActive()).thenReturn(true); controller.show(); verifyZeroInteractions(uiStack); verify(screen).setUp(); } @Test public void shouldPopCurrentScreenFromUiStack() { controller.popScreen(); verify(screen).popScreen(uiStack); } @Test public void shouldClearUiStackAndShowHomeScreen() { controller.homeScreen(); verify(uiStack).clear(); verify(dispatcher).homeScreen(); } @Test public void shouldInvokeNewChildOnCreateNewChildRecord() { controller.createNewChildRecord(); verify(dispatcher).newChild(); } private class TestController extends Controller { public TestController(CustomScreen screen, UiStack uiStack, Dispatcher dispatcher) { super(screen, uiStack, dispatcher); } } }