package org.magenta.random; 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 java.util.List; import java.util.Random; import org.junit.Test; import org.mockito.Mockito; import com.google.common.collect.Lists; public class RandomIterableTest { @Test public void testTraversal_mocked_case_1(){ //setup fixtures Random random=mock(Random.class); FluentRandom randomizer=FluentRandom.get(random); List<Integer> list1=Arrays.asList(1,2,3); List<Integer> list2=Arrays.asList(4,5,6); List<Integer> list3=Arrays.asList(7,8,9); Integer[] expected = new Integer[]{1,4,7,2,5,8,3,6,9}; //sequence of random to get the expected result when(random.nextInt(Mockito.anyInt())).thenReturn(0,1,2,0,1,2,0,0,0); List<List<Integer>> integerLists=Lists.newArrayList(list1,list2,list3); MixedIterable<Integer> sut=new MixedIterable<>(integerLists, randomizer); //exercise sut List<Integer> actual=Lists.newArrayList(sut); //verify outcome assertThat(actual).containsExactly(expected); } @Test public void testTraversal_mocked_case_2(){ //setup fixtures Random random=mock(Random.class); FluentRandom randomizer=FluentRandom.get(random); List<Integer> list1=Arrays.asList(1,2,3); List<Integer> list2=Arrays.asList(4,5,6); List<Integer> list3=Arrays.asList(7,8,9); Integer[] expected = new Integer[]{7,1,8,9,4,2,3,5,6}; //sequence of random to get the expected result when(random.nextInt(Mockito.anyInt())).thenReturn(2,0,2,2,1,0,0,0,0); List<List<Integer>> integerLists=Lists.newArrayList(list1,list2,list3); MixedIterable<Integer> sut=new MixedIterable<>(integerLists, randomizer); //exercise sut List<Integer> actual=Lists.newArrayList(sut); //verify outcome assertThat(actual).containsExactly(expected); } @Test public void testTraversalWhenOneOfTheListIsEmpty(){ //setup fixtures FluentRandom randomizer=FluentRandom.get(new Random()); List<Integer> list1=Arrays.asList(1,2,3); List<Integer> list2=Arrays.asList(4,5,6); List<Integer> list3=Arrays.asList(); Integer[] expected = new Integer[]{1,2,3,4,5,6}; List<List<Integer>> integerLists=Lists.newArrayList(list1,list2,list3); MixedIterable<Integer> sut=new MixedIterable<>(integerLists, randomizer); //exercise sut (should not throw error) List<Integer> actual=Lists.newArrayList(sut); // verify outcome assertThat(actual).containsOnly(expected); } @Test public void testTraversalWhenAllListAreEmpty(){ //setup fixtures FluentRandom randomizer=FluentRandom.get(new Random()); List<Integer> list1=Arrays.asList(); List<Integer> list2=Arrays.asList(); List<Integer> list3=Arrays.asList(); Integer[] expected = new Integer[]{}; List<List<Integer>> integerLists=Lists.newArrayList(list1,list2,list3); MixedIterable<Integer> sut=new MixedIterable<>(integerLists, randomizer); //exercise sut (should not throw error) List<Integer> actual=Lists.newArrayList(sut); // verify outcome assertThat(actual).isEmpty(); } //TODO test with a list that is a view and see when it is actually rendered }