package org.jbehave.core.embedder;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import org.junit.Test;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.containsString;
import static org.hamcrest.Matchers.equalTo;
import static org.hamcrest.Matchers.is;
public class EmbedderControlsBehaviour {
@Test
public void shouldAllowPropertyBasedControls() throws Throwable {
EmbedderControls embedderControls = new PropertyBasedEmbedderControls();
assertThat(embedderControls.toString(), containsString(PropertyBasedEmbedderControls.class.getSimpleName()));
EmbedderControls defaultControls = new EmbedderControls();
assertThat(embedderControls.batch(), is(defaultControls.batch()));
assertThat(embedderControls.generateViewAfterStories(), is(defaultControls.generateViewAfterStories()));
assertThat(embedderControls.ignoreFailureInStories(), is(defaultControls.ignoreFailureInStories()));
assertThat(embedderControls.ignoreFailureInView(), is(defaultControls.ignoreFailureInView()));
assertThat(embedderControls.skip(), is(defaultControls.skip()));
assertThat(embedderControls.verboseFailures(), is(defaultControls.verboseFailures()));
assertThat(embedderControls.verboseFiltering(), is(defaultControls.verboseFiltering()));
assertThat(embedderControls.storyTimeouts(), equalTo(defaultControls.storyTimeouts()));
assertThat(embedderControls.storyTimeoutInSecs(), equalTo(defaultControls.storyTimeoutInSecs()));
assertThat(embedderControls.storyTimeoutInSecsByPath(), equalTo(defaultControls.storyTimeoutInSecsByPath()));
assertThat(embedderControls.failOnStoryTimeout(), is(defaultControls.failOnStoryTimeout()));
assertThat(embedderControls.threads(), equalTo(defaultControls.threads()));
System.setProperty(PropertyBasedEmbedderControls.BATCH, "true");
System.setProperty(PropertyBasedEmbedderControls.GENERATE_VIEW_AFTER_STORIES, "true");
System.setProperty(PropertyBasedEmbedderControls.IGNORE_FAILURE_IN_STORIES, "true");
System.setProperty(PropertyBasedEmbedderControls.IGNORE_FAILURE_IN_VIEW, "true");
System.setProperty(PropertyBasedEmbedderControls.SKIP, "true");
System.setProperty(PropertyBasedEmbedderControls.VERBOSE_FAILURES, "true");
System.setProperty(PropertyBasedEmbedderControls.VERBOSE_FILTERING, "true");
System.setProperty(PropertyBasedEmbedderControls.STORY_TIMEOUT_IN_SECS, "500");
System.setProperty(PropertyBasedEmbedderControls.STORY_TIMEOUT_IN_SECS_BY_PATH, "**/shorts/*.story:3,**/longs/*.story:20");
System.setProperty(PropertyBasedEmbedderControls.FAIL_ON_STORY_TIMEOUT, "true");
System.setProperty(PropertyBasedEmbedderControls.THREADS, "5");
assertThat(embedderControls.batch(), is(true));
assertThat(embedderControls.generateViewAfterStories(), is(true));
assertThat(embedderControls.ignoreFailureInStories(), is(true));
assertThat(embedderControls.ignoreFailureInView(), is(true));
assertThat(embedderControls.skip(), is(true));
assertThat(embedderControls.verboseFailures(), is(true));
assertThat(embedderControls.verboseFiltering(), is(true));
assertThat(embedderControls.storyTimeoutInSecs(), equalTo(500L));
assertThat(embedderControls.storyTimeoutInSecsByPath(), equalTo("**/shorts/*.story:3,**/longs/*.story:20"));
assertThat(embedderControls.failOnStoryTimeout(), is(true));
assertThat(embedderControls.threads(), equalTo(5));
}
@Test
public void shouldNotAllowModificationOfUnmodifiableControls() throws Throwable {
EmbedderControls delegate = new EmbedderControls();
EmbedderControls embedderControls = new UnmodifiableEmbedderControls(delegate);
assertThat(embedderControls.toString(), containsString(UnmodifiableEmbedderControls.class.getSimpleName()));
assertThat(embedderControls.batch(), equalTo(delegate.batch()));
assertThat(embedderControls.generateViewAfterStories(), equalTo(delegate.generateViewAfterStories()));
assertThat(embedderControls.ignoreFailureInStories(), equalTo(delegate.ignoreFailureInStories()));
assertThat(embedderControls.ignoreFailureInView(), equalTo(delegate.ignoreFailureInView()));
assertThat(embedderControls.verboseFailures(), is(delegate.verboseFailures()));
assertThat(embedderControls.verboseFiltering(), is(delegate.verboseFiltering()));
assertThat(embedderControls.skip(), equalTo(delegate.skip()));
assertThat(embedderControls.storyTimeouts(), equalTo(delegate.storyTimeouts()));
assertThat(embedderControls.storyTimeoutInSecs(), equalTo(delegate.storyTimeoutInSecs()));
assertThat(embedderControls.storyTimeoutInSecsByPath(), equalTo(delegate.storyTimeoutInSecsByPath()));
assertThat(embedderControls.threads(), equalTo(delegate.threads()));
assertThatNotAllowed(embedderControls, "doBatch", boolean.class, true);
assertThatNotAllowed(embedderControls, "doGenerateViewAfterStories", boolean.class, true);
assertThatNotAllowed(embedderControls, "doIgnoreFailureInStories", boolean.class, true);
assertThatNotAllowed(embedderControls, "doIgnoreFailureInView", boolean.class, true);
assertThatNotAllowed(embedderControls, "doSkip", boolean.class, true);
assertThatNotAllowed(embedderControls, "doVerboseFailures", boolean.class, true);
assertThatNotAllowed(embedderControls, "doVerboseFiltering", boolean.class, true);
assertThatNotAllowed(embedderControls, "useStoryTimeoutInSecs", long.class, 1);
assertThatNotAllowed(embedderControls, "useStoryTimeoutInSecsByPath", String.class, "**/*/BddTest1.story");
assertThatNotAllowed(embedderControls, "doFailOnStoryTimeout", boolean.class, true);
assertThatNotAllowed(embedderControls, "useThreads", int.class, 1);
}
private void assertThatNotAllowed(EmbedderControls unmodifiable, String methodName, Class<?> type, Object value)
throws NoSuchMethodException, IllegalAccessException {
Method method = unmodifiable.getClass().getMethod(methodName, type);
try {
method.invoke(unmodifiable, value);
} catch (IllegalAccessException e) {
throw e; // should not occur
} catch (InvocationTargetException e) {
// expected
}
}
}