package zenproject.meditation.android.sketch.painting.ink;
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.Mockito;
import org.mockito.MockitoAnnotations;
import org.robolectric.annotation.Config;
import zenproject.meditation.android.BuildConfig;
import zenproject.meditation.android.ContextRetriever;
import zenproject.meditation.android.R;
import zenproject.meditation.android.RobolectricLauncherGradleTestRunner;
import zenproject.meditation.android.ZenTestBase;
import zenproject.meditation.android.preferences.BrushOptionsPreferences;
@RunWith(RobolectricLauncherGradleTestRunner.class)
@Config(constants = BuildConfig.class)
public class InkDropSizeLimiterTest extends ZenTestBase {
private static final float MINIMUM_RADIUS = ContextRetriever.INSTANCE.getResources().getDimension(R.dimen.ink_drop_min_radius);
private static final float MAXIMUM_RADIUS = ContextRetriever.INSTANCE.getResources().getDimension(R.dimen.ink_drop_max_radius);
@Mock
private BrushOptionsPreferences brushOptionsPreferences;
private InkDropSizeLimiter inkDropSizeLimiter;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
inkDropSizeLimiter = new InkDropSizeLimiter(brushOptionsPreferences);
}
@Test
public void getMinimumRadiusReturnsMinimum() {
givenAPercentageForAVeryLowRadius();
Assertions.assertThat(inkDropSizeLimiter.getMinimumRadius()).isEqualTo(MINIMUM_RADIUS);
}
@Test
public void getMaximumRadiusReturnsMaximum() {
givenAPercentageForAVeryHighRadius();
Assertions.assertThat(inkDropSizeLimiter.getMaximumRadius()).isEqualTo(MAXIMUM_RADIUS);
}
@Test
public void testThatWhenRadiusIsLowerThatMinimumThenMinimumIsReturned() {
givenAPercentageForAVeryLowRadius();
Assertions.assertThat(inkDropSizeLimiter.getRadius()).isEqualTo(MINIMUM_RADIUS);
}
@Test
public void testThatWhenRadiusIsGreaterThatMaximumThenMaximumIsReturned() {
givenAPercentageForAVeryHighRadius();
Assertions.assertThat(inkDropSizeLimiter.getRadius()).isEqualTo(MAXIMUM_RADIUS);
}
@Test
public void testThatWhenRadiusIsBetweenMaxAndMinRadiusIsReturned() {
givenAPercentageForARadiusInBetween();
Assertions.assertThat(inkDropSizeLimiter.getRadius()).isLessThan(MAXIMUM_RADIUS).isGreaterThan(MINIMUM_RADIUS);
}
@Test
public void testThatNewInstanceReturnsNotNullInkDropSizeLimiter() {
Assertions.assertThat(InkDropSizeLimiter.newInstance(brushOptionsPreferences)).isNotNull();
}
@Test
public void testThatNewInstanceReturnsANewInstance() {
InkDropSizeLimiter firstInstance = InkDropSizeLimiter.newInstance(brushOptionsPreferences);
InkDropSizeLimiter secondInstance = InkDropSizeLimiter.newInstance(brushOptionsPreferences);
Assertions.assertThat(firstInstance).isNotEqualTo(secondInstance);
}
private void givenAPercentageForAVeryLowRadius() {
Mockito.when(brushOptionsPreferences.getBrushSizePercentage()).thenReturn(-1);
}
private void givenAPercentageForAVeryHighRadius() {
Mockito.when(brushOptionsPreferences.getBrushSizePercentage()).thenReturn(200);
}
private void givenAPercentageForARadiusInBetween() {
Mockito.when(brushOptionsPreferences.getBrushSizePercentage()).thenReturn(50);
}
}