package org.magenta.random; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Matchers.anyInt; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import java.util.List; import java.util.Random; import org.junit.Test; import com.google.common.collect.Range; public class RandomIntegerTest { public static Range<Integer> SINGLE_POSITIVE = Range.closed(1, 1); public static Range<Integer> SINGLE_NEGATIVE = Range.closed(-1, -1); public static Range<Integer> LOWER_BOUND_TO_PLUS_ONE = Range.atMost(1); public static Range<Integer> MINUS_ONE_TO_UPPER_BOUND = Range.atLeast(-1); public static Range<Integer> LOWER_BOUND_TO_ZERO = Range.atMost(0); public static Range<Integer> ZERO_TO_UPPER_BOUND = Range.atLeast(0); @Test public void testAnyWithResolutionOf2() { // setup fixtures Random random = mock(Random.class); RandomInteger sut = new RandomInteger(random).resolution(2); // first case int oddNumber = 17; when(random.nextInt(anyInt())).thenReturn(oddNumber); // exercise SUT int actual = sut.any(); // verify outcome assertThat(actual % 2).isEqualTo(0); // second case int evenNumber = 96; when(random.nextInt(anyInt())).thenReturn(evenNumber); // exercise SUT actual = sut.any(); // verify outcome assertThat(actual % 2).isEqualTo(0); } @Test public void testAny() { // setup fixtures RandomInteger sut = newConstrainedInstance(SINGLE_POSITIVE); int expected = SINGLE_POSITIVE.lowerEndpoint(); // exercise SUT int actual = sut.any(); // verify outcome assertThat(actual).isEqualTo(expected); } @Test public void testAnyIntegerPositive() { // setup fixtures RandomInteger sut = newConstrainedInstance(LOWER_BOUND_TO_ZERO); int expected = 0; // exercise SUT int actual = sut.anyPositive(); // verify outcome assertThat(actual).isGreaterThanOrEqualTo(0) .isEqualTo(expected); } @Test public void testAnyIntegerNegative() { // setup fixtures RandomInteger sut = newConstrainedInstance(ZERO_TO_UPPER_BOUND); int expected = 0; // exercise SUT int actual = sut.anyNegative(); // verify outcome assertThat(actual).isLessThanOrEqualTo(0) .isEqualTo(expected); } @Test public void testAnyIntegerPositiveButZero() { // setup fixtures RandomInteger sut = newConstrainedInstance(LOWER_BOUND_TO_PLUS_ONE); int expected = 1; // exercise SUT int actual = sut.anyPositiveButZero(); // verify outcome assertThat(actual).isGreaterThan(0) .isEqualTo(expected); } @Test public void testAnyIntegerNegativeButZero() { // setup fixtures RandomInteger sut = newConstrainedInstance(MINUS_ONE_TO_UPPER_BOUND); int expected = -1; // exercise SUT int actual = sut.anyNegativeButZero(); // verify outcome assertThat(actual).isLessThan(0) .isEqualTo(expected); } @Test public void testSomeIntegers() { // setup fixtures RandomInteger sut = newConstrainedInstance(Range.open(0, 5)); //exercise sut List<Integer> integers = sut.some(3); //verify outcome for(Integer i:integers){ assertThat(i).isGreaterThan(0).isLessThan(5); } } @Test(expected = IllegalStateException.class) public void testIllegalState() { // setup fixtures RandomInteger sut = newConstrainedInstance(Range.greaterThan(0)); // exercise SUT sut.anyNegative(); } private RandomInteger newConstrainedInstance(Range<Integer> constraint) { RandomInteger sut = new RandomInteger(new Random(), constraint, 1); return sut; } }