package i5.las2peer.services.ocd.graphs;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import i5.las2peer.services.ocd.adapters.AdapterException;
import i5.las2peer.services.ocd.graphs.CustomGraph;
import i5.las2peer.services.ocd.testsUtils.OcdTestGraphFactory;
import java.io.FileNotFoundException;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;
import javax.persistence.TypedQuery;
import org.junit.After;
import org.junit.Ignore;
import org.junit.Test;
import y.base.Edge;
import y.base.Node;
public class CustomGraphPersistenceTest {
private static final String userName1 = "testUser1";
private static final String graphName1 = "persistenceTestGraph1";
private static final String invalidGraphName = "invalidGraphName";
EntityManagerFactory emf = Persistence.createEntityManagerFactory("ocd");
@Test
public void testPersist() {
EntityManager em = emf.createEntityManager();
CustomGraph graph = new CustomGraph();
graph.setUserName(userName1);
graph.setName(graphName1);
Node nodeA = graph.createNode();
Node nodeB = graph.createNode();
Node nodeC = graph.createNode();
graph.setNodeName(nodeA, "A");
graph.setNodeName(nodeB, "B");
graph.setNodeName(nodeC, "C");
Edge edgeAB = graph.createEdge(nodeA, nodeB);
graph.setEdgeWeight(edgeAB, 5);
Edge edgeBC = graph.createEdge(nodeB, nodeC);
graph.setEdgeWeight(edgeBC, 2.5);
graph.addType(GraphType.DIRECTED);
EntityTransaction tx = em.getTransaction();
try {
tx.begin();
em.persist(graph);
tx.commit();
} catch( RuntimeException ex ) {
if( tx != null && tx.isActive() ) tx.rollback();
throw ex;
}
em.close();
em = emf.createEntityManager();
TypedQuery<CustomGraph> query = em.createQuery("Select g from CustomGraph g where g.name = :name", CustomGraph.class);
query.setParameter("name", graphName1);
List<CustomGraph> queryResults = query.getResultList();
assertEquals(1, queryResults.size());
CustomGraph persistedGraph = queryResults.get(0);
assertNotNull(persistedGraph);
System.out.println("Username: " + persistedGraph.getUserName());
System.out.println("Graphname: " + persistedGraph.getName());
System.out.println("Nodecount: " + persistedGraph.nodeCount());
System.out.println("Edgecount: " + persistedGraph.edgeCount());
assertEquals(graphName1, persistedGraph.getName());
assertEquals(userName1, persistedGraph.getUserName());
assertEquals(3, persistedGraph.nodeCount());
assertEquals(2, persistedGraph.edgeCount());
Set<String> nodeNames = new HashSet<String>();
nodeNames.add("A");
nodeNames.add("B");
nodeNames.add("C");
for(int i=0; i<3; i++) {
Node node = persistedGraph.getNodeArray()[i];
String name = persistedGraph.getNodeName(node);
System.out.println("Node: " + node.index() + ", Name: " + persistedGraph.getNodeName(node));
assertTrue(nodeNames.contains(name));
nodeNames.remove(name);
}
for(int i=0; i<2; i++) {
Edge edge = persistedGraph.getEdgeArray()[i];
Double weight = persistedGraph.getEdgeWeight(edge);
if(weight == 5) {
assertEquals("A", persistedGraph.getNodeName(edge.source()));
assertEquals("B", persistedGraph.getNodeName(edge.target()));
}
else if(weight == 2.5) {
assertEquals("B", persistedGraph.getNodeName(edge.source()));
assertEquals("C", persistedGraph.getNodeName(edge.target()));
}
else {
throw new IllegalStateException("Invalid Node Weight");
}
}
assertEquals(1, persistedGraph.getTypes().size());
assertTrue(persistedGraph.getTypes().contains(GraphType.DIRECTED));
System.out.println("Types: " + graph.getTypes());
query = em.createQuery("Select graph from CustomGraph graph where graph.name = :name", CustomGraph.class);
query.setParameter("name", invalidGraphName);
queryResults = query.getResultList();
assertEquals(0, queryResults.size());
}
/*
* Tests whether two instances of the same object obtained by a single entity manager
* are indeed identical (i.e. the comparison == results in TRUE).
*/
@Ignore
@Test
public void testIdentity() {
EntityManager em = emf.createEntityManager();
CustomGraph graph = new CustomGraph();
graph.setUserName(userName1);
graph.setName(graphName1);
Node nodeA = graph.createNode();
Node nodeB = graph.createNode();
Node nodeC = graph.createNode();
graph.setNodeName(nodeA, "A");
graph.setNodeName(nodeB, "B");
graph.setNodeName(nodeC, "C");
EntityTransaction tx = em.getTransaction();
try {
tx.begin();
em.persist(graph);
tx.commit();
} catch( RuntimeException ex ) {
if( tx != null && tx.isActive() ) tx.rollback();
throw ex;
}
em.close();
em = emf.createEntityManager();
TypedQuery<CustomGraph> query = em.createQuery("Select g from CustomGraph g where g.name = :name", CustomGraph.class);
query.setParameter("name", graphName1);
List<CustomGraph> queryResults1 = query.getResultList();
assertEquals(1, queryResults1.size());
CustomGraph persistedGraph1 = queryResults1.get(0);
List<CustomGraph> queryResults2 = query.getResultList();
assertEquals(1, queryResults2.size());
CustomGraph persistedGraph2 = queryResults2.get(0);
assertTrue(persistedGraph1 == persistedGraph2);
Node node = persistedGraph1.getNodeArray()[0];
String name1 = persistedGraph1.getNodeName(node);
String name2 = persistedGraph2.getNodeName(node);
System.out.println("name1: " + name1);
System.out.println("name2: " + name2);
assertEquals(name1, name2);
}
@Ignore
@Test
public void testEfficiency() throws AdapterException, FileNotFoundException {
CustomGraph graph = OcdTestGraphFactory.getSiamDmGraph();
EntityManager em = emf.createEntityManager();
EntityTransaction tx = em.getTransaction();
try {
tx.begin();
em.persist(graph);
System.out.println("Commit graph");
tx.commit();
System.out.println("Commited graph");
} catch( RuntimeException ex ) {
if( tx != null && tx.isActive() ) tx.rollback();
throw ex;
}
em.close();
}
@After
public void after() {
emf.close();
}
}