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

andreac pushed a commit to branch 3.8-dev
in repository https://gitbox.apache.org/repos/asf/tinkerpop.git


The following commit(s) were added to refs/heads/3.8-dev by this push:
     new 599e51436c Fix flaky TraversalExplanationTest (#3259)
599e51436c is described below

commit 599e51436c9ecde9ee125c6eae8737649233cdaa
Author: andreachild <[email protected]>
AuthorDate: Tue Nov 4 09:28:43 2025 -0800

    Fix flaky TraversalExplanationTest (#3259)
    
    Refactored flaky test 
TraversalExplanationTest.shouldApplyStrategiesCorrectly which has started 
failing more often when executed by github actions. This changeset changes the 
test to validate the individual parts of the TraversalExplanation triplets 
(strategy name, strategy category, steps) instead of using the prettyPrint 
output which can add line breaks in the middle of strategy and step names.
---
 .../traversal/util/TraversalExplanationTest.java   | 71 ++++++++++------------
 1 file changed, 31 insertions(+), 40 deletions(-)

diff --git 
a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/util/TraversalExplanationTest.java
 
b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/util/TraversalExplanationTest.java
index daee1ce1fa..5eba7e49e2 100644
--- 
a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/util/TraversalExplanationTest.java
+++ 
b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/util/TraversalExplanationTest.java
@@ -19,17 +19,21 @@
 
 package org.apache.tinkerpop.gremlin.process.traversal.util;
 
+import java.util.List;
+import java.util.stream.Stream;
 import org.apache.tinkerpop.gremlin.process.traversal.P;
 import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
 import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategies;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategy;
 import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal;
 import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__;
+import 
org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization.AdjacentToIncidentStrategy;
+import 
org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization.CountStrategy;
+import 
org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization.IncidentToAdjacentStrategy;
 import 
org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization.ProductiveByStrategy;
 import org.apache.tinkerpop.gremlin.structure.Graph;
 import org.junit.Test;
 
-import java.util.stream.Stream;
-
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
@@ -98,51 +102,38 @@ public class TraversalExplanationTest {
     public void shouldApplyStrategiesCorrectly() {
         Traversal.Admin<?, ?> traversal = __.out().count().asAdmin();
         
traversal.setStrategies(TraversalStrategies.GlobalCache.getStrategies(Graph.class));
-        int found = 0;
-        for (final String line : traversal.explain().toString().split("\n")) {
-            if (line.contains("AdjacentToIncidentStrategy") && 
line.contains("[VertexStepPlaceholder(OUT,edge)"))
-                found++;
-        }
-        assertEquals(1, found);
+        checkTraversalExplanation(traversal.explain(), List.of(new 
ExplainExpectation(AdjacentToIncidentStrategy.class, 
"[VertexStepPlaceholder(OUT,edge)")));
         ///
         traversal = __.out().group().by(__.in().count()).asAdmin();
         
traversal.setStrategies(TraversalStrategies.GlobalCache.getStrategies(Graph.class).clone());
-        found = 0;
-        for (final String line : traversal.explain().toString().split("\n")) {
-            if (line.contains("AdjacentToIncidentStrategy") && 
line.contains("[VertexStepPlaceholder(IN,edge)"))
-                found++;
-        }
-        assertEquals(1, found);
+        checkTraversalExplanation(traversal.explain(), List.of(new 
ExplainExpectation(AdjacentToIncidentStrategy.class, 
"[VertexStepPlaceholder(IN,edge)")));
         ///
         traversal = 
__.outE().inV().group().by(__.inE().outV().groupCount().by(__.both().count().is(P.gt(2)))).asAdmin();
         
traversal.setStrategies(TraversalStrategies.GlobalCache.getStrategies(Graph.class).clone().removeStrategies(ProductiveByStrategy.class));
-        // System.out.println(traversal.explain());
-        found = 0;
-        for (final String line : traversal.explain().toString().split("]\n")) 
{ // need to split cause of word wrap
-            //System.out.println(line + "\n\n");
-            if (line.contains("IncidentToAdjacentStrategy") && 
line.contains("[VertexStepPlaceholder(IN,vertex)"))
-                found++;
-            if (line.contains("IncidentToAdjacentStrategy") && 
line.contains("[VertexStepPlaceholder(OUT,vertex)"))
-                found++;
-            if (line.contains("AdjacentToIncidentStrategy") && 
line.contains("[VertexStepPlaceholder(BOTH,edge)"))
-                found++;
-            if (line.contains("CountStrategy") && 
line.contains("RangeGlobalStep(0,3)"))
-                found++;
+        checkTraversalExplanation(traversal.explain(), List.of(new 
ExplainExpectation(IncidentToAdjacentStrategy.class, 
"[VertexStepPlaceholder(IN,vertex)"),
+                new ExplainExpectation(IncidentToAdjacentStrategy.class, 
"[VertexStepPlaceholder(OUT,vertex)"),
+                new ExplainExpectation(AdjacentToIncidentStrategy.class, 
"[VertexStepPlaceholder(BOTH,edge)"),
+                new ExplainExpectation(CountStrategy.class, 
"RangeGlobalStep(0,3)")));
+    }
+
+    private void checkTraversalExplanation(final TraversalExplanation 
explanation, final List<ExplainExpectation> expectations) {
+        // explanation string triplet consists of strategy name + strategy 
category + steps
+        expectations.forEach(expectation -> assertTrue(expectation.toString(), 
explanation.getIntermediates()
+                .anyMatch(t -> 
t.getValue0().contains(expectation.strategyClass.getSimpleName()) &&
+                        t.getValue2().contains(expectation.stepSubstring))));
+    }
+
+    private static class ExplainExpectation {
+        final Class<? extends TraversalStrategy<?>> strategyClass;
+        final String stepSubstring;
+
+        ExplainExpectation(final Class<? extends TraversalStrategy<?>> 
strategyClass, final String stepSubstring) {
+            this.strategyClass = strategyClass;
+            this.stepSubstring = stepSubstring;
         }
-        assertEquals(4, found);
-        //
-        //System.out.println(traversal.explain().prettyPrint(160));
-        found = 0;
-        for (final String line : 
traversal.explain().prettyPrint(170).split("]\n")) { // need to split cause of 
word wrap
-            if (line.contains("IncidentToAdjacentStrategy") && 
line.contains("[VertexStepPlaceholder(IN,vertex)"))
-                found++;
-            if (line.contains("IncidentToAdjacentStrategy") && 
line.contains("[VertexStepPlaceholder(OUT,vertex)"))
-                found++;
-            if (line.contains("AdjacentToIncidentStrategy") && 
line.contains("[VertexStepPlaceholder(BOTH,edge)"))
-                found++;
-            if (line.contains("CountStrategy") && 
line.contains("RangeGlobalStep(0,3)"))
-                found++;
+
+        public String toString() {
+            return String.format("Expecting strategy %s and steps substring 
%s", strategyClass.getSimpleName(), stepSubstring);
         }
-        assertEquals(4, found);
     }
 }

Reply via email to