TINKERPOP-1784 Initial implementation of a new language agnostic test suite

Uses Gherkin to write test specifications that will be implemented by the 
various GLVs. Provided a basic implementation for gremlin-python.


Project: http://git-wip-us.apache.org/repos/asf/tinkerpop/repo
Commit: http://git-wip-us.apache.org/repos/asf/tinkerpop/commit/94cca010
Tree: http://git-wip-us.apache.org/repos/asf/tinkerpop/tree/94cca010
Diff: http://git-wip-us.apache.org/repos/asf/tinkerpop/diff/94cca010

Branch: refs/heads/TINKERPOP-1784
Commit: 94cca010a86536db045764ab77cbed9ddc478b80
Parents: 132011f
Author: Stephen Mallette <sp...@genoprime.com>
Authored: Thu Sep 14 15:44:32 2017 -0400
Committer: Stephen Mallette <sp...@genoprime.com>
Committed: Wed Sep 20 12:32:02 2017 -0400

----------------------------------------------------------------------
 gremlin-python/pom.xml                          | 19 +++++++
 .../main/jython/radish/count_features_step.py   | 59 ++++++++++++++++++++
 .../src/main/jython/radish/terrain.py           | 31 ++++++++++
 gremlin-python/src/main/jython/setup.py         |  3 +-
 gremlin-test/features/Count.feature             | 54 ++++++++++++++++++
 5 files changed, 165 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/94cca010/gremlin-python/pom.xml
----------------------------------------------------------------------
diff --git a/gremlin-python/pom.xml b/gremlin-python/pom.xml
index 379a114..4ab5f37 100644
--- a/gremlin-python/pom.xml
+++ b/gremlin-python/pom.xml
@@ -341,6 +341,10 @@ limitations under the License.
                                               failonerror="true">
                                             <arg line="install wheel"/>
                                         </exec>
+                                        <exec 
dir="${project.build.directory}/python2" executable="env/bin/pip"
+                                              failonerror="true">
+                                            <arg line="install radish-bdd"/>
+                                        </exec>
                                         <exec 
dir="${project.build.directory}/python3" executable="virtualenv"
                                               failonerror="true">
                                             <arg line="--python=python3 env"/>
@@ -349,6 +353,10 @@ limitations under the License.
                                               failonerror="true">
                                             <arg line="install wheel"/>
                                         </exec>
+                                        <exec 
dir="${project.build.directory}/python3" executable="env/bin/pip"
+                                              failonerror="true">
+                                            <arg line="install radish-bdd"/>
+                                        </exec>
                                         <exec 
dir="${project.build.directory}/python-packaged" executable="virtualenv"
                                               failonerror="true">
                                             <arg line="--python=python3 env"/>
@@ -438,6 +446,17 @@ limitations under the License.
                                             <env key="PYTHONPATH" value=""/>
                                             <arg line="setup.py test"/>
                                         </exec>
+                                        <!-- radish seems to like all 
dependencies in place -->
+                                        <exec executable="env/bin/python" 
dir="${project.build.directory}/python2"
+                                              failonerror="true">
+                                            <env key="PYTHONPATH" value=""/>
+                                            <arg line="setup.py install"/>
+                                        </exec>
+                                        <exec executable="env/bin/radish" 
dir="${project.build.directory}/python2"
+                                              failonerror="true">
+                                            <env key="PYTHONPATH" value=""/>
+                                            <arg line="-b 
${project.build.directory}/python2/radish 
${project.basedir}/../gremlin-test/features/"/>
+                                        </exec>                                
                                  
                                     </target>
                                 </configuration>
                             </execution>

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/94cca010/gremlin-python/src/main/jython/radish/count_features_step.py
----------------------------------------------------------------------
diff --git a/gremlin-python/src/main/jython/radish/count_features_step.py 
b/gremlin-python/src/main/jython/radish/count_features_step.py
new file mode 100644
index 0000000..324c29c
--- /dev/null
+++ b/gremlin-python/src/main/jython/radish/count_features_step.py
@@ -0,0 +1,59 @@
+'''
+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.
+'''
+
+from gremlin_python.structure.graph import Graph
+from gremlin_python.process.graph_traversal import __
+from gremlin_python.process.traversal import Scope
+from radish import before, given, when, then
+
+out = __.out
+
+
+@given("the {graphName:w} graph")
+def choose_graph(step, graphName):
+    # only have modern atm but graphName would be used to select the right one
+    step.context.g = 
Graph().traversal().withRemote(step.context.remote_conn_modern)
+
+
+@given("the traversal of")
+def translate_traversal(step):
+    g = step.context.g
+    if step.text == "g.V().count()":
+        step.context.traversal = g.V().count()
+    elif step.text == "g.V().both().both().count()":
+        step.context.traversal = g.V().both().both().count()
+    elif step.text == "g.V().fold().count(Scope.local)":
+        step.context.traversal = g.V().fold().count(Scope.local)
+    elif step.text == "g.V().has(\"no\").count()":
+        step.context.traversal = g.V().has("no").count()
+    else:
+        raise ValueError("Gremlin translation to python not found - missing: " 
+ step.text)
+
+
+@when("iterating")
+def iterate_the_traversal(step):
+    step.context.result = step.context.traversal.toList()
+
+
+@then("the result should be {number:d}")
+def assert_single_result_of_number(step, number):
+    assert len(step.context.result) == 1
+    assert step.context.result[0] == number
+
+

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/94cca010/gremlin-python/src/main/jython/radish/terrain.py
----------------------------------------------------------------------
diff --git a/gremlin-python/src/main/jython/radish/terrain.py 
b/gremlin-python/src/main/jython/radish/terrain.py
new file mode 100644
index 0000000..389f39c
--- /dev/null
+++ b/gremlin-python/src/main/jython/radish/terrain.py
@@ -0,0 +1,31 @@
+'''
+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.
+'''
+
+from gremlin_python.driver.driver_remote_connection import 
DriverRemoteConnection
+from radish import before, after
+
+
+@before.each_scenario
+def prepare_traversal_source(scenario):
+    scenario.context.remote_conn_modern = 
DriverRemoteConnection('ws://localhost:45940/gremlin', 'g')
+
+
+@after.each_scenario
+def close_traversal_source(scenario):
+    scenario.context.remote_conn_modern.close()

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/94cca010/gremlin-python/src/main/jython/setup.py
----------------------------------------------------------------------
diff --git a/gremlin-python/src/main/jython/setup.py 
b/gremlin-python/src/main/jython/setup.py
index e6ab493..fddd7c8 100644
--- a/gremlin-python/src/main/jython/setup.py
+++ b/gremlin-python/src/main/jython/setup.py
@@ -70,7 +70,8 @@ setup(
     ],
     tests_require=[
         'pytest',
-        'mock'
+        'mock',
+        'radish-bdd'
     ],
     install_requires=install_requires,
     classifiers=[

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/94cca010/gremlin-test/features/Count.feature
----------------------------------------------------------------------
diff --git a/gremlin-test/features/Count.feature 
b/gremlin-test/features/Count.feature
new file mode 100644
index 0000000..383eecf
--- /dev/null
+++ b/gremlin-test/features/Count.feature
@@ -0,0 +1,54 @@
+# 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.
+
+Feature: Count Step
+
+  Scenario: Count all vertices
+    Given the modern graph
+    And the traversal of
+    """
+    g.V().count()
+    """
+    When iterating
+    Then the result should be 6
+
+  Scenario: Count vertices after traversing both() twice
+    Given the modern graph
+    And the traversal of
+    """
+    g.V().both().both().count()
+    """
+    When iterating
+    Then the result should be 30
+
+  Scenario: Count local
+    Given the modern graph
+    And the traversal of
+    """
+    g.V().fold().count(Scope.local)
+    """
+    When iterating
+    Then the result should be 6
+
+  Scenario: Count no vertices
+    Given the modern graph
+    And the traversal of
+    """
+    g.V().has("no").count()
+    """
+    When iterating
+    Then the result should be 0
\ No newline at end of file

Reply via email to