You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tinkerpop.apache.org by sp...@apache.org on 2021/10/18 20:38:46 UTC

[tinkerpop] branch master updated (23263fe -> 202f596)

This is an automated email from the ASF dual-hosted git repository.

spmallette pushed a change to branch master
in repository https://gitbox.apache.org/repos/asf/tinkerpop.git.


    from 23263fe  Merge branch '3.5-dev'
     new deff190  Added SeedStrategy to imports CTR
     new c4053b9  Merge branch '3.5-dev'
     new 202f596  Migrated some JVM tests to Gherkin

The 3 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 docs/src/dev/developer/for-committers.asciidoc     |   7 +-
 .../tinkerpop/gremlin/jsr223/CoreImports.java      |   2 +
 .../strategy/decoration/SeedStrategy.java          |   1 -
 .../traversal/translator/JavascriptTranslator.java |  10 +-
 .../translator/JavascriptTranslatorTest.java       |   7 +-
 .../Gremlin.Net.IntegrationTest/Gherkin/Gremlin.cs |   5 +
 gremlin-javascript/build/generate.groovy           |   2 +-
 .../lib/process/traversal-strategy.js              |  11 +++
 .../test/cucumber/feature-steps.js                 |   3 +-
 .../gremlin-javascript/test/cucumber/gremlin.js    |   7 +-
 .../test/integration/traversal-test.js             |  12 ++-
 gremlin-python/src/main/python/radish/gremlin.py   |   5 +
 gremlin-test/features/filter/Coin.feature          |  14 ++-
 .../features/integrated/Miscellaneous.feature      |  75 ++++++++++++++
 gremlin-test/features/integrated/Paths.feature     | 109 +++++++++++++++++++++
 .../Recommendation.feature}                        |  41 ++++----
 .../tinkerpop/gremlin/features/StepDefinition.java |   5 +-
 .../process/traversal/CoreTraversalTest.java       |  76 --------------
 .../spark/SparkGraphFeatureIntegrateTest.java      |   1 +
 .../gremlin/tinkergraph/TinkerGraphWorld.java      |   1 +
 20 files changed, 285 insertions(+), 109 deletions(-)
 create mode 100644 gremlin-test/features/integrated/Miscellaneous.feature
 create mode 100644 gremlin-test/features/integrated/Paths.feature
 copy gremlin-test/features/{filter/Coin.feature => integrated/Recommendation.feature} (54%)

[tinkerpop] 01/03: Added SeedStrategy to imports CTR

Posted by sp...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

spmallette pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/tinkerpop.git

commit deff1906512fe677d16b2513b79b0c6c9ff0058d
Author: Stephen Mallette <st...@amazon.com>
AuthorDate: Thu Oct 14 15:51:34 2021 -0400

    Added SeedStrategy to imports CTR
---
 .../src/main/java/org/apache/tinkerpop/gremlin/jsr223/CoreImports.java  | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/jsr223/CoreImports.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/jsr223/CoreImports.java
index 60865c7..503c31a 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/jsr223/CoreImports.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/jsr223/CoreImports.java
@@ -75,6 +75,7 @@ import org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.Elemen
 import org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.EventStrategy;
 import org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.HaltedTraverserStrategy;
 import org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.PartitionStrategy;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.SeedStrategy;
 import org.apache.tinkerpop.gremlin.process.traversal.strategy.finalization.ReferenceElementStrategy;
 import org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.SubgraphStrategy;
 import org.apache.tinkerpop.gremlin.process.traversal.strategy.finalization.MatchAlgorithmStrategy;
@@ -266,6 +267,7 @@ public final class CoreImports {
         CLASS_IMPORTS.add(LambdaRestrictionStrategy.class);
         CLASS_IMPORTS.add(ReadOnlyStrategy.class);
         CLASS_IMPORTS.add(ReferenceElementStrategy.class);
+        CLASS_IMPORTS.add(SeedStrategy.class);
         CLASS_IMPORTS.add(StandardVerificationStrategy.class);
         CLASS_IMPORTS.add(EdgeLabelVerificationStrategy.class);
         CLASS_IMPORTS.add(VertexProgramRestrictionStrategy.class);

[tinkerpop] 02/03: Merge branch '3.5-dev'

Posted by sp...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

spmallette pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/tinkerpop.git

commit c4053b959ed899f4a5ccc80f654b6c58bff0efa5
Merge: 23263fe deff190
Author: Stephen Mallette <st...@amazon.com>
AuthorDate: Thu Oct 14 15:51:47 2021 -0400

    Merge branch '3.5-dev'

 .../src/main/java/org/apache/tinkerpop/gremlin/jsr223/CoreImports.java  | 2 ++
 1 file changed, 2 insertions(+)

[tinkerpop] 03/03: Migrated some JVM tests to Gherkin

Posted by sp...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

spmallette pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/tinkerpop.git

commit 202f596423db060b54f2e65718010aaa53827d47
Author: Stephen Mallette <st...@amazon.com>
AuthorDate: Mon Oct 18 16:36:43 2021 -0400

    Migrated some JVM tests to Gherkin
    
    Had to fix a few odds/ends to get this to work - SeedStrategy/JavascriptTranslator needed some adjustment. Expect to backport those changes to 3.5-dev. CTR
---
 docs/src/dev/developer/for-committers.asciidoc     |   7 +-
 .../strategy/decoration/SeedStrategy.java          |   1 -
 .../traversal/translator/JavascriptTranslator.java |  10 +-
 .../translator/JavascriptTranslatorTest.java       |   7 +-
 .../Gremlin.Net.IntegrationTest/Gherkin/Gremlin.cs |   5 +
 gremlin-javascript/build/generate.groovy           |   2 +-
 .../lib/process/traversal-strategy.js              |  11 +++
 .../test/cucumber/feature-steps.js                 |   3 +-
 .../gremlin-javascript/test/cucumber/gremlin.js    |   7 +-
 .../test/integration/traversal-test.js             |  12 ++-
 gremlin-python/src/main/python/radish/gremlin.py   |   5 +
 gremlin-test/features/filter/Coin.feature          |  14 ++-
 .../features/integrated/Miscellaneous.feature      |  75 ++++++++++++++
 gremlin-test/features/integrated/Paths.feature     | 109 +++++++++++++++++++++
 .../Recommendation.feature}                        |  41 ++++----
 .../tinkerpop/gremlin/features/StepDefinition.java |   5 +-
 .../process/traversal/CoreTraversalTest.java       |  76 --------------
 .../spark/SparkGraphFeatureIntegrateTest.java      |   1 +
 .../gremlin/tinkergraph/TinkerGraphWorld.java      |   1 +
 19 files changed, 283 insertions(+), 109 deletions(-)

diff --git a/docs/src/dev/developer/for-committers.asciidoc b/docs/src/dev/developer/for-committers.asciidoc
index 5a7bc19..089726b 100644
--- a/docs/src/dev/developer/for-committers.asciidoc
+++ b/docs/src/dev/developer/for-committers.asciidoc
@@ -473,8 +473,9 @@ Scenario: g_V_outE_drop
 Features have tags associated with them to help allow developers to better break up test runs if they desire. There
 are two types of tags:
 
-* `@StepClass*` - Marks the step grouping and is a prefix that precedes and refers to one of the four types of steps:
-`Branch`, `Filter`, `Map`, and `SideEffect` (e.g. `@StepClassBranch`).
+* `@StepClass*` - Marks the step grouping and is a prefix that precedes and either refers to one of the four types of
+steps: `Branch`, `Filter`, `Map`, and `SideEffect` (e.g. `@StepClassBranch`) or to an `Integrated` grouping that does
+not fit those individual classifications well.
 * `@Step*` - Marks testing for a particular step. While this tag is generally unique to the feature
 file itself and test filtering could be accomplished at that level by way of the file, the use of the tag is a
 secondary option and allows filtering to be consistently managed by tags alone. The suffix is the Gremlin step itself
@@ -496,6 +497,8 @@ mid-`V()` step is not supported.
 is not compatible with `GraphComputer`
 * `@GraphComputerVerificationReferenceOnly` - The scenario itself is not written to support `GraphComputer` because it
 tries to reference inaccessible properties that are on elements only available by "reference" (i.e `T.id` only).
+* `@GraphComputerVerificationStrategyNotSupported` - The scenario uses a traversal strategy that is not supported by
+`GraphComputer`.
 * `@GraphComputerVerificationStarGraphExceeded` - The scenario itself is not written to support `GraphComputer` because
 the traversal does not mind the star graph limitation.
 * `@MultiMetaProperties` - The scenario uses "The Crew" graph as a dataset or otherwise utilizes multi-properties
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/SeedStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/SeedStrategy.java
index dbf9324..9a9d00b 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/SeedStrategy.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/SeedStrategy.java
@@ -72,7 +72,6 @@ public class SeedStrategy extends AbstractTraversalStrategy<TraversalStrategy.De
     @Override
     public Configuration getConfiguration() {
         final Map<String, Object> map = new HashMap<>();
-        map.put(STRATEGY, SeedStrategy.class.getCanonicalName());
         map.put(ID_SEED, this.seed);
         return new MapConfiguration(map);
     }
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/translator/JavascriptTranslator.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/translator/JavascriptTranslator.java
index df427b4..b96b6ab 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/translator/JavascriptTranslator.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/translator/JavascriptTranslator.java
@@ -266,7 +266,15 @@ public final class JavascriptTranslator implements Translator.ScriptTranslator {
                 return script.append("new " + o.getStrategyClass().getSimpleName() + "()");
             } else {
                 script.append("new " + o.getStrategyClass().getSimpleName() + "(");
-                convertToScript(ConfigurationConverter.getMap(o.getConfiguration()));
+                final Map<Object,Object> conf = ConfigurationConverter.getMap(o.getConfiguration());
+                script.append("{");
+                conf.entrySet().forEach(entry -> {
+                    script.append(entry.getKey().toString());
+                    script.append(":");
+                    convertToScript(entry.getValue()).getScript();
+                    script.append(",");
+                });
+                script.setCharAtEnd('}');
                 return script.append(")");
             }
         }
diff --git a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/translator/JavascriptTranslatorTest.java b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/translator/JavascriptTranslatorTest.java
index 8ae9f4c..1a0f1c0 100644
--- a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/translator/JavascriptTranslatorTest.java
+++ b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/translator/JavascriptTranslatorTest.java
@@ -24,6 +24,7 @@ import org.apache.tinkerpop.gremlin.process.traversal.Pop;
 import org.apache.tinkerpop.gremlin.process.traversal.Scope;
 import org.apache.tinkerpop.gremlin.process.traversal.Translator;
 import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.SeedStrategy;
 import org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.SubgraphStrategy;
 import org.apache.tinkerpop.gremlin.process.traversal.strategy.verification.ReadOnlyStrategy;
 import org.apache.tinkerpop.gremlin.structure.Column;
@@ -55,9 +56,11 @@ public class JavascriptTranslatorTest {
     @Test
     public void shouldTranslateStrategies() throws Exception {
         assertEquals("g.withStrategies(new ReadOnlyStrategy()," +
-                        "new SubgraphStrategy(new Map([[\"checkAdjacentVertices\",false],[\"vertices\",__.hasLabel(\"person\")]]))).V().has(\"name\")",
+                        "new SubgraphStrategy({checkAdjacentVertices:false,vertices:__.hasLabel(\"person\")})," +
+                        "new SeedStrategy({seed:999999})).V().has(\"name\")",
                 translator.translate(g.withStrategies(ReadOnlyStrategy.instance(),
-                        SubgraphStrategy.build().checkAdjacentVertices(false).vertices(hasLabel("person")).create()).
+                        SubgraphStrategy.build().checkAdjacentVertices(false).vertices(hasLabel("person")).create(),
+                        new SeedStrategy(999999)).
                         V().has("name").asAdmin().getBytecode()).getScript());
     }
 
diff --git a/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/Gremlin.cs b/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/Gremlin.cs
index f11f119..e124297 100644
--- a/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/Gremlin.cs
+++ b/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/Gremlin.cs
@@ -320,6 +320,11 @@ namespace Gremlin.Net.IntegrationTest.Gherkin
                {"g_V_asXaX_outEXcreatedX_asXbX_inV_asXcX_inXcreatedX_asXdX_whereXa_ltXbX_orXgtXcXX_andXneqXdXXX_byXageX_byXweightX_byXinXcreatedX_valuesXageX_minX_selectXa_c_dX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().As("a").OutE("created").As("b").InV().As("c").In("created").As("d").Where("a",P.Lt("b").Or(P.Gt("c")).And(P.Neq("d"))).By("age").By("weight").By(__.In("created").Values<object>("age").Min<object>()).Select<object>("a","c [...]
                {"g_VX1X_asXaX_out_hasXageX_whereXgtXaXX_byXageX_name", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V(p["vid1"]).As("a").Out().Has("age").Where(P.Gt("a")).By("age").Values<object>("name")}}, 
                {"g_VX3X_asXaX_in_out_asXbX_whereXa_eqXbXX_byXageX_name", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V(p["vid3"]).As("a").In().Out().As("b").Where("a",P.Eq("b")).By("age").Values<object>("name")}}, 
+               {"g_V_coworker", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().HasLabel("person").Filter(__.OutE("created")).Aggregate("p").As("p1").Values<object>("name").As("p1n").Select<object>("p").Unfold<object>().Where(P.Neq("p1")).As("p2").Values<object>("name").As("p2n").Select<object>("p2").Out("created").Choose<object>(__.In("created").Where(P.Eq("p1")),__.Values<object>("name"),__.Constant<object>(p["xx1"])).Group<object,object>(). [...]
+               {"g_V_coworker_with_midV", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().HasLabel("person").Filter(__.OutE("created")).As("p1").V().HasLabel("person").Where(P.Neq("p1")).Filter(__.OutE("created")).As("p2").Map<object>(__.Out("created").Where(__.In("created").As("p1")).Values<object>("name").Fold()).Group<object,object>().By(__.Select<object>("p1").By("name")).By(__.Group<object,object>().By(__.Select<object>("p2").By("name")). [...]
+               {"g_V_playlist_paths", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.WithStrategies(new SeedStrategy(seed: 100)).V().Has("name","Bob_Dylan").In("sungBy").As("a").Repeat(__.Out().Order().By(Order.Shuffle).SimplePath().From("a")).Until(__.Out("writtenBy").Has("name","Johnny_Cash")).Limit<object>(1).As("b").Repeat(__.Out().Order().By(Order.Shuffle).As("c").SimplePath().From("b").To("c")).Until(__.Out("sungBy").Has("name","Grateful_De [...]
+               {"g_V_shortestpath", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().As("v").Both().As("v").Project<object>("src","tgt","p").By(__.Select<object>(Pop.First,"v")).By(__.Select<object>(Pop.Last,"v")).By(__.Select<object>(Pop.All,"v")).As("triple").Group("x").By(__.Select<object>("src","tgt")).By(__.Select<object>("p").Fold()).Select<object>("tgt").Barrier().Repeat(__.Both().As("v").Project<object>("src","tgt","p").By(__.Select<obj [...]
+               {"g_V_classic_recommendation", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().Has("name","DARK STAR").As("a").Out("followedBy").Aggregate("stash").In("followedBy").Where(P.Neq("a").And(P.Without(new List<object> {"stash"}))).GroupCount<object>().Unfold<object>().Project<object>("x","y","z").By(__.Select<object>(Column.Keys).Values<object>("name")).By(__.Select<object>(Column.Keys).Values<object>("performances")).By(__.Select<ob [...]
                {"g_VX1X_asXaX_outXcreatedX_addEXcreatedByX_toXaX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("person").Property("name","marko").Property("age",29).As("marko").AddV("person").Property("name","vadas").Property("age",27).As("vadas").AddV("software").Property("name","lop").Property("lang","java").As("lop").AddV("person").Property("name","josh").Property("age",32).As("josh").AddV("software").Property("name","ripple").Property [...]
                {"g_VX1X_asXaX_outXcreatedX_addEXcreatedByX_toXaX_propertyXweight_2X", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("person").Property("name","marko").Property("age",29).As("marko").AddV("person").Property("name","vadas").Property("age",27).As("vadas").AddV("software").Property("name","lop").Property("lang","java").As("lop").AddV("person").Property("name","josh").Property("age",32).As("josh").AddV("software").Property("name" [...]
                {"g_V_outE_propertyXweight_nullX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("person").Property("name","marko").Property("age",29).As("marko").AddV("person").Property("name","vadas").Property("age",27).As("vadas").AddV("software").Property("name","lop").Property("lang","java").As("lop").AddV("person").Property("name","josh").Property("age",32).As("josh").AddV("software").Property("name","ripple").Property("lang","java").A [...]
diff --git a/gremlin-javascript/build/generate.groovy b/gremlin-javascript/build/generate.groovy
index 520bd90..75e7087 100644
--- a/gremlin-javascript/build/generate.groovy
+++ b/gremlin-javascript/build/generate.groovy
@@ -74,7 +74,7 @@ radishGremlinFile.withWriter('UTF-8') { Writer writer ->
     writer.writeLine(
                     'const graphTraversalModule = require(\'../../lib/process/graph-traversal\');\n' +
                     'const traversalModule = require(\'../../lib/process/traversal\');\n' +
-                    'const { TraversalStrategies, VertexProgramStrategy, OptionsStrategy } = require(\'../../lib/process/traversal-strategy\');\n' +
+                    'const { TraversalStrategies, VertexProgramStrategy, OptionsStrategy, SeedStrategy } = require(\'../../lib/process/traversal-strategy\');\n' +
                     'const __ = graphTraversalModule.statics;\n' +
                     'const Barrier = traversalModule.barrier\n' +
                     'const Cardinality = traversalModule.cardinality\n' +
diff --git a/gremlin-javascript/src/main/javascript/gremlin-javascript/lib/process/traversal-strategy.js b/gremlin-javascript/src/main/javascript/gremlin-javascript/lib/process/traversal-strategy.js
index 7539a26..cf561ae 100644
--- a/gremlin-javascript/src/main/javascript/gremlin-javascript/lib/process/traversal-strategy.js
+++ b/gremlin-javascript/src/main/javascript/gremlin-javascript/lib/process/traversal-strategy.js
@@ -288,6 +288,16 @@ class ReservedKeysVerificationStrategy extends TraversalStrategy {
   }
 }
 
+class SeedStrategy extends TraversalStrategy {
+  /**
+   * @param {Object} [options]
+   * @param {number} [options.seed] the seed to provide to the random number generator for the traversal
+   */
+  constructor(options) {
+    super("org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.SeedStrategy",{seed: options.seed});
+  }
+}
+
 module.exports = {
   TraversalStrategies: TraversalStrategies,
   TraversalStrategy: TraversalStrategy,
@@ -297,6 +307,7 @@ module.exports = {
   HaltedTraverserStrategy: HaltedTraverserStrategy,
   OptionsStrategy: OptionsStrategy,
   PartitionStrategy: PartitionStrategy,
+  SeedStrategy: SeedStrategy,
   SubgraphStrategy: SubgraphStrategy,
   VertexProgramStrategy: VertexProgramStrategy,
   // finalization
diff --git a/gremlin-javascript/src/main/javascript/gremlin-javascript/test/cucumber/feature-steps.js b/gremlin-javascript/src/main/javascript/gremlin-javascript/test/cucumber/feature-steps.js
index 49a7891..7a9c8ee 100644
--- a/gremlin-javascript/src/main/javascript/gremlin-javascript/test/cucumber/feature-steps.js
+++ b/gremlin-javascript/src/main/javascript/gremlin-javascript/test/cucumber/feature-steps.js
@@ -70,7 +70,8 @@ const ignoredScenarios = {
   'g_withSideEffectXa_setX_V_both_name_aggregateXlocal_aX_capXaX': new IgnoreError(ignoreReason.setNotSupported),
   'g_V_group_byXageX': new IgnoreError(ignoreReason.nullKeysInMapNotSupportedWell),
   'g_V_shortestPath_edgesIncluded': new IgnoreError(ignoreReason.needsFurtherInvestigation),
-  'g_V_shortestPath_edgesIncluded_edgesXoutEX': new IgnoreError(ignoreReason.needsFurtherInvestigation)
+  'g_V_shortestPath_edgesIncluded_edgesXoutEX': new IgnoreError(ignoreReason.needsFurtherInvestigation),
+  'g_V_shortestpath': new IgnoreError(ignoreReason.needsFurtherInvestigation)
 };
 
 Given(/^the (.+) graph$/, function (graphName) {
diff --git a/gremlin-javascript/src/main/javascript/gremlin-javascript/test/cucumber/gremlin.js b/gremlin-javascript/src/main/javascript/gremlin-javascript/test/cucumber/gremlin.js
index 22e99b2..7999060 100644
--- a/gremlin-javascript/src/main/javascript/gremlin-javascript/test/cucumber/gremlin.js
+++ b/gremlin-javascript/src/main/javascript/gremlin-javascript/test/cucumber/gremlin.js
@@ -26,7 +26,7 @@
 
 const graphTraversalModule = require('../../lib/process/graph-traversal');
 const traversalModule = require('../../lib/process/traversal');
-const { TraversalStrategies, VertexProgramStrategy, OptionsStrategy } = require('../../lib/process/traversal-strategy');
+const { TraversalStrategies, VertexProgramStrategy, OptionsStrategy, SeedStrategy } = require('../../lib/process/traversal-strategy');
 const __ = graphTraversalModule.statics;
 const Barrier = traversalModule.barrier
 const Cardinality = traversalModule.cardinality
@@ -309,6 +309,11 @@ const gremlins = {
     g_V_asXaX_outEXcreatedX_asXbX_inV_asXcX_inXcreatedX_asXdX_whereXa_ltXbX_orXgtXcXX_andXneqXdXXX_byXageX_byXweightX_byXinXcreatedX_valuesXageX_minX_selectXa_c_dX: [function({g}) { return g.V().as("a").outE("created").as("b").inV().as("c").in_("created").as("d").where("a",P.lt("b").or(P.gt("c")).and(P.neq("d"))).by("age").by("weight").by(__.in_("created").values("age").min()).select("a","c","d").by("name") }], 
     g_VX1X_asXaX_out_hasXageX_whereXgtXaXX_byXageX_name: [function({g, vid1}) { return g.V(vid1).as("a").out().has("age").where(P.gt("a")).by("age").values("name") }], 
     g_VX3X_asXaX_in_out_asXbX_whereXa_eqXbXX_byXageX_name: [function({g, vid3}) { return g.V(vid3).as("a").in_().out().as("b").where("a",P.eq("b")).by("age").values("name") }], 
+    g_V_coworker: [function({g, xxx1}) { return g.V().hasLabel("person").filter(__.outE("created")).aggregate("p").as("p1").values("name").as("p1n").select("p").unfold().where(P.neq("p1")).as("p2").values("name").as("p2n").select("p2").out("created").choose(__.in_("created").where(P.eq("p1")),__.values("name"),__.constant(xxx1)).group().by(__.select("p1n")).by(__.group().by(__.select("p2n")).by(__.unfold().fold().project("numCoCreated","coCreated").by(__.count(Scope.local)).by())).unfold() }], 
+    g_V_coworker_with_midV: [function({g}) { return g.V().hasLabel("person").filter(__.outE("created")).as("p1").V().hasLabel("person").where(P.neq("p1")).filter(__.outE("created")).as("p2").map(__.out("created").where(__.in_("created").as("p1")).values("name").fold()).group().by(__.select("p1").by("name")).by(__.group().by(__.select("p2").by("name")).by(__.project("numCoCreated","coCreated").by(__.count(Scope.local)).by())).unfold() }], 
+    g_V_playlist_paths: [function({g}) { return g.withStrategies(new SeedStrategy({seed:100})).V().has("name","Bob_Dylan").in_("sungBy").as("a").repeat(__.out().order().by(Order.shuffle).simplePath().from_("a")).until(__.out("writtenBy").has("name","Johnny_Cash")).limit(1).as("b").repeat(__.out().order().by(Order.shuffle).as("c").simplePath().from_("b").to("c")).until(__.out("sungBy").has("name","Grateful_Dead")).limit(1).path().from_("a").unfold().project("song","artists").by("name").by [...]
+    g_V_shortestpath: [function({g}) { return g.V().as("v").both().as("v").project("src","tgt","p").by(__.select(Pop.first,"v")).by(__.select(Pop.last,"v")).by(__.select(Pop.all,"v")).as("triple").group("x").by(__.select("src","tgt")).by(__.select("p").fold()).select("tgt").barrier().repeat(__.both().as("v").project("src","tgt","p").by(__.select(Pop.first,"v")).by(__.select(Pop.last,"v")).by(__.select(Pop.all,"v")).as("t").filter(__.select(Pop.all,"p").count(Scope.local).as("l").select(P [...]
+    g_V_classic_recommendation: [function({g}) { return g.V().has("name","DARK STAR").as("a").out("followedBy").aggregate("stash").in_("followedBy").where(P.neq("a").and(P.without(["stash"]))).groupCount().unfold().project("x","y","z").by(__.select(Column.keys).values("name")).by(__.select(Column.keys).values("performances")).by(__.select(Column.values)).order().by(__.select("z"),Order.desc).by(__.select("y"),Order.asc).limit(5).aggregate(Scope.local,"m").select("x") }], 
     g_VX1X_asXaX_outXcreatedX_addEXcreatedByX_toXaX: [function({g, vid1}) { return g.addV("person").property("name","marko").property("age",29).as("marko").addV("person").property("name","vadas").property("age",27).as("vadas").addV("software").property("name","lop").property("lang","java").as("lop").addV("person").property("name","josh").property("age",32).as("josh").addV("software").property("name","ripple").property("lang","java").as("ripple").addV("person").property("name","peter").pr [...]
     g_VX1X_asXaX_outXcreatedX_addEXcreatedByX_toXaX_propertyXweight_2X: [function({g, vid1}) { return g.addV("person").property("name","marko").property("age",29).as("marko").addV("person").property("name","vadas").property("age",27).as("vadas").addV("software").property("name","lop").property("lang","java").as("lop").addV("person").property("name","josh").property("age",32).as("josh").addV("software").property("name","ripple").property("lang","java").as("ripple").addV("person").property [...]
     g_V_outE_propertyXweight_nullX: [function({g}) { return g.addV("person").property("name","marko").property("age",29).as("marko").addV("person").property("name","vadas").property("age",27).as("vadas").addV("software").property("name","lop").property("lang","java").as("lop").addV("person").property("name","josh").property("age",32).as("josh").addV("software").property("name","ripple").property("lang","java").as("ripple").addV("person").property("name","peter").property("age",35).as("pe [...]
diff --git a/gremlin-javascript/src/main/javascript/gremlin-javascript/test/integration/traversal-test.js b/gremlin-javascript/src/main/javascript/gremlin-javascript/test/integration/traversal-test.js
index bc19e8a..1bc91a3 100644
--- a/gremlin-javascript/src/main/javascript/gremlin-javascript/test/integration/traversal-test.js
+++ b/gremlin-javascript/src/main/javascript/gremlin-javascript/test/integration/traversal-test.js
@@ -29,7 +29,7 @@ const DriverRemoteConnection = require('../../lib/driver/driver-remote-connectio
 const { Vertex } = require('../../lib/structure/graph');
 const { traversal } = require('../../lib/process/anonymous-traversal');
 const { GraphTraversalSource, GraphTraversal, statics } = require('../../lib/process/graph-traversal');
-const { SubgraphStrategy, ReadOnlyStrategy,
+const { SubgraphStrategy, ReadOnlyStrategy, SeedStrategy,
         ReservedKeysVerificationStrategy, EdgeLabelVerificationStrategy } = require('../../lib/process/traversal-strategy');
 const Bytecode = require('../../lib/process/bytecode');
 const helper = require('../helper');
@@ -170,6 +170,16 @@ describe('Traversal', function () {
     });
   });
   describe("should allow TraversalStrategy definition", function() {
+    it('should allow SeedStrategy', function () {
+      const g = traversal().withRemote(connection).withStrategies(
+        new SeedStrategy({seed: 999999}));
+      g.V().count().next().then(function (item1) {
+        assert.ok(item1);
+        assert.strictEqual(item1.value, 4);
+      }, (err) => assert.fail("tanked: " + err));
+    })
+  });
+  describe("should allow TraversalStrategy definition", function() {
     it('should allow SubgraphStrategy', function() {
       const g = traversal().withRemote(connection).withStrategies(
           new SubgraphStrategy({vertices:__.hasLabel("person"), edges:__.hasLabel("created")}));
diff --git a/gremlin-python/src/main/python/radish/gremlin.py b/gremlin-python/src/main/python/radish/gremlin.py
index 9d09361..a32f4fa 100644
--- a/gremlin-python/src/main/python/radish/gremlin.py
+++ b/gremlin-python/src/main/python/radish/gremlin.py
@@ -294,6 +294,11 @@ world.gremlins = {
     'g_V_asXaX_outEXcreatedX_asXbX_inV_asXcX_inXcreatedX_asXdX_whereXa_ltXbX_orXgtXcXX_andXneqXdXXX_byXageX_byXweightX_byXinXcreatedX_valuesXageX_minX_selectXa_c_dX': [(lambda g:g.V().as_('a').outE('created').as_('b').inV().as_('c').in_('created').as_('d').where('a',P.lt('b').or_(P.gt('c')).and_(P.neq('d'))).by('age').by('weight').by(__.in_('created').age.min()).select('a','c','d').by('name'))], 
     'g_VX1X_asXaX_out_hasXageX_whereXgtXaXX_byXageX_name': [(lambda g, vid1=None:g.V(vid1).as_('a').out().has('age').where(P.gt('a')).by('age').name)], 
     'g_VX3X_asXaX_in_out_asXbX_whereXa_eqXbXX_byXageX_name': [(lambda g, vid3=None:g.V(vid3).as_('a').in_().out().as_('b').where('a',P.eq('b')).by('age').name)], 
+    'g_V_coworker': [(lambda g, xxx1=None:g.V().hasLabel('person').filter(__.outE('created')).aggregate('p').as_('p1').name.as_('p1n').select('p').unfold().where(P.neq('p1')).as_('p2').name.as_('p2n').select('p2').out('created').choose(__.in_('created').where(P.eq('p1')),__.name,__.constant(xxx1)).group().by(__.select('p1n')).by(__.group().by(__.select('p2n')).by(__.unfold().fold().project('numCoCreated','coCreated').by(__.count(Scope.local)).by())).unfold())], 
+    'g_V_coworker_with_midV': [(lambda g:g.V().hasLabel('person').filter(__.outE('created')).as_('p1').V().hasLabel('person').where(P.neq('p1')).filter(__.outE('created')).as_('p2').map(__.out('created').where(__.in_('created').as_('p1')).name.fold()).group().by(__.select('p1').by('name')).by(__.group().by(__.select('p2').by('name')).by(__.project('numCoCreated','coCreated').by(__.count(Scope.local)).by())).unfold())], 
+    'g_V_playlist_paths': [(lambda g:g.withStrategies(*[TraversalStrategy('SeedStrategy',{'seed':100}, 'org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.SeedStrategy')]).V().has('name','Bob_Dylan').in_('sungBy').as_('a').repeat(__.out().order().by(Order.shuffle).simplePath().from_('a')).until(__.out('writtenBy').has('name','Johnny_Cash'))[0:1].as_('b').repeat(__.out().order().by(Order.shuffle).as_('c').simplePath().from_('b').to('c')).until(__.out('sungBy').has('name',' [...]
+    'g_V_shortestpath': [(lambda g:g.V().as_('v').both().as_('v').project('src','tgt','p').by(__.select(Pop.first,'v')).by(__.select(Pop.last,'v')).by(__.select(Pop.all_,'v')).as_('triple').group('x').by(__.select('src','tgt')).by(__.select('p').fold()).select('tgt').barrier().repeat(__.both().as_('v').project('src','tgt','p').by(__.select(Pop.first,'v')).by(__.select(Pop.last,'v')).by(__.select(Pop.all_,'v')).as_('t').filter(__.select(Pop.all_,'p').count(Scope.local).as_('l').select(Pop [...]
+    'g_V_classic_recommendation': [(lambda g:g.V().has('name','DARK STAR').as_('a').out('followedBy').aggregate('stash').in_('followedBy').where(P.neq('a').and_(P.without(['stash']))).groupCount().unfold().project('x','y','z').by(__.select(Column.keys).name).by(__.select(Column.keys).performances).by(__.select(Column.values)).order().by(__.select('z'),Order.desc).by(__.select('y'),Order.asc)[0:5].aggregate(Scope.local,'m').select('x'))], 
     'g_VX1X_asXaX_outXcreatedX_addEXcreatedByX_toXaX': [(lambda g, vid1=None:g.addV('person').property('name','marko').property('age',29).as_('marko').addV('person').property('name','vadas').property('age',27).as_('vadas').addV('software').property('name','lop').property('lang','java').as_('lop').addV('person').property('name','josh').property('age',32).as_('josh').addV('software').property('name','ripple').property('lang','java').as_('ripple').addV('person').property('name','peter').pro [...]
     'g_VX1X_asXaX_outXcreatedX_addEXcreatedByX_toXaX_propertyXweight_2X': [(lambda g, vid1=None:g.addV('person').property('name','marko').property('age',29).as_('marko').addV('person').property('name','vadas').property('age',27).as_('vadas').addV('software').property('name','lop').property('lang','java').as_('lop').addV('person').property('name','josh').property('age',32).as_('josh').addV('software').property('name','ripple').property('lang','java').as_('ripple').addV('person').property( [...]
     'g_V_outE_propertyXweight_nullX': [(lambda g:g.addV('person').property('name','marko').property('age',29).as_('marko').addV('person').property('name','vadas').property('age',27).as_('vadas').addV('software').property('name','lop').property('lang','java').as_('lop').addV('person').property('name','josh').property('age',32).as_('josh').addV('software').property('name','ripple').property('lang','java').as_('ripple').addV('person').property('name','peter').property('age',35).as_('peter') [...]
diff --git a/gremlin-test/features/filter/Coin.feature b/gremlin-test/features/filter/Coin.feature
index 20e405e..8def707 100644
--- a/gremlin-test/features/filter/Coin.feature
+++ b/gremlin-test/features/filter/Coin.feature
@@ -41,4 +41,16 @@ Feature: Step - coin()
       g.V().coin(0.0)
       """
     When iterated to list
-    Then the result should be empty
\ No newline at end of file
+    Then the result should be empty
+
+  @GraphComputerVerificationStrategyNotSupported
+  Scenario: g_withStrategiesXSeedStrategyX_V_coinX50X
+    Given the modern graph
+    And the traversal of
+      """
+      g.withStrategies(new SeedStrategy(seed: 999999)).V().coin(0.5)
+      """
+    When iterated to list
+    Then the result should be unordered
+      | result |
+      | v[marko] |
\ No newline at end of file
diff --git a/gremlin-test/features/integrated/Miscellaneous.feature b/gremlin-test/features/integrated/Miscellaneous.feature
new file mode 100644
index 0000000..9ec56f4
--- /dev/null
+++ b/gremlin-test/features/integrated/Miscellaneous.feature
@@ -0,0 +1,75 @@
+# 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.
+
+@StepClassIntegrated
+Feature: Step - miscellaneous
+
+  Scenario: g_V_coworker
+    Given the modern graph
+    And using the parameter xx1 defined as "l[]"
+    And the traversal of
+      """
+      g.V().hasLabel("person").
+        filter(__.outE("created")).
+        aggregate("p").as("p1").
+        values("name").as("p1n").
+        select("p").unfold().
+        where(neq("p1")).as("p2").values("name").as("p2n").
+        select("p2").
+        out("created").
+        choose(__.in("created").where(eq("p1")), values("name"), constant(xx1)).
+        group().
+          by(__.select("p1n")).
+          by(__.group().
+                  by(__.select("p2n")).
+                  by(__.unfold().fold().
+                     project("numCoCreated", "coCreated").
+                       by(__.count(local)).by())).
+        unfold()
+      """
+    When iterated to list
+    Then the result should be unordered
+      | result |
+      | m[{"peter": {"josh": {"numCoCreated":"d[1].l", "coCreated":["lop"]}, "marko": {"numCoCreated":"d[1].l", "coCreated":["lop"]}}}] |
+      | m[{"josh": {"peter": {"numCoCreated":"d[1].l", "coCreated":["lop"]}, "marko": {"numCoCreated":"d[1].l", "coCreated":["lop"]}}}] |
+      | m[{"marko": {"peter": {"numCoCreated":"d[1].l", "coCreated":["lop"]}, "josh": {"numCoCreated":"d[1].l", "coCreated":["lop"]}}}] |
+
+  @GraphComputerVerificationMidVNotSupported
+  Scenario: g_V_coworker_with_midV
+    Given the modern graph
+    And the traversal of
+      """
+      g.V().hasLabel("person").
+        filter(__.outE("created")).as("p1").
+        V().hasLabel("person").
+        where(P.neq("p1")).
+        filter(__.outE("created")).as("p2").
+        map(__.out("created").where(__.in("created").as("p1")).values("name").fold()).
+        group().
+          by(__.select("p1").by("name")).
+          by(__.group().by(select("p2").by("name")).
+          by(__.project("numCoCreated", "coCreated").
+                  by(__.count(local)).by())).
+        unfold()
+      """
+    When iterated to list
+    Then the result should be unordered
+      | result |
+      | m[{"peter": {"josh": {"numCoCreated":"d[1].l", "coCreated":["lop"]}, "marko": {"numCoCreated":"d[1].l", "coCreated":["lop"]}}}] |
+      | m[{"josh": {"peter": {"numCoCreated":"d[1].l", "coCreated":["lop"]}, "marko": {"numCoCreated":"d[1].l", "coCreated":["lop"]}}}] |
+      | m[{"marko": {"peter": {"numCoCreated":"d[1].l", "coCreated":["lop"]}, "josh": {"numCoCreated":"d[1].l", "coCreated":["lop"]}}}] |
+
diff --git a/gremlin-test/features/integrated/Paths.feature b/gremlin-test/features/integrated/Paths.feature
new file mode 100644
index 0000000..5bbd74f
--- /dev/null
+++ b/gremlin-test/features/integrated/Paths.feature
@@ -0,0 +1,109 @@
+# 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.
+
+@StepClassIntegrated
+Feature: Step - paths
+
+  @GraphComputerVerificationStarGraphExceeded
+  Scenario: g_V_playlist_paths
+    Given the grateful graph
+    And the traversal of
+      """
+      g.V().has("name", "Bob_Dylan").
+        in("sungBy").order().by('name').as("a").
+        repeat(__.out().order().by('name').simplePath().from("a")).
+          until(__.out("writtenBy").has("name", "Johnny_Cash")).limit(1).as("b").
+        repeat(__.out().order().by('name').as("c").simplePath().from("b").to("c")).
+          until(__.out("sungBy").has("name", "Grateful_Dead")).limit(1).
+        path().from("a").unfold().
+        project("song", "artists").
+          by("name").
+          by(__.coalesce(__.out("sungBy", "writtenBy").dedup().values("name").order(), __.constant("Unknown")).fold())
+      """
+    When iterated to list
+    Then the result should be unordered
+      | result |
+      | m[{"song": "CHIMES OF FREEDOM", "artists": ["Bob_Dylan"]}] |
+      | m[{"song": "QUEEN JANE", "artists": ["Unknown"]}] |
+      | m[{"song": "ALTHEA", "artists": ["Garcia","Hunter"]}] |
+      | m[{"song": "BIG RIVER", "artists": ["Johnny_Cash","Weir"]}] |
+      | m[{"song": "HES GONE", "artists": ["Garcia","Hunter"]}] |
+      | m[{"song": "CAUTION", "artists": ["Grateful_Dead"]}] |
+
+  @GraphComputerVerificationReferenceOnly
+  Scenario: g_V_shortestpath
+    Given the modern graph
+    And the traversal of
+      """
+      g.V().as("v").both().as("v").
+        project("src", "tgt", "p").
+          by(__.select(first, "v")).
+          by(__.select(last, "v")).
+          by(__.select(Pop.all, "v")).as("triple").
+        group("x").
+          by(__.select("src", "tgt")).
+          by(__.select("p").fold()).select("tgt").barrier().
+        repeat(__.both().as("v").
+                project("src", "tgt", "p").
+                  by(__.select(first, "v")).
+                  by(__.select(last, "v")).
+                  by(__.select(Pop.all, "v")).as("t").
+                filter(__.select(Pop.all, "p").count(local).as("l").
+                       select(Pop.last, "t").select(Pop.all, "p").dedup(Scope.local).count(Scope.local).where(P.eq("l"))).
+                select(Pop.last, "t").
+                not(__.select(Pop.all, "p").as("p").count(local).as("l").
+                    select(Pop.all, "x").unfold().filter(select(keys).where(P.eq("t")).by(select("src", "tgt"))).
+                    filter(__.select(Column.values).unfold().or(__.count(Scope.local).where(P.lt("l")), __.where(P.eq("p"))))).
+                barrier().
+                group("x").
+                  by(__.select("src", "tgt")).
+                  by(__.select(Pop.all, "p").fold()).select("tgt").barrier()).
+        cap("x").select(Column.values).unfold().unfold().map(__.unfold().values("name").fold())
+      """
+    When iterated to list
+    Then the result should be unordered
+      | result |
+      | l[josh,marko,vadas]|
+      | l[ripple,josh,lop]|
+      | l[josh,lop]|
+      | l[peter,lop,marko]|
+      | l[ripple,josh,marko]|
+      | l[josh,marko]|
+      | l[marko,lop]|
+      | l[lop,marko]|
+      | l[josh,lop,peter]|
+      | l[peter,lop,josh]|
+      | l[vadas,marko]|
+      | l[ripple,josh]|
+      | l[marko]|
+      | l[josh]|
+      | l[ripple]|
+      | l[josh,ripple]|
+      | l[peter,lop]|
+      | l[vadas,marko,josh]|
+      | l[lop,josh,ripple]|
+      | l[marko,josh]|
+      | l[lop,marko,vadas]|
+      | l[lop]|
+      | l[peter]|
+      | l[vadas]|
+      | l[marko,josh,ripple]|
+      | l[marko,vadas]|
+      | l[vadas,marko,lop]|
+      | l[lop,peter]|
+      | l[lop,josh]|
+      | l[marko,lop,peter]|
diff --git a/gremlin-test/features/filter/Coin.feature b/gremlin-test/features/integrated/Recommendation.feature
similarity index 54%
copy from gremlin-test/features/filter/Coin.feature
copy to gremlin-test/features/integrated/Recommendation.feature
index 20e405e..eff27fa 100644
--- a/gremlin-test/features/filter/Coin.feature
+++ b/gremlin-test/features/integrated/Recommendation.feature
@@ -15,30 +15,31 @@
 # specific language governing permissions and limitations
 # under the License.
 
-@StepClassFilter @StepCoin
-Feature: Step - coin()
+@StepClassIntegrated
+Feature: Step - recommendation
 
-  Scenario: g_V_coinX1X
-    Given the modern graph
+  Scenario: g_V_classic_recommendation
+    Given the grateful graph
     And the traversal of
       """
-      g.V().coin(1.0)
+      g.V().has("name", "DARK STAR").as("a").out("followedBy").aggregate("stash").
+        in("followedBy").where(P.neq("a").and(P.not(P.within("stash")))).
+        groupCount().
+        unfold().
+        project("x", "y", "z").
+          by(__.select(keys).values("name")).
+          by(__.select(keys).values("performances")).
+          by(__.select(values)).
+        order().
+          by(__.select("z"), Order.desc).
+          by(__.select("y"), Order.asc).
+        limit(5).aggregate(local,"m").select("x")
       """
     When iterated to list
     Then the result should be unordered
       | result |
-      | v[marko] |
-      | v[vadas] |
-      | v[lop] |
-      | v[josh] |
-      | v[ripple] |
-      | v[peter]  |
-
-  Scenario: g_V_coinX0X
-    Given the modern graph
-    And the traversal of
-      """
-      g.V().coin(0.0)
-      """
-    When iterated to list
-    Then the result should be empty
\ No newline at end of file
+      | LET IT GROW |
+      | UNCLE JOHNS BAND |
+      | I KNOW YOU RIDER |
+      | SHIP OF FOOLS |
+      | GOOD LOVING |
\ No newline at end of file
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/features/StepDefinition.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/features/StepDefinition.java
index ada4ae5..410858c 100644
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/features/StepDefinition.java
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/features/StepDefinition.java
@@ -60,6 +60,7 @@ import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
+import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
@@ -324,8 +325,8 @@ public final class StepDefinition {
         // gotta convert Map.Entry to individual Map coz that how we assert those for GLVs - dah
         final List<Object> actual = r.stream().map(o -> {
             if (o instanceof Map.Entry) {
-                return new HashMap() {{
-                    put(((Entry<?, ?>) o).getKey(), ((Entry<?, ?>) o).getValue());
+                return new LinkedHashMap() {{
+                    put(((Map.Entry<?, ?>) o).getKey(), ((Map.Entry<?, ?>) o).getValue());
                 }};
             } else {
                 return o;
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/CoreTraversalTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/CoreTraversalTest.java
index 356677c..e60ec62 100644
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/CoreTraversalTest.java
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/CoreTraversalTest.java
@@ -69,44 +69,6 @@ import static org.junit.Assert.fail;
 public class CoreTraversalTest extends AbstractGremlinProcessTest {
 
     @Test
-    @LoadGraphWith(MODERN)
-    @FeatureRequirement(featureClass = Graph.Features.VertexFeatures.class, feature = Graph.Features.VertexFeatures.FEATURE_ADD_VERTICES)
-    @FeatureRequirement(featureClass = Graph.Features.VertexFeatures.class, feature = Graph.Features.VertexFeatures.FEATURE_ADD_PROPERTY)
-    @FeatureRequirement(featureClass = Graph.Features.VertexFeatures.class, feature = Graph.Features.VertexFeatures.FEATURE_NULL_PROPERTY_VALUES)
-    public void g_addVXpersonX_propertyXname_nullX() {
-        final Traversal<Vertex, Vertex> traversal = g.addV("person").property("name", null);
-        printTraversalForm(traversal);
-        final Vertex nulled = traversal.next();
-        assertFalse(traversal.hasNext());
-        assertEquals("person", nulled.label());
-        assertNull(nulled.value("name"));
-        assertEquals(1, IteratorUtils.count(nulled.properties()));
-        assertEquals(7, IteratorUtils.count(g.V()));
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    @FeatureRequirement(featureClass = Graph.Features.EdgeFeatures.class, feature = Graph.Features.EdgeFeatures.FEATURE_ADD_EDGES)
-    @FeatureRequirement(featureClass = Graph.Features.EdgeFeatures.class, feature = Graph.Features.EdgeFeatures.FEATURE_NULL_PROPERTY_VALUES)
-    public void g_VX1X_asXaX_outXcreatedX_addEXcreatedByX_toXaX_propertyXweight_nullX() {
-        final Traversal<Vertex, Edge> traversal = g.V(convertToVertexId("marko")).as("a").out("created").addE("createdBy").to("a").property("weight", null);
-        printTraversalForm(traversal);
-        int count = 0;
-        while (traversal.hasNext()) {
-            final Edge edge = traversal.next();
-            assertEquals("createdBy", edge.label());
-            assertNull(g.E(edge).<Double>values("weight").next());
-            assertEquals(1, g.E(edge).properties().count().next().intValue());
-            count++;
-
-
-        }
-        assertEquals(1, count);
-        assertEquals(7, IteratorUtils.count(g.E()));
-        assertEquals(6, IteratorUtils.count(g.V()));
-    }
-
-    @Test
     @LoadGraphWith
     public void shouldNeverPropagateANoBulkTraverser() {
         try {
@@ -131,44 +93,6 @@ public class CoreTraversalTest extends AbstractGremlinProcessTest {
 
     @Test
     @LoadGraphWith(MODERN)
-    public void shouldLoadVerticesViaIds() {
-        final List<Vertex> vertices = g.V().toList();
-        final List<Object> ids = vertices.stream().map(Vertex::id).collect(Collectors.toList());
-        final List<Vertex> verticesReloaded = g.V(ids.toArray()).toList();
-        assertEquals(vertices.size(), verticesReloaded.size());
-        assertEquals(new HashSet<>(vertices), new HashSet<>(verticesReloaded));
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void shouldLoadEdgesViaIds() {
-        final List<Edge> edges = g.E().toList();
-        final List<Object> ids = edges.stream().map(Edge::id).collect(Collectors.toList());
-        final List<Edge> edgesReloaded = g.E(ids.toArray()).toList();
-        assertEquals(edges.size(), edgesReloaded.size());
-        assertEquals(new HashSet<>(edges), new HashSet<>(edgesReloaded));
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void shouldLoadVerticesViaVertices() {
-        final List<Vertex> vertices = g.V().toList();
-        final List<Vertex> verticesReloaded = g.V(vertices.toArray()).toList();
-        assertEquals(vertices.size(), verticesReloaded.size());
-        assertEquals(new HashSet<>(vertices), new HashSet<>(verticesReloaded));
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void shouldLoadEdgesViaEdges() {
-        final List<Edge> edges = g.E().toList();
-        final List<Edge> edgesReloaded = g.E(edges.toArray()).toList();
-        assertEquals(edges.size(), edgesReloaded.size());
-        assertEquals(new HashSet<>(edges), new HashSet<>(edgesReloaded));
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
     public void shouldAllowIdsOfMixedTypes() {
         final List<Vertex> vertices = g.V().toList();
         assertEquals(2, g.V(vertices.get(0), vertices.get(1).id()).count().next().intValue());
diff --git a/spark-gremlin/src/test/java/org/apache/tinkerpop/gremlin/spark/SparkGraphFeatureIntegrateTest.java b/spark-gremlin/src/test/java/org/apache/tinkerpop/gremlin/spark/SparkGraphFeatureIntegrateTest.java
index 7ee7450..3b15904 100644
--- a/spark-gremlin/src/test/java/org/apache/tinkerpop/gremlin/spark/SparkGraphFeatureIntegrateTest.java
+++ b/spark-gremlin/src/test/java/org/apache/tinkerpop/gremlin/spark/SparkGraphFeatureIntegrateTest.java
@@ -104,6 +104,7 @@ public class SparkGraphFeatureIntegrateTest {
             "@StepV",
             "@StepIndex", // doesn't look like this works with Spark atm - doesn't serialize (IndexTest not in the ProcessComputerSuite)
             "@GraphComputerVerificationOneBulk",
+            "@GraphComputerVerificationStrategyNotSupported",
             "@GraphComputerVerificationMidVNotSupported",
             "@GraphComputerVerificationInjectionNotSupported",
             "@GraphComputerVerificationStarGraphExceeded",
diff --git a/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/TinkerGraphWorld.java b/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/TinkerGraphWorld.java
index f80b095..cda080f 100644
--- a/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/TinkerGraphWorld.java
+++ b/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/TinkerGraphWorld.java
@@ -108,6 +108,7 @@ public class TinkerGraphWorld implements World {
                 "@StepDrop",
                 "@StepV",
                 "@GraphComputerVerificationOneBulk",
+                "@GraphComputerVerificationStrategyNotSupported",
                 "@GraphComputerVerificationMidVNotSupported",
                 "@GraphComputerVerificationInjectionNotSupported",
                 "@GraphComputerVerificationStarGraphExceeded",