Skip to content

Commit dcdcef0

Browse files
committed
Updated 'clojure-native' of https://github.com/hiredman/cucumber-jvm to apply cleanly to master HEAD
Changed cucumber.runtime.clj to implement cucumber.runtime.clj.Backend#loadGlue Implemented getSnippet to return the same snippets as ClojureBackend.java did Fixed a problem with creating TagExpression in add-hook-definition Added additional feature to execute clojure-snippet Added Before and After step definitions to execute add-hook-definition
2 parents 393837b + d4ffedd commit dcdcef0

File tree

15 files changed

+262
-292
lines changed

15 files changed

+262
-292
lines changed

clojure/pom.xml

+58-35
Original file line numberDiff line numberDiff line change
@@ -13,40 +13,63 @@
1313
<name>Cucumber-JVM: Clojure</name>
1414

1515
<dependencies>
16-
<dependency>
17-
<groupId>info.cukes</groupId>
18-
<artifactId>cucumber-core</artifactId>
19-
</dependency>
20-
<dependency>
21-
<groupId>org.clojure</groupId>
22-
<artifactId>clojure</artifactId>
23-
<scope>provided</scope>
24-
</dependency>
25-
<dependency>
26-
<groupId>info.cukes</groupId>
27-
<artifactId>cucumber-junit</artifactId>
28-
<scope>test</scope>
29-
</dependency>
30-
<dependency>
31-
<groupId>junit</groupId>
32-
<artifactId>junit</artifactId>
33-
<scope>test</scope>
34-
</dependency>
35-
<dependency>
36-
<groupId>org.mockito</groupId>
37-
<artifactId>mockito-all</artifactId>
38-
<scope>test</scope>
39-
</dependency>
40-
<!-- These dependencies are required in order to find classes when running in an IDE - they haven't been jar-jarred -->
41-
<dependency>
42-
<groupId>com.thoughtworks.xstream</groupId>
43-
<artifactId>xstream</artifactId>
44-
<scope>test</scope>
45-
</dependency>
46-
<dependency>
47-
<groupId>com.googlecode.java-diff-utils</groupId>
48-
<artifactId>diffutils</artifactId>
49-
<scope>test</scope>
50-
</dependency>
16+
<dependency>
17+
<groupId>info.cukes</groupId>
18+
<artifactId>cucumber-core</artifactId>
19+
</dependency>
20+
<dependency>
21+
<groupId>org.clojure</groupId>
22+
<artifactId>clojure</artifactId>
23+
<scope>provided</scope>
24+
</dependency>
25+
<dependency>
26+
<groupId>junit</groupId>
27+
<artifactId>junit</artifactId>
28+
<scope>test</scope>
29+
</dependency>
30+
<dependency>
31+
<groupId>info.cukes</groupId>
32+
<artifactId>cucumber-junit</artifactId>
33+
<scope>test</scope>
34+
</dependency>
35+
<dependency>
36+
<groupId>com.thoughtworks.xstream</groupId>
37+
<artifactId>xstream</artifactId>
38+
<scope>test</scope>
39+
</dependency>
5140
</dependencies>
41+
<build>
42+
<plugins>
43+
<plugin>
44+
<groupId>com.theoryinpractise</groupId>
45+
<artifactId>clojure-maven-plugin</artifactId>
46+
<version>1.3.6</version>
47+
<configuration>
48+
<namespaces>
49+
<namespace>cucumber.*</namespace>
50+
</namespaces>
51+
<sourceDirectories>
52+
<sourceDirectory>src/main/clj</sourceDirectory>
53+
</sourceDirectories>
54+
<compileDeclaredNamespaceOnly>true</compileDeclaredNamespaceOnly>
55+
</configuration>
56+
<executions>
57+
<execution>
58+
<id>compile</id>
59+
<phase>compile</phase>
60+
<goals>
61+
<goal>compile</goal>
62+
</goals>
63+
</execution>
64+
<execution>
65+
<id>test</id>
66+
<phase>test</phase>
67+
<goals>
68+
<goal>test</goal>
69+
</goals>
70+
</execution>
71+
</executions>
72+
</plugin>
73+
</plugins>
74+
</build>
5275
</project>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,137 @@
1+
(ns cucumber.runtime.clj
2+
(:import (cucumber.runtime CucumberException
3+
JdkPatternArgumentMatcher
4+
StepDefinition
5+
HookDefinition)
6+
(cucumber.runtime.snippets Snippet
7+
SnippetGenerator)
8+
(gherkin TagExpression)
9+
(clojure.lang RT))
10+
(:gen-class :name cucumber.runtime.clj.Backend
11+
:implements [cucumber.runtime.Backend]
12+
:constructors
13+
{[cucumber.io.ResourceLoader] []}
14+
:init init
15+
:state state))
16+
17+
(def glue (atom nil))
18+
19+
(defn clojure-snippet []
20+
(reify
21+
Snippet
22+
(template [_]
23+
(str
24+
"({0} #\"{1}\"\n"
25+
" (fn [{3}]\n"
26+
" '' {4}\n"
27+
" ))\n"))
28+
(arguments [_ argumentTypes]
29+
(SnippetGenerator/untypedArguments argumentTypes))
30+
(namedGroupStart [_] nil)
31+
(namedGroupEnd [_] nil)
32+
(escapePattern [_ pattern]
33+
(str pattern))))
34+
35+
(def snippet-generator (SnippetGenerator. (clojure-snippet)))
36+
37+
(defn load-script [path]
38+
(try
39+
(RT/load (str (.replaceAll path ".clj$" "")) true)
40+
(catch Throwable t
41+
(throw (CucumberException. t)))))
42+
43+
(defn- -init [resource-loader]
44+
[[] (atom {:resource-loader resource-loader})])
45+
46+
(defn -loadGlue [cljb a-glue glue-paths]
47+
(reset! glue a-glue)
48+
(doseq [path glue-paths
49+
resource (.resources (:resource-loader @(.state cljb)) path ".clj")]
50+
(binding [*ns* (create-ns 'cucumber.runtime.clj)]
51+
(load-script (.getPath resource)))))
52+
53+
(defn- -buildWorld [cljb])
54+
55+
(defn- -disposeWorld [cljb])
56+
57+
(defn- -getSnippet [cljb step]
58+
(.getSnippet snippet-generator step))
59+
60+
(defn- -setUnreportedStepExecutor [cljb executor]
61+
"executor")
62+
63+
(defn add-step-definition [pattern fun location]
64+
(.addStepDefinition
65+
@glue
66+
(reify
67+
StepDefinition
68+
(matchedArguments [_ step]
69+
(.argumentsFrom (JdkPatternArgumentMatcher. pattern)
70+
(.getName step)))
71+
(getLocation [_]
72+
(str (:file location) ":" (:line location)))
73+
(getParameterTypes [_]
74+
nil)
75+
(execute [_ locale args]
76+
(apply fun args))
77+
(isDefinedAt [_ stack-trace-element]
78+
(and (= (.getLineNumber stack-trace-element)
79+
(:line location))
80+
(= (.getFileName stack-trace-element)
81+
(:file location))))
82+
(getPattern [_]
83+
(str pattern)))))
84+
85+
(defmulti add-hook-definition (fn [t & _] t))
86+
87+
(defmethod add-hook-definition :before [_ tag-expression hook-fun]
88+
(let [te (TagExpression. tag-expression)]
89+
(.addBeforeHook
90+
@glue
91+
(reify
92+
HookDefinition
93+
(execute [hd scenario-result]
94+
(hook-fun))
95+
(matches [hd tags]
96+
(.eval te tags))
97+
(getOrder [hd] 0)))))
98+
99+
(defmethod add-hook-definition :after [_ tag-expression hook-fun]
100+
(let [te (TagExpression. tag-expression)
101+
max-parameter-count (->> hook-fun class .getDeclaredMethods
102+
(filter #(= "invoke" (.getName %)))
103+
(map #(count (.getParameterTypes %)))
104+
(apply max))]
105+
(.addBeforeHook
106+
@glue
107+
(reify
108+
HookDefinition
109+
(execute [hd scenario-result]
110+
(if (zero? max-parameter-count)
111+
(hook-fun)
112+
(hook-fun scenario-result)))
113+
(matches [hd tags]
114+
(.eval te tags))
115+
(getOrder [hd] 0)))))
116+
117+
;; TODO: before and after hooks
118+
119+
(defmacro step-macros [& names]
120+
(cons 'do
121+
(for [name names]
122+
`(defmacro ~name [pattern# fun#]
123+
`(add-step-definition ~pattern# ~fun#
124+
'~{:file *file*
125+
:line (:line (meta ~'&form))})))))
126+
(step-macros
127+
Given When Then And But)
128+
129+
(defmacro Before [& fun]
130+
(when (not (empty? fun))
131+
(let [fun (first fun)]
132+
`(add-hook-definition :before [] ~fun))))
133+
134+
(defmacro After [& fun]
135+
(when (not (empty? fun))
136+
(let [fun (first fun)]
137+
`(add-hook-definition :after [] ~fun))))
+28
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
(ns leiningen.cuke
2+
(:require [leiningen.compile :as lc]
3+
[leiningen.core :as c]))
4+
5+
(defn cuke
6+
"runs cucumber"
7+
[project]
8+
;; basically a reimplimentation of cli.Main that doesn't annoyingly
9+
;; call System/exit
10+
(lc/eval-in-project
11+
project
12+
`(let [~'runtime (cucumber.runtime.Runtime.
13+
(list* ["test/cucumber"])
14+
(cucumber.io.FileResourceLoader.) false)
15+
mformatter# (doto (cucumber.formatter.MultiFormatter.)
16+
(.add (.createFormatter
17+
(cucumber.formatter.FormatterFactory.)
18+
"pretty" System/out)))
19+
formatter# (.formatterProxy mformatter#)]
20+
(.run ~'runtime
21+
(list* ["test/cucumber/features"])
22+
(list)
23+
formatter#
24+
(.reporterProxy mformatter#))
25+
(.done formatter#)
26+
(println)
27+
~(when-not c/*interactive?*
28+
`(System/exit (.exitStatus ~'runtime))))))

clojure/src/main/java/cucumber/runtime/clojure/ClojureBackend.java

-103
This file was deleted.

clojure/src/main/java/cucumber/runtime/clojure/ClojureHook.java

-18
This file was deleted.

0 commit comments

Comments
 (0)