
com.tinkerpop.gremlin.AbstractGremlinSuite Maven / Gradle / Ivy
package com.tinkerpop.gremlin;
import com.tinkerpop.gremlin.structure.Graph;
import org.junit.runners.Suite;
import org.junit.runners.model.InitializationError;
import org.junit.runners.model.RunnerBuilder;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.util.List;
import java.util.function.Consumer;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import static org.junit.Assert.assertEquals;
/**
* Base Gremlin test suite from which different classes of tests can be exposed to implementers.
*
* @author Stephen Mallette (http://stephen.genoprime.com)
*/
public abstract class AbstractGremlinSuite extends Suite {
/**
* The GraphProvider instance that will be used to generate a Graph instance.
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Inherited
public @interface GraphProviderClass {
public Class extends GraphProvider> value();
}
public AbstractGremlinSuite(final Class> klass, final RunnerBuilder builder, final Class>[] testsToExecute) throws InitializationError {
this(klass, builder, testsToExecute, null);
}
public AbstractGremlinSuite(final Class> klass, final RunnerBuilder builder, final Class>[] testsToExecute, final Class>[] testsToEnforce) throws InitializationError {
super(builder, klass, enforce(testsToExecute, testsToEnforce));
// figures out what the implementer assigned as the GraphProvider class and make it available to tests.
// the klass is the Suite that implements this suite (e.g. GroovyTinkerGraphProcessStandardTest).
// this class should be annotated with GraphProviderClass. Failure to do so will toss an InitializationError
final Class graphProviderClass = getGraphProviderClass(klass);
try {
GraphManager.set((GraphProvider) graphProviderClass.newInstance());
} catch (Exception ex) {
throw new InitializationError(ex);
}
}
private static Class>[] enforce(final Class>[] testsToExecute, final Class>[] testsToEnforce) {
if (null == testsToEnforce) return testsToExecute;
// examine each test to enforce and ensure an instance of it is in the list of testsToExecute
final List> notSupplied = Stream.of(testsToEnforce)
.filter(t -> Stream.of(testsToExecute).noneMatch(t::isAssignableFrom))
.collect(Collectors.toList());
if (notSupplied.size() > 0)
System.err.println(String.format("Review the testsToExecute given to the test suite as the following are missing: %s", notSupplied));
return testsToExecute;
}
public static Class extends GraphProvider> getGraphProviderClass(final Class> klass) throws InitializationError {
final GraphProviderClass annotation = klass.getAnnotation(GraphProviderClass.class);
if (null == annotation)
throw new InitializationError(String.format("class '%s' must have a GraphProviderClass annotation", klass.getName()));
return annotation.value();
}
public static Consumer assertVertexEdgeCounts(final int expectedVertexCount, final int expectedEdgeCount) {
return (g) -> {
assertEquals(new Long(expectedVertexCount), g.V().count().next());
assertEquals(new Long(expectedEdgeCount), g.E().count().next());
};
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy