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

kenhuuu pushed a commit to branch local-emit-repeat
in repository https://gitbox.apache.org/repos/asf/tinkerpop.git

commit e7f3a1ab294b98e972c4b74b4989d4357745e97b
Author: Ken Hu <[email protected]>
AuthorDate: Thu Jan 8 16:26:47 2026 -0800

    Add feature tests for local-emit-repeat scenario
---
 .../Gremlin.Net.IntegrationTest/Gherkin/Gremlin.cs |  3 +
 gremlin-go/driver/cucumber/gremlin.go              |  3 +
 .../gremlin-javascript/test/cucumber/gremlin.js    |  3 +
 gremlin-python/src/main/python/radish/gremlin.py   |  3 +
 .../gremlin/test/features/branch/Repeat.feature    | 75 ++++++++++++++++++++++
 5 files changed, 87 insertions(+)

diff --git a/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/Gremlin.cs 
b/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/Gremlin.cs
index 0a6cfbc701..0b8bb653ed 100644
--- a/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/Gremlin.cs
+++ b/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/Gremlin.cs
@@ -182,6 +182,9 @@ namespace Gremlin.Net.IntegrationTest.Gherkin
                
{"g_VX3X_repeatXoutE_order_byXweightX_tailX2X_inVX_timesX2X_valuesXnameX", new 
List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> 
{(g,p) 
=>g.V(p["vid3"]).Repeat(__.OutE().Order().By("weight").Tail<object>(2).InV()).Times(2).Values<object>("name")}},
 
                
{"g_VX3X_repeatXoutE_order_byXweight_descX_limitX2X_inVX_timesX2X_valuesXnameX",
 new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> 
{(g,p) =>g.V(p["vid3"]).Repeat(__.OutE().Order().By("weight", 
Order.Desc).Limit<object>(2).InV()).Times(2).Values<object>("name")}}, 
                {"g_V_emit_repeatXout_order_byXnameXX_timesX2X_valuesXnameX", 
new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> 
{(g,p) 
=>g.V().Emit().Repeat(__.Out().Order().By("name")).Times(2).Values<object>("name")}},
 
+               
{"g_V_localXemit_repeatXout_order_byXnameXX_timesX2X_valuesXnameXX", new 
List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> 
{(g,p) 
=>g.V().Local<object>(__.Emit().Repeat(__.Out().Order().By("name")).Times(2).Values<object>("name"))}},
 
+               
{"g_V_emit_repeatXlocalXout_order_byXnameXXX_timesX2X_valuesXnameX", new 
List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> 
{(g,p) 
=>g.V().Emit().Repeat(__.Local<object>(__.Out().Order().By("name"))).Times(2).Values<object>("name")}},
 
+               
{"g_V_localXemit_repeatXlocalXout_order_byXnameXXX_timesX2X_valuesXnameXX", new 
List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> 
{(g,p) 
=>g.V().Local<object>(__.Emit().Repeat(__.Local<object>(__.Out().Order().By("name"))).Times(2).Values<object>("name"))}},
 
                
{"g_V_emitXhasLabelXpersonXX_repeatXout_order_byXnameXX_timesX2X_valuesXnameX", 
new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> 
{(g,p) 
=>g.V().Emit(__.HasLabel("person")).Repeat(__.Out().Order().By("name")).Times(2).Values<object>("name")}},
 
                
{"g_V_untilXloops_isX2XX_repeatXout_order_byXnameXX_valuesXnameX", new 
List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> 
{(g,p) 
=>g.V().Until(__.Loops().Is(2)).Repeat(__.Out().Order().By("name")).Values<object>("name")}},
 
                {"g_V_emit_repeatXdedupX_timesX1X", new 
List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> 
{(g,p) =>g.V().Emit().Repeat(__.Dedup()).Times(1)}}, 
diff --git a/gremlin-go/driver/cucumber/gremlin.go 
b/gremlin-go/driver/cucumber/gremlin.go
index d975424664..30541a0f2a 100644
--- a/gremlin-go/driver/cucumber/gremlin.go
+++ b/gremlin-go/driver/cucumber/gremlin.go
@@ -152,6 +152,9 @@ var translationMap = map[string][]func(g 
*gremlingo.GraphTraversalSource, p map[
     "g_VX3X_repeatXoutE_order_byXweightX_tailX2X_inVX_timesX2X_valuesXnameX": 
{func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) 
*gremlingo.GraphTraversal {return 
g.V(p["vid3"]).Repeat(gremlingo.T__.OutE().Order().By("weight").Tail(2).InV()).Times(2).Values("name")}},
 
     
"g_VX3X_repeatXoutE_order_byXweight_descX_limitX2X_inVX_timesX2X_valuesXnameX": 
{func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) 
*gremlingo.GraphTraversal {return 
g.V(p["vid3"]).Repeat(gremlingo.T__.OutE().Order().By("weight", 
gremlingo.Order.Desc).Limit(2).InV()).Times(2).Values("name")}}, 
     "g_V_emit_repeatXout_order_byXnameXX_timesX2X_valuesXnameX": {func(g 
*gremlingo.GraphTraversalSource, p map[string]interface{}) 
*gremlingo.GraphTraversal {return 
g.V().Emit().Repeat(gremlingo.T__.Out().Order().By("name")).Times(2).Values("name")}},
 
+    "g_V_localXemit_repeatXout_order_byXnameXX_timesX2X_valuesXnameXX": 
{func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) 
*gremlingo.GraphTraversal {return 
g.V().Local(gremlingo.T__.Emit().Repeat(gremlingo.T__.Out().Order().By("name")).Times(2).Values("name"))}},
 
+    "g_V_emit_repeatXlocalXout_order_byXnameXXX_timesX2X_valuesXnameX": 
{func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) 
*gremlingo.GraphTraversal {return 
g.V().Emit().Repeat(gremlingo.T__.Local(gremlingo.T__.Out().Order().By("name"))).Times(2).Values("name")}},
 
+    "g_V_localXemit_repeatXlocalXout_order_byXnameXXX_timesX2X_valuesXnameXX": 
{func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) 
*gremlingo.GraphTraversal {return 
g.V().Local(gremlingo.T__.Emit().Repeat(gremlingo.T__.Local(gremlingo.T__.Out().Order().By("name"))).Times(2).Values("name"))}},
 
     
"g_V_emitXhasLabelXpersonXX_repeatXout_order_byXnameXX_timesX2X_valuesXnameX": 
{func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) 
*gremlingo.GraphTraversal {return 
g.V().Emit(gremlingo.T__.HasLabel("person")).Repeat(gremlingo.T__.Out().Order().By("name")).Times(2).Values("name")}},
 
     "g_V_untilXloops_isX2XX_repeatXout_order_byXnameXX_valuesXnameX": {func(g 
*gremlingo.GraphTraversalSource, p map[string]interface{}) 
*gremlingo.GraphTraversal {return 
g.V().Until(gremlingo.T__.Loops().Is(2)).Repeat(gremlingo.T__.Out().Order().By("name")).Values("name")}},
 
     "g_V_emit_repeatXdedupX_timesX1X": {func(g 
*gremlingo.GraphTraversalSource, p map[string]interface{}) 
*gremlingo.GraphTraversal {return 
g.V().Emit().Repeat(gremlingo.T__.Dedup()).Times(1)}}, 
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 e7e4dd0197..095bfab7fe 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
@@ -183,6 +183,9 @@ const gremlins = {
     g_VX3X_repeatXoutE_order_byXweightX_tailX2X_inVX_timesX2X_valuesXnameX: 
[function({g, vid3}) { return 
g.V(vid3).repeat(__.outE().order().by("weight").tail(2).inV()).times(2).values("name")
 }], 
     
g_VX3X_repeatXoutE_order_byXweight_descX_limitX2X_inVX_timesX2X_valuesXnameX: 
[function({g, vid3}) { return g.V(vid3).repeat(__.outE().order().by("weight", 
Order.desc).limit(2).inV()).times(2).values("name") }], 
     g_V_emit_repeatXout_order_byXnameXX_timesX2X_valuesXnameX: [function({g}) 
{ return 
g.V().emit().repeat(__.out().order().by("name")).times(2).values("name") }], 
+    g_V_localXemit_repeatXout_order_byXnameXX_timesX2X_valuesXnameXX: 
[function({g}) { return 
g.V().local(__.emit().repeat(__.out().order().by("name")).times(2).values("name"))
 }], 
+    g_V_emit_repeatXlocalXout_order_byXnameXXX_timesX2X_valuesXnameX: 
[function({g}) { return 
g.V().emit().repeat(__.local(__.out().order().by("name"))).times(2).values("name")
 }], 
+    g_V_localXemit_repeatXlocalXout_order_byXnameXXX_timesX2X_valuesXnameXX: 
[function({g}) { return 
g.V().local(__.emit().repeat(__.local(__.out().order().by("name"))).times(2).values("name"))
 }], 
     
g_V_emitXhasLabelXpersonXX_repeatXout_order_byXnameXX_timesX2X_valuesXnameX: 
[function({g}) { return 
g.V().emit(__.hasLabel("person")).repeat(__.out().order().by("name")).times(2).values("name")
 }], 
     g_V_untilXloops_isX2XX_repeatXout_order_byXnameXX_valuesXnameX: 
[function({g}) { return 
g.V().until(__.loops().is(2)).repeat(__.out().order().by("name")).values("name")
 }], 
     g_V_emit_repeatXdedupX_timesX1X: [function({g}) { return 
g.V().emit().repeat(__.dedup()).times(1) }], 
diff --git a/gremlin-python/src/main/python/radish/gremlin.py 
b/gremlin-python/src/main/python/radish/gremlin.py
index d6456be0ac..ef4723d178 100644
--- a/gremlin-python/src/main/python/radish/gremlin.py
+++ b/gremlin-python/src/main/python/radish/gremlin.py
@@ -155,6 +155,9 @@ world.gremlins = {
     'g_VX3X_repeatXoutE_order_byXweightX_tailX2X_inVX_timesX2X_valuesXnameX': 
[(lambda g, 
vid3=None:g.V(vid3).repeat(__.out_e().order().by('weight').tail(2).in_v()).times(2).values('name'))],
 
     
'g_VX3X_repeatXoutE_order_byXweight_descX_limitX2X_inVX_timesX2X_valuesXnameX': 
[(lambda g, vid3=None:g.V(vid3).repeat(__.out_e().order().by('weight', 
Order.desc).limit(2).in_v()).times(2).values('name'))], 
     'g_V_emit_repeatXout_order_byXnameXX_timesX2X_valuesXnameX': [(lambda 
g:g.V().emit().repeat(__.out().order().by('name')).times(2).values('name'))], 
+    'g_V_localXemit_repeatXout_order_byXnameXX_timesX2X_valuesXnameXX': 
[(lambda 
g:g.V().local(__.emit().repeat(__.out().order().by('name')).times(2).values('name')))],
 
+    'g_V_emit_repeatXlocalXout_order_byXnameXXX_timesX2X_valuesXnameX': 
[(lambda 
g:g.V().emit().repeat(__.local(__.out().order().by('name'))).times(2).values('name'))],
 
+    'g_V_localXemit_repeatXlocalXout_order_byXnameXXX_timesX2X_valuesXnameXX': 
[(lambda 
g:g.V().local(__.emit().repeat(__.local(__.out().order().by('name'))).times(2).values('name')))],
 
     
'g_V_emitXhasLabelXpersonXX_repeatXout_order_byXnameXX_timesX2X_valuesXnameX': 
[(lambda 
g:g.V().emit(__.has_label('person')).repeat(__.out().order().by('name')).times(2).values('name'))],
 
     'g_V_untilXloops_isX2XX_repeatXout_order_byXnameXX_valuesXnameX': [(lambda 
g:g.V().until(__.loops().is_(2)).repeat(__.out().order().by('name')).values('name'))],
 
     'g_V_emit_repeatXdedupX_timesX1X': [(lambda 
g:g.V().emit().repeat(__.dedup()).times(1))], 
diff --git 
a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/branch/Repeat.feature
 
b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/branch/Repeat.feature
index 07e6f23179..e13bd04755 100644
--- 
a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/branch/Repeat.feature
+++ 
b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/branch/Repeat.feature
@@ -856,6 +856,81 @@ Feature: Step - repeat()
       | peter |
       | lop |
 
+  @GraphComputerVerificationStarGraphExceeded
+  Scenario: g_V_localXemit_repeatXout_order_byXnameXX_timesX2X_valuesXnameXX
+    Given the modern graph
+    And the traversal of
+      """
+      
g.V().local(__.emit().repeat(__.out().order().by("name")).times(2).values("name"))
+      """
+    When iterated to list
+    Then the result should be unordered
+      | result |
+      | marko |
+      | josh |
+      | lop |
+      | ripple |
+      | lop |
+      | vadas |
+      | vadas |
+      | lop |
+      | josh |
+      | lop |
+      | ripple |
+      | ripple |
+      | peter |
+      | lop |
+
+  @GraphComputerVerificationStarGraphExceeded
+  Scenario: g_V_emit_repeatXlocalXout_order_byXnameXXX_timesX2X_valuesXnameX
+    Given the modern graph
+    And the traversal of
+      """
+      
g.V().emit().repeat(__.local(__.out().order().by("name"))).times(2).values("name")
+      """
+    When iterated to list
+    Then the result should be unordered
+      | result |
+      | marko |
+      | josh |
+      | lop |
+      | ripple |
+      | lop |
+      | vadas |
+      | vadas |
+      | lop |
+      | josh |
+      | lop |
+      | ripple |
+      | ripple |
+      | peter |
+      | lop |
+
+  @GraphComputerVerificationStarGraphExceeded
+  Scenario: 
g_V_localXemit_repeatXlocalXout_order_byXnameXXX_timesX2X_valuesXnameXX
+    Given the modern graph
+    And the traversal of
+      """
+      
g.V().local(__.emit().repeat(__.local(__.out().order().by("name"))).times(2).values("name"))
+      """
+    When iterated to list
+    Then the result should be unordered
+      | result |
+      | marko |
+      | josh |
+      | lop |
+      | ripple |
+      | lop |
+      | vadas |
+      | vadas |
+      | lop |
+      | josh |
+      | lop |
+      | ripple |
+      | ripple |
+      | peter |
+      | lop |
+
   Scenario: 
g_V_emitXhasLabelXpersonXX_repeatXout_order_byXnameXX_timesX2X_valuesXnameX
     Given the modern graph
     And the traversal of

Reply via email to