package cuke4duke.internal.java;
import cuke4duke.annotation.I18n.EN.*;
import cuke4duke.StepMother;
import cuke4duke.internal.jvmclass.ClassAnalyzer;
import cuke4duke.internal.jvmclass.ClassLanguage;
import cuke4duke.internal.jvmclass.ClassLanguageMixin;
import cuke4duke.internal.language.AbstractStepDefinition;
import cuke4duke.internal.language.StepDefinition;
import cuke4duke.spi.ExceptionFactory;
import org.junit.Test;
import org.mockito.Mock;
import java.util.Arrays;
import java.util.List;
import static junit.framework.Assert.assertEquals;
import static org.mockito.Mockito.mock;
import static org.mockito.MockitoAnnotations.initMocks;
public class JavaAnalyzerTest {
@Mock
private StepMother stepMother;
@Mock
private ClassLanguageMixin languageMixin;
public JavaAnalyzerTest() {
initMocks(this);
}
public abstract static class FlintStone {
@Given("where is dino")
public Class whereIsDino() {
return getClass();
}
}
public static class Fred extends FlintStone {
}
public static class Wilma extends FlintStone {
}
@Test
public void shouldAllowOneInheritedSubclass() throws Throwable {
ClassLanguage classLanguage = new ClassLanguage(languageMixin, mock(ExceptionFactory.class), stepMother, Arrays.<ClassAnalyzer>asList(new JavaAnalyzer()));
classLanguage.addClass(FlintStone.class);
classLanguage.addClass(Fred.class);
classLanguage.begin_scenario(null);
List<StepDefinition> stepDefinitions = classLanguage.getStepDefinitions();
assertEquals(1, stepDefinitions.size());
assertEquals(Fred.class, ((AbstractStepDefinition)stepDefinitions.get(0)).invokeWithArgs(new Object[0]));
}
@Test(expected=Exception.class)
public void shouldFailWithTwoInheritedSubclass() throws Throwable {
ClassLanguage classLanguage = new ClassLanguage(languageMixin, mock(ExceptionFactory.class), stepMother, Arrays.<ClassAnalyzer>asList(new JavaAnalyzer()));
classLanguage.addClass(FlintStone.class);
classLanguage.addClass(Fred.class);
classLanguage.addClass(Wilma.class);
classLanguage.begin_scenario(null);
List<StepDefinition> stepDefinitions = classLanguage.getStepDefinitions();
assertEquals(1, stepDefinitions.size());
assertEquals(Fred.class, ((AbstractStepDefinition)stepDefinitions.get(0)).invokeWithArgs(new Object[0]));
}
}