[#328] completions for clojure.test do not work

This commit is contained in:
Michiel Borkent 2020-04-04 14:26:02 +02:00
parent 62014c0e74
commit 3bf27445f3
2 changed files with 33 additions and 21 deletions

View file

@ -88,10 +88,10 @@
(or (when (and (identical? :unqualified qualifier) (re-find pat sym-name)) (or (when (and (identical? :unqualified qualifier) (re-find pat sym-name))
[sym-ns sym-name]) [sym-ns sym-name])
(when sym-ns (when sym-ns
(or (when (re-find pat (str sym-ns "/" sym-name)) (or (when (re-find pat (str (get ns->alias (symbol sym-ns)) "/" sym-name))
[sym-ns (str sym-ns "/" sym-name)]) [sym-ns (str (get ns->alias (symbol sym-ns)) "/" sym-name)])
(when (re-find pat (str (get ns->alias (symbol sym-ns)) "/" sym-name)) (when (re-find pat (str sym-ns "/" sym-name))
[sym-ns (str (get ns->alias (symbol sym-ns)) "/" sym-name)])))))) [sym-ns (str sym-ns "/" sym-name)]))))))
(defn complete [ctx o msg] (defn complete [ctx o msg]
(try (try

View file

@ -2,10 +2,10 @@
(:require (:require
[babashka.impl.bencode.core :as bencode] [babashka.impl.bencode.core :as bencode]
[babashka.impl.nrepl-server :refer [start-server! stop-server!]] [babashka.impl.nrepl-server :refer [start-server! stop-server!]]
[babashka.main :as main]
[babashka.test-utils :as tu] [babashka.test-utils :as tu]
[babashka.wait :as wait] [babashka.wait :as wait]
[cheshire.core :as cheshire] [cheshire.core :as cheshire]
[clojure.java.shell :refer [sh]]
[clojure.test :as t :refer [deftest is testing]] [clojure.test :as t :refer [deftest is testing]]
[sci.impl.opts :refer [init]]) [sci.impl.opts :refer [init]])
(:import [java.lang ProcessBuilder$Redirect])) (:import [java.lang ProcessBuilder$Redirect]))
@ -41,29 +41,31 @@
in (java.io.PushbackInputStream. in) in (java.io.PushbackInputStream. in)
os (.getOutputStream socket)] os (.getOutputStream socket)]
(bencode/write-bencode os {"op" "clone"}) (bencode/write-bencode os {"op" "clone"})
(let [session (:new-session (read-msg (bencode/read-bencode in)))] (let [session (:new-session (read-msg (bencode/read-bencode in)))
id (atom 0)
new-id! #(swap! id inc)]
(testing "session" (testing "session"
(is session)) (is session))
(testing "eval" (testing "eval"
(bencode/write-bencode os {"op" "eval" "code" "(+ 1 2 3)" "session" session "id" 1}) (bencode/write-bencode os {"op" "eval" "code" "(+ 1 2 3)" "session" session "id" (new-id!)})
(let [msg (read-reply in session 1) (let [msg (read-reply in session @id)
id (:id msg) id (:id msg)
value (:value msg)] value (:value msg)]
(is (= 1 id)) (is (= 1 id))
(is (= value "6")))) (is (= value "6"))))
(testing "load-file" (testing "load-file"
(bencode/write-bencode os {"op" "load-file" "file" "(ns foo) (defn foo [] :foo)" "session" session "id" 2}) (bencode/write-bencode os {"op" "load-file" "file" "(ns foo) (defn foo [] :foo)" "session" session "id" (new-id!)})
(read-reply in session 2) (read-reply in session @id)
(bencode/write-bencode os {"op" "eval" "code" "(foo)" "ns" "foo" "session" session "id" 3}) (bencode/write-bencode os {"op" "eval" "code" "(foo)" "ns" "foo" "session" session "id" (new-id!)})
(is (= ":foo" (:value (read-reply in session 3))))) (is (= ":foo" (:value (read-reply in session @id)))))
(testing "complete" (testing "complete"
(testing "completions for fo" (testing "completions for fo"
(bencode/write-bencode os {"op" "complete" (bencode/write-bencode os {"op" "complete"
"symbol" "fo" "symbol" "fo"
"session" session "session" session
"id" 4 "id" (new-id!)
"ns" "foo"}) "ns" "foo"})
(let [reply (read-reply in session 4) (let [reply (read-reply in session @id)
completions (:completions reply) completions (:completions reply)
completions (mapv read-msg completions) completions (mapv read-msg completions)
completions (into #{} (map (juxt :ns :candidate)) completions)] completions (into #{} (map (juxt :ns :candidate)) completions)]
@ -72,19 +74,29 @@
(testing "completions for quux should be empty" (testing "completions for quux should be empty"
(bencode/write-bencode os {"op" "complete" (bencode/write-bencode os {"op" "complete"
"symbol" "quux" "symbol" "quux"
"session" session "id" 6 "session" session "id" (new-id!)
"ns" "foo"}) "ns" "foo"})
(let [reply (read-reply in session 6) (let [reply (read-reply in session @id)
completions (:completions reply)] completions (:completions reply)]
(is (empty? completions))) (is (empty? completions)))
(testing "unless quux is an alias" (testing "unless quux is an alias"
(bencode/write-bencode os {"op" "eval" "code" "(require '[cheshire.core :as quux])" "session" session "id" 7}) (bencode/write-bencode os {"op" "eval" "code" "(require '[cheshire.core :as quux])" "session" session "id" (new-id!)})
(bencode/write-bencode os {"op" "complete" "symbol" "quux" "session" session "id" 8}) (read-reply in session @id)
(let [reply (read-reply in session 8) (bencode/write-bencode os {"op" "complete" "symbol" "quux" "session" session "id" (new-id!)})
(let [reply (read-reply in session @id)
completions (:completions reply) completions (:completions reply)
completions (mapv read-msg completions) completions (mapv read-msg completions)
completions (into #{} (map (juxt :ns :candidate)) completions)] completions (into #{} (map (juxt :ns :candidate)) completions)]
(is (contains? completions ["cheshire.core" "quux/generate-string"])))))) (is (contains? completions ["cheshire.core" "quux/generate-string"])))))
(testing "completions for clojure.test"
(bencode/write-bencode os {"op" "eval" "code" "(require '[clojure.test :as test])" "session" session "id" (new-id!)})
(read-reply in session @id)
(bencode/write-bencode os {"op" "complete" "symbol" "test" "session" session "id" (new-id!)})
(let [reply (read-reply in session @id)
completions (:completions reply)
completions (mapv read-msg completions)
completions (into #{} (map (juxt :ns :candidate)) completions)]
(is (contains? completions ["clojure.test" "test/deftest"])))))
#_(testing "interrupt" ;; .stop doesn't work on Thread in GraalVM, this is why we can't have this yet #_(testing "interrupt" ;; .stop doesn't work on Thread in GraalVM, this is why we can't have this yet
(bencode/write-bencode os {"op" "eval" "code" "(range)" "session" session "id" 9}) (bencode/write-bencode os {"op" "eval" "code" "(range)" "session" session "id" 9})
(Thread/sleep 1000) (Thread/sleep 1000)
@ -97,7 +109,7 @@
(if tu/jvm? (if tu/jvm?
(future (future
(start-server! (start-server!
(init {:namespaces {'cheshire.core {'generate-string cheshire/generate-string}} (init {:namespaces main/namespaces
:features #{:bb}}) "0.0.0.0:1667")) :features #{:bb}}) "0.0.0.0:1667"))
(let [pb (ProcessBuilder. ["./bb" "--nrepl-server" "0.0.0.0:1667"]) (let [pb (ProcessBuilder. ["./bb" "--nrepl-server" "0.0.0.0:1667"])
_ (.redirectError pb ProcessBuilder$Redirect/INHERIT) _ (.redirectError pb ProcessBuilder$Redirect/INHERIT)