package org.magenta.generators; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import java.util.Arrays; import org.junit.Test; import org.magenta.DataSpecification; import org.magenta.Fixture; import org.magenta.GenerationStrategy; import org.mockito.Mockito; import org.mockito.invocation.InvocationOnMock; import org.mockito.stubbing.Answer; import com.google.common.base.Function; import com.google.common.base.Predicate; public class TransformedStrategyTest { @Test public void testGenerate() { // setup fixtures Fixture<DataSpecification> dataDomain = mock(Fixture.class); GenerationStrategy<Integer, DataSpecification> strategy = createIntegerGenerationStrategy(1, 2, 3, 4, 5, 6); Function<Integer, String> converter = integerToStringFunction(); Predicate<Integer> filter = oddNumberFilter(); TransformedStrategy<String, Integer, DataSpecification> sut = new TransformedStrategy<>(strategy, filter, converter); String[] expected = new String[] { "1", "3", "5" }; // exercise sut Iterable<String> actual = sut.generate(dataDomain); // verify outcome assertThat(actual).containsExactly(expected); } @Test public void testGenerateSpecificNumberOfElements() { // setup fixtures Fixture<DataSpecification> dataDomain = mock(Fixture.class); GenerationStrategy<Integer, DataSpecification> strategy = createIntegerGenerationStrategy(1, 2, 3, 4, 5, 6); Function<Integer, String> converter = integerToStringFunction(); Predicate<Integer> filter = oddNumberFilter(); TransformedStrategy<String, Integer, DataSpecification> sut = new TransformedStrategy<>(strategy, filter, converter); String[] expected = new String[] { "1", "3" }; // exercise sut Iterable<String> actual = sut.generate(3, dataDomain); // verify outcome assertThat(actual).containsExactly(expected); } private GenerationStrategy<Integer, DataSpecification> createIntegerGenerationStrategy(final Integer... values) { GenerationStrategy<Integer, DataSpecification> g = mock(GenerationStrategy.class); when(g.generate(Mockito.any(Fixture.class))).thenReturn(Arrays.asList(values)); when(g.generate(Mockito.anyInt(), Mockito.any(Fixture.class))).thenAnswer(new Answer<Iterable<Integer>>() { @Override public Iterable<Integer> answer(InvocationOnMock invocation) throws Throwable { Integer numberOfElements = (Integer) invocation.getArguments()[0]; return Arrays.asList(values) .subList(0, numberOfElements); } }); return g; } private Predicate<Integer> oddNumberFilter() { return new Predicate<Integer>() { @Override public boolean apply(Integer input) { return Math.abs(input) % 2 == 1; } }; } private Function<Integer, String> integerToStringFunction() { return new Function<Integer, String>() { @Override public String apply(Integer input) { return String.valueOf(input); }; }; } }