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

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

commit 799e4e3b26c86c01b28b875edaaedf0574a9a401
Author: Florian Hockmann <[email protected]>
AuthorDate: Wed Feb 2 15:16:49 2022 +0100

    TINKERPOP-2518 Enable more Gherkin scenarios
    
    There were three categories of scenarios ignored that are now enabled:
    * Some scenarios passed without any change. I don't know why they were
    ignored in the first place. Maybe we've fixed something in the meantime
    but forgot to enable them again.
    * Some scenarios expected a decimal type as the result but the server
    sent a double. I simply changed the expected type there to reflect what
    we get back from the server.
    * One scenario required a more complex assertion as it expects an array
    of dictionaries which means that we have to perform a deep equality
    check.
---
 .../Gherkin/CommonSteps.cs                         | 22 ++++-
 .../Gherkin/DeepEqualityExtensions.cs              | 96 ++++++++++++++++++++++
 .../Gherkin/GherkinTestRunner.cs                   | 23 ------
 .../Gherkin/IgnoreException.cs                     |  5 --
 gremlin-test/features/sideEffect/Sack.feature      | 12 +--
 5 files changed, 121 insertions(+), 37 deletions(-)

diff --git 
a/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/CommonSteps.cs 
b/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/CommonSteps.cs
index 0c17cc3..3641e69 100644
--- a/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/CommonSteps.cs
+++ b/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/CommonSteps.cs
@@ -46,8 +46,9 @@ namespace Gremlin.Net.IntegrationTest.Gherkin
         private readonly IDictionary<string, object> _parameters = new 
Dictionary<string, object>();
         private ITraversal _traversal;
         private object[] _result;
-        private static readonly JsonSerializerOptions JsonDeserializingOptions 
= new JsonSerializerOptions
-            {PropertyNamingPolicy = JsonNamingPolicy.CamelCase};
+
+        private static readonly JsonSerializerOptions JsonDeserializingOptions 
=
+            new() { PropertyNamingPolicy = JsonNamingPolicy.CamelCase };
         
         public static ScenarioData ScenarioData { get; set; } = new 
ScenarioData(new GraphSON3MessageSerializer());
 
@@ -205,7 +206,22 @@ namespace Gremlin.Net.IntegrationTest.Gherkin
                         var expectedArray = expected.ToArray();
                         foreach (var resultItem in _result)
                         {
-                            Assert.Contains(resultItem, expectedArray);
+                            if (resultItem is Dictionary<object, object> 
resultItemDict)
+                            {
+                                var expectedArrayContainsResultDictionary = 
false;
+                                foreach (var expectedItem in expectedArray)
+                                {
+                                    if (expectedItem is not Dictionary<object, 
object> expectedItemDict) continue;
+                                    if 
(!expectedItemDict.DeepEqual(resultItemDict)) continue;
+                                    expectedArrayContainsResultDictionary = 
true;
+                                    break;
+                                }
+                                
Assert.True(expectedArrayContainsResultDictionary);
+                            }
+                            else
+                            {
+                                Assert.Contains(resultItem, expectedArray);
+                            }
                         }
                         if (characterizedAs != "of")
                         {
diff --git 
a/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/DeepEqualityExtensions.cs
 
b/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/DeepEqualityExtensions.cs
new file mode 100644
index 0000000..d0f36e3
--- /dev/null
+++ 
b/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/DeepEqualityExtensions.cs
@@ -0,0 +1,96 @@
+#region License
+
+/*
+ * 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.
+ */
+
+#endregion
+
+using System.Collections;
+using System.Collections.Generic;
+using System.Linq;
+
+namespace Gremlin.Net.IntegrationTest.Gherkin;
+
+public static class DeepEqualityExtensions
+{
+    public static bool DeepEqual(this Dictionary<object, object> first, 
Dictionary<object, object> second)
+    {
+        if (first.Count != second.Count) return false;
+            
+        foreach (var (key1, value1) in first)
+        {
+            var foundMatch = false;
+            foreach (var (key2, value2) in second)
+            {
+                if (!key1.DeepEqual(key2) || !value1.DeepEqual(value2)) 
continue;
+                foundMatch = true;
+                break;
+            }
+            if (!foundMatch) return false;
+        }
+
+        return true;
+    }
+
+    private static bool DeepEqual(this object first, object second)
+    {
+        if (first == null)
+        {
+            if (second != null) return false;
+        }
+        else if (first is not string && first is IEnumerable enumerable1)
+        {
+            if (second is string || second is not IEnumerable enumerable2) 
return false;
+            if (!enumerable1.DeepEqual(enumerable2))
+            {
+                return false;
+            }
+        }
+        else
+        {
+            if (!first.Equals(second)) return false;
+        }
+
+        return true;
+    }
+    
+    private static bool DeepEqual(this IEnumerable first, IEnumerable second)
+    {
+        if (first is Dictionary<object, object> dict1)
+        {
+            return second is Dictionary<object, object> dict2 && 
dict1.DeepEqual(dict2);
+        }
+        var objectEnum1 = first.ToObjectEnumerable();
+        var objectEnum2 = second.ToObjectEnumerable();
+            
+        // I hope that these IEnumerable<object> objects will always be simple 
collections so we don't need to go
+        //  even deeper...
+        return objectEnum1.SequenceEqual(objectEnum2);
+    }
+    
+    private static IEnumerable<object> ToObjectEnumerable(this IEnumerable 
enumerable)
+    {
+        if (enumerable.GetType().IsArray)
+        {
+            return (IEnumerable<object>)enumerable;
+        }
+
+        return (IEnumerable<object>)enumerable;
+    }
+}
\ No newline at end of file
diff --git 
a/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/GherkinTestRunner.cs 
b/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/GherkinTestRunner.cs
index ea06c76..300eb74 100644
--- 
a/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/GherkinTestRunner.cs
+++ 
b/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/GherkinTestRunner.cs
@@ -45,29 +45,6 @@ namespace Gremlin.Net.IntegrationTest.Gherkin
             {
                 // Add here the name of scenarios to ignore and the reason, 
e.g.:
                 {"g_V_group_byXageX", IgnoreReason.NullKeysInMapNotSupported},
-
-                // they are not failing as a result of the Gremlin itself - 
they are failing because of shortcomings in
-                // the test suite.
-                // https://issues.apache.org/jira/browse/TINKERPOP-2518
-                {"g_withSackX0X_V_outE_sackXsumX_byXweightX_inV_sack_sum", 
IgnoreReason.NoReason},
-                {"g_V_aggregateXaX_byXageX_capXaX_unfold_sum", 
IgnoreReason.NoReason},
-                
{"g_withSackX0X_V_repeatXoutE_sackXsumX_byXweightX_inVX_timesX2X_sack", 
IgnoreReason.NoReason},
-                {"g_injectXlistXnull_10_20_nullXX_meanXlocalX", 
IgnoreReason.NoReason},
-                {"g_injectXnull_10_20_nullX_mean", IgnoreReason.NoReason},
-                {"g_injectXnull_10_5_nullX_sum", IgnoreReason.NoReason},
-                {"g_injectXlistXnull_10_5_nullXX_sumXlocalX", 
IgnoreReason.NoReason},
-                {
-                    
"g_withBulkXfalseX_withSackX1_sumX_VX1X_localXoutEXknowsX_barrierXnormSackX_inVX_inXknowsX_barrier_sack",
-                    IgnoreReason.NoReason
-                },
-                {
-                    
"g_withSackX1_sumX_VX1X_localXoutXknowsX_barrierXnormSackXX_inXknowsX_barrier_sack",
-                    IgnoreReason.NoReason
-                },
-                {
-                    
"g_V_hasXperson_name_markoX_bothXknowsX_groupCount_byXvaluesXnameX_foldX",
-                    IgnoreReason.ArrayKeysInMapNotAssertingInGherkin
-                },
             };
 
         private static class Keywords
diff --git 
a/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/IgnoreException.cs 
b/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/IgnoreException.cs
index 9579626..d7d41e2 100644
--- a/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/IgnoreException.cs
+++ b/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/IgnoreException.cs
@@ -56,10 +56,5 @@ namespace Gremlin.Net.IntegrationTest.Gherkin
         /// C# does not allow a `null` value to be used as a key.
         /// </summary>
         NullKeysInMapNotSupported,
-        
-        /// <summary>
-        /// C# array equality is by reference not contents so the gherkin 
setup won't assert properly
-        /// </summary>
-        ArrayKeysInMapNotAssertingInGherkin
     }
 }
\ No newline at end of file
diff --git a/gremlin-test/features/sideEffect/Sack.feature 
b/gremlin-test/features/sideEffect/Sack.feature
index 6c4627d..4912659 100644
--- a/gremlin-test/features/sideEffect/Sack.feature
+++ b/gremlin-test/features/sideEffect/Sack.feature
@@ -42,7 +42,7 @@ Feature: Step - sack()
     When iterated to list
     Then the result should be unordered
       | result |
-      | d[3.5].m |
+      | d[3.5].d |
 
   Scenario: g_withSackX0X_V_repeatXoutE_sackXsumX_byXweightX_inVX_timesX2X_sack
     Given the modern graph
@@ -53,8 +53,8 @@ Feature: Step - sack()
     When iterated to list
     Then the result should be unordered
       | result |
-      | d[2.0].m |
-      | d[1.4].m |
+      | d[2.0].d |
+      | d[1.4].d |
 
   Scenario: 
g_withBulkXfalseX_withSackX1_sumX_VX1X_localXoutEXknowsX_barrierXnormSackX_inVX_inXknowsX_barrier_sack
     Given the modern graph
@@ -66,7 +66,7 @@ Feature: Step - sack()
     When iterated to list
     Then the result should be unordered
       | result |
-      | d[1.0].m |
+      | d[1.0].d |
 
   Scenario: g_withBulkXfalseX_withSackX1_sumX_V_out_barrier_sack
     Given the modern graph
@@ -92,8 +92,8 @@ Feature: Step - sack()
     When iterated to list
     Then the result should be unordered
       | result |
-      | d[1.0].m |
-      | d[1.0].m |
+      | d[1.0].d |
+      | d[1.0].d |
 
   Scenario: 
g_withSackXBigInteger_TEN_powX1000X_assignX_V_localXoutXknowsX_barrierXnormSackXX_inXknowsX_barrier_sack
     Given an unsupported test

Reply via email to