package org.magenta.random; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.when; import java.util.Date; import java.util.Random; import java.util.concurrent.TimeUnit; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.runners.MockitoJUnitRunner; import com.google.common.base.Ticker; import com.google.common.collect.Range; @RunWith(MockitoJUnitRunner.class) public class RandomDateTest { @Mock private Random random; @Mock private Ticker ticker; @Test public void testAny() { // setup fixtures RandomDate sut = createSimpleRandomDate(); Long oneHundredYears = 1000L * 60L * 60L * 24L * 365L * 100L; Date oneHundredYearsAfter1969 = new Date(oneHundredYears); when(random.nextLong()).thenReturn(oneHundredYears); // exercise SUT Date actual = sut.any(); // verify outcome assertThat(actual).isEqualTo(oneHundredYearsAfter1969); } private RandomDate createSimpleRandomDate() { RandomDate sut = new RandomDate(1L, Range.closedOpen(new Date(0), new Date(System.currentTimeMillis() + (1000L * 60L * 60L * 24L * 365L * 100L))), new RandomLong(random), ticker); return sut; } @Test public void testAnyInFuture() { // setup fixtures RandomDate sut = createSimpleRandomDate(); Long twoHours = 1000L * 60L * 60L * 2; Long current = System.currentTimeMillis(); Date expected = new Date(current + twoHours); when(random.nextLong()).thenReturn(twoHours); when(ticker.read()).thenReturn(TimeUnit.MILLISECONDS.toNanos(current)); // exercise SUT Date actual = sut.anyInTheFuture(1, TimeUnit.DAYS); // verify outcome assertThat(actual).isEqualTo(expected); } @Test public void testAnyInPast() { // setup fixtures RandomDate sut = createSimpleRandomDate(); Long twoHours = 1000L * 60L * 60L * 2; Long aDay = 1000L * 60L * 60L * 24L; Long current = System.currentTimeMillis(); Date expected = new Date(current - aDay + twoHours); when(random.nextLong()).thenReturn(twoHours); when(ticker.read()).thenReturn(TimeUnit.MILLISECONDS.toNanos(current)); // exercise SUT Date actual = sut.anyInThePast(1, TimeUnit.DAYS); // verify outcome assertThat(actual).isEqualTo(expected); } @Test public void testAnyInTheLast() { // setup fixtures RandomDate sut = createSimpleRandomDate(); Long current = System.currentTimeMillis(); Long twoHours = 1000L * 60L * 60L * 2; Long aDay = 1000L * 60L * 60L * 24L; Date expected = new Date(current - aDay + twoHours); when(random.nextLong()).thenReturn(twoHours); when(ticker.read()).thenReturn(TimeUnit.MILLISECONDS.toNanos(current)); // exercise SUT Date actual = sut.anyInTheLast(new Date(current), 1, TimeUnit.DAYS); // verify outcome assertThat(actual).isEqualTo(expected); } @Test public void testAnyInTheNext() { // setup fixtures RandomDate sut = createSimpleRandomDate(); Long current = System.currentTimeMillis(); Long twoHours = 1000L * 60L * 60L * 2; Date expected = new Date(current + twoHours); when(random.nextLong()).thenReturn(twoHours); when(ticker.read()).thenReturn(TimeUnit.MILLISECONDS.toNanos(current)); // exercise SUT Date actual = sut.anyInTheNext(new Date(current), 1, TimeUnit.DAYS); // verify outcome assertThat(actual).isEqualTo(expected); } }