package org.magenta.core;
import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.Assert.assertFalse;
import static org.mockito.Matchers.any;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import java.util.Arrays;
import java.util.List;
import java.util.Random;
import java.util.Set;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.magenta.FixtureFactory;
import org.magenta.DataSet;
import org.magenta.DataSpecification;
import org.magenta.GenerationStrategy;
import org.magenta.core.GeneratorImpl;
import org.magenta.random.FluentRandom;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.runners.MockitoJUnitRunner;
import com.google.common.base.Functions;
import com.google.common.base.Predicates;
import com.google.common.base.Suppliers;
@RunWith(MockitoJUnitRunner.class)
public class GeneratorImplTest {
@Mock
FixtureFactory<DataSpecification> datasetMap;
@Mock
GenerationStrategy<String,DataSpecification> spy;
@Test
public void testIsGenerated(){
GeneratorImpl<String,DataSpecification> sut = createGeneratorImpl(spy);
//exercise sut
assertThat(sut.isGenerated()).isTrue();
}
@Test
public void testAny() {
// setup fixtures
GeneratorImpl<String,DataSpecification> sut = createGeneratorImpl(spy);
Iterable<String> expected = Arrays.asList("result");
when(spy.generate(Mockito.anyInt(), any(FixtureFactory.class))).thenReturn(expected);
// exercise sut
String result = sut.any();
// verify outcome
verify(spy).generate(1, datasetMap);
assertThat(result).isEqualTo(expected.iterator()
.next());
}
@Test
public void testArray() {
// setup fixtures
GeneratorImpl<String,DataSpecification> sut = createGeneratorImpl(spy);
String[] expected =new String[]{"1", "2", "3"};
when(spy.generate(any(FixtureFactory.class))).thenReturn(Arrays.asList(expected));
// exercise sut
String[] actual = sut.array();
// verify outcome
verify(spy).generate(datasetMap);
assertThat(actual).containsExactly(expected)
.hasSameSizeAs(expected);
}
@Test
public void testArray_with_size() {
// setup fixtures
GeneratorImpl<String,DataSpecification> sut = createGeneratorImpl(spy);
String[] expected =new String[]{"1", "2"};
when(spy.generate(Mockito.anyInt(), any(FixtureFactory.class))).thenReturn(Arrays.asList("1","2"));
// exercise sut
String[] actual = sut.array(2);
// verify outcome
verify(spy).generate(2,datasetMap);
assertThat(actual).containsExactly(expected)
.hasSameSizeAs(expected);
}
@Test
public void testRandomArray() {
// setup fixtures
GeneratorImpl<String,DataSpecification> sut = createGeneratorImpl(spy);
String[] expected =new String[]{"1", "2", "3"};
when(spy.generate(any(FixtureFactory.class))).thenReturn(Arrays.asList(expected));
// exercise sut
String[] actual = sut.randomArray();
// verify outcome
verify(spy).generate(datasetMap);
assertThat(actual).containsOnly(expected)
.hasSameSizeAs(expected);
}
@Test
public void testRandomArray_with_size() {
// setup fixtures
GeneratorImpl<String,DataSpecification> sut = createGeneratorImpl(spy);
String[] expected =new String[]{"1", "2"};
when(spy.generate(Mockito.anyInt(),any(FixtureFactory.class))).thenReturn(Arrays.asList("1","2"));
// exercise sut
String[] actual = sut.randomArray(2);
// verify outcome
verify(spy).generate(2,datasetMap);
assertThat(actual).containsOnly(expected)
.hasSameSizeAs(expected);
}
@Test
public void testList() {
// setup fixtures
GeneratorImpl<String,DataSpecification> sut = createGeneratorImpl(spy);
List<String> expected = Arrays.asList("1", "2", "3");
when(spy.generate(any(FixtureFactory.class))).thenReturn(expected);
// exercise sut
List<String> actual = sut.list();
// verify outcome
verify(spy).generate(datasetMap);
assertThat(actual).containsExactly("1", "2", "3")
.hasSameSizeAs(expected);
}
@Test
public void testList_with_size() {
// setup fixtures
GeneratorImpl<String,DataSpecification> sut = createGeneratorImpl(spy);
List<String> expected = Arrays.asList("1", "2");
int expectedSize = 2;
when(spy.generate(Mockito.anyInt(), any(FixtureFactory.class))).thenReturn(expected);
// exercise sut
List<String> actual = sut.list(expectedSize);
// verify outcome
verify(spy).generate(expectedSize, datasetMap);
assertThat(actual).containsExactly("1", "2")
.hasSameSizeAs(expected);
}
@Test
public void testRandomList() {
// setup fixtures
GeneratorImpl<String,DataSpecification> sut = createGeneratorImpl(spy);
List<String> expected = Arrays.asList("1", "2", "3");
when(spy.generate(any(FixtureFactory.class))).thenReturn(expected);
// exercise sut
List<String> actual = sut.randomList();
// verify outcome
verify(spy).generate(datasetMap);
assertThat(actual).containsAll(expected)
.hasSameSizeAs(expected);
}
@Test
public void testRandomList_with_size() {
// setup fixtures
GeneratorImpl<String,DataSpecification> sut = createGeneratorImpl(spy);
List<String> expected = Arrays.asList("1", "2");
int expectedSize = 2;
when(spy.generate(Mockito.anyInt(), any(FixtureFactory.class))).thenReturn(expected);
// exercise sut
List<String> actual = sut.randomList(expectedSize);
// verify outcome
verify(spy).generate(expectedSize, datasetMap);
assertThat(actual).containsAll(expected)
.hasSameSizeAs(expected);
}
@Test
public void testSet() {
// setup fixtures
GeneratorImpl<String,DataSpecification> sut = createGeneratorImpl(spy);
List<String> expected = Arrays.asList("1", "2", "3");
when(spy.generate(any(FixtureFactory.class))).thenReturn(expected);
// exercise sut
Set<String> actual = sut.set();
// verify outcome
verify(spy).generate(datasetMap);
assertThat(actual).containsAll(expected)
.hasSameSizeAs(expected);
}
@Test
public void testSet_with_size() {
// setup fixtures
GeneratorImpl<String,DataSpecification> sut = createGeneratorImpl(spy);
List<String> expected = Arrays.asList("1", "2");
int expectedSize = 2;
when(spy.generate(Mockito.anyInt(), any(FixtureFactory.class))).thenReturn(expected);
// exercise sut
Set<String> actual = sut.set(expectedSize);
// verify outcome
verify(spy).generate(expectedSize, datasetMap);
assertThat(actual).containsAll(expected)
.hasSize(expectedSize);
}
@Test(expected = UnsupportedOperationException.class)
public void testLink() {
// setup fixtures
GeneratorImpl<String,DataSpecification> sut = createGeneratorImpl(spy);
// exercise sut
String actual = sut.link(new Object());
}
@Test(expected = UnsupportedOperationException.class)
public void testReverseLink() {
// setup fixtures
GeneratorImpl<String,DataSpecification> sut = createGeneratorImpl(spy);
// exercise sut
sut.reverseLink(String.class, "Test");
}
private GeneratorImpl<String,DataSpecification> createGeneratorImpl(GenerationStrategy<String,DataSpecification> strategy) {
return new GeneratorImpl<String,DataSpecification>(datasetMap, strategy, String.class);
}
}