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/09/15 13:20:40 UTC

[tinkerpop] 09/21: TINKERPOP-2601 Improved support around withComputer() testing

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

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

commit 24a87f0dbaba520798ff4b74b11afe23cd88c859
Author: Stephen Mallette <st...@amazon.com>
AuthorDate: Wed Sep 8 12:33:14 2021 -0400

    TINKERPOP-2601 Improved support around withComputer() testing
    
    Adjusted the grammar to allow an existing GraphTraversalSource to be used. Modified the test runners to better trigger use of withComputer() rather than embedding it into the tests themselves. Added many more tags to give runners more control over how the tests are executed. Developed a method by which TinkerGraph can do multiple runs with multiple World implementations.
---
 docs/src/dev/developer/for-committers.asciidoc     |  10 ++
 .../Gherkin/CommonSteps.cs                         |   5 +
 .../Gherkin/GherkinTestRunner.cs                   |   2 +
 .../Gherkin/ScenarioData.cs                        |   1 +
 .../test/cucumber/feature-steps.js                 |   5 +
 .../gremlin-javascript/test/cucumber/world.js      |   5 +
 .../src/main/python/radish/feature_steps.py        |   7 +-
 gremlin-test/features/branch/Choose.feature        |   2 +
 gremlin-test/features/branch/Local.feature         |   1 +
 gremlin-test/features/branch/Optional.feature      |   5 +-
 gremlin-test/features/branch/Repeat.feature        |   8 +-
 gremlin-test/features/filter/And.feature           |   1 +
 gremlin-test/features/filter/Dedup.feature         |   5 +-
 gremlin-test/features/filter/Range.feature         |   5 +
 gremlin-test/features/filter/SimplePath.feature    |   1 +
 gremlin-test/features/filter/Tail.feature          |  22 ++--
 gremlin-test/features/filter/Where.feature         |   8 ++
 gremlin-test/features/map/Coalesce.feature         |   3 +-
 .../features/map/ConnectedComponent.feature        |  12 +-
 gremlin-test/features/map/Count.feature            |   1 +
 gremlin-test/features/map/ElementMap.feature       |   1 +
 gremlin-test/features/map/Loops.feature            |   3 +
 gremlin-test/features/map/Match.feature            |   4 +
 gremlin-test/features/map/Math.feature             |   3 +
 gremlin-test/features/map/Min.feature              |   1 +
 gremlin-test/features/map/PageRank.feature         |  23 ++--
 gremlin-test/features/map/Path.feature             |   4 +
 gremlin-test/features/map/PeerPressure.feature     |   9 +-
 gremlin-test/features/map/Select.feature           |   7 ++
 gremlin-test/features/map/ShortestPath.feature     |  32 ++---
 gremlin-test/features/map/Unfold.feature           |   1 +
 gremlin-test/features/map/Vertex.feature           |   1 +
 gremlin-test/features/sideEffect/Group.feature     |   7 +-
 gremlin-test/features/sideEffect/Sack.feature      |   2 +
 .../gremlin/features/AbstractGuiceFactory.java     |  56 +++++++++
 .../tinkerpop/gremlin/features/StepDefinition.java |   7 +-
 .../gremlin/hadoop/HadoopGraphFeatureTest.java     |   9 +-
 .../gremlin/spark/SparkGraphFeatureTest.java       |  48 ++++++--
 .../TinkerGraphComputerFeatureTest.java            |  52 ++++++++
 .../tinkergraph/TinkerGraphFeatureTest.java        |  70 ++---------
 .../gremlin/tinkergraph/TinkerGraphWorld.java      | 137 +++++++++++++++++++++
 .../io.cucumber.core.backend.ObjectFactory         |   2 +
 42 files changed, 445 insertions(+), 143 deletions(-)

diff --git a/docs/src/dev/developer/for-committers.asciidoc b/docs/src/dev/developer/for-committers.asciidoc
index 60ba841..457a5f2 100644
--- a/docs/src/dev/developer/for-committers.asciidoc
+++ b/docs/src/dev/developer/for-committers.asciidoc
@@ -486,6 +486,16 @@ include or ignore certain tests. The tags enable the practical and necessary abi
 they simply cannot support. It is important to be aware of the following tags when writing tests as not including a
 tag when one is necessary will cause provider tests to fail:
 
+* `@GraphComputerVerificationInjectionNotSupported` - The scenario will not work on with `GraphComputer` because the
+`inject()` step is not supported.
+* `@GraphComputerVerificationMidVNotSupported` - The scenario will not work on with `GraphComputer` because the
+mid-`V()` step is not supported.
+* `@GraphComputerVerificationOneBulk` - The scenario will not work because `withBulk(false)` is configured and that
+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).
+* `@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
 or meta-properties for creating or querying data.
 * `@RemoteOnly` - The scenario uses some Gremlin syntax that cannot be supported outside of remote test executions. The
diff --git a/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/CommonSteps.cs b/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/CommonSteps.cs
index 0c17cc3..a2941eb 100644
--- a/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/CommonSteps.cs
+++ b/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/CommonSteps.cs
@@ -114,6 +114,11 @@ namespace Gremlin.Net.IntegrationTest.Gherkin
             {
                 throw new InvalidOperationException("g should be a traversal source");
             }
+
+            if (ScenarioData.CurrentFeature.Tags.Select(t => t.Name).ToList().Contains("@GraphComputerOnly"))
+            {
+                _g = _g.WithComputer();
+            }
             
             _traversal =
                 Gremlin.UseTraversal(ScenarioData.CurrentScenario.Name, _g, _parameters);
diff --git a/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/GherkinTestRunner.cs b/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/GherkinTestRunner.cs
index ce33709..4cc21d5 100644
--- a/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/GherkinTestRunner.cs
+++ b/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/GherkinTestRunner.cs
@@ -143,6 +143,8 @@ namespace Gremlin.Net.IntegrationTest.Gherkin
                         }
 
                         scenarioData.CurrentScenario = scenario;
+                        scenarioData.CurrentFeature = feature;
+
                         var result = ExecuteStep(stepDefinition, currentStep.Value, step);
                         if (result != null)
                         {
diff --git a/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/ScenarioData.cs b/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/ScenarioData.cs
index 28979a3..99731fe 100644
--- a/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/ScenarioData.cs
+++ b/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/ScenarioData.cs
@@ -50,6 +50,7 @@ namespace Gremlin.Net.IntegrationTest.Gherkin
         private readonly RemoteConnectionFactory _connectionFactory;
 
         public Scenario CurrentScenario;
+        public Feature CurrentFeature;
 
         public ScenarioDataPerGraph GetByGraphName(string name)
         {
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 07be9f9..49a7891 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
@@ -80,6 +80,11 @@ Given(/^the (.+) graph$/, function (graphName) {
   this.graphName = graphName;
   const data = this.getData();
   this.g = traversal().withRemote(data.connection);
+
+  if (this.isGraphComputer) {
+    this.g = this.g.withComputer();
+  }
+
   if (graphName === 'empty') {
     return this.cleanEmptyGraph();
   }
diff --git a/gremlin-javascript/src/main/javascript/gremlin-javascript/test/cucumber/world.js b/gremlin-javascript/src/main/javascript/gremlin-javascript/test/cucumber/world.js
index b9211c0..aae38df 100644
--- a/gremlin-javascript/src/main/javascript/gremlin-javascript/test/cucumber/world.js
+++ b/gremlin-javascript/src/main/javascript/gremlin-javascript/test/cucumber/world.js
@@ -38,6 +38,7 @@ function TinkerPopWorld(){
   this.cache = null;
   this.graphName = null;
   this.parameters = {};
+  this.isGraphComputer = false;
 }
 
 TinkerPopWorld.prototype.getData = function () {
@@ -95,6 +96,10 @@ Before(function (info) {
   this.cache = cache;
 });
 
+Before({tags: "@GraphComputerOnly"}, function() {
+  this.isGraphComputer = true;
+})
+
 function getVertices(connection) {
   const g = traversal().withRemote(connection);
   return g.V().group().by('name').by(__.tail()).next().then(it => it.value);
diff --git a/gremlin-python/src/main/python/radish/feature_steps.py b/gremlin-python/src/main/python/radish/feature_steps.py
index fe1ea44..82ec15b 100644
--- a/gremlin-python/src/main/python/radish/feature_steps.py
+++ b/gremlin-python/src/main/python/radish/feature_steps.py
@@ -79,7 +79,12 @@ def add_parameter(step, param_name, param):
 def translate_traversal(step):
     step.context.ignore = step.text in ignores
     p = step.context.traversal_params if hasattr(step.context, "traversal_params") else {}
-    p['g'] = step.context.g
+    localg = step.context.g
+    tagset = [ tag.name for tag in step.all_tags ]
+    print(str(tagset))
+    if "GraphComputerOnly" in tagset:
+        localg = step.context.g.withComputer()
+    p['g'] = localg
     step.context.traversal = step.context.traversals.pop(0)(**p)
 
 
diff --git a/gremlin-test/features/branch/Choose.feature b/gremlin-test/features/branch/Choose.feature
index 42d7257..9696563 100644
--- a/gremlin-test/features/branch/Choose.feature
+++ b/gremlin-test/features/branch/Choose.feature
@@ -141,6 +141,7 @@ Feature: Step - choose()
       | result |
       | m[{"young":"d[1].l", "old":"d[3].l"}] |
 
+  @GraphComputerVerificationInjectionNotSupported
   Scenario: g_injectX1X_chooseXisX1X__constantX10Xfold__foldX
     Given the empty graph
     And using the parameter xx1 defined as "d[10].i"
@@ -154,6 +155,7 @@ Feature: Step - choose()
       | result |
       | l[d[10].i] |
 
+  @GraphComputerVerificationInjectionNotSupported
   Scenario: g_injectX2X_chooseXisX1X__constantX10Xfold__foldX
     Given the empty graph
     And using the parameter xx1 defined as "d[10].i"
diff --git a/gremlin-test/features/branch/Local.feature b/gremlin-test/features/branch/Local.feature
index e3e8099..315235e 100644
--- a/gremlin-test/features/branch/Local.feature
+++ b/gremlin-test/features/branch/Local.feature
@@ -168,6 +168,7 @@ Feature: Step - local()
       | marko |
       | marko |
 
+  @GraphComputerVerificationStarGraphExceeded
   Scenario: g_V_localXmatchXproject__created_person__person_name_nameX_selectXname_projectX_by_byXnameX
     Given the modern graph
     And the traversal of
diff --git a/gremlin-test/features/branch/Optional.feature b/gremlin-test/features/branch/Optional.feature
index 26d33b4..7ac8ff4 100644
--- a/gremlin-test/features/branch/Optional.feature
+++ b/gremlin-test/features/branch/Optional.feature
@@ -42,6 +42,7 @@ Feature: Step - choose()
       | result |
       | v[marko] |
 
+  @GraphComputerVerificationStarGraphExceeded
   Scenario: g_V_hasLabelXpersonX_optionalXoutXknowsX_optionalXoutXcreatedXXX_path
     Given the modern graph
     And the traversal of
@@ -60,7 +61,8 @@ Feature: Step - choose()
       | p[v[vadas]] |
       | p[v[josh]] |
       | p[v[peter]] |
-    
+
+  @GraphComputerVerificationStarGraphExceeded
   Scenario: g_V_optionalXout_optionalXoutXX_path
     Given the modern graph
     And the traversal of
@@ -81,6 +83,7 @@ Feature: Step - choose()
       | p[v[ripple]] |
       | p[v[peter],v[lop]] |
 
+  @GraphComputerVerificationStarGraphExceeded
   Scenario: g_VX1X_optionalXaddVXdogXX_label
     Given the empty graph
     And the graph initializer of
diff --git a/gremlin-test/features/branch/Repeat.feature b/gremlin-test/features/branch/Repeat.feature
index bc2f520..cfc8d6b 100644
--- a/gremlin-test/features/branch/Repeat.feature
+++ b/gremlin-test/features/branch/Repeat.feature
@@ -48,6 +48,7 @@ Feature: Step - repeat()
       | marko |
       | marko |
 
+  @GraphComputerVerificationReferenceOnly
   Scenario: g_V_repeatXoutE_inVX_timesX2X_path_by_name_by_label
     Given the modern graph
     And the traversal of
@@ -223,6 +224,7 @@ Feature: Step - repeat()
       | result |
       | m[{"ripple":"d[3].l","vadas":"d[3].l","josh":"d[4].l","lop":"d[10].l","marko":"d[4].l"}] |
 
+  @GraphComputerVerificationReferenceOnly
   Scenario: g_V_hasXname_markoX_repeatXoutE_inV_simplePathX_untilXhasXname_rippleXX_path_byXnameX_byXlabelX
     Given the modern graph
     And the traversal of
@@ -238,6 +240,7 @@ Feature: Step - repeat()
       | created |
       | ripple  |
 
+  @GraphComputerVerificationReferenceOnly
   Scenario: g_V_hasXloop_name_loopX_repeatXinX_timesX5X_path_by_name
     Given the sink graph
     And the traversal of
@@ -254,6 +257,7 @@ Feature: Step - repeat()
       | loop  |
       | loop  |
 
+  @GraphComputerVerificationReferenceOnly
   Scenario: g_V_repeatXout_repeatXoutX_timesX1XX_timesX1X_limitX1X_path_by_name
       Given the modern graph
       And the traversal of
@@ -266,7 +270,7 @@ Feature: Step - repeat()
         | marko |
         | josh |
         | ripple |
-
+  @GraphComputerVerificationReferenceOnly
   Scenario: g_V_repeatXoutXknowsXX_untilXrepeatXoutXcreatedXX_emitXhasXname_lopXXX_path_byXnameX
       Given the modern graph
       And the traversal of
@@ -314,6 +318,7 @@ Feature: Step - repeat()
       | java |
       | java |
 
+  @GraphComputerVerificationReferenceOnly
   Scenario: g_VX3X_repeatXbothX_createdXX_untilXloops_is_40XXemit_repeatXin_knowsXX_emit_loopsXisX1Xdedup_values
       Given the modern graph
       And using the parameter vid3 defined as "v[lop].id"
@@ -353,6 +358,7 @@ Feature: Step - repeat()
       | java |
       | java |
 
+  @GraphComputerVerificationReferenceOnly
   Scenario: g_VX6X_repeatXa_bothXcreatedX_simplePathX_emitXrepeatXb_bothXknowsXX_untilXloopsXbX_asXb_whereXloopsXaX_asXbX_hasXname_vadasXX_dedup_name
     Given the modern graph
     And using the parameter vid6 defined as "v[peter].id"
diff --git a/gremlin-test/features/filter/And.feature b/gremlin-test/features/filter/And.feature
index b368707..3ced5db 100644
--- a/gremlin-test/features/filter/And.feature
+++ b/gremlin-test/features/filter/And.feature
@@ -42,6 +42,7 @@ Feature: Step - and()
       | josh |
       | peter  |
 
+  @GraphComputerVerificationStarGraphExceeded
   Scenario: g_V_asXaX_outXknowsX_and_outXcreatedX_inXcreatedX_asXaX_name
     Given the modern graph
     And the traversal of
diff --git a/gremlin-test/features/filter/Dedup.feature b/gremlin-test/features/filter/Dedup.feature
index 228205f..0cf9c21 100644
--- a/gremlin-test/features/filter/Dedup.feature
+++ b/gremlin-test/features/filter/Dedup.feature
@@ -70,9 +70,10 @@ Feature: Step - dedup()
       g.V().both().has(T.label, "software").dedup().by("lang").values("name")
       """
     When iterated to list
-    Then the result should be unordered
+    Then the result should be of
       | result |
       | lop |
+      | ripple |
 
   Scenario: g_V_both_name_order_byXa_bX_dedup_value
     Given the modern graph
@@ -143,6 +144,7 @@ Feature: Step - dedup()
       | result |
       | m[{"software":[0.2,0.4,1.0],"person":[0.2,0.4,0.5,1.0]}] |
 
+  @GraphComputerVerificationReferenceOnly
   Scenario: g_V_asXaX_both_asXbX_dedupXa_bX_byXlabelX_selectXa_bX
     Given the modern graph
     And the traversal of
@@ -246,6 +248,7 @@ Feature: Step - dedup()
       | d[0].l |
 
   # https://issues.apache.org/jira/browse/TINKERPOP-2529
+  @GraphComputerVerificationStarGraphExceeded
   Scenario: g_V_both_group_by_byXout_dedup_foldX_unfold_selectXvaluesX_unfold_out_order_byXnameX_limitX1X_valuesXnameX
     Given the modern graph
     And the traversal of
diff --git a/gremlin-test/features/filter/Range.feature b/gremlin-test/features/filter/Range.feature
index 1bb9d53..c3dc520 100644
--- a/gremlin-test/features/filter/Range.feature
+++ b/gremlin-test/features/filter/Range.feature
@@ -171,6 +171,7 @@ Feature: Step - range()
       | m[{"b":"josh"}] |
       | m[{"b":"josh"}] |
 
+  @GraphComputerVerificationReferenceOnly
   Scenario: g_V_asXaX_out_asXaX_out_asXaX_selectXmixed_aX_byXunfold_valuesXnameX_foldX_rangeXlocal_1_3X
     Given the modern graph
     And the traversal of
@@ -183,6 +184,7 @@ Feature: Step - range()
       | l[josh,ripple] |
       | l[josh,lop] |
 
+  @GraphComputerVerificationReferenceOnly
   Scenario: g_V_asXaX_out_asXaX_out_asXaX_selectXmixed_aX_byXunfold_valuesXnameX_foldX_rangeXlocal_1_2X
     Given the modern graph
     And the traversal of
@@ -208,6 +210,7 @@ Feature: Step - range()
       | josh |
       | peter |
 
+  @GraphComputerVerificationReferenceOnly
   Scenario: g_V_asXaX_out_asXaX_out_asXaX_selectXmixed_aX_byXunfold_valuesXnameX_foldX_rangeXlocal_4_5X
     Given the modern graph
     And the traversal of
@@ -228,6 +231,7 @@ Feature: Step - range()
       | result |
       | l[d[0.4].d,d[0.5].d,d[1.0].d,d[1.0].d] |
 
+  @GraphComputerVerificationReferenceOnly
   Scenario: g_V_asXaX_in_asXaX_in_asXaX_selectXmixed_aX_byXunfold_valuesXnameX_foldX_limitXlocal_1X
     Given the modern graph
     And the traversal of
@@ -240,6 +244,7 @@ Feature: Step - range()
       | lop    |
       | ripple |
 
+  @GraphComputerVerificationReferenceOnly
   Scenario: g_V_asXaX_in_asXaX_in_asXaX_selectXmixed_aX_byXunfold_valuesXnameX_foldX_limitXlocal_2X
     Given the modern graph
     And the traversal of
diff --git a/gremlin-test/features/filter/SimplePath.feature b/gremlin-test/features/filter/SimplePath.feature
index c97de36..d1e2d13 100644
--- a/gremlin-test/features/filter/SimplePath.feature
+++ b/gremlin-test/features/filter/SimplePath.feature
@@ -59,6 +59,7 @@ Feature: Step - simplePath()
       | p[v[peter],v[lop],v[josh],v[ripple]] |
       | p[v[peter],v[lop],v[josh],v[marko]] |
 
+  @GraphComputerVerificationReferenceOnly
   Scenario: g_V_asXaX_out_asXbX_out_asXcX_simplePath_byXlabelX_fromXbX_toXcX_path_byXnameX
     Given the modern graph
     And the traversal of
diff --git a/gremlin-test/features/filter/Tail.feature b/gremlin-test/features/filter/Tail.feature
index 95d5cb7..a2ae496 100644
--- a/gremlin-test/features/filter/Tail.feature
+++ b/gremlin-test/features/filter/Tail.feature
@@ -70,21 +70,11 @@ Feature: Step - tail()
       | vadas  |
 
   Scenario: g_V_repeatXbothX_timesX3X_tailX7X
-    Given the modern graph
-    And the traversal of
+    Given an unsupported test
+    Then nothing should happen because
       """
-      g.V().repeat(__.bothE().order().by('weight',Order.asc).otherV()).times(3).tail(7)
+      This test is not easily asserted given limitations on ordering.
       """
-    When iterated to list
-    Then the result should be unordered
-      | result |
-      | v[ripple] |
-      | v[ripple] |
-      | v[josh] |
-      | v[josh] |
-      | v[josh] |
-      | v[marko] |
-      | v[marko] |
 
   Scenario: g_V_repeatXin_outX_timesX3X_tailX7X_count
     Given the modern graph
@@ -97,6 +87,7 @@ Feature: Step - tail()
       | result |
       | d[7].l |
 
+  @GraphComputerVerificationReferenceOnly
   Scenario: g_V_asXaX_out_asXaX_out_asXaX_selectXaX_byXunfold_valuesXnameX_foldX_tailXlocal_1X
     Given the modern graph
     And the traversal of
@@ -109,6 +100,7 @@ Feature: Step - tail()
       | ripple |
       | lop |
 
+  @GraphComputerVerificationReferenceOnly
   Scenario: g_V_asXaX_out_asXaX_out_asXaX_selectXaX_byXunfold_valuesXnameX_foldX_tailXlocalX
     Given the modern graph
     And the traversal of
@@ -145,6 +137,7 @@ Feature: Step - tail()
       | m[{"c":"ripple"}] |
       | m[{"c":"lop"}] |
 
+  @GraphComputerVerificationReferenceOnly
   Scenario: g_V_asXaX_out_asXaX_out_asXaX_selectXmixed_aX_byXunfold_valuesXnameX_foldX_tailXlocal_1X
     Given the modern graph
     And the traversal of
@@ -157,6 +150,7 @@ Feature: Step - tail()
       | ripple |
       | lop |
 
+  @GraphComputerVerificationReferenceOnly
   Scenario: g_V_asXaX_out_asXaX_out_asXaX_selectXmixed_aX_byXunfold_valuesXnameX_foldX_tailXlocalX
     Given the modern graph
     And the traversal of
@@ -169,6 +163,7 @@ Feature: Step - tail()
       | ripple |
       | lop |
 
+  @GraphComputerVerificationReferenceOnly
   Scenario: g_V_asXaX_out_asXaX_out_asXaX_selectXmixed_aX_byXlimitXlocal_0XX_tailXlocal_1X
     Given the modern graph
     And the traversal of
@@ -178,6 +173,7 @@ Feature: Step - tail()
     When iterated to list
     Then the result should be empty
 
+  @GraphComputerVerificationReferenceOnly
   Scenario: g_V_asXaX_out_asXaX_out_asXaX_selectXmixed_aX_byXunfold_valuesXnameX_foldX_tailXlocal_2X
     Given the modern graph
     And the traversal of
diff --git a/gremlin-test/features/filter/Where.feature b/gremlin-test/features/filter/Where.feature
index 6266675..27e0e46 100644
--- a/gremlin-test/features/filter/Where.feature
+++ b/gremlin-test/features/filter/Where.feature
@@ -117,6 +117,7 @@ Feature: Step - where()
       | josh |
       | peter |
 
+  @GraphComputerVerificationStarGraphExceeded
   Scenario: g_VX1X_asXaX_outXcreatedX_inXcreatedX_asXbX_whereXasXbX_outXcreatedX_hasXname_rippleXX_valuesXage_nameX
     Given the modern graph
     And using the parameter vid1 defined as "v[marko].id"
@@ -209,6 +210,7 @@ Feature: Step - where()
       | lop |
       | ripple |
 
+  @GraphComputerVerificationReferenceOnly
   Scenario: g_V_asXaX_out_asXbX_whereXandXasXaX_outXknowsX_asXbX__orXasXbX_outXcreatedX_hasXname_rippleX__asXbX_inXknowsX_count_isXnotXeqX0XXXXX_selectXa_bX
     Given the modern graph
     And the traversal of
@@ -234,6 +236,7 @@ Feature: Step - where()
       | vadas |
       | josh |
 
+  @GraphComputerVerificationReferenceOnly
   Scenario: g_V_asXaX_outXcreatedX_asXbX_whereXandXasXbX_in__notXasXaX_outXcreatedX_hasXname_rippleXXX_selectXa_bX
     Given the modern graph
     And the traversal of
@@ -258,6 +261,7 @@ Feature: Step - where()
       | m[{"a": "v[marko]", "b": "v[lop]", "c": "v[josh]", "d": "v[vadas]"}] |
       | m[{"a": "v[peter]", "b": "v[lop]", "c": "v[josh]", "d": "v[vadas]"}] |
 
+  @GraphComputerVerificationReferenceOnly
   Scenario: g_V_asXaX_out_asXbX_whereXin_count_isXeqX3XX_or_whereXoutXcreatedX_and_hasXlabel_personXXX_selectXa_bX
     Given the modern graph
     And the traversal of
@@ -272,6 +276,7 @@ Feature: Step - where()
       | m[{"a": "v[josh]", "b": "v[lop]"}] |
       | m[{"a": "v[peter]", "b": "v[lop]"}] |
 
+  @GraphComputerVerificationReferenceOnly
   Scenario: g_V_asXaX_outXcreatedX_inXcreatedX_asXbX_whereXa_gtXbXX_byXageX_selectXa_bX_byXnameX
     Given the modern graph
     And the traversal of
@@ -285,6 +290,7 @@ Feature: Step - where()
       | m[{"a": "peter", "b": "marko"}] |
       | m[{"a": "peter", "b": "josh"}] |
 
+  @GraphComputerVerificationReferenceOnly
   Scenario: g_V_asXaX_outEXcreatedX_asXbX_inV_asXcX_whereXa_gtXbX_orXeqXbXXX_byXageX_byXweightX_byXweightX_selectXa_cX_byXnameX
     Given the modern graph
     And the traversal of
@@ -299,6 +305,7 @@ Feature: Step - where()
       | m[{"a": "josh", "c": "lop"}] |
       | m[{"a": "peter", "c": "lop"}] |
 
+  @GraphComputerVerificationReferenceOnly
   Scenario: g_V_asXaX_outEXcreatedX_asXbX_inV_asXcX_inXcreatedX_asXdX_whereXa_ltXbX_orXgtXcXX_andXneqXdXXX_byXageX_byXweightX_byXinXcreatedX_valuesXageX_minX_selectXa_c_dX
     Given the modern graph
     And the traversal of
@@ -313,6 +320,7 @@ Feature: Step - where()
       | m[{"a": "peter", "c": "lop", "d": "marko"}] |
       | m[{"a": "peter", "c": "lop", "d": "josh"}] |
 
+  @GraphComputerVerificationReferenceOnly
   Scenario: g_VX1X_asXaX_out_hasXageX_whereXgtXaXX_byXageX_name
     Given the modern graph
     And using the parameter vid1 defined as "v[marko].id"
diff --git a/gremlin-test/features/map/Coalesce.feature b/gremlin-test/features/map/Coalesce.feature
index 028cd58..dd5820b 100644
--- a/gremlin-test/features/map/Coalesce.feature
+++ b/gremlin-test/features/map/Coalesce.feature
@@ -63,6 +63,7 @@ Feature: Step - coalesce()
       | result |
       | m[{"ripple":"d[1].l", "vadas":"d[1].l", "josh":"d[1].l", "lop":"d[2].l"}] |
 
+  @GraphComputerVerificationReferenceOnly
   Scenario: g_V_coalesceXoutEXknowsX_outEXcreatedXX_otherV_path_byXnameX_byXlabelX
     Given the modern graph
     And the traversal of
@@ -85,7 +86,7 @@ Feature: Step - coalesce()
       g.V().out("created").order().by("name").coalesce(__.values("name"), __.constant("x"))
       """
     When iterated to list
-    Then the result should be ordered
+    Then the result should be unordered
       | result |
       | lop |
       | lop |
diff --git a/gremlin-test/features/map/ConnectedComponent.feature b/gremlin-test/features/map/ConnectedComponent.feature
index 3933a6c..95b5cb7 100644
--- a/gremlin-test/features/map/ConnectedComponent.feature
+++ b/gremlin-test/features/map/ConnectedComponent.feature
@@ -15,14 +15,14 @@
 # specific language governing permissions and limitations
 # under the License.
 
-@StepClassMap @StepConnectedComponent
+@GraphComputerOnly @StepClassMap @StepConnectedComponent
 Feature: Step - connectedComponent()
-                
+
   Scenario: g_V_connectedComponent_hasXcomponentX
     Given the modern graph
     And the traversal of
       """
-      g.withComputer().V().connectedComponent().has("gremlin.connectedComponentVertexProgram.component")
+      g.V().connectedComponent().has("gremlin.connectedComponentVertexProgram.component")
       """
     When iterated to list
     Then the result should be unordered
@@ -38,7 +38,7 @@ Feature: Step - connectedComponent()
     Given the modern graph
     And the traversal of
       """
-      g.withComputer().V().dedup().connectedComponent().has("gremlin.connectedComponentVertexProgram.component")
+      g.V().dedup().connectedComponent().has("gremlin.connectedComponentVertexProgram.component")
       """
     When iterated to list
     Then the result should be unordered
@@ -54,7 +54,7 @@ Feature: Step - connectedComponent()
     Given the modern graph
     And the traversal of
       """
-      g.withComputer().V().hasLabel("software").connectedComponent().project("name","component").by("name").by("gremlin.connectedComponentVertexProgram.component")
+      g.V().hasLabel("software").connectedComponent().project("name","component").by("name").by("gremlin.connectedComponentVertexProgram.component")
       """
     When iterated to list
     Then the result should be unordered
@@ -66,7 +66,7 @@ Feature: Step - connectedComponent()
     Given the modern graph
     And the traversal of
       """
-      g.withComputer().V().hasLabel("person").connectedComponent().with("~tinkerpop.connectedComponent.edges", __.bothE("knows")).with("~tinkerpop.connectedComponent.propertyName", "cluster").project("name","cluster").by("name").by("cluster")
+      g.V().hasLabel("person").connectedComponent().with("~tinkerpop.connectedComponent.edges", __.bothE("knows")).with("~tinkerpop.connectedComponent.propertyName", "cluster").project("name","cluster").by("name").by("cluster")
       """
     When iterated to list
     Then the result should be unordered
diff --git a/gremlin-test/features/map/Count.feature b/gremlin-test/features/map/Count.feature
index 474233a..7db93d2 100644
--- a/gremlin-test/features/map/Count.feature
+++ b/gremlin-test/features/map/Count.feature
@@ -73,6 +73,7 @@ Feature: Step - count()
       | result |
       | d[0].l |
 
+  @GraphComputerVerificationStarGraphExceeded
   Scenario: g_V_whereXinXkknowsX_outXcreatedX_count_is_0XX_name
     Given the modern graph
     And the traversal of
diff --git a/gremlin-test/features/map/ElementMap.feature b/gremlin-test/features/map/ElementMap.feature
index 1188783..4ebcddb 100644
--- a/gremlin-test/features/map/ElementMap.feature
+++ b/gremlin-test/features/map/ElementMap.feature
@@ -50,6 +50,7 @@ Feature: Step - elementMap()
       | m[{"t[id]": "v[lop].id", "t[label]": "software", "name": "lop"}] |
       | m[{"t[id]": "v[ripple].id", "t[label]": "software", "name": "ripple"}] |
 
+  @GraphComputerVerificationReferenceOnly
   Scenario: g_EX11X_elementMap
     Given the modern graph
     And using the parameter eid11 defined as "e[josh-created->lop].id"
diff --git a/gremlin-test/features/map/Loops.feature b/gremlin-test/features/map/Loops.feature
index 9032180..fe3701a 100644
--- a/gremlin-test/features/map/Loops.feature
+++ b/gremlin-test/features/map/Loops.feature
@@ -18,6 +18,7 @@
 @StepClassMap @StepLoops
 Feature: Step - loops()
 
+  @GraphComputerVerificationReferenceOnly
   Scenario: g_VX1X_repeatXboth_simplePathX_untilXhasXname_peterX_or_loops_isX3XX_hasXname_peterX_path_byXnameX
     Given the modern graph
     And using the parameter vid1 defined as "v[marko].id"
@@ -31,6 +32,7 @@ Feature: Step - loops()
       | p[marko,lop,peter] |
       | p[marko,josh,lop,peter] |
 
+  @GraphComputerVerificationReferenceOnly
   Scenario: g_VX1X_repeatXboth_simplePathX_untilXhasXname_peterX_or_loops_isX2XX_hasXname_peterX_path_byXnameX
     Given the modern graph
     And using the parameter vid1 defined as "v[marko].id"
@@ -43,6 +45,7 @@ Feature: Step - loops()
       | result |
       | p[marko,lop,peter] |
 
+  @GraphComputerVerificationReferenceOnly
   Scenario: g_VX1X_repeatXboth_simplePathX_untilXhasXname_peterX_and_loops_isX3XX_hasXname_peterX_path_byXnameX
     Given the modern graph
     And using the parameter vid1 defined as "v[marko].id"
diff --git a/gremlin-test/features/map/Match.feature b/gremlin-test/features/map/Match.feature
index 6ec49fd..be926fc 100644
--- a/gremlin-test/features/map/Match.feature
+++ b/gremlin-test/features/map/Match.feature
@@ -124,6 +124,7 @@ Feature: Step - match()
       | m[{"a":"v[marko]","b":"v[josh]","c":"v[ripple]","d":"v[vadas]"}] |
       | m[{"a":"v[marko]","b":"v[josh]","c":"v[lop]","d":"v[vadas]"}] |
 
+  @GraphComputerVerificationStarGraphExceeded
   Scenario: g_V_matchXa_created_lop_b__b_0created_29_c__c_whereXrepeatXoutX_timesX2XXX
     Given the modern graph
     And the traversal of
@@ -162,6 +163,7 @@ Feature: Step - match()
       | m[{"a":"v[marko]","b":"v[vadas]"}] |
       | m[{"a":"v[marko]","b":"v[josh]"}] |
 
+  @GraphComputerVerificationStarGraphExceeded
   Scenario: g_V_matchXa_created_lop_b__b_0created_29_cX_whereXc_repeatXoutX_timesX2XX_selectXa_b_cX
     Given the modern graph
     And the traversal of
@@ -336,6 +338,7 @@ Feature: Step - match()
       | m[{"a":"v[marko]","b":"v[vadas]","c":"v[lop]"}] |
       | m[{"a":"v[marko]","b":"v[josh]","c":"v[lop]"}] |
 
+  @GraphComputerVerificationReferenceOnly
   Scenario: g_V_matchXwhereXandXa_created_b__b_0created_count_isXeqX3XXXX__a_both_b__whereXb_inXX
     Given the modern graph
     And the traversal of
@@ -366,6 +369,7 @@ Feature: Step - match()
       | m[{"a":"josh","b":"ripple"}] |
       | m[{"a":"peter","b":"lop"}] |
 
+  @GraphComputerVerificationReferenceOnly
   Scenario: g_V_matchXa_both_b__b_both_cX_dedupXa_bX_byXlabelX
     Given the modern graph
     And the traversal of
diff --git a/gremlin-test/features/map/Math.feature b/gremlin-test/features/map/Math.feature
index b797425..768f37c 100644
--- a/gremlin-test/features/map/Math.feature
+++ b/gremlin-test/features/map/Math.feature
@@ -48,6 +48,7 @@ Feature: Step - math()
       | d[54.0].d |
       | d[70.0].d |
 
+  @GraphComputerVerificationReferenceOnly
   Scenario: g_V_asXaX_outXknowsX_asXbX_mathXa_plus_bX_byXageX
     Given the modern graph
     And the traversal of
@@ -75,6 +76,7 @@ Feature: Step - math()
       | d[132.0].d |
       | d[135.0].d |
 
+  @GraphComputerVerificationReferenceOnly
   Scenario: g_V_asXaX_outXcreatedX_asXbX_mathXb_plus_aX_byXinXcreatedX_countX_byXageX
     Given the modern graph
     And the traversal of
@@ -89,6 +91,7 @@ Feature: Step - math()
       | d[35.0].d |
       | d[38.0].d |
 
+  @GraphComputerVerificationInjectionNotSupported
   Scenario: g_withSackX1X_injectX1X_repeatXsackXsumX_byXconstantX1XXX_timesX5X_emit_mathXsin__X_byXsackX
     Given the modern graph
     And the traversal of
diff --git a/gremlin-test/features/map/Min.feature b/gremlin-test/features/map/Min.feature
index acb5d04..193e340 100644
--- a/gremlin-test/features/map/Min.feature
+++ b/gremlin-test/features/map/Min.feature
@@ -146,6 +146,7 @@ Feature: Step - min()
       | result |
       | m[{"ripple":"d[1.0].d","lop":"d[0.2].d"}] |
 
+  @GraphComputerVerificationInjectionNotSupported
   Scenario: g_V_foo_injectX9999999999X_min
     Given the modern graph
     And using the parameter xx1 defined as "d[9999999999].l"
diff --git a/gremlin-test/features/map/PageRank.feature b/gremlin-test/features/map/PageRank.feature
index d80cab0..a0f003e 100644
--- a/gremlin-test/features/map/PageRank.feature
+++ b/gremlin-test/features/map/PageRank.feature
@@ -15,14 +15,14 @@
 # specific language governing permissions and limitations
 # under the License.
 
-@StepClassMap @StepPageRank
+@GraphComputerOnly @StepClassMap @StepPageRank
 Feature: Step - pageRank()
-                
+
   Scenario: g_V_pageRank_hasXpageRankX
     Given the modern graph
     And the traversal of
       """
-      g.withComputer().V().pageRank().has("gremlin.pageRankVertexProgram.pageRank")
+      g.V().pageRank().has("gremlin.pageRankVertexProgram.pageRank")
       """
     When iterated to list
     Then the result should be unordered
@@ -33,13 +33,12 @@ Feature: Step - pageRank()
       | v[josh] |
       | v[ripple] |
       | v[peter] |
-    And the graph should return 6 for count of "g.withComputer().V().pageRank().has(\"gremlin.pageRankVertexProgram.pageRank\")"
 
   Scenario: g_V_outXcreatedX_pageRank_withXedges_bothEX_withXpropertyName_projectRankX_withXtimes_0X_valueMapXname_projectRankX
     Given the modern graph
     And the traversal of
       """
-      g.withComputer().V().out("created").pageRank().with("~tinkerpop.pageRank.edges",__.bothE()).with("~tinkerpop.pageRank.propertyName","projectRank").with("~tinkerpop.pageRank.times",0).valueMap("name", "projectRank")
+      g.V().out("created").pageRank().with("~tinkerpop.pageRank.edges",__.bothE()).with("~tinkerpop.pageRank.propertyName","projectRank").with("~tinkerpop.pageRank.times",0).valueMap("name", "projectRank")
       """
     When iterated to list
     Then the result should be unordered
@@ -53,7 +52,7 @@ Feature: Step - pageRank()
     Given the modern graph
     And the traversal of
       """
-      g.withComputer().V().pageRank().order().by("gremlin.pageRankVertexProgram.pageRank", Order.desc).by("name").values("name")
+      g.V().pageRank().order().by("gremlin.pageRankVertexProgram.pageRank", Order.desc).by("name").values("name")
       """
     When iterated to list
     Then the result should be ordered
@@ -69,7 +68,7 @@ Feature: Step - pageRank()
     Given the modern graph
     And the traversal of
       """
-      g.withComputer().V().pageRank().order().by("gremlin.pageRankVertexProgram.pageRank", Order.desc).values("name").limit(2)
+      g.V().pageRank().order().by("gremlin.pageRankVertexProgram.pageRank", Order.desc).values("name").limit(2)
       """
     When iterated to list
     Then the result should be ordered
@@ -81,7 +80,7 @@ Feature: Step - pageRank()
     Given the modern graph
     And the traversal of
       """
-      g.withComputer().V().pageRank().with("~tinkerpop.pageRank.edges",__.outE("knows")).with("~tinkerpop.pageRank.propertyName","friendRank").project("name", "friendRank").by("name").by(__.values("friendRank").math("ceil(_ * 100)"))
+      g.V().pageRank().with("~tinkerpop.pageRank.edges",__.outE("knows")).with("~tinkerpop.pageRank.propertyName","friendRank").project("name", "friendRank").by("name").by(__.values("friendRank").math("ceil(_ * 100)"))
       """
     When iterated to list
     Then the result should be unordered
@@ -97,7 +96,7 @@ Feature: Step - pageRank()
     Given the modern graph
     And the traversal of
       """
-      g.withComputer().V().hasLabel("person").pageRank().with("~tinkerpop.pageRank.propertyName","pageRank").project("name", "pageRank").by("name").by(__.values("pageRank").math("ceil(_ * 100)"))
+      g.V().hasLabel("person").pageRank().with("~tinkerpop.pageRank.propertyName","pageRank").project("name", "pageRank").by("name").by(__.values("pageRank").math("ceil(_ * 100)"))
       """
     When iterated to list
     Then the result should be unordered
@@ -111,7 +110,7 @@ Feature: Step - pageRank()
     Given the modern graph
     And the traversal of
       """
-      g.withComputer().V().pageRank().with("~tinkerpop.pageRank.propertyName","pageRank").as("a").out("knows").values("pageRank").as("b").select("a", "b").by().by(__.math("ceil(_ * 100)"))
+      g.V().pageRank().with("~tinkerpop.pageRank.propertyName","pageRank").as("a").out("knows").values("pageRank").as("b").select("a", "b").by().by(__.math("ceil(_ * 100)"))
       """
     When iterated to list
     Then the result should be unordered
@@ -123,7 +122,7 @@ Feature: Step - pageRank()
     Given the modern graph
     And the traversal of
       """
-      g.withComputer().V().hasLabel("software").has("name", "ripple").pageRank(1.0).with("~tinkerpop.pageRank.edges",__.inE("created")).with("~tinkerpop.pageRank.times",1).with("~tinkerpop.pageRank.propertyName","priors").in("created").union(__.both(), __.identity()).valueMap("name", "priors")
+      g.V().hasLabel("software").has("name", "ripple").pageRank(1.0).with("~tinkerpop.pageRank.edges",__.inE("created")).with("~tinkerpop.pageRank.times",1).with("~tinkerpop.pageRank.propertyName","priors").in("created").union(__.both(), __.identity()).valueMap("name", "priors")
       """
     When iterated to list
     Then the result should be unordered
@@ -137,7 +136,7 @@ Feature: Step - pageRank()
     Given the modern graph
     And the traversal of
       """
-      g.withComputer().V().out("created").group("m").by(T.label).pageRank(1.0).with("~tinkerpop.pageRank.propertyName", "pageRank").with("~tinkerpop.pageRank.edges",__.inE()).with("~tinkerpop.pageRank.times", 1).in("created").group("m").by("pageRank").cap("m")
+      g.V().out("created").group("m").by(T.label).pageRank(1.0).with("~tinkerpop.pageRank.propertyName", "pageRank").with("~tinkerpop.pageRank.edges",__.inE()).with("~tinkerpop.pageRank.times", 1).in("created").group("m").by("pageRank").cap("m")
       """
     When iterated next
     Then the result should have a count of 3
\ No newline at end of file
diff --git a/gremlin-test/features/map/Path.feature b/gremlin-test/features/map/Path.feature
index 9dc86ba..c31d1dc 100644
--- a/gremlin-test/features/map/Path.feature
+++ b/gremlin-test/features/map/Path.feature
@@ -30,6 +30,7 @@ Feature: Step - path()
       | result |
       | p[v[marko],marko] |
 
+  @GraphComputerVerificationReferenceOnly
   Scenario: g_VX1X_out_path_byXageX_byXnameX
     Given the modern graph
     And using the parameter vid1 defined as "v[marko].id"
@@ -44,6 +45,7 @@ Feature: Step - path()
       | p[d[29].i,vadas] |
       | p[d[29].i,josh] |
 
+  @GraphComputerVerificationReferenceOnly
   Scenario: g_V_repeatXoutX_timesX2X_path_byXitX_byXnameX_byXlangX
     Given the modern graph
     And the traversal of
@@ -56,6 +58,7 @@ Feature: Step - path()
       | p[v[marko],josh,java] |
       | p[v[marko],josh,java] |
 
+  @GraphComputerVerificationReferenceOnly
   Scenario: g_V_out_out_path_byXnameX_byXageX
     Given the modern graph
     And the traversal of
@@ -93,6 +96,7 @@ Feature: Step - path()
       | p[v[marko],e[marko-created->lop],v[lop],e[josh-created->lop],v[josh]] |
       | p[v[marko],e[marko-created->lop],v[lop],e[peter-created->lop],v[peter]] |
 
+  @GraphComputerVerificationReferenceOnly
   Scenario: g_V_asXaX_out_asXbX_out_asXcX_path_fromXbX_toXcX_byXnameX
     Given the modern graph
     And the traversal of
diff --git a/gremlin-test/features/map/PeerPressure.feature b/gremlin-test/features/map/PeerPressure.feature
index 29f5c13..ed01125 100644
--- a/gremlin-test/features/map/PeerPressure.feature
+++ b/gremlin-test/features/map/PeerPressure.feature
@@ -15,14 +15,14 @@
 # specific language governing permissions and limitations
 # under the License.
 
-@StepClassMap @StepPeerPressure
+@GraphComputerOnly @StepClassMap @StepPeerPressure
 Feature: Step - peerPressure()
                 
   Scenario: g_V_peerPressure_hasXclusterX
     Given the modern graph
     And the traversal of
       """
-      g.withComputer().V().peerPressure().has("gremlin.peerPressureVertexProgram.cluster")
+      g.V().peerPressure().has("gremlin.peerPressureVertexProgram.cluster")
       """
     When iterated to list
     Then the result should be unordered
@@ -33,13 +33,12 @@ Feature: Step - peerPressure()
       | v[josh] |
       | v[ripple] |
       | v[peter] |
-    And the graph should return 6 for count of "g.withComputer().V().peerPressure().has(\"gremlin.peerPressureVertexProgram.cluster\")"
 
   Scenario: g_V_peerPressure_withXpropertyName_clusterX_withXedges_outEXknowsXX_pageRankX1X_byXrankX_withXedges_outEXknowsX_withXtimes_2X_group_byXclusterX_byXrank_sumX_limitX100X
     Given the modern graph
     And the traversal of
       """
-      g.withComputer().V().peerPressure().with("~tinkerpop.peerPressure.propertyName","cluster").with("~tinkerpop.peerPressure.edges",__.outE("knows")).pageRank(1.0).with("~tinkerpop.pageRank.propertyName", "rank").with("~tinkerpop.pageRank.edges", __.outE("knows")).with("~tinkerpop.pageRank.times", 1).group().by("cluster").by(__.values("rank").sum()).limit(100)
+      g.V().peerPressure().with("~tinkerpop.peerPressure.propertyName","cluster").with("~tinkerpop.peerPressure.edges",__.outE("knows")).pageRank(1.0).with("~tinkerpop.pageRank.propertyName", "rank").with("~tinkerpop.pageRank.edges", __.outE("knows")).with("~tinkerpop.pageRank.times", 1).group().by("cluster").by(__.values("rank").sum()).limit(100)
       """
     When iterated to list
     Then the result should be unordered
@@ -50,7 +49,7 @@ Feature: Step - peerPressure()
     Given the modern graph
     And the traversal of
       """
-      g.withComputer().V().has("name", "ripple").in("created").peerPressure().with("~tinkerpop.peerPressure.edges",__.outE()).with("~tinkerpop.peerPressure.propertyName", "cluster").repeat(__.union(__.identity(), __.both())).times(2).dedup().valueMap("name", "cluster")
+      g.V().has("name", "ripple").in("created").peerPressure().with("~tinkerpop.peerPressure.edges",__.outE()).with("~tinkerpop.peerPressure.propertyName", "cluster").repeat(__.union(__.identity(), __.both())).times(2).dedup().valueMap("name", "cluster")
       """
     When iterated to list
     Then the result should be unordered
diff --git a/gremlin-test/features/map/Select.feature b/gremlin-test/features/map/Select.feature
index 485372d..a69dcc4 100644
--- a/gremlin-test/features/map/Select.feature
+++ b/gremlin-test/features/map/Select.feature
@@ -342,6 +342,7 @@ Feature: Step - select()
       | result |
       | m[{"ripple":"d[1].l", "lop":"d[6].l"}] |
 
+  @GraphComputerVerificationStarGraphExceeded
   Scenario: g_V_untilXout_outX_repeatXin_asXaXX_selectXaX_byXtailXlocalX_nameX
     Given the modern graph
     And the traversal of
@@ -371,6 +372,7 @@ Feature: Step - select()
       | d[0.4].d |
       | d[0.2].d |
 
+  @GraphComputerVerificationStarGraphExceeded
   Scenario: g_V_hasLabelXsoftwareX_asXnameX_asXlanguageX_asXcreatorsX_selectXname_language_creatorsX_byXnameX_byXlangX_byXinXcreatedX_name_fold_orderXlocalXX
     Given the modern graph
     And the traversal of
@@ -412,6 +414,7 @@ Feature: Step - select()
       | d[2].l |
       | d[1].l |
 
+  @GraphComputerVerificationReferenceOnly
   Scenario: g_V_untilXout_outX_repeatXin_asXaX_in_asXbXX_selectXa_bX_byXnameX
     Given the modern graph
     And the traversal of
@@ -462,6 +465,7 @@ Feature: Step - select()
       | v[marko] |
       | v[marko] |
 
+  @GraphComputerVerificationReferenceOnly
   Scenario: g_V_asXaX_outXknowsX_asXbX_localXselectXa_bX_byXnameXX
     Given the modern graph
     And the traversal of
@@ -522,6 +526,7 @@ Feature: Step - select()
       | d[2].l |
       | d[2].l |
 
+  @GraphComputerVerificationReferenceOnly
   Scenario: g_V_asXaX_groupXmX_by_byXbothE_countX_barrier_selectXmX_selectXselectXaXX
     Given the modern graph
     And the traversal of
@@ -538,6 +543,7 @@ Feature: Step - select()
       | d[1].l |
       | d[1].l |
 
+  @GraphComputerVerificationReferenceOnly
   Scenario: g_V_asXaX_groupXmX_by_byXbothE_countX_barrier_selectXmX_selectXselectXaXX_byXmathX_plus_XX
     Given the modern graph
     And the traversal of
@@ -554,6 +560,7 @@ Feature: Step - select()
       | d[2].d |
       | d[2].d |
 
+  @GraphComputerVerificationReferenceOnly
   Scenario: g_V_asXaX_outXknowsX_asXaX_selectXall_constantXaXX
     Given the modern graph
     And the traversal of
diff --git a/gremlin-test/features/map/ShortestPath.feature b/gremlin-test/features/map/ShortestPath.feature
index bfe1925..1393812 100644
--- a/gremlin-test/features/map/ShortestPath.feature
+++ b/gremlin-test/features/map/ShortestPath.feature
@@ -15,14 +15,14 @@
 # specific language governing permissions and limitations
 # under the License.
 
-@StepClassMap @StepShortestPath
+@GraphComputerOnly @StepClassMap @StepShortestPath
 Feature: Step - shortestPath()
 
   Scenario: g_V_shortestPath
     Given the modern graph
     And the traversal of
       """
-      g.withComputer().V().shortestPath()
+      g.V().shortestPath()
       """
     When iterated to list
     Then the result should be unordered
@@ -68,7 +68,7 @@ Feature: Step - shortestPath()
     Given the modern graph
     And the traversal of
       """
-      g.withComputer().V().both().dedup().shortestPath()
+      g.V().both().dedup().shortestPath()
       """
     When iterated to list
     Then the result should be unordered
@@ -114,7 +114,7 @@ Feature: Step - shortestPath()
     Given the modern graph
     And the traversal of
       """
-      g.withComputer().V().shortestPath().with("~tinkerpop.shortestPath.includeEdges")
+      g.V().shortestPath().with("~tinkerpop.shortestPath.includeEdges")
       """
     When iterated to list
     Then the result should be unordered
@@ -160,7 +160,7 @@ Feature: Step - shortestPath()
     Given the modern graph
     And the traversal of
       """
-      g.withComputer().V().shortestPath().with("~tinkerpop.shortestPath.edges", Direction.IN)
+      g.V().shortestPath().with("~tinkerpop.shortestPath.edges", Direction.IN)
       """
     When iterated to list
     Then the result should be unordered
@@ -183,7 +183,7 @@ Feature: Step - shortestPath()
     Given the modern graph
     And the traversal of
       """
-      g.withComputer().V().shortestPath().with("~tinkerpop.shortestPath.edges", __.outE())
+      g.V().shortestPath().with("~tinkerpop.shortestPath.edges", __.outE())
       """
     When iterated to list
     Then the result should be unordered
@@ -206,7 +206,7 @@ Feature: Step - shortestPath()
     Given the modern graph
     And the traversal of
       """
-      g.withComputer().V().shortestPath().
+      g.V().shortestPath().
           with("~tinkerpop.shortestPath.includeEdges").
           with("~tinkerpop.shortestPath.edges", __.outE())
       """
@@ -231,7 +231,7 @@ Feature: Step - shortestPath()
     Given the modern graph
     And the traversal of
       """
-      g.withComputer().V().has("name","marko").shortestPath()
+      g.V().has("name","marko").shortestPath()
       """
     When iterated to list
     Then the result should be unordered
@@ -247,7 +247,7 @@ Feature: Step - shortestPath()
     Given the modern graph
     And the traversal of
       """
-      g.withComputer().V().shortestPath().with("~tinkerpop.shortestPath.target", __.has("name","marko"))
+      g.V().shortestPath().with("~tinkerpop.shortestPath.target", __.has("name","marko"))
       """
     When iterated to list
     Then the result should be unordered
@@ -263,7 +263,7 @@ Feature: Step - shortestPath()
     Given the modern graph
     And the traversal of
       """
-      g.withComputer().V().shortestPath().with("~tinkerpop.shortestPath.target", __.values("name").is("marko"))
+      g.V().shortestPath().with("~tinkerpop.shortestPath.target", __.values("name").is("marko"))
       """
     When iterated to list
     Then the result should be unordered
@@ -279,7 +279,7 @@ Feature: Step - shortestPath()
     Given the modern graph
     And the traversal of
       """
-      g.withComputer().V().has("name","marko").shortestPath().with("~tinkerpop.shortestPath.target", __.hasLabel("software"))
+      g.V().has("name","marko").shortestPath().with("~tinkerpop.shortestPath.target", __.hasLabel("software"))
       """
     When iterated to list
     Then the result should be unordered
@@ -291,7 +291,7 @@ Feature: Step - shortestPath()
     Given the modern graph
     And the traversal of
       """
-      g.withComputer().V().has("name","marko").shortestPath().
+      g.V().has("name","marko").shortestPath().
           with("~tinkerpop.shortestPath.target", __.has("name","josh")).
           with("~tinkerpop.shortestPath.distance", "weight")
       """
@@ -305,7 +305,7 @@ Feature: Step - shortestPath()
     Given the crew graph
     And the traversal of
       """
-      g.withComputer().V().has("name","daniel").shortestPath().
+      g.V().has("name","daniel").shortestPath().
           with("~tinkerpop.shortestPath.target", __.has("name","stephen")).
           with("~tinkerpop.shortestPath.edges", __.bothE("uses"))
       """
@@ -319,7 +319,7 @@ Feature: Step - shortestPath()
     Given the grateful graph
     And the traversal of
       """
-      g.withComputer().V().has("song","name","MIGHT AS WELL").
+      g.V().has("song","name","MIGHT AS WELL").
         shortestPath().
           with("~tinkerpop.shortestPath.target", __.has("song","name","MAYBE YOU KNOW HOW I FEEL")).
           with("~tinkerpop.shortestPath.edges", __.outE("followedBy")).
@@ -335,7 +335,7 @@ Feature: Step - shortestPath()
     Given the modern graph
     And the traversal of
       """
-      g.withComputer().V().has("name","marko").shortestPath().with("~tinkerpop.shortestPath.maxDistance", 1)
+      g.V().has("name","marko").shortestPath().with("~tinkerpop.shortestPath.maxDistance", 1)
       """
     When iterated to list
     Then the result should be unordered
@@ -349,7 +349,7 @@ Feature: Step - shortestPath()
     Given the modern graph
     And the traversal of
       """
-      g.withComputer().V().has("name","vadas").shortestPath().
+      g.V().has("name","vadas").shortestPath().
           with("~tinkerpop.shortestPath.distance", "weight").
           with("~tinkerpop.shortestPath.maxDistance", 1.3)
       """
diff --git a/gremlin-test/features/map/Unfold.feature b/gremlin-test/features/map/Unfold.feature
index 68c295d..b687db9 100644
--- a/gremlin-test/features/map/Unfold.feature
+++ b/gremlin-test/features/map/Unfold.feature
@@ -57,6 +57,7 @@ Feature: Step - unfold()
       | name   |
       | age    |
 
+  @GraphComputerVerificationReferenceOnly
   Scenario: g_VX1X_repeatXboth_simplePathX_untilXhasIdX6XX_path_byXnameX_unfold
     Given the modern graph
     And using the parameter vid1 defined as "v[marko].id"
diff --git a/gremlin-test/features/map/Vertex.feature b/gremlin-test/features/map/Vertex.feature
index 121a0d7..37738bb 100644
--- a/gremlin-test/features/map/Vertex.feature
+++ b/gremlin-test/features/map/Vertex.feature
@@ -537,6 +537,7 @@ Feature: Step - V(), E(), out(), in(), both(), inE(), outE(), bothE()
     Then the result should be empty
     And the graph should return 3 for count of "g.V(vid1, vid2, vid3, vid4)"
 
+  @GraphComputerVerificationMidVNotSupported
   Scenario: g_V_hasLabelXpersonX_V_hasLabelXsoftwareX_name
     Given the modern graph
     And the traversal of
diff --git a/gremlin-test/features/sideEffect/Group.feature b/gremlin-test/features/sideEffect/Group.feature
index 54b0435..e7c83a7 100644
--- a/gremlin-test/features/sideEffect/Group.feature
+++ b/gremlin-test/features/sideEffect/Group.feature
@@ -99,12 +99,12 @@ Feature: Step - group()
     Given the modern graph
     And the traversal of
       """
-      g.V().group().by(__.outE().count()).by("name")
+      g.V().order().by("name").group().by(__.outE().count()).by("name")
       """
     When iterated to list
     Then the result should be unordered
       | result |
-      | m[{"d[0].l":["vadas","lop","ripple"],"d[1].l":["peter"],"d[2].l":["josh"],"d[3].l":["marko"]}] |
+      | m[{"d[0].l":["lop","ripple","vadas"],"d[1].l":["peter"],"d[2].l":["josh"],"d[3].l":["marko"]}] |
 
   Scenario: g_V_groupXaX_byXlabelX_byXoutE_weight_sumX_capXaX
     Given the modern graph
@@ -218,6 +218,7 @@ Feature: Step - group()
       | result |
       | m[{"cover":{"followedBy":"d[777982].l"}, "":{"followedBy":"d[179350].l"}, "original":{"followedBy":"d[2185613].l"}}] |
 
+  @GraphComputerVerificationStarGraphExceeded
   Scenario: g_V_groupXmX_byXnameX_byXinXknowsX_nameX_capXmX
     Given the modern graph
     And the traversal of
@@ -253,6 +254,7 @@ Feature: Step - group()
       | result |
       | m[{"ripple":[], "peter":["created"], "noone":["blah"], "vadas":[], "josh":["created", "created"], "lop":[], "marko":["666", "created", "knows", "knows"]}] |
 
+  @GraphComputerVerificationStarGraphExceeded
   Scenario: g_V_hasLabelXpersonX_asXpX_outXcreatedX_group_byXnameX_byXselectXpX_valuesXageX_sumX
     Given the modern graph
     And the traversal of
@@ -264,6 +266,7 @@ Feature: Step - group()
       | result |
       | m[{"ripple":"d[32].l", "lop":"d[96].l"}] |
 
+  @GraphComputerVerificationStarGraphExceeded
   Scenario: g_V_hasLabelXpersonX_asXpX_outXcreatedX_groupXaX_byXnameX_byXselectXpX_valuesXageX_sumX_capXaX
     Given the modern graph
     And the traversal of
diff --git a/gremlin-test/features/sideEffect/Sack.feature b/gremlin-test/features/sideEffect/Sack.feature
index 5f243c2..0ce1ad0 100644
--- a/gremlin-test/features/sideEffect/Sack.feature
+++ b/gremlin-test/features/sideEffect/Sack.feature
@@ -57,6 +57,7 @@ Feature: Step - sack()
       | d[2.0].m |
       | d[1.4].m |
 
+  @GraphComputerVerificationOneBulk
   Scenario: g_withBulkXfalseX_withSackX1_sumX_VX1X_localXoutEXknowsX_barrierXnormSackX_inVX_inXknowsX_barrier_sack
     Given the modern graph
     And using the parameter vid1 defined as "v[marko].id"
@@ -69,6 +70,7 @@ Feature: Step - sack()
       | result |
       | d[1.0].m |
 
+  @GraphComputerVerificationOneBulk
   Scenario: g_withBulkXfalseX_withSackX1_sumX_V_out_barrier_sack
     Given the modern graph
     And the traversal of
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/features/AbstractGuiceFactory.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/features/AbstractGuiceFactory.java
new file mode 100644
index 0000000..13c17b9
--- /dev/null
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/features/AbstractGuiceFactory.java
@@ -0,0 +1,56 @@
+/*
+ * 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.features;
+
+import com.google.inject.Injector;
+import io.cucumber.core.backend.ObjectFactory;
+import io.cucumber.guice.ScenarioScope;
+
+/**
+ * Base class for implementing a custom {@code ObjectFactory} for cucumber tests and is based on the basic
+ * {@code GuiceFactory} implementation which can't be extended. That implementation works well when there is only
+ * single {@link World} implementation to test or if the requirements are such that system properties or environment
+ * variables can otherwise suffice in controlling the test environment to the provider's satisfaction. In other cases,
+ * it may simply be easier to create a custom {@code ObjectFactory} from this class, register it in
+ * {@code META-INF/services/io.cucumber.core.backend.ObjectFactory} and then reference it directly in the
+ * {@code CucumberOptions} annotation for the test class.
+ */
+public class AbstractGuiceFactory implements ObjectFactory {
+    private final Injector injector;
+
+    protected AbstractGuiceFactory(final Injector injector) {
+        this.injector = injector;
+    }
+
+    public boolean addClass(final Class<?> clazz) {
+        return true;
+    }
+
+    public void start() {
+        injector.getInstance(ScenarioScope.class).enterScope();
+    }
+
+    public void stop() {
+        injector.getInstance(ScenarioScope.class).exitScope();
+    }
+
+    public <T> T getInstance(final Class<T> clazz) {
+        return injector.getInstance(clazz);
+    }
+}
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 e5095e3..ebf04fc 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
@@ -38,7 +38,6 @@ import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSo
 import org.apache.tinkerpop.gremlin.structure.Direction;
 import org.apache.tinkerpop.gremlin.structure.Edge;
 import org.apache.tinkerpop.gremlin.structure.T;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
 import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils;
 import org.apache.tinkerpop.shaded.jackson.databind.JsonNode;
 import org.apache.tinkerpop.shaded.jackson.databind.ObjectMapper;
@@ -47,7 +46,6 @@ import org.javatuples.Triplet;
 import org.junit.AssumptionViolatedException;
 
 import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData;
-import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.inV;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.collection.IsIn.in;
 import static org.hamcrest.collection.IsIterableContainingInAnyOrder.containsInAnyOrder;
@@ -313,13 +311,10 @@ public final class StepDefinition {
     //////////////////////////////////////////////
 
     private Traversal parseGremlin(final String script) {
-        if (script.contains(".withComputer("))
-            throw new AssumptionViolatedException("withComputer() syntax is not supported by gremlin-language at this time");
-
         final GremlinLexer lexer = new GremlinLexer(CharStreams.fromString(script));
         final GremlinParser parser = new GremlinParser(new CommonTokenStream(lexer));
         final GremlinParser.QueryContext ctx = parser.query();
-        return (Traversal) new GremlinAntlrToJava(g.getGraph()).visitQuery(ctx);
+        return (Traversal) new GremlinAntlrToJava(g).visitQuery(ctx);
     }
 
     private List<Object> translateResultsToActual() {
diff --git a/hadoop-gremlin/src/test/java/org/apache/tinkerpop/gremlin/hadoop/HadoopGraphFeatureTest.java b/hadoop-gremlin/src/test/java/org/apache/tinkerpop/gremlin/hadoop/HadoopGraphFeatureTest.java
index 8f8f6a4..998b6c2 100644
--- a/hadoop-gremlin/src/test/java/org/apache/tinkerpop/gremlin/hadoop/HadoopGraphFeatureTest.java
+++ b/hadoop-gremlin/src/test/java/org/apache/tinkerpop/gremlin/hadoop/HadoopGraphFeatureTest.java
@@ -29,8 +29,6 @@ import io.cucumber.java.Scenario;
 import io.cucumber.junit.Cucumber;
 import io.cucumber.junit.CucumberOptions;
 import org.apache.commons.configuration2.MapConfiguration;
-import org.apache.commons.lang3.RandomStringUtils;
-import org.apache.tinkerpop.gremlin.LoadGraphWith;
 import org.apache.tinkerpop.gremlin.TestHelper;
 import org.apache.tinkerpop.gremlin.features.TestFiles;
 import org.apache.tinkerpop.gremlin.features.World;
@@ -42,10 +40,7 @@ import org.apache.tinkerpop.gremlin.structure.Graph;
 import org.javatuples.Pair;
 import org.junit.AssumptionViolatedException;
 import org.junit.runner.RunWith;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
-import java.io.File;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
@@ -56,14 +51,12 @@ import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData;
 
 @RunWith(Cucumber.class)
 @CucumberOptions(
-        tags = "not @RemoteOnly and not @MultiMetaProperties",
+        tags = "not @RemoteOnly and not @GraphComputerOnly",
         glue = { "org.apache.tinkerpop.gremlin.features" },
         objectFactory = GuiceFactory.class,
         features = { "../gremlin-test/features" },
         plugin = {"pretty", "junit:target/cucumber.xml"})
 public class HadoopGraphFeatureTest {
-    private static final Logger logger = LoggerFactory.getLogger(HadoopGraphFeatureTest.class);
-
     private static final String skipReasonLength = "Hadoop-Gremlin is OLAP-oriented and for OLTP operations, linear-scan joins are required. This particular tests takes many minutes to execute.";
 
     private static final List<Pair<String, String>> skip = new ArrayList<Pair<String,String>>() {{
diff --git a/spark-gremlin/src/test/java/org/apache/tinkerpop/gremlin/spark/SparkGraphFeatureTest.java b/spark-gremlin/src/test/java/org/apache/tinkerpop/gremlin/spark/SparkGraphFeatureTest.java
index 9112448..21a11ff 100644
--- a/spark-gremlin/src/test/java/org/apache/tinkerpop/gremlin/spark/SparkGraphFeatureTest.java
+++ b/spark-gremlin/src/test/java/org/apache/tinkerpop/gremlin/spark/SparkGraphFeatureTest.java
@@ -46,26 +46,25 @@ import org.apache.tinkerpop.gremlin.structure.Graph;
 import org.javatuples.Pair;
 import org.junit.AssumptionViolatedException;
 import org.junit.runner.RunWith;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Optional;
+import java.util.stream.Collectors;
 
 import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData;
 
 @RunWith(Cucumber.class)
 @CucumberOptions(
-        tags = "not @RemoteOnly and not @MultiMetaProperties",
+        tags = "not @RemoteOnly",
         glue = { "org.apache.tinkerpop.gremlin.features" },
         objectFactory = GuiceFactory.class,
         features = { "../gremlin-test/features" },
         plugin = {"pretty", "junit:target/cucumber.xml"})
 public class SparkGraphFeatureTest {
-    private static final Logger logger = LoggerFactory.getLogger(SparkGraphFeatureTest.class);
     private static final int AVAILABLE_PROCESSORS = Runtime.getRuntime().availableProcessors();
 
     private static final String skipReasonLength = "Spark-Gremlin is OLAP-oriented and for OLTP operations, linear-scan joins are required. This particular tests takes many minutes to execute.";
@@ -86,6 +85,27 @@ public class SparkGraphFeatureTest {
         add(Pair.with("g_V_matchXa_followedBy_count_isXgtX10XX_b__a_0followedBy_count_isXgtX10XX_bX_count", skipReasonLength));
     }};
 
+    private static final List<String> TAGS_TO_IGNORE = Arrays.asList(
+            "@StepDrop",
+            "@StepV",
+            "@StepConnectedComponent", // need to implement this in the grammar
+            "@StepIndex", // doesn't look like this works with Spark atm - doesn't serialize (IndexTest not in the ProcessComputerSuite)
+            "@GraphComputerVerificationOneBulk",
+            "@GraphComputerVerificationMidVNotSupported",
+            "@GraphComputerVerificationInjectionNotSupported",
+            "@GraphComputerVerificationStarGraphExceeded",
+            "@GraphComputerVerificationReferenceOnly");
+
+    private static final List<String> SCENARIOS_TO_IGNORE = Arrays.asList(
+            "g_V_group_byXoutE_countX_byXnameX",
+            "g_V_asXvX_mapXbothE_weight_foldX_sumXlocalX_asXsX_selectXv_sX_order_byXselectXsX_descX",
+            "g_V_hasXlangX_groupXaX_byXlangX_byXnameX_out_capXaX",
+            "g_V_group_byXageX",
+            "g_V_order_byXoutE_count_descX",
+            "g_V_both_both_dedup_byXoutE_countX_name",
+            "g_V_mapXbothE_weight_foldX_order_byXsumXlocalX_descX",
+            "g_V_hasLabelXsoftwareX_order_byXnameX_index_withXmapX");
+
     public static final class ServiceModule extends AbstractModule {
         @Override
         protected void configure() {
@@ -114,15 +134,15 @@ public class SparkGraphFeatureTest {
             if (null == graphData)
                 throw new AssumptionViolatedException("HadoopGraph does not support graph mutations");
             else if (graphData == GraphData.CLASSIC)
-                return classic.traversal().withComputer(Computer.compute(SparkGraphComputer.class));
+                return classic.traversal().withComputer(Computer.compute(SparkGraphComputer.class).workers(AVAILABLE_PROCESSORS));
             else if (graphData == GraphData.CREW)
-                return crew.traversal().withComputer(Computer.compute(SparkGraphComputer.class));
+                return crew.traversal().withComputer(Computer.compute(SparkGraphComputer.class).workers(AVAILABLE_PROCESSORS));
             else if (graphData == GraphData.MODERN)
-                return modern.traversal().withComputer(Computer.compute(SparkGraphComputer.class));
+                return modern.traversal().withComputer(Computer.compute(SparkGraphComputer.class).workers(AVAILABLE_PROCESSORS));
             else if (graphData == GraphData.SINK)
-                return sink.traversal().withComputer(Computer.compute(SparkGraphComputer.class));
+                return sink.traversal().withComputer(Computer.compute(SparkGraphComputer.class).workers(AVAILABLE_PROCESSORS));
             else if (graphData == GraphData.GRATEFUL)
-                return grateful.traversal().withComputer(Computer.compute(SparkGraphComputer.class));
+                return grateful.traversal().withComputer(Computer.compute(SparkGraphComputer.class).workers(AVAILABLE_PROCESSORS));
             else
                 throw new UnsupportedOperationException("GraphData not supported: " + graphData.name());
         }
@@ -133,6 +153,16 @@ public class SparkGraphFeatureTest {
                     filter(s -> s.getValue0().equals(scenario.getName())).findFirst();
             if (skipped.isPresent())
                 throw new AssumptionViolatedException(skipped.get().getValue1());
+
+            final List<String> ignores = TAGS_TO_IGNORE.stream().filter(t -> scenario.getSourceTagNames().contains(t)).collect(Collectors.toList());
+            if (!ignores.isEmpty())
+                throw new AssumptionViolatedException(String.format("This scenario is not supported with GraphComputer: %s", ignores));
+
+            // the following needs some further investigation.........may need to improve the definition of result
+            // equality with map<list>
+            final String scenarioName = scenario.getName();
+            if (SCENARIOS_TO_IGNORE.contains(scenarioName))
+                throw new AssumptionViolatedException("There are some internal ordering issues with result where equality is not required but is being enforced");
         }
 
         private static void readIntoGraph(final Graph graph, final GraphData graphData) {
diff --git a/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/TinkerGraphComputerFeatureTest.java b/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/TinkerGraphComputerFeatureTest.java
new file mode 100644
index 0000000..e996a23
--- /dev/null
+++ b/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/TinkerGraphComputerFeatureTest.java
@@ -0,0 +1,52 @@
+/*
+ * 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.tinkergraph;
+
+import com.google.inject.AbstractModule;
+import com.google.inject.Guice;
+import com.google.inject.Stage;
+import io.cucumber.guice.CucumberModules;
+import io.cucumber.junit.Cucumber;
+import io.cucumber.junit.CucumberOptions;
+import org.apache.tinkerpop.gremlin.features.AbstractGuiceFactory;
+import org.apache.tinkerpop.gremlin.features.World;
+import org.junit.runner.RunWith;
+
+@RunWith(Cucumber.class)
+@CucumberOptions(
+        tags = "not @RemoteOnly",
+        glue = { "org.apache.tinkerpop.gremlin.features" },
+        objectFactory = TinkerGraphComputerFeatureTest.TinkerGraphGuiceFactory.class,
+        features = { "../gremlin-test/features" },
+        plugin = {"pretty", "junit:target/cucumber.xml"})
+public class TinkerGraphComputerFeatureTest {
+
+    public static class TinkerGraphGuiceFactory extends AbstractGuiceFactory {
+        public TinkerGraphGuiceFactory() {
+            super(Guice.createInjector(Stage.PRODUCTION, CucumberModules.createScenarioModule(), new ServiceModule()));
+        }
+    }
+
+    public static final class ServiceModule extends AbstractModule {
+        @Override
+        protected void configure() {
+            bind(World.class).to(TinkerGraphWorld.ComputerWorld.class);
+        }
+    }
+}
diff --git a/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/TinkerGraphFeatureTest.java b/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/TinkerGraphFeatureTest.java
index 6c2d27f..b3a416a 100644
--- a/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/TinkerGraphFeatureTest.java
+++ b/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/TinkerGraphFeatureTest.java
@@ -20,85 +20,33 @@ package org.apache.tinkerpop.gremlin.tinkergraph;
 
 import com.google.inject.AbstractModule;
 import com.google.inject.Guice;
-import com.google.inject.Injector;
 import com.google.inject.Stage;
 import io.cucumber.guice.CucumberModules;
-import io.cucumber.guice.GuiceFactory;
-import io.cucumber.guice.InjectorSource;
 import io.cucumber.junit.Cucumber;
 import io.cucumber.junit.CucumberOptions;
-import org.apache.commons.configuration2.BaseConfiguration;
-import org.apache.commons.configuration2.Configuration;
-import org.apache.tinkerpop.gremlin.TestHelper;
+import org.apache.tinkerpop.gremlin.features.AbstractGuiceFactory;
 import org.apache.tinkerpop.gremlin.features.World;
-import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource;
-import org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerFactory;
-import org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerGraph;
 import org.junit.runner.RunWith;
 
-import java.io.File;
-
-import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData;
-
 @RunWith(Cucumber.class)
 @CucumberOptions(
-        tags = "not @RemoteOnly",
+        tags = "not @RemoteOnly and not @GraphComputerOnly",
         glue = { "org.apache.tinkerpop.gremlin.features" },
-        objectFactory = GuiceFactory.class,
+        objectFactory = TinkerGraphFeatureTest.TinkerGraphGuiceFactory.class,
         features = { "../gremlin-test/features" },
         plugin = {"pretty", "junit:target/cucumber.xml"})
 public class TinkerGraphFeatureTest {
 
-    public static final class ServiceModule extends AbstractModule {
-        @Override
-        protected void configure() {
-            bind(World.class).to(TinkerGraphWorld.class);
+    public static class TinkerGraphGuiceFactory extends AbstractGuiceFactory {
+        public TinkerGraphGuiceFactory() {
+            super(Guice.createInjector(Stage.PRODUCTION, CucumberModules.createScenarioModule(), new ServiceModule()));
         }
     }
 
-    public static class TinkerGraphWorld implements World {
-        private static final TinkerGraph modern = TinkerFactory.createModern();
-        private static final TinkerGraph classic = TinkerFactory.createClassic();
-        private static final TinkerGraph crew = TinkerFactory.createTheCrew();
-        private static final TinkerGraph sink = TinkerFactory.createKitchenSink();
-        private static final TinkerGraph grateful = TinkerFactory.createGratefulDead();
-
-        @Override
-        public GraphTraversalSource getGraphTraversalSource(final GraphData graphData) {
-            if (null == graphData)
-                return TinkerGraph.open(getNumberIdManagerConfiguration()).traversal();
-            else if (graphData == GraphData.CLASSIC)
-                return classic.traversal();
-            else if (graphData == GraphData.CREW)
-                return crew.traversal();
-            else if (graphData == GraphData.MODERN)
-                return modern.traversal();
-            else if (graphData == GraphData.SINK)
-                return sink.traversal();
-            else if (graphData == GraphData.GRATEFUL)
-                return grateful.traversal();
-            else
-                throw new UnsupportedOperationException("GraphData not supported: " + graphData.name());
-        }
-
-        @Override
-        public String changePathToDataFile(final String pathToFileFromGremlin) {
-            return ".." + File.separator + pathToFileFromGremlin;
-        }
-    }
-
-    public static final class WorldInjectorSource implements InjectorSource {
+    public static final class ServiceModule extends AbstractModule {
         @Override
-        public Injector getInjector() {
-            return Guice.createInjector(Stage.PRODUCTION, CucumberModules.createScenarioModule(), new ServiceModule());
+        protected void configure() {
+            bind(World.class).to(TinkerGraphWorld.class);
         }
     }
-
-    private static Configuration getNumberIdManagerConfiguration() {
-        final Configuration conf = new BaseConfiguration();
-        conf.setProperty(TinkerGraph.GREMLIN_TINKERGRAPH_VERTEX_ID_MANAGER, TinkerGraph.DefaultIdManager.INTEGER.name());
-        conf.setProperty(TinkerGraph.GREMLIN_TINKERGRAPH_EDGE_ID_MANAGER, TinkerGraph.DefaultIdManager.INTEGER.name());
-        conf.setProperty(TinkerGraph.GREMLIN_TINKERGRAPH_VERTEX_PROPERTY_ID_MANAGER, TinkerGraph.DefaultIdManager.LONG.name());
-        return conf;
-    }
 }
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
new file mode 100644
index 0000000..f37e5ac
--- /dev/null
+++ b/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/TinkerGraphWorld.java
@@ -0,0 +1,137 @@
+/*
+ * 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.tinkergraph;
+
+import io.cucumber.java.Scenario;
+import org.apache.commons.configuration2.BaseConfiguration;
+import org.apache.commons.configuration2.Configuration;
+import org.apache.commons.configuration2.MapConfiguration;
+import org.apache.tinkerpop.gremlin.LoadGraphWith;
+import org.apache.tinkerpop.gremlin.TestHelper;
+import org.apache.tinkerpop.gremlin.features.World;
+import org.apache.tinkerpop.gremlin.process.computer.GraphComputer;
+import org.apache.tinkerpop.gremlin.process.computer.traversal.strategy.decoration.VertexProgramStrategy;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource;
+import org.apache.tinkerpop.gremlin.tinkergraph.process.computer.TinkerGraphComputer;
+import org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerFactory;
+import org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerGraph;
+import org.junit.AssumptionViolatedException;
+
+import java.io.File;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Random;
+import java.util.stream.Collectors;
+
+/**
+ * The {@link World} implementation for TinkerGraph that provides the {@link GraphTraversalSource} instances required
+ * by the Gherkin test suite.
+ */
+public class TinkerGraphWorld implements World {
+    private static final TinkerGraph modern = TinkerFactory.createModern();
+    private static final TinkerGraph classic = TinkerFactory.createClassic();
+    private static final TinkerGraph crew = TinkerFactory.createTheCrew();
+    private static final TinkerGraph sink = TinkerFactory.createKitchenSink();
+    private static final TinkerGraph grateful = TinkerFactory.createGratefulDead();
+
+    @Override
+    public GraphTraversalSource getGraphTraversalSource(final LoadGraphWith.GraphData graphData) {
+        if (null == graphData)
+            return TinkerGraph.open(getNumberIdManagerConfiguration()).traversal();
+        else if (graphData == LoadGraphWith.GraphData.CLASSIC)
+            return classic.traversal();
+        else if (graphData == LoadGraphWith.GraphData.CREW)
+            return crew.traversal();
+        else if (graphData == LoadGraphWith.GraphData.MODERN)
+            return modern.traversal();
+        else if (graphData == LoadGraphWith.GraphData.SINK)
+            return sink.traversal();
+        else if (graphData == LoadGraphWith.GraphData.GRATEFUL)
+            return grateful.traversal();
+        else
+            throw new UnsupportedOperationException("GraphData not supported: " + graphData.name());
+    }
+
+    @Override
+    public String changePathToDataFile(final String pathToFileFromGremlin) {
+        return ".." + File.separator + pathToFileFromGremlin;
+    }
+
+    private static Configuration getNumberIdManagerConfiguration() {
+        final Configuration conf = new BaseConfiguration();
+        conf.setProperty(TinkerGraph.GREMLIN_TINKERGRAPH_VERTEX_ID_MANAGER, TinkerGraph.DefaultIdManager.INTEGER.name());
+        conf.setProperty(TinkerGraph.GREMLIN_TINKERGRAPH_EDGE_ID_MANAGER, TinkerGraph.DefaultIdManager.INTEGER.name());
+        conf.setProperty(TinkerGraph.GREMLIN_TINKERGRAPH_VERTEX_PROPERTY_ID_MANAGER, TinkerGraph.DefaultIdManager.LONG.name());
+        return conf;
+    }
+
+    /**
+     * Turns on {@link GraphComputer} when testing.
+     */
+    public static class ComputerWorld extends TinkerGraphWorld {
+        private static final Random RANDOM = TestHelper.RANDOM;
+
+        private static final List<String> TAGS_TO_IGNORE = Arrays.asList(
+                "@StepDrop",
+                "@StepV",
+                "@StepConnectedComponent", // need to implement this in the grammar
+                "@GraphComputerVerificationOneBulk",
+                "@GraphComputerVerificationMidVNotSupported",
+                "@GraphComputerVerificationInjectionNotSupported",
+                "@GraphComputerVerificationStarGraphExceeded",
+                "@GraphComputerVerificationReferenceOnly");
+
+        private static final List<String> SCENARIOS_TO_IGNORE = Arrays.asList(
+                "g_V_group_byXoutE_countX_byXnameX",
+                "g_V_asXvX_mapXbothE_weight_foldX_sumXlocalX_asXsX_selectXv_sX_order_byXselectXsX_descX",
+                "g_V_hasXlangX_groupXaX_byXlangX_byXnameX_out_capXaX",
+                "g_V_group_byXageX",
+                "g_V_order_byXoutE_count_descX",
+                "g_V_both_both_dedup_byXoutE_countX_name",
+                "g_V_mapXbothE_weight_foldX_order_byXsumXlocalX_descX",
+                "g_V_hasLabelXsoftwareX_order_byXnameX_index_withXmapX");
+
+        @Override
+        public void beforeEachScenario(final Scenario scenario) {
+            final List<String> ignores = TAGS_TO_IGNORE.stream().filter(t -> scenario.getSourceTagNames().contains(t)).collect(Collectors.toList());
+            if (!ignores.isEmpty())
+                throw new AssumptionViolatedException(String.format("This scenario is not supported with GraphComputer: %s", ignores));
+
+            // the following needs some further investigation.........may need to improve the definition of result
+            // equality with map<list>
+            final String scenarioName = scenario.getName();
+            if (SCENARIOS_TO_IGNORE.contains(scenarioName))
+                throw new AssumptionViolatedException("There are some internal ordering issues with result where equality is not required but is being enforced");
+        }
+
+        @Override
+        public GraphTraversalSource getGraphTraversalSource(final LoadGraphWith.GraphData graphData) {
+            if (null == graphData)
+                throw new AssumptionViolatedException("GraphComputer does not support mutation");
+
+            return super.getGraphTraversalSource(graphData).withStrategies(VertexProgramStrategy.create(new MapConfiguration(new HashMap<String, Object>() {{
+                put(VertexProgramStrategy.WORKERS, Runtime.getRuntime().availableProcessors());
+                put(VertexProgramStrategy.GRAPH_COMPUTER, RANDOM.nextBoolean() ?
+                        GraphComputer.class.getCanonicalName() :
+                        TinkerGraphComputer.class.getCanonicalName());
+            }})));
+        }
+    }
+}
diff --git a/tinkergraph-gremlin/src/test/resources/META-INF/services/io.cucumber.core.backend.ObjectFactory b/tinkergraph-gremlin/src/test/resources/META-INF/services/io.cucumber.core.backend.ObjectFactory
new file mode 100644
index 0000000..d4066a8
--- /dev/null
+++ b/tinkergraph-gremlin/src/test/resources/META-INF/services/io.cucumber.core.backend.ObjectFactory
@@ -0,0 +1,2 @@
+org.apache.tinkerpop.gremlin.tinkergraph.TinkerGraphFeatureTest$TinkerGraphGuiceFactory
+org.apache.tinkerpop.gremlin.tinkergraph.TinkerGraphComputerFeatureTest$TinkerGraphGuiceFactory
\ No newline at end of file