package org.magenta;
import org.junit.Test;
import org.magenta.annotations.InjectDataSet;
import com.google.common.base.Supplier;
public class CycleDetectionTestCase extends FixtureFactoryTestSupport{
@Test(expected=CycleDetectedInGenerationException.class)
public void test_one_generator_referencing_itself_should_be_detected(){
//setup fixtures
FixtureFactory<SimpleDataSpecification> sut = createAnonymousFixtureFactory();
sut.newDataSet(String.class).generatedBy(new SelfReferencingGenerationStrategy());
//exercise sut
sut.dataset(String.class).any();
}
private static final DataKey<String> FOO =DataKey.makeQualified("Foo", String.class);
private static final DataKey<String> BAR =DataKey.makeQualified("Bar", String.class);
@Test(expected=CycleDetectedInGenerationException.class)
public void test_two_generators_referencing_each_other_should_be_detected(){
//setup fixtures
FixtureFactory<SimpleDataSpecification> sut = createAnonymousFixtureFactory();
sut.newDataSet(FOO).generatedBy(new FooGenerationStrategy());
sut.newDataSet(BAR).generatedBy(new BarGenerationStrategy());
//exercise sut
sut.dataset(FOO).any();
}
private static final DataKey<String> TIC =DataKey.makeQualified("Tic", String.class);
private static final DataKey<String> TAC =DataKey.makeQualified("Tac", String.class);
private static final DataKey<String> TOE =DataKey.makeQualified("Toe", String.class);
@Test(expected=CycleDetectedInGenerationException.class)
public void test_three_generators_referencing_each_other_should_be_detected(){
//setup fixtures
FixtureFactory<SimpleDataSpecification> sut = createAnonymousFixtureFactory();
sut.newDataSet(TIC).generatedBy(new TicGenerationStrategy());
sut.newDataSet(TAC).generatedBy(new TacGenerationStrategy());
sut.newDataSet(TOE).generatedBy(new ToeGenerationStrategy());
//exercise sut
sut.dataset(TIC).any();
}
public static class SelfReferencingGenerationStrategy implements Supplier<String>{
@InjectDataSet
DataSet<String> self;
@Override
public String get() {
return self.any();
}
}
public static class FooGenerationStrategy implements Supplier<String>{
@InjectDataSet("Bar")
DataSet<String> bar;
@Override
public String get() {
return bar.any();
}
}
public static class BarGenerationStrategy implements Supplier<String>{
@InjectDataSet("Foo")
DataSet<String> foo;
@Override
public String get() {
return foo.any();
}
}
public static class TicGenerationStrategy implements Supplier<String>{
@InjectDataSet("Tac")
DataSet<String> tac;
@Override
public String get() {
return tac.any();
}
}
public static class TacGenerationStrategy implements Supplier<String>{
@InjectDataSet("Toe")
DataSet<String> toe;
@Override
public String get() {
return toe.any();
}
}
public static class ToeGenerationStrategy implements Supplier<String>{
@InjectDataSet("Tic")
DataSet<String> tic;
@Override
public String get() {
return tic.any();
}
}
}