package org.jbehave.core.embedder;
import static java.util.Arrays.asList;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.containsString;
import static org.hamcrest.Matchers.equalTo;
import static org.hamcrest.Matchers.is;
import static org.hamcrest.Matchers.not;
import static org.hamcrest.Matchers.nullValue;
import static org.hamcrest.Matchers.sameInstance;
import java.io.File;
import java.net.MalformedURLException;
import java.util.Arrays;
import java.util.List;
import org.jbehave.core.Embeddable;
import org.jbehave.core.embedder.EmbedderClassLoader.InstantiationFailed;
import org.jbehave.core.embedder.EmbedderClassLoader.InvalidClasspathElement;
import org.jbehave.core.junit.JUnitStory;
import org.junit.Test;
public class EmbedderClassLoaderBehaviour {
@Test
public void shouldInstantiateNewEmbedder() {
EmbedderClassLoader classLoader = new EmbedderClassLoader(Arrays.<String> asList());
assertThatIsInstantiated(classLoader, MyEmbedder.class.getName(), MyEmbedder.class);
}
@Test
public void shouldInstantiateNewStory() {
EmbedderClassLoader classLoader = new EmbedderClassLoader(Arrays.<String> asList());
assertThatIsInstantiated(classLoader, MyStory.class.getName(), MyStory.class);
}
@Test
public void shouldIdentifyIfStoryIsAbstract() {
EmbedderClassLoader classLoader = new EmbedderClassLoader(Arrays.<String> asList());
assertThat(classLoader.isAbstract(MyStory.class.getName()), is(false));
assertThat(classLoader.isAbstract(MyAbstractStory.class.getName()), is(true));
assertThat(classLoader.isAbstract("InexistentClass"), is(false));
}
@Test
public void shouldIgnoreIfListOfClasspathElementsIsNull() {
List<String> elements = null;
EmbedderClassLoader classLoader = new EmbedderClassLoader(elements);
assertThatIsInstantiated(classLoader, MyStory.class.getName(), MyStory.class);
}
@Test(expected=InvalidClasspathElement.class)
public void shouldNotIgnoreAnIndividualClasspathElementThatIsNull(){
List<String> elements = asList("target/classes", (String)null);
EmbedderClassLoader classLoader = new EmbedderClassLoader(elements);
assertThatIsInstantiated(classLoader, MyStory.class.getName(), MyStory.class);
}
private <T> void assertThatIsInstantiated(EmbedderClassLoader classLoader, String className, Class<T> type) {
T t = classLoader.newInstance(type, className);
assertThat(t, not(nullValue()));
assertThat(className, equalTo(t.getClass().getName()));
assertThat(classLoader, is(sameInstance(Thread.currentThread().getContextClassLoader())));
}
@Test
public void shouldProvideShortJarPathUrlContentAsString() throws MalformedURLException {
EmbedderClassLoader classLoader = new EmbedderClassLoader(Arrays.<String> asList("/path/to/one.jar",
"/target/classes"));
assertThat(classLoader.toString(),
containsString("urls=" + classLoader.asShortPaths(new File("one.jar").toURI().toURL(), new File("/target/classes").toURI().toURL())));
}
@Test(expected = InstantiationFailed.class)
public void shouldNotInstantiateClassWithInexistentName() {
EmbedderClassLoader classLoader = new EmbedderClassLoader(Arrays.<String> asList());
classLoader.newInstance(Embeddable.class, "InexistentClass");
}
public static class MyEmbedder extends Embedder {
public MyEmbedder() {
}
}
public static class MyStory extends JUnitStory {
public MyStory() {
}
}
public static abstract class MyAbstractStory extends JUnitStory {
}
}