package zenproject.meditation.android.sketch.painting.ink; import com.juankysoriano.rainbow.core.drawing.RainbowDrawer; import com.juankysoriano.rainbow.core.event.RainbowInputController; import com.juankysoriano.rainbow.core.graphics.RainbowImage; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.Mockito; import org.mockito.MockitoAnnotations; import org.mockito.Spy; import org.robolectric.annotation.Config; import zenproject.meditation.android.BuildConfig; import zenproject.meditation.android.R; import zenproject.meditation.android.RobolectricLauncherGradleTestRunner; import zenproject.meditation.android.ZenTestBase; import zenproject.meditation.android.sketch.painting.flowers.branch.BranchesList; import static org.fest.assertions.api.Assertions.assertThat; import static org.mockito.Matchers.anyFloat; import static org.mockito.Mockito.*; @RunWith(RobolectricLauncherGradleTestRunner.class) @Config(constants = BuildConfig.class) public class InkPerformerTest extends ZenTestBase { @Mock private InkDrop inkDrop; @Mock private BranchesList branchesList; @Spy private RainbowDrawer rainbowDrawer = new RainbowDrawer(); @Mock private RainbowInputController rainbowInputController; @Mock private RainbowImage loadedImage; private InkPerformer inkPerformer; @Before public void setUp() { MockitoAnnotations.initMocks(this); when(inkDrop.getBrushColor()).thenReturn(BrushColor.DARK); disableRainbowDrawerInvocations(); inkPerformer = new InkPerformer(inkDrop, rainbowDrawer, rainbowInputController); } @Test public void testThatInitConfiguresRainbowDrawer() { inkPerformer.init(); verify(rainbowDrawer).noStroke(); verify(rainbowDrawer).smooth(); verify(rainbowDrawer).loadImage(R.drawable.brush_ink, RainbowImage.LOAD_ORIGINAL_SIZE, inkPerformer); } @Test public void testThatWhenDoStepIfEnabledThenInkDropRadiusIsUpdated() { givenThatFingerHasMoved(); inkPerformer.enable(); inkPerformer.doStep(); verify(inkDrop, atLeast(1)).updateInkRadius(); } @Test public void testThatWhenDoStepIfDisabledThenDropWithoutImageIsPainted() { givenThatFingerHasMoved(); inkPerformer.onLoadFail(); inkPerformer.disable(); inkPerformer.doStep(); verify(rainbowDrawer, never()).line(anyFloat(), anyFloat(), anyFloat(), anyFloat()); } @Test public void testThatWhenDoStepIfDisabledThenInkDropRadiusINotsUpdated() { givenThatFingerHasMoved(); inkPerformer.disable(); inkPerformer.doStep(); verify(inkDrop, never()).updateInkRadius(); } @Test public void testThatWhenDoStepIfEnabledAndLoadFailThenDropWithoutImageIsPainted() { givenThatFingerHasMoved(); inkPerformer.onLoadFail(); inkPerformer.enable(); inkPerformer.doStep(); verify(rainbowDrawer, atLeast(1)).line(anyFloat(), anyFloat(), anyFloat(), anyFloat()); } @Test public void testThatWhenDoStepIfEnabledAndLoadSuccessThenDropWithoutImageIsPainted() { givenThatFingerHasMoved(); inkPerformer.onLoadSucceed(loadedImage); inkPerformer.enable(); inkPerformer.doStep(); verify(rainbowDrawer, atLeast(1)).line(anyFloat(), anyFloat(), anyFloat(), anyFloat()); } @Test public void testThatWhenDoStepIfEnabledColorIsRetrievedFromInkDrop() { givenThatFingerHasMoved(); inkPerformer.enable(); inkPerformer.doStep(); verify(inkDrop, atLeast(1)).getBrushColor(); } @Test public void testThatWhenResetThenInkDropRadiusIsReset() { inkPerformer.reset(); verify(inkDrop).resetRadius(); } @Test public void testThatNewInstanceReturnsNotNullInkPerformer() { assertThat(InkPerformer.newInstance(inkDrop, rainbowDrawer, rainbowInputController)).isNotNull(); } @Test public void testThatNewInstanceReturnsANewInstance() { InkPerformer firstInstance = InkPerformer.newInstance(inkDrop, rainbowDrawer, rainbowInputController); InkPerformer secondInstance = InkPerformer.newInstance(inkDrop, rainbowDrawer, rainbowInputController); assertThat(firstInstance).isNotEqualTo(secondInstance); } private void givenThatFingerHasMoved() { when(rainbowInputController.getPreviousSmoothX()).thenReturn(1f); when(rainbowInputController.getPreviousSmoothY()).thenReturn(1f); when(rainbowInputController.getSmoothX()).thenReturn(2f); when(rainbowInputController.getSmoothY()).thenReturn(2f); } private void disableRainbowDrawerInvocations() { Mockito.doNothing().when(rainbowDrawer).noStroke(); Mockito.doNothing().when(rainbowDrawer).smooth(); Mockito.doNothing().when(rainbowDrawer).loadImage(anyInt(), anyInt(), any(RainbowImage.LoadPictureListener.class)); Mockito.doNothing().when(rainbowDrawer).tint(anyInt()); Mockito.doNothing().when(rainbowDrawer).imageMode(anyInt()); Mockito.doNothing().when(rainbowDrawer).pushMatrix(); Mockito.doNothing().when(rainbowDrawer).translate(anyFloat(), anyFloat()); Mockito.doNothing().when(rainbowDrawer).rotate(anyFloat()); Mockito.doNothing().when(rainbowDrawer).image(any(RainbowImage.class), anyFloat(), anyFloat(), anyFloat(), anyFloat()); Mockito.doNothing().when(rainbowDrawer).tint(anyInt()); Mockito.doNothing().when(rainbowDrawer).stroke(anyInt(), anyFloat()); Mockito.doNothing().when(rainbowDrawer).strokeWeight(anyFloat()); Mockito.doNothing().when(rainbowDrawer).line(anyFloat(), anyFloat(), anyFloat(), anyFloat()); } }