Coverage Summary for Class: TestEdgeMultiplicity (org.umlg.sqlg.test.topology.edgeMultiplicity)

Class Method, % Branch, % Line, %
TestEdgeMultiplicity 100% (9/9) 40.9% (9/22) 100% (201/201)
TestEdgeMultiplicity$1 100% (1/1) 100% (2/2)
TestEdgeMultiplicity$10 100% (1/1) 100% (2/2)
TestEdgeMultiplicity$2 100% (1/1) 100% (2/2)
TestEdgeMultiplicity$3 100% (1/1) 100% (2/2)
TestEdgeMultiplicity$4 100% (1/1) 100% (2/2)
TestEdgeMultiplicity$5 100% (1/1) 100% (2/2)
TestEdgeMultiplicity$6 100% (1/1) 100% (2/2)
TestEdgeMultiplicity$7 100% (1/1) 100% (2/2)
TestEdgeMultiplicity$8 100% (1/1) 100% (2/2)
TestEdgeMultiplicity$9 100% (1/1) 100% (2/2)
Total 100% (19/19) 40.9% (9/22) 100% (221/221)


 package org.umlg.sqlg.test.topology.edgeMultiplicity;
 
 import org.apache.tinkerpop.gremlin.structure.Direction;
 import org.apache.tinkerpop.gremlin.structure.T;
 import org.apache.tinkerpop.gremlin.structure.Vertex;
 import org.junit.Assert;
 import org.junit.Test;
 import org.umlg.sqlg.structure.Multiplicity;
 import org.umlg.sqlg.structure.PropertyDefinition;
 import org.umlg.sqlg.structure.PropertyType;
 import org.umlg.sqlg.structure.SqlgGraph;
 import org.umlg.sqlg.structure.topology.*;
 import org.umlg.sqlg.test.BaseTest;
 
 import java.util.LinkedHashMap;
 import java.util.Optional;
 import java.util.Set;
 
 import static org.junit.Assert.assertTrue;
 
 public class TestEdgeMultiplicity extends BaseTest {
 
     @Test
     public void testUpperMinusOne() {
         Schema publicSchema = this.sqlgGraph.getTopology().getPublicSchema();
         VertexLabel aVertexLabel = publicSchema.ensureVertexLabelExist("A");
         VertexLabel bVertexLabel = publicSchema.ensureVertexLabelExist("B");
         VertexLabel cVertexLabel = publicSchema.ensureVertexLabelExist("C");
         EdgeLabel testEdgeEdgeLabel = aVertexLabel.ensureEdgeLabelExist("testedge", bVertexLabel, EdgeDefinition.of(Multiplicity.of(1, 1), Multiplicity.of(1, -1)));
         testEdgeEdgeLabel = aVertexLabel.ensureEdgeLabelExist("testedge", cVertexLabel, EdgeDefinition.of(Multiplicity.of(1, 1), Multiplicity.of(1, 1)));
         this.sqlgGraph.tx().commit();
 
         Vertex a = this.sqlgGraph.addVertex(T.label, "A");
         Vertex b = this.sqlgGraph.addVertex(T.label, "B");
         Vertex c = this.sqlgGraph.addVertex(T.label, "C");
         a.addEdge("testedge", b);
 
         this.sqlgGraph.tx().checkMultiplicity(aVertexLabel, Direction.OUT, testEdgeEdgeLabel, bVertexLabel);
         this.sqlgGraph.tx().checkMultiplicity(a, Direction.OUT, testEdgeEdgeLabel, bVertexLabel);
 //        this.sqlgGraph.tx().checkMultiplicity(a, Direction.OUT, testEdgeEdgeLabel, cVertexLabel);
         this.sqlgGraph.tx().commit();
     }
 
     @Test
     public void testOneToOne() {
         VertexLabel computerVertexLabel = this.sqlgGraph.getTopology().getPublicSchema().ensureVertexLabelExist("Computer",
                 new LinkedHashMap<>() {{
                     put("serialNo", PropertyDefinition.of(PropertyType.STRING, Multiplicity.of(1, 1)));
                 }}
         );
         VertexLabel cpuVertexLabel = this.sqlgGraph.getTopology().getPublicSchema().ensureVertexLabelExist("Cpu",
                 new LinkedHashMap<>() {{
                     put("serialNo", PropertyDefinition.of(PropertyType.STRING, Multiplicity.of(1, 1)));
                 }}
         );
         computerVertexLabel.ensureEdgeLabelExist(
                 "cpu",
                 cpuVertexLabel,
                 EdgeDefinition.of(
                         Multiplicity.of(1, 1),
                         Multiplicity.of(1, 1)
                 )
         );
         this.sqlgGraph.tx().commit();
         this.sqlgGraph.getTopology().lock();
         Vertex computer1 = this.sqlgGraph.addVertex(T.label, "Computer", "serialNo", "1111");
         Vertex cpu1 = this.sqlgGraph.addVertex(T.label, "Cpu", "serialNo", "aaab");
         Vertex cpu2 = this.sqlgGraph.addVertex(T.label, "Cpu", "serialNo", "aaac");
         computer1.addEdge("cpu", cpu1);
         this.sqlgGraph.tx().commit();
         try {
             computer1.addEdge("cpu", cpu2);
         } catch (RuntimeException e) {
             if (isPostgres()) {
                 Assert.assertTrue(e.getMessage().contains("duplicate key value violates unique constraint"));
             }
         }
         this.sqlgGraph.tx().rollback();
         Vertex computer2 = this.sqlgGraph.addVertex(T.label, "Computer", "serialNo", "2222");
         try {
             computer2.addEdge("cpu", cpu1);
         } catch (RuntimeException e) {
             if (isPostgres()) {
                 Assert.assertTrue(e.getMessage().contains("duplicate key value violates unique constraint"));
             }
         }
         this.sqlgGraph.tx().rollback();
     }
 
     @Test
     public void testOneToMany() {
         VertexLabel personVertexLabel = this.sqlgGraph.getTopology().getPublicSchema().ensureVertexLabelExist("Person",
                 new LinkedHashMap<>() {{
                     put("name", PropertyDefinition.of(PropertyType.STRING, Multiplicity.of(1, 1)));
                 }}
         );
         VertexLabel countryVertexLabel = this.sqlgGraph.getTopology().getPublicSchema().ensureVertexLabelExist("Country",
                 new LinkedHashMap<>() {{
                     put("name", PropertyDefinition.of(PropertyType.STRING, Multiplicity.of(1, 1)));
                 }}
         );
         personVertexLabel.ensureEdgeLabelExist(
                 "visited",
                 countryVertexLabel,
                 EdgeDefinition.of(
                         Multiplicity.of(0, 1),
                         Multiplicity.of(-1, -1, true)
                 )
         );
         this.sqlgGraph.tx().commit();
         this.sqlgGraph.getTopology().lock();
         Vertex john = this.sqlgGraph.addVertex(T.label, "Person", "name", "John");
         Vertex usa = this.sqlgGraph.addVertex(T.label, "Country", "name", "USA");
         Vertex sa = this.sqlgGraph.addVertex(T.label, "Country", "name", "SA");
         john.addEdge("visited", usa);
         john.addEdge("visited", sa);
         this.sqlgGraph.tx().commit();
         try {
             john.addEdge("visited", usa);
         } catch (RuntimeException e) {
             if (isPostgres()) {
                 Assert.assertTrue(e.getMessage().contains("duplicate key value violates unique constraint"));
             }
         }
         this.sqlgGraph.tx().rollback();
         Vertex peter = this.sqlgGraph.addVertex(T.label, "Person", "name", "John");
         peter.addEdge("visited", usa);
         this.sqlgGraph.tx().commit();
     }
 
     @Test
     public void testUniqueManyToMany() {
         VertexLabel personVertexLabel = this.sqlgGraph.getTopology().getPublicSchema().ensureVertexLabelExist("Person",
                 new LinkedHashMap<>() {{
                     put("name", PropertyDefinition.of(PropertyType.STRING, Multiplicity.of(1, 1)));
                 }}
         );
         VertexLabel vehicleVertexLabel = this.sqlgGraph.getTopology().getPublicSchema().ensureVertexLabelExist("Vehicle",
                 new LinkedHashMap<>() {{
                     put("name", PropertyDefinition.of(PropertyType.STRING, Multiplicity.of(1, 1)));
                 }}
         );
         personVertexLabel.ensureEdgeLabelExist(
                 "drives",
                 vehicleVertexLabel,
                 EdgeDefinition.of(
                         Multiplicity.of(-1, -1, true),
                         Multiplicity.of(-1, -1, true)
                 )
         );
         this.sqlgGraph.tx().commit();
         this.sqlgGraph.getTopology().lock();
         Vertex john = this.sqlgGraph.addVertex(T.label, "Person", "name", "John");
         Vertex peter = this.sqlgGraph.addVertex(T.label, "Person", "name", "Peter");
         Vertex toyota = this.sqlgGraph.addVertex(T.label, "Vehicle", "name", "Toyota");
         Vertex kia = this.sqlgGraph.addVertex(T.label, "Vehicle", "name", "Kia");
         john.addEdge("drives", toyota);
         john.addEdge("drives", kia);
         peter.addEdge("drives", toyota);
         peter.addEdge("drives", kia);
         this.sqlgGraph.tx().commit();
         try {
             john.addEdge("drives", toyota);
         } catch (RuntimeException e) {
             if (isPostgres()) {
                 Assert.assertTrue(e.getMessage().contains("duplicate key value violates unique constraint"));
             }
         }
         this.sqlgGraph.tx().rollback();
     }
 
     @Test
     public void testCheckMultiplicitiesPerVertex() {
         VertexLabel personVertexLabel = this.sqlgGraph.getTopology().getPublicSchema().ensureVertexLabelExist("Person",
                 new LinkedHashMap<>() {{
                     put("name", PropertyDefinition.of(PropertyType.STRING, Multiplicity.of(1, 1)));
                 }}
         );
         VertexLabel addressVertexLabel = this.sqlgGraph.getTopology().getPublicSchema().ensureVertexLabelExist("Address",
                 new LinkedHashMap<>() {{
                     put("name", PropertyDefinition.of(PropertyType.STRING, Multiplicity.of(1, 1)));
                 }}
         );
         EdgeLabel personAddressEdgeLabel = personVertexLabel.ensureEdgeLabelExist(
                 "address",
                 addressVertexLabel,
                 EdgeDefinition.of(
                         Multiplicity.of(0, 1, true),
                         Multiplicity.of(1, 3, true)
                 )
         );
         this.sqlgGraph.tx().commit();
         this.sqlgGraph.getTopology().lock();
         Vertex john = this.sqlgGraph.addVertex(T.label, "Person", "name", "John");
         Vertex peter = this.sqlgGraph.addVertex(T.label, "Person", "name", "peter");
         Vertex johnHomeAddress = this.sqlgGraph.addVertex(T.label, "Address", "name", "home");
         Vertex johnWorkAddress = this.sqlgGraph.addVertex(T.label, "Address", "name", "work");
         Vertex johnVacationAddress = this.sqlgGraph.addVertex(T.label, "Address", "name", "vacation");
         try {
             this.sqlgGraph.tx().checkMultiplicity(john, Direction.OUT, personAddressEdgeLabel, addressVertexLabel);
         } catch (RuntimeException e) {
             if (isPostgres()) {
                 assertTrue(e.getMessage().contains("Multiplicity check for EdgeLabel 'address' fails.\n" +
                         "Lower multiplicity is 1 current lower multiplicity is 0"));
             }
         }
         john.addEdge("address", johnHomeAddress);
         john.addEdge("address", johnWorkAddress);
         john.addEdge("address", johnVacationAddress);
         this.sqlgGraph.tx().checkMultiplicity(john, Direction.OUT, personAddressEdgeLabel, addressVertexLabel);
 
         peter.addEdge("address", johnHomeAddress);
         boolean fails = false;
         try {
             this.sqlgGraph.tx().checkMultiplicity(johnHomeAddress, Direction.IN, personAddressEdgeLabel, personVertexLabel);
         } catch (RuntimeException e) {
             fails = true;
             if (isPostgres()) {
                 System.out.println(e.getMessage());
                 assertTrue(e.getMessage().contains("Multiplicity check for EdgeLabel 'address' fails.\n" +
                         "Upper multiplicity is 1 current upper multiplicity is 2"));
             }
         }
         assertTrue(fails);
         this.sqlgGraph.tx().commit();
     }
 
     @Test
     public void testCheckMultiplicitiesPerVertexLabel() {
         VertexLabel personVertexLabel = this.sqlgGraph.getTopology().getPublicSchema().ensureVertexLabelExist("Person",
                 new LinkedHashMap<>() {{
                     put("name", PropertyDefinition.of(PropertyType.STRING, Multiplicity.of(1, 1)));
                 }}
         );
         VertexLabel addressVertexLabel = this.sqlgGraph.getTopology().getPublicSchema().ensureVertexLabelExist("Address",
                 new LinkedHashMap<>() {{
                     put("name", PropertyDefinition.of(PropertyType.STRING, Multiplicity.of(1, 1)));
                 }}
         );
         EdgeLabel personAddressEdgeLabel = personVertexLabel.ensureEdgeLabelExist(
                 "address",
                 addressVertexLabel,
                 EdgeDefinition.of(
                         Multiplicity.of(0, 1, true),
                         Multiplicity.of(1, 3, true)
                 )
         );
         this.sqlgGraph.tx().commit();
         this.sqlgGraph.getTopology().lock();
         Vertex john = this.sqlgGraph.addVertex(T.label, "Person", "name", "John");
         Vertex peter = this.sqlgGraph.addVertex(T.label, "Person", "name", "peter");
         Vertex johnHomeAddress = this.sqlgGraph.addVertex(T.label, "Address", "name", "home");
         Vertex johnWorkAddress = this.sqlgGraph.addVertex(T.label, "Address", "name", "work");
         Vertex johnVacationAddress = this.sqlgGraph.addVertex(T.label, "Address", "name", "vacation");
         john.addEdge("address", johnHomeAddress);
         john.addEdge("address", johnWorkAddress);
         john.addEdge("address", johnVacationAddress);
         peter.addEdge("address", johnHomeAddress);
 
         this.sqlgGraph.tx().checkMultiplicity(personVertexLabel, Direction.OUT, personAddressEdgeLabel, addressVertexLabel);
         boolean fails = false;
         try {
             this.sqlgGraph.tx().checkMultiplicity(addressVertexLabel, Direction.IN, personAddressEdgeLabel, personVertexLabel);
         } catch (RuntimeException e) {
             fails = true;
             if (isPostgres()) {
                 System.out.println(e.getMessage());
                 String msg = String.format("Multiplicity check for EdgeLabel 'address' fails for '%s'.\nUpper multiplicity is [1] current multiplicity is [2]", johnHomeAddress.id().toString());
                 System.out.println(msg);
                 assertTrue(e.getMessage().contains(msg));
             }
         }
         assertTrue(fails);
         this.sqlgGraph.tx().commit();
     }
 
     @Test
     public void testMultiplicity() {
         Schema publicSchema = this.sqlgGraph.getTopology().getPublicSchema();
         VertexLabel aVertexLabel = publicSchema.ensureVertexLabelExist("A");
         VertexLabel bVertexLabel = publicSchema.ensureVertexLabelExist("B");
         aVertexLabel.ensureEdgeLabelExist("ab", bVertexLabel,
                 EdgeDefinition.of(
                         Multiplicity.of(1, 1),
                         Multiplicity.of(5, 5)
                 )
         );
         VertexLabel cVertexLabel = publicSchema.ensureVertexLabelExist("C");
         aVertexLabel.ensureEdgeLabelExist("ab", cVertexLabel,
                 EdgeDefinition.of(
                         Multiplicity.of(1, 1),
                         Multiplicity.of(0, -1)
                 )
         );
 
         Schema aSchema = this.sqlgGraph.getTopology().ensureSchemaExist("A");
         VertexLabel aaVertexLabel = aSchema.ensureVertexLabelExist("A");
         VertexLabel bbVertexLabel = aSchema.ensureVertexLabelExist("B");
         aaVertexLabel.ensureEdgeLabelExist("ab",
                 bbVertexLabel,
                 EdgeDefinition.of(
                         Multiplicity.of(1, 1),
                         Multiplicity.of(1, 1))
         );
         this.sqlgGraph.tx().commit();
 
         Optional<EdgeLabel> abEdgeLabelOptional = aVertexLabel.getOutEdgeLabel("ab");
         Assert.assertTrue(abEdgeLabelOptional.isPresent());
         EdgeLabel abEdgeLabel = abEdgeLabelOptional.get();
         Set<EdgeRole> inEdgeRoles = abEdgeLabel.getInEdgeRoles();
         Assert.assertEquals(2, inEdgeRoles.size());
         Set<EdgeRole> outEdgeRoles = abEdgeLabel.getOutEdgeRoles();
         Assert.assertEquals(1, outEdgeRoles.size());
         Assert.assertEquals(0, abEdgeLabel.getProperties().size());
         EdgeRole outEdgeRoleForVertexLabel = abEdgeLabel.getOutEdgeRoles(aVertexLabel);
         Assert.assertNotNull(outEdgeRoleForVertexLabel);
         Assert.assertEquals(Multiplicity.of(1, 1), outEdgeRoleForVertexLabel.getMultiplicity());
         EdgeRole inEdgeRoleForVertexLabel = abEdgeLabel.getInEdgeRoles(bVertexLabel);
         Assert.assertNotNull(inEdgeRoleForVertexLabel);
         Assert.assertEquals(Multiplicity.of(5, 5), inEdgeRoleForVertexLabel.getMultiplicity());
     }
 
     @Test
     public void testLoadMultiplicity() {
         try (SqlgGraph sqlgGraph2 = SqlgGraph.open(configuration)) {
             VertexLabel aVertexLabel = sqlgGraph2.getTopology().getPublicSchema().ensureVertexLabelExist("A");
             VertexLabel bVertexLabel = sqlgGraph2.getTopology().getPublicSchema().ensureVertexLabelExist("B");
             aVertexLabel.ensureEdgeLabelExist("ab", bVertexLabel,
                     EdgeDefinition.of(
                             Multiplicity.of(5, 5),
                             Multiplicity.of(5, 5))
             );
             sqlgGraph2.tx().commit();
         }
         try (SqlgGraph sqlgGraph2 = SqlgGraph.open(configuration)) {
             Optional<VertexLabel> optionalAVertexLabel = sqlgGraph2.getTopology().getPublicSchema().getVertexLabel("A");
             Assert.assertTrue(optionalAVertexLabel.isPresent());
             Optional<VertexLabel> optionalBVertexLabel = sqlgGraph2.getTopology().getPublicSchema().getVertexLabel("B");
             Assert.assertTrue(optionalBVertexLabel.isPresent());
             Optional<EdgeLabel> optionalEdgeLabel = sqlgGraph2.getTopology().getPublicSchema().getEdgeLabel("ab");
             Assert.assertTrue(optionalEdgeLabel.isPresent());
             EdgeRole edgeRole = optionalEdgeLabel.get().getOutEdgeRoles(optionalAVertexLabel.get());
             Assert.assertNotNull(edgeRole);
             Multiplicity multiplicity = edgeRole.getMultiplicity();
             Assert.assertEquals(Multiplicity.of(5, 5), multiplicity);
             edgeRole = optionalEdgeLabel.get().getInEdgeRoles(optionalBVertexLabel.get());
             Assert.assertNotNull(edgeRole);
             Assert.assertEquals(Multiplicity.of(5, 5), multiplicity);
         }
     }
 
 }