package fr.inria.atlanmod.neo4emf.tests.reflection;
import java.io.File;
import java.io.IOException;
import org.apache.commons.io.FileUtils;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import fr.inria.atlanmod.neo4emf.INeo4emfResource;
import fr.inria.atlanmod.neo4emf.INeo4emfResourceFactory;
import fr.inria.atlanmod.neo4emf.drivers.NESession;
import fr.inria.atlanmod.neo4emf.mgraph.MEdge;
import fr.inria.atlanmod.neo4emf.mgraph.MGraph;
import fr.inria.atlanmod.neo4emf.mgraph.MNode;
import fr.inria.atlanmod.neo4emf.mgraph.MgraphFactory;
import fr.inria.atlanmod.neo4emf.mgraph.MgraphPackage;
public class LoadTest {
private INeo4emfResource resource;
private static final File DB_FOLDER = new File("/tmp/LoadTest/output/ResourceSave");
@BeforeClass
public static void setUpBeforeClass() throws Exception{
FileUtils.forceMkdir(DB_FOLDER);
NESession session = new NESession(MgraphPackage.eINSTANCE);
INeo4emfResource resource = session.createResource(URI.createURI("neo4emf:///"+DB_FOLDER.getAbsolutePath()),100000);
MgraphFactory factory = MgraphFactory.eINSTANCE;
MGraph mg = factory.createMGraph();
mg.setName("myGraph");
MNode n1 = factory.createMNode();
MNode n2 = factory.createMNode();
n1.setName("N1");
n1.setGraph(mg);
n2.setName("N2");
n2.setGraph(mg);
MEdge edge = factory.createMEdge();
edge.setName("E1");
edge.setGraph(mg);
n1.getTo().add(edge);
n2.getFrom().add(edge);
resource.getContents().add(mg);
resource.save();
resource.shutdown();
}
@AfterClass
public static void tearDownAfterClass() throws Exception {
FileUtils.forceDelete(DB_FOLDER);
}
@Before
public void setUp() {
ResourceSet resourceSet = new ResourceSetImpl();
// Create an URI with neo4emf as protocol
URI uri = URI.createURI("neo4emf:///"+DB_FOLDER.getAbsolutePath());
// attach this protocol to INeo4emfResourceFactory
resourceSet.getResourceFactoryRegistry().getProtocolToFactoryMap().put("neo4emf",
INeo4emfResourceFactory.eINSTANCE);
// Create the resource
resource = (INeo4emfResource) resourceSet.createResource(uri);
// Register the package
EPackage.Registry.INSTANCE.put(MgraphPackage.eINSTANCE.getNsURI(), MgraphPackage.eINSTANCE);
}
@Test
public void testLoadGraph() {
try {
resource.load(null);
EList<EObject> resourceContents = resource.getContents();
assert resourceContents.size() == 1 : "Wrong resource content count : found " + resource.getContents().size() + ", expected 1";
assert resourceContents.get(0) != null : "Resource root content is null, expected MGraph instance";
assert resourceContents.get(0).eClass().equals(MgraphPackage.Literals.MGRAPH) : "Resource root is not a MGraph instance, found " + resource.getContents().get(0).eClass().toString();
MGraph graph = (MGraph)resourceContents.get(0);
String graphName = graph.getName();
assert graphName != null : "Graph name is null";
assert graphName.equals("myGraph") : "Wrong graph name : found " + graphName + ", expected \"myGraph\"";
// Test graph node contents
EList<MNode> graphNodes = graph.getNodes();
assert graphNodes != null : "Graph node list is null";
assert graphNodes.size() == 2 : "Wrong graph node list size : found " + graphNodes.size() + ", expected 2";
// Test node names, not order
MNode n1 = graphNodes.get(0);
assert n1 != null : "Node N1 is null";
String n1Name = n1.getName();
assert n1Name != null : "Node N1 name is null";
assert n1Name.equals("N1") || n1Name.equals("N2") : "Wrong N1 node name : found " + n1Name + ", expected N1 or N2";
MNode n2 = graphNodes.get(1);
assert n2 != null : "Node N2 is null";
String n2Name = n2.getName();
assert n2Name != null : "Node N2 name is null";
assert n2Name.equals("N1") || n2Name.equals("N2") : "Wrong N2 node name : found " + n2Name + ", expected N1 or N2";
// Test graph edge contents
EList<MEdge> graphEdges = graph.getEdges();
assert graphEdges != null : "Graph edge list is null";
assert graphEdges.size() == 1 : "Wrong graph edge list size : found " + graphEdges.size() + ", expected 1";
// Test edge name
MEdge edge = graphEdges.get(0);
assert edge != null : "Edge is null";
String edgeName = edge.getName();
assert edgeName != null : "Edge name is null";
assert edgeName.equals("E1") : "Wrong edge name : found " + edgeName + ", expected E1";
} catch (IOException e) {
e.printStackTrace();
} finally {
resource.shutdown();
}
}
@Test
public void testLoadNode() {
try {
resource.load(null);
EList<EObject> resourceContents = resource.getContents();
MGraph graph = (MGraph)resourceContents.get(0);
EList<MNode> graphNodes = graph.getNodes();
MNode n1 = graphNodes.get(0);
MNode n2 = graphNodes.get(1);
String n1Name = n1.getName();
EList<MEdge> n1ToEdge = n1.getTo();
EList<MEdge> n1FromEdge = n1.getFrom();
String n2Name = n2.getName();
EList<MEdge> n2ToEdge = n2.getTo();
EList<MEdge> n2FromEdge = n2.getFrom();
assert n1Name != null : "N1 name is null";
assert n2Name != null : "N2 name is null";
assert n1ToEdge != null : "To Edge list for N1 is null";
assert n1FromEdge != null : "From Edge list for N1 is null";
if(n1Name.equals("N1")) {
assert n1ToEdge.size() == 1 : "Wrong Edge list size for N1 : found " + n1ToEdge.size() + ", expected 1";
MEdge toEdge = n1ToEdge.get(0);
assert toEdge != null : "To Edge for N1 is null";
assert toEdge.getName() != null : "To Edge for N1 name is null";
assert toEdge.getName().equals("E1");
assert toEdge.getInComing() != null : "To Edge for N1 in coming is null";
assert toEdge.getInComing().equals(n1) : "In Coming node for Edge E1 is not N1";
assert n1FromEdge.size() == 0 : "From Edge list for N1 is not empty";
}
else if(n1Name.equals("N2")) {
assert n1ToEdge.size() == 0 : "To Edge list for N2 is not empty";
assert n1FromEdge.size() == 1 : "Wrong Edge list size for N2 : found " + n1FromEdge.size() + ", expected 1";
MEdge fromEdge = n1FromEdge.get(0);
assert fromEdge != null : "From Edge for N2 is null";
assert fromEdge.getName() != null : "From Edge for N2 name is null";
assert fromEdge.getName().equals("E1");
assert fromEdge.getOutGoing() != null : "From Edge for N2 out going is null";
assert fromEdge.getOutGoing().equals(n1) : "Out going node for Edge E1 is not N2";
}
// todo same for other nodes
} catch(IOException e) {
e.printStackTrace();
} finally {
resource.shutdown();
}
}
@Test
public void testLoadGraphReflective() {
try {
resource.load(null);
EList<EObject> resourceContents = resource.getContents();
EObject graph = resourceContents.get(0);
String graphName = (String)graph.eGet(graph.eClass().getEStructuralFeature("name"));
assert graphName != null : "Graph name is null";
assert graphName.equals("myGraph") : "Wrong graph name : found " + graphName + ", expected \"myGraph\"";
// Test graph node contents
EList<EObject> graphNodes = (EList<EObject>)graph.eGet(graph.eClass().getEStructuralFeature("nodes"));
assert graphNodes != null : "Graph node list is null";
assert graphNodes.size() == 2 : "Wrong graph node list size : found " + graphNodes.size() + ", expected 2";
// Test node names, not order
EObject n1 = graphNodes.get(0);
assert n1 != null : "Node N1 is null";
String n1Name = (String)n1.eGet(n1.eClass().getEStructuralFeature("name"));
assert n1Name != null : "Node N1 name is null";
assert n1Name.equals("N1") || n1Name.equals("N2") : "Wrong N1 node name : found " + n1Name + ", expected N1 or N2";
EObject n2 = graphNodes.get(1);
assert n2 != null : "Node N2 is null";
String n2Name = (String)n2.eGet(n2.eClass().getEStructuralFeature("name"));
assert n2Name != null : "Node N2 name is null";
assert n2Name.equals("N1") || n2Name.equals("N2") : "Wrong N2 node name : found " + n2Name + ", expected N1 or N2";
// Test graph edge contents
EList<EObject> graphEdges = (EList<EObject>)graph.eGet(graph.eClass().getEStructuralFeature("edges"));
assert graphEdges != null : "Graph edge list is null";
assert graphEdges.size() == 1 : "Wrong graph edge list size : found " + graphEdges.size() + ", expected 1";
// Test edge name
EObject edge = graphEdges.get(0);
assert edge != null : "Edge is null";
String edgeName = (String)edge.eGet(edge.eClass().getEStructuralFeature("name"));
assert edgeName != null : "Edge name is null";
assert edgeName.equals("E1") : "Wrong edge name : found " + edgeName + ", expected E1";
} catch (IOException e) {
e.printStackTrace();
} finally {
resource.shutdown();
}
}
// TODO same tests with the generic API
}