/******************************************************************************* * Copyright (c) 2014 EURA NOVA. * All rights reserved. This program and the accompanying materials * are made available under the terms of the GNU Public License v2.0 * which accompanies this distribution, and is available at * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html * * Contributors: * Aldemar Reynaga - initial API and implementation * Salim Jouili - initial API and implementation ******************************************************************************/ package com.imgraph.tests; import static org.junit.Assert.*; import java.util.HashMap; import java.util.List; import java.util.Map; import org.junit.After; import org.junit.AfterClass; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; import com.steffi.Main; import com.steffi.common.Configuration; import com.steffi.model.Cell; import com.steffi.model.EdgeType; import com.steffi.model.SteffiEdge; import com.steffi.model.SteffiGraph; import com.steffi.model.SteffiVertex; import com.steffi.networking.NodeServer; import com.steffi.storage.CacheContainer; import com.steffi.storage.CellTransaction.TransactionConclusion; import com.tinkerpop.blueprints.Edge; /** * @author Aldemar Reynaga * Tests for CRUD operations on the graph */ public class TestCrudOperations extends BaseLocalTest{ @Test public void testBasicAddition() { System.out.println("Starting tests...."); SteffiGraph graph = SteffiGraph.getInstance(); graph.startTransaction(); graph.registerItemName("friend"); graph.registerItemName("father"); graph.registerItemName("age"); graph.registerItemName("country"); graph.registerItemName("affinity"); SteffiVertex v1 = graph.addVertex(1L, null); SteffiVertex v2 = graph.addVertex(2L, null); SteffiVertex v3 = graph.addVertex(3L, null); v1.putAttribute("age", 34); v2.putAttribute("age", 30); v3.putAttribute("age", 15); v3.putAttribute("country", "Belgium"); SteffiEdge e12 = v1.addEdge(v2, false, "friend"); v1.addEdge(v3, true, "father"); SteffiEdge e23 = v2.addEdge(v3, false, "friend"); e12.putAttribute("affinity", "high"); e23.putAttribute("affinity", "low"); graph.stopTransaction(TransactionConclusion.COMMIT); SteffiVertex rv1 = (SteffiVertex) graph.retrieveCell(1L); SteffiVertex rv2 = (SteffiVertex) graph.retrieveCell(2L); SteffiVertex rv3 = (SteffiVertex) graph.retrieveCell(3L); assertEquals(1L, rv1.getId()); assertEquals(2L, rv2.getId()); assertEquals(3L, rv3.getId()); assertEquals(34, rv1.getAttribute("age")); assertEquals(30, rv2.getAttribute("age")); assertEquals(15, rv3.getAttribute("age")); assertEquals("Belgium", rv3.getAttribute("country")); int counter = 0; for (String key : rv3.getAttributeKeys()) { counter++; assertTrue(key.equals("country") || key.equals("age")); } assertEquals(2, counter); for (SteffiEdge edge : rv1.getEdges()) { assertNotNull(edge.getId()); if (edge.getName().equals("friend") && edge.getSourceCellId() == 1 && edge.getDestCellId() == 2 && edge.getEdgeType().equals(EdgeType.UNDIRECTED)) { assertEquals("high", edge.getAttribute("affinity")); } else if (edge.getName().equals("father") && edge.getSourceCellId() == 1 && edge.getDestCellId() == 3 && edge.getEdgeType().equals(EdgeType.OUT)) { assertFalse(edge.getAttributeKeys().iterator().hasNext()); } else { fail("Edge not valid"); } } for (SteffiEdge edge : rv2.getEdges()) { assertNotNull(edge.getId()); if (edge.getName().equals("friend") && edge.getSourceCellId() == 2 && edge.getDestCellId() == 1 && edge.getEdgeType().equals(EdgeType.UNDIRECTED)) { assertEquals("high", edge.getAttribute("affinity")); } else if (edge.getName().equals("friend") && edge.getSourceCellId() == 2 && edge.getDestCellId() == 3 && edge.getEdgeType().equals(EdgeType.UNDIRECTED)) { assertEquals("low", edge.getAttribute("affinity")); } else { fail("Edge not valid"); } } for (SteffiEdge edge : rv3.getEdges()) { assertNotNull(edge.getId()); if (edge.getName().equals("friend") && edge.getSourceCellId() == 3 && edge.getDestCellId() == 2 && edge.getEdgeType().equals(EdgeType.UNDIRECTED)) { assertEquals("low", edge.getAttribute("affinity")); } else if (edge.getName().equals("father") && edge.getSourceCellId() == 3 && edge.getDestCellId() == 1 && edge.getEdgeType().equals(EdgeType.IN)) { assertFalse(edge.getAttributeKeys().iterator().hasNext()); } else { fail("Edge not valid"); } } } @Test public void testRemoveVertex() { SteffiGraph graph = SteffiGraph.getInstance(); graph.startTransaction(); SteffiVertex v101 = (SteffiVertex) graph.retrieveCell(101L); v101.remove(); graph.commit(); assertNull(graph.retrieveCell(101L)); SteffiVertex v103 = (SteffiVertex) graph.retrieveCell(103L); SteffiVertex v104 = (SteffiVertex) graph.retrieveCell(104L); for (SteffiEdge edge : v103.getEdges()) if (!isEdgeWith(edge, EdgeType.IN, "recommends", 100, 103)) fail("Edge not valid of v103: " + edge); for (SteffiEdge edge : v104.getEdges()) if (!isEdgeWith(edge, EdgeType.IN, "recommends", 100, 104)) fail("Edge not valid of v104: " + edge); } @Test public void testSetProperties() { SteffiGraph graph = SteffiGraph.getInstance(); graph.registerItemName("height"); graph.registerItemName("date"); graph.startTransaction(); SteffiVertex v102 = (SteffiVertex)graph.retrieveCell(102); v102.putAttribute("height", 1.69); v102.putAttribute("name", "David"); SteffiEdge e102_100 = v102.getEdge(100, EdgeType.UNDIRECTED, "classmate"); SteffiEdge e102_101 = v102.getEdge(101, EdgeType.IN, "recommends"); e102_100.putAttribute("date", "2002-10-15"); e102_101.putAttribute("date", "2012-01-01"); graph.commit(); //Check vertex properties SteffiVertex rv102 = (SteffiVertex)graph.retrieveCell(102); Map<String, Object> expectedProperties = new HashMap<String, Object>(); expectedProperties.put("height", 1.69); expectedProperties.put("name", "David"); expectedProperties.put("weight", 77); checkProperties(rv102, expectedProperties); //Check edge properties SteffiVertex rv100 = (SteffiVertex)graph.retrieveCell(100); SteffiVertex rv101 = (SteffiVertex)graph.retrieveCell(101); SteffiEdge e100_102 = rv100.getEdge(102, EdgeType.UNDIRECTED, "classmate"); SteffiEdge e101_102 = rv101.getEdge(102, EdgeType.OUT, "recommends"); e102_100 = rv102.getEdge(100, EdgeType.UNDIRECTED, "classmate"); expectedProperties.clear(); expectedProperties.put("date", "2002-10-15"); checkProperties(e102_100, expectedProperties); checkProperties(e100_102, expectedProperties); e102_101 = rv102.getEdge(101, EdgeType.IN, "recommends"); expectedProperties.clear(); expectedProperties.put("date", "2012-01-01"); expectedProperties.put("stars", 3); checkProperties(e102_101, expectedProperties); checkProperties(e101_102, expectedProperties); } @Test public void testRemoveProperties() { SteffiGraph graph = SteffiGraph.getInstance(); graph.startTransaction(); SteffiVertex v104 = (SteffiVertex)graph.retrieveCell(104); v104.removeAttribute("weight"); SteffiEdge edge = v104.getEdge(101L, EdgeType.OUT, "recommends"); edge.removeAttribute("stars"); graph.commit(); SteffiVertex rv104 = (SteffiVertex)graph.retrieveCell(104); edge = v104.getEdge(101L, EdgeType.OUT, "recommends"); Map<String, Object> expectedProperties = new HashMap<String, Object>(); expectedProperties.put("name", "Amy"); checkProperties(rv104, expectedProperties); expectedProperties.clear(); checkProperties(edge, expectedProperties); } @Test public void removeEdge() { SteffiGraph graph = SteffiGraph.getInstance(); graph.startTransaction(); SteffiVertex v102 = graph.getVertex(102); SteffiEdge e102_100 = v102.getEdge(100, EdgeType.UNDIRECTED, "classmate"); v102.removeEdge(e102_100); SteffiVertex v104 = graph.getVertex(104); SteffiEdge e104_100 = v104.getEdge(100, EdgeType.IN, "recommends"); v104.removeEdge(e104_100); graph.commit(); SteffiVertex rv102 = graph.getVertex(102); SteffiVertex rv104 = graph.getVertex(104); SteffiVertex rv100 = graph.getVertex(100); for (SteffiEdge edge : rv102.getEdges()) if (!isEdgeWith(edge, EdgeType.IN, "recommends", 101, 102)) fail("Edge not valid: " + edge); for (SteffiEdge edge : rv104.getEdges()) if (!isEdgeWith(edge, EdgeType.OUT, "recommends", 101, 104)) fail("Edge not valid: " + edge); for (SteffiEdge edge : rv100.getEdges()) if (!isEdgeWith(edge, EdgeType.OUT, "recommends", 103, 100)) fail("Edge not valid: " + edge); } }