package zenproject.meditation.android.sketch.painting.flowers;
import com.juankysoriano.rainbow.core.drawing.RainbowDrawer;
import com.juankysoriano.rainbow.core.graphics.RainbowImage;
import java.util.ArrayList;
import java.util.List;
import org.fest.assertions.api.Assertions;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InOrder;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.robolectric.RuntimeEnvironment;
import org.robolectric.annotation.Config;
import zenproject.meditation.android.BuildConfig;
import zenproject.meditation.android.RobolectricLauncherGradleTestRunner;
import zenproject.meditation.android.ZenTestBase;
import zenproject.meditation.android.sketch.painting.flowers.branch.Branch;
import static org.mockito.Mockito.*;
@RunWith(RobolectricLauncherGradleTestRunner.class)
@Config(constants = BuildConfig.class)
public class FlowerDrawerTest extends ZenTestBase {
private static final RainbowImage NO_IMAGE = null;
private static final int BRANCH_X = 10;
private static final int BRANCH_Y = 10;
@Mock
private RainbowImage rainbowImage;
@Mock
private RainbowDrawer rainbowDrawer;
@Mock
private List<RainbowImage> loadedImagesMock;
private Flower flowerToPaint;
private FlowerDrawer flowerDrawer;
private List<RainbowImage> loadedImages;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
when(rainbowDrawer.getContext()).thenReturn(RuntimeEnvironment.application.getApplicationContext());
flowerToPaint = Flower.POPPY;
loadedImages = new ArrayList<>();
flowerDrawer = new FlowerDrawer(flowerToPaint, loadedImages, rainbowDrawer);
}
@Test
public void testThatInitDoesLoadImageForEveryImageOnFlower() {
flowerDrawer.init();
for (Integer flowerImageId : flowerToPaint.getFlowerLeafRes()) {
verify(rainbowDrawer).loadImage(flowerImageId, RainbowImage.LOAD_ORIGINAL_SIZE, flowerDrawer);
}
}
@Test
public void testThatOnLoadSuccessIncludesRainbowImageOnFlowerList() {
flowerDrawer.onLoadSucceed(rainbowImage);
Assertions.assertThat(loadedImages).containsExactly(rainbowImage);
}
@Test
public void testThatOnLoadFailIncludesNullRainbowImageOnFlowerList() {
flowerDrawer.onLoadFail();
Assertions.assertThat(loadedImages).containsExactly(NO_IMAGE);
}
@Test
public void testThatPaintFlowerPerformsImagePaintOnRainbowDrawer() {
givenThatHasImages();
Branch branch = givenABranch();
flowerDrawer.paintFlowerFor(branch);
verify(rainbowDrawer).image(any(RainbowImage.class), anyFloat(), anyFloat(), anyFloat(), anyFloat());
}
@Test
public void testThatPaintFlowerPerformsTranslationToBranchLocation() {
givenThatHasImages();
Branch branch = givenABranch();
flowerDrawer.paintFlowerFor(branch);
verify(rainbowDrawer).translate(branch.getX(), branch.getY());
}
@Test
public void testThatPaintFlowerPerformsTranslationBeforePaintingImage() {
givenThatHasImages();
Branch branch = givenABranch();
flowerDrawer.paintFlowerFor(branch);
InOrder drawingOperation = inOrder(rainbowDrawer);
drawingOperation.verify(rainbowDrawer).translate(anyFloat(), anyFloat());
drawingOperation.verify(rainbowDrawer).image(any(RainbowImage.class), anyFloat(), anyFloat(), anyFloat(), anyFloat());
}
@Test
public void testThatPaintFlowerGetsAFlowerFromList() {
givenThatHasImages();
Branch branch = givenABranch();
FlowerDrawer flowerDrawer = new FlowerDrawer(flowerToPaint, loadedImagesMock, rainbowDrawer);
flowerDrawer.paintFlowerFor(branch);
verify(loadedImagesMock).get(anyInt());
}
@Test
public void testThatPaintFlowerForBranchDoesNothingIfHasNoFlowersToPaint() {
flowerDrawer.paintFlowerFor(givenABranch());
verify(rainbowDrawer, never()).image(any(RainbowImage.class), anyFloat(), anyFloat(), anyFloat(), anyFloat());
}
@Test
public void testThatNewInstanceReturnsNotNullFlowerDrawer() {
Assertions.assertThat(FlowerDrawer.newInstance(Flower.POPPY, rainbowDrawer)).isNotNull();
}
@Test
public void testThatNewInstanceReturnsANewInstance() {
FlowerDrawer firstInstance = FlowerDrawer.newInstance(flowerToPaint, rainbowDrawer);
FlowerDrawer secondInstance = FlowerDrawer.newInstance(flowerToPaint, rainbowDrawer);
Assertions.assertThat(firstInstance).isNotEqualTo(secondInstance);
}
private Branch givenABranch() {
return Branch.createAt(BRANCH_X, BRANCH_Y);
}
private void givenThatHasImages() {
flowerDrawer.onLoadSucceed(rainbowImage);
}
}