package zenproject.meditation.android.ui.menu; import com.oguzdev.circularfloatingactionmenu.library.CircularMenu; import org.fest.assertions.api.Assertions; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.robolectric.annotation.Config; import zenproject.meditation.android.BuildConfig; import zenproject.meditation.android.RobolectricLauncherGradleTestRunner; import zenproject.meditation.android.ZenTestBase; import zenproject.meditation.android.ui.menu.buttons.FloatingActionButton; import zenproject.meditation.android.ui.menu.buttons.MenuButton; import zenproject.meditation.android.ui.sketch.ZenSketchView; import static org.mockito.Mockito.*; @RunWith(RobolectricLauncherGradleTestRunner.class) @Config(constants = BuildConfig.class) public class ZenMenuTest extends ZenTestBase { @Mock private ZenSketchView zenSketchView; @Mock private CircularMenu circularMenu; @Mock private FloatingActionButton menuButton; private ZenMenu zenMenu; @Before public void setUp() { MockitoAnnotations.initMocks(this); zenMenu = new ZenMenu(zenSketchView); when(zenSketchView.getCircularMenu()).thenReturn(circularMenu); when(circularMenu.getActionView()).thenReturn(menuButton); } @Test public void testThatToggleDelegatesOnCircularMenu() { zenMenu.toggle(); verify(circularMenu).toggle(true); } @Test public void testThatToggleRotatesMenuButton() { zenMenu.toggle(); verify(menuButton).rotate(); } @Test public void testThatOnPaintingStartDoesPostRunnable() { zenMenu.onPaintingStart(); verify(zenSketchView).post(any(Runnable.class)); } @Test public void testThatOnPaintingStopPostsRunnable() { zenMenu.onPaintingEnd(); verify(zenSketchView).post(any(Runnable.class)); } @Test public void testThatGetButtonViewForReturnsMenuButtonIfItIsRequested() { Assertions.assertThat(zenMenu.getButtonViewFor(MenuButton.MENU)).isEqualTo(menuButton); } @Test public void testThatGetButtonViewForFindsButtonIfRequestedIsNotMenu() { zenMenu.getButtonViewFor(MenuButton.SHARE); verify(circularMenu).findSubActionViewWithId(MenuButton.SHARE.getId()); } @Test public void testThatOnMenuOpenedHidesMenuButtonIfItIsClosedAndIsPainting() { givenThatMenuIsClosed(); zenMenu.onPaintingStart(); zenMenu.onMenuOpened(circularMenu); verify(menuButton, times(1)).hide(); } @Test public void testThatOnMenuOpenedTogglesMenuButtonIfItIsOpenedAndIsPainting() { givenThatMenuIsOpened(); zenMenu.onPaintingStart(); zenMenu.onMenuOpened(circularMenu); verify(circularMenu, times(1)).toggle(true); } @Test public void testThatOnMenuOpenedStartRotatesMenuButtonIfItIsOpenedAndIsPainting() { givenThatMenuIsOpened(); zenMenu.onPaintingStart(); zenMenu.onMenuOpened(circularMenu); verify(menuButton, times(1)).rotate(); } @Test public void testThatOnMenuOpenedDoesNothingIfNotPainting() { givenThatMenuIsOpened(); zenMenu.onPaintingEnd(); zenMenu.onMenuOpened(circularMenu); verify(circularMenu, never()).toggle(true); verify(menuButton, never()).rotate(); verify(menuButton, never()).hide(); } @Test public void testThatOnMenuClosedDoesNothingIfNotPainting() { zenMenu.onPaintingEnd(); zenMenu.onMenuClosed(circularMenu); verify(menuButton, never()).hide(); } @Test public void testThatOnMenuClosedHidesMenuButtonIfPainting() { zenMenu.onPaintingStart(); zenMenu.onMenuClosed(circularMenu); verify(menuButton, times(1)).hide(); } @Test public void testThatNewInstanceReturnsNotNullInstance() { Assertions.assertThat(ZenMenu.newInstance(zenSketchView)).isNotNull(); } @Test public void testThatNewInstanceReturnsANewInstance() { ZenMenu firstInstance = ZenMenu.newInstance(zenSketchView); ZenMenu secondInstance = ZenMenu.newInstance(zenSketchView); Assertions.assertThat(firstInstance).isNotEqualTo(secondInstance); } private void givenThatMenuIsClosed() { when(circularMenu.isOpen()).thenReturn(false); } private void givenThatMenuIsOpened() { when(circularMenu.isOpen()).thenReturn(true); } }