You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tinkerpop.apache.org by ok...@apache.org on 2015/06/11 18:30:45 UTC

incubator-tinkerpop git commit: added Path.getSingle(pop, label) and Path.getList(label). Right now, just default methods in Path. Added two new tests to PathTest which ensures proper semantics for all Path implementations (PATH_SUPPLIERS). Moved PathTest

Repository: incubator-tinkerpop
Updated Branches:
  refs/heads/master 9f9ccf166 -> 1d576d88e


added Path.getSingle(pop,label) and Path.getList(label). Right now, just default methods in Path. Added two new tests to PathTest which ensures proper semantics for all Path implementations (PATH_SUPPLIERS). Moved PathTest to its right directory. Added Pop to AbstractImportCustomizer as we will use it in select()-soon.


Project: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/commit/1d576d88
Tree: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/tree/1d576d88
Diff: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/diff/1d576d88

Branch: refs/heads/master
Commit: 1d576d88e233eb5c850fd19f67229f20bd707901
Parents: 9f9ccf1
Author: Marko A. Rodriguez <ok...@gmail.com>
Authored: Thu Jun 11 10:30:39 2015 -0600
Committer: Marko A. Rodriguez <ok...@gmail.com>
Committed: Thu Jun 11 10:30:39 2015 -0600

----------------------------------------------------------------------
 CHANGELOG.asciidoc                              |   1 +
 README.asciidoc                                 |   2 +-
 .../gremlin/process/traversal/Path.java         |  22 +-
 .../gremlin/process/traversal/Pop.java          |  31 +++
 .../AbstractImportCustomizerProvider.java       |   3 +-
 .../gremlin/process/ProcessStandardSuite.java   |   3 +-
 .../gremlin/process/traversal/PathTest.java     | 212 +++++++++++++++++++
 .../process/traversal/step/util/PathTest.java   | 168 ---------------
 8 files changed, 270 insertions(+), 172 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/1d576d88/CHANGELOG.asciidoc
----------------------------------------------------------------------
diff --git a/CHANGELOG.asciidoc b/CHANGELOG.asciidoc
index ce89d77..c65a036 100644
--- a/CHANGELOG.asciidoc
+++ b/CHANGELOG.asciidoc
@@ -25,6 +25,7 @@ image::http://www.tinkerpop.com/docs/current/images/gremlin-hindu.png[width=225]
 TinkerPop 3.0.0.GA (NOT OFFICIALLY RELEASED YET)
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
+* Added `Path.getSingle(pop,label)` and `Path.getList(label)` as default helpers in `Path`.
 * Gremlin Server `Settings` now has sensible defaults thus allowing the server to be started with no additional configuration.
 * Fixed garbled characters in Gremlin Console that notably showed up in `:help`
 * `GraphTraversal.and()` (and `or()`) now take `Object...` composed of `P` predicates or `Traversals` to be converted to `TraversalP`.

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/1d576d88/README.asciidoc
----------------------------------------------------------------------
diff --git a/README.asciidoc b/README.asciidoc
index 77be81f..141c5bf 100644
--- a/README.asciidoc
+++ b/README.asciidoc
@@ -36,7 +36,7 @@ TinkerPop requires `Java 1.8.0_40+` for proper building and proper operations.
 ** Specify specific tests in a TinkerPop Suite to run with the `GREMLIN_TESTS` environment variable, along with the Maven project list argument, e.g.:
 +
 ----
-export GREMLIN_TESTS='org.apache.tinkerpop.gremlin.process.traversal.step.map.PathTest$Traversals,org.apache.tinkerpop.gremlin.process.traversal.step.util.PathTest'
+export GREMLIN_TESTS='org.apache.tinkerpop.gremlin.process.traversal.step.map.PathTest$Traversals,org.apache.tinkerpop.gremlin.process.traversal.PathTest'
 mvn -Dmaven.javadoc.skip=true --projects tinkergraph-gremlin test
 ----
 ** Clean the `.groovy/grapes/org.apache.tinkerpop` directory on build: `mvn clean install -DcleanGrapes`

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/1d576d88/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Path.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Path.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Path.java
index d20fe2c..a8f2680 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Path.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Path.java
@@ -31,7 +31,7 @@ import java.util.stream.IntStream;
 import java.util.stream.Stream;
 
 /**
- * A Path denotes a particular walk through a {@link Graph} as defined by a {@link Traverser}.
+ * A Path denotes a particular walk through a {@link Graph} as defined by a {@link Traversal}.
  * In abstraction, any Path implementation maintains two lists: a list of sets of labels and a list of objects.
  * The list of labels are the labels of the steps traversed. The list of objects are the objects traversed.
  *
@@ -97,6 +97,26 @@ public interface Path extends Cloneable {
         return (A) object;
     }
 
+    public default <A> List<A> getList(final String label) throws IllegalArgumentException {
+        if (this.hasLabel(label)) {
+            final Object object = this.get(label);
+            if (object instanceof List)
+                return (List<A>) object;
+            else
+                return Collections.singletonList((A) object);
+        } else {
+            return Collections.emptyList();
+        }
+    }
+
+    public default <A> A getSingle(final Pop pop, final String label) throws IllegalArgumentException {
+        final Object object = this.get(label);
+        if (object instanceof List) {
+            return Pop.head == pop ? ((List<A>) object).get(((List) object).size() - 1) : ((List<A>) object).get(0);
+        } else
+            return (A) object;
+    }
+
     /**
      * Get the object associated with the specified index into the path.
      *

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/1d576d88/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Pop.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Pop.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Pop.java
new file mode 100644
index 0000000..9acd8c2
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Pop.java
@@ -0,0 +1,31 @@
+/*
+ *
+ *  * Licensed to the Apache Software Foundation (ASF) under one
+ *  * or more contributor license agreements.  See the NOTICE file
+ *  * distributed with this work for additional information
+ *  * regarding copyright ownership.  The ASF licenses this file
+ *  * to you under the Apache License, Version 2.0 (the
+ *  * "License"); you may not use this file except in compliance
+ *  * with the License.  You may obtain a copy of the License at
+ *  *
+ *  * http://www.apache.org/licenses/LICENSE-2.0
+ *  *
+ *  * Unless required by applicable law or agreed to in writing,
+ *  * software distributed under the License is distributed on an
+ *  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  * KIND, either express or implied.  See the License for the
+ *  * specific language governing permissions and limitations
+ *  * under the License.
+ *
+ */
+
+package org.apache.tinkerpop.gremlin.process.traversal;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public enum Pop {
+
+    head,
+    tail
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/1d576d88/gremlin-groovy/src/main/java/org/apache/tinkerpop/gremlin/groovy/AbstractImportCustomizerProvider.java
----------------------------------------------------------------------
diff --git a/gremlin-groovy/src/main/java/org/apache/tinkerpop/gremlin/groovy/AbstractImportCustomizerProvider.java b/gremlin-groovy/src/main/java/org/apache/tinkerpop/gremlin/groovy/AbstractImportCustomizerProvider.java
index fcef79d..2e4c626 100644
--- a/gremlin-groovy/src/main/java/org/apache/tinkerpop/gremlin/groovy/AbstractImportCustomizerProvider.java
+++ b/gremlin-groovy/src/main/java/org/apache/tinkerpop/gremlin/groovy/AbstractImportCustomizerProvider.java
@@ -30,6 +30,7 @@ import org.apache.tinkerpop.gremlin.process.computer.traversal.TraversalVertexPr
 import org.apache.tinkerpop.gremlin.process.traversal.Operator;
 import org.apache.tinkerpop.gremlin.process.traversal.Order;
 import org.apache.tinkerpop.gremlin.process.traversal.P;
+import org.apache.tinkerpop.gremlin.process.traversal.Pop;
 import org.apache.tinkerpop.gremlin.process.traversal.Scope;
 import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
 import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal;
@@ -104,7 +105,7 @@ public abstract class AbstractImportCustomizerProvider implements ImportCustomiz
         staticImports.add(Order.class.getCanonicalName() + DOT_STAR);
         staticImports.add(Operator.class.getCanonicalName() + DOT_STAR);
         staticImports.add(Scope.class.getCanonicalName() + DOT_STAR);
-
+        staticImports.add(Pop.class.getCanonicalName() + DOT_STAR);
 
         // utils
         imports.add(Gremlin.class.getPackage().getName() + DOT_STAR);

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/1d576d88/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/ProcessStandardSuite.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/ProcessStandardSuite.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/ProcessStandardSuite.java
index 1888761..9762a5b 100644
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/ProcessStandardSuite.java
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/ProcessStandardSuite.java
@@ -20,6 +20,7 @@ package org.apache.tinkerpop.gremlin.process;
 
 import org.apache.tinkerpop.gremlin.AbstractGremlinSuite;
 import org.apache.tinkerpop.gremlin.process.traversal.CoreTraversalTest;
+import org.apache.tinkerpop.gremlin.process.traversal.PathTest;
 import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
 import org.apache.tinkerpop.gremlin.process.traversal.TraversalSideEffectsTest;
 import org.apache.tinkerpop.gremlin.process.traversal.step.branch.BranchTest;
@@ -153,7 +154,7 @@ public class ProcessStandardSuite extends AbstractGremlinSuite {
 
             // util
             TraversalSideEffectsTest.Traversals.class,
-            org.apache.tinkerpop.gremlin.process.traversal.step.util.PathTest.class,
+            PathTest.class,
 
             // compliance
             CoreTraversalTest.class,

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/1d576d88/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/PathTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/PathTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/PathTest.java
new file mode 100644
index 0000000..02f0553
--- /dev/null
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/PathTest.java
@@ -0,0 +1,212 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.tinkerpop.gremlin.process.traversal;
+
+import org.apache.tinkerpop.gremlin.LoadGraphWith;
+import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.ImmutablePath;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.MutablePath;
+import org.apache.tinkerpop.gremlin.structure.util.detached.DetachedPath;
+import org.apache.tinkerpop.gremlin.structure.util.reference.ReferencePath;
+import org.junit.Test;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.function.Supplier;
+
+import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.out;
+import static org.junit.Assert.*;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public class PathTest extends AbstractGremlinProcessTest {
+
+    private final static List<Supplier<Path>> PATH_SUPPLIERS =
+            Arrays.asList(MutablePath::make, ImmutablePath::make, DetachedPath::make, ReferencePath::make);
+
+    @Test
+    public void shouldHaveStandardSemanticsImplementedCorrectly() {
+        PATH_SUPPLIERS.forEach(supplier -> {
+            Path path = supplier.get();
+            assertTrue(path.isSimple());
+            assertEquals(0, path.size());
+            path = path.extend(1, Collections.singleton("a"));
+            path = path.extend(2, Collections.singleton("b"));
+            path = path.extend(3, Collections.singleton("c"));
+            assertEquals(3, path.size());
+            assertEquals(Integer.valueOf(1), path.get("a"));
+            assertEquals(Integer.valueOf(2), path.get("b"));
+            assertEquals(Integer.valueOf(3), path.get("c"));
+            path.addLabel("d");
+            assertEquals(3, path.size());
+            assertEquals(Integer.valueOf(1), path.get("a"));
+            assertEquals(Integer.valueOf(2), path.get("b"));
+            assertEquals(Integer.valueOf(3), path.get("c"));
+            assertEquals(Integer.valueOf(3), path.get("d"));
+            assertTrue(path.hasLabel("a"));
+            assertTrue(path.hasLabel("b"));
+            assertTrue(path.hasLabel("c"));
+            assertTrue(path.hasLabel("d"));
+            assertFalse(path.hasLabel("e"));
+            assertTrue(path.isSimple());
+            path = path.extend(3, Collections.singleton("e"));
+            assertFalse(path.isSimple());
+            assertTrue(path.hasLabel("e"));
+            assertEquals(4, path.size());
+            assertEquals(Integer.valueOf(1), path.get(0));
+            assertEquals(Integer.valueOf(2), path.get(1));
+            assertEquals(Integer.valueOf(3), path.get(2));
+            assertEquals(Integer.valueOf(3), path.get(3));
+        });
+    }
+
+    @Test
+    @LoadGraphWith(LoadGraphWith.GraphData.MODERN)
+    public void shouldHandleMultiLabelPaths() {
+        PATH_SUPPLIERS.forEach(supplier -> {
+            Path path = supplier.get();
+            path = path.extend("marko", Collections.singleton("a"));
+            path = path.extend("stephen", Collections.singleton("b"));
+            path = path.extend("matthias", Collections.singleton("a"));
+            assertEquals(3, path.size());
+            assertEquals(3, path.objects().size());
+            assertEquals(3, path.labels().size());
+            assertEquals(2, new HashSet<>(path.labels()).size());
+            assertTrue(path.get("a") instanceof List);
+            assertTrue(path.get("b") instanceof String);
+            assertEquals(2, path.<List<String>>get("a").size());
+            assertTrue(path.<List<String>>get("a").contains("marko"));
+            assertTrue(path.<List<String>>get("a").contains("matthias"));
+        });
+
+        final Path path = g.V().as("x").repeat(out().as("y")).times(2).path().by("name").next();
+        assertEquals(3, path.size());
+        assertEquals(3, path.labels().size());
+        assertEquals(2, new HashSet<>(path.labels()).size());
+        assertTrue(path.get("x") instanceof String);
+        assertTrue(path.get("y") instanceof List);
+        assertEquals(2, path.<List<String>>get("y").size());
+        assertTrue(path.<List<String>>get("y").contains("josh"));
+        assertTrue(path.<List<String>>get("y").contains("ripple") || path.<List<String>>get("y").contains("lop"));
+    }
+
+    @Test
+    public void shouldExcludeUnlabeledLabelsFromPath() {
+        PATH_SUPPLIERS.forEach(supplier -> {
+            Path path = supplier.get();
+            path = path.extend("marko", "a");
+            path = path.extend("stephen", "b");
+            path = path.extend("matthias", "c", "d");
+            assertEquals(3, path.size());
+            assertEquals(3, path.objects().size());
+            assertEquals(3, path.labels().size());
+            assertEquals(1, path.labels().get(0).size());
+            assertEquals(1, path.labels().get(1).size());
+            assertEquals("b", path.labels().get(1).iterator().next());
+            assertEquals(2, path.labels().get(2).size());
+            assertTrue(path.labels().get(2).contains("c"));
+            assertTrue(path.labels().get(2).contains("d"));
+        });
+    }
+
+    @Test
+    public void shouldHaveOrderedPathLabels() {
+        PATH_SUPPLIERS.forEach(supplier -> {
+            Path path = supplier.get();
+            path = path.extend("marko", "a", "b");
+            path = path.extend("stephen", "c", "a");
+            path = path.extend("matthias", "a", "b");
+            assertEquals(3, path.size());
+            assertEquals(3, path.objects().size());
+            assertEquals(3, path.labels().size());
+            assertEquals(2, path.labels().get(0).size());
+            assertEquals(2, path.labels().get(1).size());
+            assertEquals(2, path.labels().get(2).size());
+            ///
+            Iterator<String> labels = path.labels().get(0).iterator();
+            assertEquals("a", labels.next());
+            assertEquals("b", labels.next());
+            assertFalse(labels.hasNext());
+            labels = path.labels().get(1).iterator();
+            assertEquals("c", labels.next());
+            assertEquals("a", labels.next());
+            assertFalse(labels.hasNext());
+            labels = path.labels().get(2).iterator();
+            assertEquals("a", labels.next());
+            assertEquals("b", labels.next());
+            assertFalse(labels.hasNext());
+            ///
+            List<String> names = path.get("a");
+            assertEquals("marko", names.get(0));
+            assertEquals("stephen", names.get(1));
+            assertEquals("matthias", names.get(2));
+            names = path.get("b");
+            assertEquals("marko", names.get(0));
+            assertEquals("matthias", names.get(1));
+            assertEquals("stephen", path.get("c"));
+        });
+    }
+
+    @Test
+    public void shouldSelectSingleCorrectly() {
+        PATH_SUPPLIERS.forEach(supplier -> {
+            Path path = supplier.get();
+            path = path.extend("marko", "a", "b");
+            path = path.extend("stephen", "a", "c");
+            path = path.extend("matthias", "c", "d");
+            assertEquals(3, path.size());
+            assertEquals("marko", path.getSingle(Pop.tail, "a"));
+            assertEquals("marko", path.getSingle(Pop.tail, "b"));
+            assertEquals("stephen", path.getSingle(Pop.tail, "c"));
+            assertEquals("matthias", path.getSingle(Pop.tail, "d"));
+            ///
+            assertEquals("marko", path.getSingle(Pop.head, "b"));
+            assertEquals("stephen", path.getSingle(Pop.head, "a"));
+            assertEquals("matthias", path.getSingle(Pop.head, "c"));
+            assertEquals("matthias", path.getSingle(Pop.head, "d"));
+        });
+    }
+
+    @Test
+    public void shouldSelectListCorrectly() {
+        PATH_SUPPLIERS.forEach(supplier -> {
+            Path path = supplier.get();
+            path = path.extend("marko", "a", "b");
+            path = path.extend("stephen", "a", "c");
+            path = path.extend("matthias", "c", "d");
+            assertEquals(3, path.size());
+            assertEquals(2, path.getList("a").size());
+            assertEquals("marko", path.getList("a").get(0));
+            assertEquals("stephen", path.getList("a").get(1));
+            assertEquals(1, path.getList("b").size());
+            assertEquals("marko", path.getList("b").get(0));
+            assertEquals(2, path.getList("c").size());
+            assertEquals("stephen", path.getList("c").get(0));
+            assertEquals("matthias", path.getList("c").get(1));
+            assertEquals(1, path.getList("d").size());
+            assertEquals("matthias", path.getList("d").get(0));
+            ///
+            assertEquals(0,path.getList("noExist").size());
+        });
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/1d576d88/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/PathTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/PathTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/PathTest.java
deleted file mode 100644
index ace5693..0000000
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/PathTest.java
+++ /dev/null
@@ -1,168 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.tinkerpop.gremlin.process.traversal.step.util;
-
-import org.apache.tinkerpop.gremlin.LoadGraphWith;
-import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
-import org.apache.tinkerpop.gremlin.process.traversal.Path;
-import org.apache.tinkerpop.gremlin.structure.util.detached.DetachedPath;
-import org.apache.tinkerpop.gremlin.structure.util.reference.ReferencePath;
-import org.junit.Test;
-
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.function.Supplier;
-
-import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.out;
-import static org.junit.Assert.*;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public class PathTest extends AbstractGremlinProcessTest {
-
-    private final static List<Supplier<Path>> PATH_SUPPLIERS =
-            Arrays.asList(MutablePath::make, ImmutablePath::make, DetachedPath::make, ReferencePath::make);
-
-    @Test
-    public void shouldHaveStandardSemanticsImplementedCorrectly() {
-        PATH_SUPPLIERS.forEach(supplier -> {
-            Path path = supplier.get();
-            assertTrue(path.isSimple());
-            assertEquals(0, path.size());
-            path = path.extend(1, Collections.singleton("a"));
-            path = path.extend(2, Collections.singleton("b"));
-            path = path.extend(3, Collections.singleton("c"));
-            assertEquals(3, path.size());
-            assertEquals(Integer.valueOf(1), path.get("a"));
-            assertEquals(Integer.valueOf(2), path.get("b"));
-            assertEquals(Integer.valueOf(3), path.get("c"));
-            path.addLabel("d");
-            assertEquals(3, path.size());
-            assertEquals(Integer.valueOf(1), path.get("a"));
-            assertEquals(Integer.valueOf(2), path.get("b"));
-            assertEquals(Integer.valueOf(3), path.get("c"));
-            assertEquals(Integer.valueOf(3), path.get("d"));
-            assertTrue(path.hasLabel("a"));
-            assertTrue(path.hasLabel("b"));
-            assertTrue(path.hasLabel("c"));
-            assertTrue(path.hasLabel("d"));
-            assertFalse(path.hasLabel("e"));
-            assertTrue(path.isSimple());
-            path = path.extend(3, Collections.singleton("e"));
-            assertFalse(path.isSimple());
-            assertTrue(path.hasLabel("e"));
-            assertEquals(4, path.size());
-            assertEquals(Integer.valueOf(1), path.get(0));
-            assertEquals(Integer.valueOf(2), path.get(1));
-            assertEquals(Integer.valueOf(3), path.get(2));
-            assertEquals(Integer.valueOf(3), path.get(3));
-        });
-    }
-
-    @Test
-    @LoadGraphWith(LoadGraphWith.GraphData.MODERN)
-    public void shouldHandleMultiLabelPaths() {
-        PATH_SUPPLIERS.forEach(supplier -> {
-            Path path = supplier.get();
-            path = path.extend("marko", Collections.singleton("a"));
-            path = path.extend("stephen", Collections.singleton("b"));
-            path = path.extend("matthias", Collections.singleton("a"));
-            assertEquals(3, path.size());
-            assertEquals(3, path.objects().size());
-            assertEquals(3, path.labels().size());
-            assertEquals(2, new HashSet<>(path.labels()).size());
-            assertTrue(path.get("a") instanceof List);
-            assertTrue(path.get("b") instanceof String);
-            assertEquals(2, path.<List<String>>get("a").size());
-            assertTrue(path.<List<String>>get("a").contains("marko"));
-            assertTrue(path.<List<String>>get("a").contains("matthias"));
-        });
-
-        final Path path = g.V().as("x").repeat(out().as("y")).times(2).path().by("name").next();
-        assertEquals(3, path.size());
-        assertEquals(3, path.labels().size());
-        assertEquals(2, new HashSet<>(path.labels()).size());
-        assertTrue(path.get("x") instanceof String);
-        assertTrue(path.get("y") instanceof List);
-        assertEquals(2, path.<List<String>>get("y").size());
-        assertTrue(path.<List<String>>get("y").contains("josh"));
-        assertTrue(path.<List<String>>get("y").contains("ripple") || path.<List<String>>get("y").contains("lop"));
-    }
-
-    @Test
-    public void shouldExcludeUnlabeledLabelsFromPath() {
-        PATH_SUPPLIERS.forEach(supplier -> {
-            Path path = supplier.get();
-            path = path.extend("marko", "a");
-            path = path.extend("stephen", "b");
-            path = path.extend("matthias", "c", "d");
-            assertEquals(3, path.size());
-            assertEquals(3, path.objects().size());
-            assertEquals(3, path.labels().size());
-            assertEquals(1, path.labels().get(0).size());
-            assertEquals(1, path.labels().get(1).size());
-            assertEquals("b", path.labels().get(1).iterator().next());
-            assertEquals(2, path.labels().get(2).size());
-            assertTrue(path.labels().get(2).contains("c"));
-            assertTrue(path.labels().get(2).contains("d"));
-        });
-    }
-
-    @Test
-    public void shouldHaveOrderedPathLabels() {
-        PATH_SUPPLIERS.forEach(supplier -> {
-            Path path = supplier.get();
-            path = path.extend("marko", "a", "b");
-            path = path.extend("stephen", "c", "a");
-            path = path.extend("matthias", "a", "b");
-            assertEquals(3, path.size());
-            assertEquals(3, path.objects().size());
-            assertEquals(3, path.labels().size());
-            assertEquals(2, path.labels().get(0).size());
-            assertEquals(2, path.labels().get(1).size());
-            assertEquals(2, path.labels().get(2).size());
-            ///
-            Iterator<String> labels = path.labels().get(0).iterator();
-            assertEquals("a", labels.next());
-            assertEquals("b", labels.next());
-            assertFalse(labels.hasNext());
-            labels = path.labels().get(1).iterator();
-            assertEquals("c", labels.next());
-            assertEquals("a", labels.next());
-            assertFalse(labels.hasNext());
-            labels = path.labels().get(2).iterator();
-            assertEquals("a", labels.next());
-            assertEquals("b", labels.next());
-            assertFalse(labels.hasNext());
-            ///
-            List<String> names = path.get("a");
-            assertEquals("marko", names.get(0));
-            assertEquals("stephen", names.get(1));
-            assertEquals("matthias", names.get(2));
-            names = path.get("b");
-            assertEquals("marko", names.get(0));
-            assertEquals("matthias", names.get(1));
-            assertEquals("stephen", path.get("c"));
-        });
-    }
-}
\ No newline at end of file