Compatibility with cognitest test runner and tools.namespace (#1423)
This commit is contained in:
parent
326b1def6b
commit
495ded8a50
19 changed files with 80 additions and 766 deletions
|
|
@ -8,10 +8,12 @@ A preview of the next release can be installed from
|
|||
## Unreleased
|
||||
|
||||
- Add `run-test` and `run-test-var` to `clojure.test`
|
||||
- Compatibility with Cognitest [test-runner](https://github.com/cognitect-labs/test-runner) and [tools.namespace](https://github.com/clojure/tools.namespace)
|
||||
- Compile distributed uberjar using GraalVM, fixes `babashka.process/exec` for Nix
|
||||
- [#1414](https://github.com/babashka/babashka/issues/1414): preserve metadata on exec task function argument map
|
||||
- [#1269](https://github.com/babashka/babashka/issues/1269): add lib tests for sluj ([@bobisageek](https://github.com/bobisageek))
|
||||
- Update nix app example in docs
|
||||
|
||||
## 1.0.165 (2022-11-01)
|
||||
|
||||
- Fix [#1401](https://github.com/babashka/babashka/issues/1401): mutation of `deftype` field should be visible in protocol method
|
||||
|
|
|
|||
6
deps.edn
6
deps.edn
|
|
@ -113,9 +113,11 @@
|
|||
environ/environ {:mvn/version "1.2.0"}
|
||||
table/table {:git/url "https://github.com/cldwalker/table", :sha "f6293c5f3dac1dd6f525a80fc80930f8ccdf16b7"}
|
||||
markdown-clj/markdown-clj {:mvn/version "1.10.8"}
|
||||
org.clojure/tools.namespace {:git/url "https://github.com/babashka/tools.namespace", :sha "a13b037215e21a2e71aa34b27e1dd52c801a2a7b"}
|
||||
org.clojure/tools.namespace {:git/sha "daf82a10e70182aea4c0716a48f3922163441b32",
|
||||
:git/url "https://github.com/clojure/tools.namespace"}
|
||||
medley/medley {:mvn/version "1.3.0"}
|
||||
io.github.cognitect-labs/test-runner {:git/tag "v0.5.0", :git/sha "b3fd0d2"}
|
||||
io.github.cognitect-labs/test-runner {:git/url "https://github.com/cognitect-labs/test-runner",
|
||||
:git/sha "7284cda41fb9edc0f3bc6b6185cfb7138fc8a023"}
|
||||
borkdude/missing.test.assertions {:git/url "https://github.com/borkdude/missing.test.assertions", :sha "603cb01bee72fb17addacc53c34c85612684ad70"}
|
||||
dev.nubank/docopt {:mvn/version "0.6.1-fix7"}
|
||||
testdoc/testdoc {:mvn/version "1.4.1"}
|
||||
|
|
|
|||
|
|
@ -19,7 +19,7 @@
|
|||
:test-selectors {:default (complement :windows-only)
|
||||
:windows (complement :skip-windows)}
|
||||
:dependencies [[org.clojure/clojure "1.11.1"]
|
||||
[borkdude/edamame "1.0.0"]
|
||||
[borkdude/edamame "1.0.16"]
|
||||
[borkdude/graal.locking "0.0.2"]
|
||||
[org.clojure/tools.cli "1.0.214"]
|
||||
[cheshire "5.11.0"]
|
||||
|
|
|
|||
2
sci
2
sci
|
|
@ -1 +1 @@
|
|||
Subproject commit 6cdf788aca5dcd579b77688a4efa24325e7852ff
|
||||
Subproject commit 71782ebbeb43927780570a67a6b119a7b428a495
|
||||
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
set -euo pipefail
|
||||
|
||||
CLOJURE_TOOLS_VERSION="1.10.3.1040"
|
||||
CLOJURE_TOOLS_VERSION="1.11.1.1200"
|
||||
|
||||
install_dir="${1:-/usr/local}"
|
||||
mkdir -p "$install_dir"
|
||||
|
|
|
|||
|
|
@ -9,7 +9,7 @@ else
|
|||
fi
|
||||
|
||||
export BABASHKA_CLASSPATH
|
||||
BABASHKA_CLASSPATH=$(clojure -A:lib-tests -Spath)
|
||||
BABASHKA_CLASSPATH=$(clojure -Spath -A:lib-tests)
|
||||
|
||||
$BB_CMD -cp "$BABASHKA_CLASSPATH" \
|
||||
-f "test-resources/lib_tests/babashka/run_all_libtests.clj" "$@"
|
||||
|
|
|
|||
56
src/babashka/impl/clojure/tools/reader.clj
Normal file
56
src/babashka/impl/clojure/tools/reader.clj
Normal file
|
|
@ -0,0 +1,56 @@
|
|||
(ns babashka.impl.clojure.tools.reader
|
||||
(:refer-clojure :exclude [read])
|
||||
(:require
|
||||
[edamame.core :as e]
|
||||
[sci.core :as sci]
|
||||
[clojure.tools.reader.reader-types :as rt]))
|
||||
|
||||
(def rns (sci/create-ns 'clojure.tools.reader))
|
||||
|
||||
(def default-opts
|
||||
(e/normalize-opts
|
||||
{:all true
|
||||
:row-key :line
|
||||
:col-key :column
|
||||
:location? seq?
|
||||
:end-location false}))
|
||||
|
||||
;; Added for compatibility with tools.namespace
|
||||
(defn read
|
||||
"Reads the first object from an IPushbackReader or a java.io.PushbackReader.
|
||||
Returns the object read. If EOF, throws if eof-error? is true.
|
||||
Otherwise returns sentinel. If no stream is provided, *in* will be used.
|
||||
Opts is a persistent map with valid keys:
|
||||
:read-cond - :allow to process reader conditionals, or
|
||||
:preserve to keep all branches
|
||||
:features - persistent set of feature keywords for reader conditionals
|
||||
:eof - on eof, return value unless :eofthrow, then throw.
|
||||
if not specified, will throw
|
||||
***WARNING***
|
||||
Note that read can execute code (controlled by *read-eval*),
|
||||
and as such should be used only with trusted sources.
|
||||
To read data structures only, use clojure.tools.reader.edn/read
|
||||
Note that the function signature of clojure.tools.reader/read and
|
||||
clojure.tools.reader.edn/read is not the same for eof-handling"
|
||||
{:arglists '([] [reader] [opts reader] [reader eof-error? eof-value])}
|
||||
([] (read @sci/in true nil))
|
||||
([reader] (read reader true nil))
|
||||
([{eof :eof :as opts :or {eof :eofthrow}} reader]
|
||||
(let [opts (assoc default-opts
|
||||
:read-cond (:read-cond opts)
|
||||
:features (:features opts))
|
||||
v (e/parse-next reader opts)]
|
||||
(if (identical? ::e/eof v)
|
||||
(if (identical? :eofthrow eof)
|
||||
(throw (java.io.EOFException.))
|
||||
eof)
|
||||
v)))
|
||||
([reader eof-error? sentinel]
|
||||
(let [v (e/parse-next reader default-opts)]
|
||||
(if (identical? ::e/eof v)
|
||||
(if eof-error?
|
||||
(throw (java.io.EOFException.))
|
||||
sentinel)
|
||||
v))))
|
||||
|
||||
(def reader-namespace {'read (sci/copy-var read rns)})
|
||||
|
|
@ -13,4 +13,5 @@
|
|||
'peek-char (sci/copy-var rt/peek-char rtns)
|
||||
'read-char (sci/copy-var rt/read-char rtns)
|
||||
'unread (sci/copy-var rt/unread rtns)
|
||||
'source-logging-push-back-reader (sci/copy-var rt/source-logging-push-back-reader rtns)})
|
||||
'source-logging-push-back-reader (sci/copy-var rt/source-logging-push-back-reader rtns)
|
||||
'source-logging-reader? (sci/copy-var rt/source-logging-reader? rtns)})
|
||||
|
|
|
|||
|
|
@ -20,6 +20,7 @@
|
|||
[babashka.impl.clojure.main :as clojure-main :refer [demunge]]
|
||||
[babashka.impl.clojure.math :refer [math-namespace]]
|
||||
[babashka.impl.clojure.stacktrace :refer [stacktrace-namespace]]
|
||||
[babashka.impl.clojure.tools.reader :refer [reader-namespace]]
|
||||
[babashka.impl.clojure.tools.reader-types :refer [edn-namespace
|
||||
reader-types-namespace]]
|
||||
[babashka.impl.clojure.zip :refer [zip-namespace]]
|
||||
|
|
@ -392,6 +393,7 @@ Use bb run --help to show this help output.
|
|||
'babashka.tasks tasks-namespace
|
||||
'clojure.tools.reader.edn edn-namespace
|
||||
'clojure.tools.reader.reader-types reader-types-namespace
|
||||
'clojure.tools.reader reader-namespace
|
||||
'clojure.core.async async-namespace
|
||||
'clojure.core.async.impl.protocols async-protocols-namespace
|
||||
'rewrite-clj.node rewrite/node-namespace
|
||||
|
|
|
|||
|
|
@ -20,8 +20,6 @@
|
|||
;; BB-TEST-PATCH: Removed markdown.md-file-test b/c tests hardcode path to test
|
||||
;; files. Removed markdown.benchmark b/c it depends on criterium which isn't bb compatible
|
||||
markdown-clj/markdown-clj {:git-sha "ac245d3049afa25a6d41fcb5ba5a268f52c610e4", :git-url "https://github.com/yogthos/markdown-clj", :test-namespaces (markdown.md-test)}
|
||||
;; BB-TEST-PATCH: Removed clojure.tools.namespace.dir-test as it fails on windows
|
||||
org.clojure/tools.namespace {:git-sha "a13b037215e21a2e71aa34b27e1dd52c801a2a7b", :git-url "https://github.com/babashka/tools.namespace", :test-namespaces (clojure.tools.namespace.test-helpers clojure.tools.namespace.dependency-test clojure.tools.namespace.find-test clojure.tools.namespace.move-test clojure.tools.namespace.parse-test), :branch "babashka"}
|
||||
com.stuartsierra/component {:git-sha "9f9653d1d95644e3c30beadf8c8811f86758ea23", :git-url "https://github.com/stuartsierra/component", :test-namespaces (com.stuartsierra.component-test)}
|
||||
slingshot/slingshot {:git-sha "6961ab0593ab9633c15b7697ffd43823090720be", :git-url "https://github.com/scgilardi/slingshot", :test-namespaces (slingshot.slingshot-test slingshot.support-test slingshot.test-test)}
|
||||
rm-hull/jasentaa {:git-sha "f52a0e75cbdf1d2b72d9604232db264ff6473f12", :git-url "https://github.com/rm-hull/jasentaa", :test-namespaces (jasentaa.position-test jasentaa.worked-example-2 jasentaa.collections-test jasentaa.parser.basic-test jasentaa.parser.combinators-test jasentaa.test-helpers jasentaa.worked-example-1)}
|
||||
|
|
@ -71,7 +69,6 @@
|
|||
cprop/cprop {:git-url "https://github.com/tolitius/cprop", :test-namespaces [cprop.smoke-test], :manually-added true}
|
||||
org.clojure/data.zip {:git-url "https://github.com/clojure/data.zip", :test-namespaces [clojure.data.zip-test], :manually-added true}
|
||||
borkdude/deps {:git-url "https://github.com/borkdude/deps.clj", :test-namespaces [borkdude.deps.smoke-test], :manually-added true}
|
||||
io.github.cognitect-labs/test-runner {:git-url "https://github.com/cognitect-labs/test-runner", :test-namespaces (cognitect.test-runner.samples-test cognitect.test-runner.sample-property-test cognitect.test-runner-test), :git-sha "cc75980b43011773162b485f46f939dc5fba91e4"}
|
||||
borkdude/missing.test.assertions {:git-url "https://github.com/borkdude/missing.test.assertions", :test-namespaces (missing.test.assertions-test missing.test.old-methods), :git-sha "603cb01bee72fb17addacc53c34c85612684ad70"}
|
||||
;; No tests to run
|
||||
io.github.technomancy/limit-break {:git-url "https://github.com/technomancy/limit-break", :test-namespaces [], :manually-added true}
|
||||
|
|
@ -176,4 +173,13 @@
|
|||
com.github.rawleyfowler/sluj {:git-url "https://github.com/rawleyfowler/sluj"
|
||||
:git-sha "4a92e772b4e07bf127423448d4140748b5782198"
|
||||
:test-paths ["test"]
|
||||
:test-namespaces [sluj.core-test]}}
|
||||
:test-namespaces [sluj.core-test]}
|
||||
io.github.cognitect-labs/test-runner {:git-url "https://github.com/cognitect-labs/test-runner",
|
||||
:git-sha "7284cda41fb9edc0f3bc6b6185cfb7138fc8a023"
|
||||
:test-namespaces [cognitect.test-runner.samples-test cognitect.test-runner.sample-property-test cognitect.test-runner-test],
|
||||
:test-paths ["test"]}
|
||||
;; BB-TEST-PATCH: Removed clojure.tools.namespace.dir-test as it fails on windows
|
||||
org.clojure/tools.namespace {:git-sha "daf82a10e70182aea4c0716a48f3922163441b32",
|
||||
:git-url "https://github.com/clojure/tools.namespace",
|
||||
:test-namespaces [clojure.tools.namespace.test-helpers clojure.tools.namespace.dependency-test clojure.tools.namespace.find-test clojure.tools.namespace.move-test clojure.tools.namespace.parse-test],
|
||||
:test-paths ["src/test/clojure"]}}
|
||||
|
|
|
|||
|
|
@ -1,315 +0,0 @@
|
|||
(ns clojure.tools.namespace.dependency-test
|
||||
(:use clojure.test
|
||||
clojure.tools.namespace.dependency))
|
||||
|
||||
;; building a graph like:
|
||||
;;
|
||||
;; :a
|
||||
;; / |
|
||||
;; :b |
|
||||
;; \ |
|
||||
;; :c
|
||||
;; |
|
||||
;; :d
|
||||
;;
|
||||
(def g1 (-> (graph)
|
||||
(depend :b :a) ; "B depends on A"
|
||||
(depend :c :b) ; "C depends on B"
|
||||
(depend :c :a) ; "C depends on A"
|
||||
(depend :d :c))) ; "D depends on C"
|
||||
|
||||
;; 'one 'five
|
||||
;; | |
|
||||
;; 'two |
|
||||
;; / \ |
|
||||
;; / \ |
|
||||
;; / \ /
|
||||
;; 'three 'four
|
||||
;; | /
|
||||
;; 'six /
|
||||
;; | /
|
||||
;; | /
|
||||
;; | /
|
||||
;; 'seven
|
||||
;;
|
||||
(def g2 (-> (graph)
|
||||
(depend 'two 'one)
|
||||
(depend 'three 'two)
|
||||
(depend 'four 'two)
|
||||
(depend 'four 'five)
|
||||
(depend 'six 'three)
|
||||
(depend 'seven 'six)
|
||||
(depend 'seven 'four)))
|
||||
|
||||
;; :level0
|
||||
;; / | | \
|
||||
;; ----- | | -----
|
||||
;; / | | \
|
||||
;; :level1a :level1b :level1c :level1d
|
||||
;; \ | | /
|
||||
;; ----- | | -----
|
||||
;; \ | | /
|
||||
;; :level2
|
||||
;; / | | \
|
||||
;; ----- | | -----
|
||||
;; / | | \
|
||||
;; :level3a :level3b :level3c :level3d
|
||||
;; \ | | /
|
||||
;; ----- | | -----
|
||||
;; \ | | /
|
||||
;; :level4
|
||||
;;
|
||||
;; ... and so on in a repeating pattern like that, up to :level26
|
||||
|
||||
(def g3 (-> (graph)
|
||||
(depend :level1a :level0)
|
||||
(depend :level1b :level0)
|
||||
(depend :level1c :level0)
|
||||
(depend :level1d :level0)
|
||||
(depend :level2 :level1a)
|
||||
(depend :level2 :level1b)
|
||||
(depend :level2 :level1c)
|
||||
(depend :level2 :level1d)
|
||||
|
||||
(depend :level3a :level2)
|
||||
(depend :level3b :level2)
|
||||
(depend :level3c :level2)
|
||||
(depend :level3d :level2)
|
||||
(depend :level4 :level3a)
|
||||
(depend :level4 :level3b)
|
||||
(depend :level4 :level3c)
|
||||
(depend :level4 :level3d)
|
||||
|
||||
(depend :level5a :level4)
|
||||
(depend :level5b :level4)
|
||||
(depend :level5c :level4)
|
||||
(depend :level5d :level4)
|
||||
(depend :level6 :level5a)
|
||||
(depend :level6 :level5b)
|
||||
(depend :level6 :level5c)
|
||||
(depend :level6 :level5d)
|
||||
|
||||
(depend :level7a :level6)
|
||||
(depend :level7b :level6)
|
||||
(depend :level7c :level6)
|
||||
(depend :level7d :level6)
|
||||
(depend :level8 :level7a)
|
||||
(depend :level8 :level7b)
|
||||
(depend :level8 :level7c)
|
||||
(depend :level8 :level7d)
|
||||
|
||||
(depend :level9a :level8)
|
||||
(depend :level9b :level8)
|
||||
(depend :level9c :level8)
|
||||
(depend :level9d :level8)
|
||||
(depend :level10 :level9a)
|
||||
(depend :level10 :level9b)
|
||||
(depend :level10 :level9c)
|
||||
(depend :level10 :level9d)
|
||||
|
||||
(depend :level11a :level10)
|
||||
(depend :level11b :level10)
|
||||
(depend :level11c :level10)
|
||||
(depend :level11d :level10)
|
||||
(depend :level12 :level11a)
|
||||
(depend :level12 :level11b)
|
||||
(depend :level12 :level11c)
|
||||
(depend :level12 :level11d)
|
||||
|
||||
(depend :level13a :level12)
|
||||
(depend :level13b :level12)
|
||||
(depend :level13c :level12)
|
||||
(depend :level13d :level12)
|
||||
(depend :level14 :level13a)
|
||||
(depend :level14 :level13b)
|
||||
(depend :level14 :level13c)
|
||||
(depend :level14 :level13d)
|
||||
|
||||
(depend :level15a :level14)
|
||||
(depend :level15b :level14)
|
||||
(depend :level15c :level14)
|
||||
(depend :level15d :level14)
|
||||
(depend :level16 :level15a)
|
||||
(depend :level16 :level15b)
|
||||
(depend :level16 :level15c)
|
||||
(depend :level16 :level15d)
|
||||
|
||||
(depend :level17a :level16)
|
||||
(depend :level17b :level16)
|
||||
(depend :level17c :level16)
|
||||
(depend :level17d :level16)
|
||||
(depend :level18 :level17a)
|
||||
(depend :level18 :level17b)
|
||||
(depend :level18 :level17c)
|
||||
(depend :level18 :level17d)
|
||||
|
||||
(depend :level19a :level18)
|
||||
(depend :level19b :level18)
|
||||
(depend :level19c :level18)
|
||||
(depend :level19d :level18)
|
||||
(depend :level20 :level19a)
|
||||
(depend :level20 :level19b)
|
||||
(depend :level20 :level19c)
|
||||
(depend :level20 :level19d)
|
||||
|
||||
(depend :level21a :level20)
|
||||
(depend :level21b :level20)
|
||||
(depend :level21c :level20)
|
||||
(depend :level21d :level20)
|
||||
(depend :level22 :level21a)
|
||||
(depend :level22 :level21b)
|
||||
(depend :level22 :level21c)
|
||||
(depend :level22 :level21d)
|
||||
|
||||
(depend :level23a :level22)
|
||||
(depend :level23b :level22)
|
||||
(depend :level23c :level22)
|
||||
(depend :level23d :level22)
|
||||
(depend :level24 :level23a)
|
||||
(depend :level24 :level23b)
|
||||
(depend :level24 :level23c)
|
||||
(depend :level24 :level23d)
|
||||
|
||||
(depend :level25a :level24)
|
||||
(depend :level25b :level24)
|
||||
(depend :level25c :level24)
|
||||
(depend :level25d :level24)
|
||||
(depend :level26 :level25a)
|
||||
(depend :level26 :level25b)
|
||||
(depend :level26 :level25c)
|
||||
(depend :level26 :level25d)))
|
||||
|
||||
(deftest t-transitive-dependencies
|
||||
(is (= #{:a :c :b}
|
||||
(transitive-dependencies g1 :d)))
|
||||
(is (= '#{two four six one five three}
|
||||
(transitive-dependencies g2 'seven))))
|
||||
|
||||
(deftest t-transitive-dependencies-deep
|
||||
(is (= #{:level0
|
||||
:level1a :level1b :level1c :level1d
|
||||
:level2
|
||||
:level3a :level3b :level3c :level3d
|
||||
:level4
|
||||
:level5a :level5b :level5c :level5d
|
||||
:level6
|
||||
:level7a :level7b :level7c :level7d
|
||||
:level8
|
||||
:level9a :level9b :level9c :level9d
|
||||
:level10
|
||||
:level11a :level11b :level11c :level11d
|
||||
:level12
|
||||
:level13a :level13b :level13c :level13d
|
||||
:level14
|
||||
:level15a :level15b :level15c :level15d
|
||||
:level16
|
||||
:level17a :level17b :level17c :level17d
|
||||
:level18
|
||||
:level19a :level19b :level19c :level19d
|
||||
:level20
|
||||
:level21a :level21b :level21c :level21d
|
||||
:level22
|
||||
:level23a :level23b :level23c :level23d}
|
||||
(transitive-dependencies g3 :level24)))
|
||||
(is (= #{:level0
|
||||
:level1a :level1b :level1c :level1d
|
||||
:level2
|
||||
:level3a :level3b :level3c :level3d
|
||||
:level4
|
||||
:level5a :level5b :level5c :level5d
|
||||
:level6
|
||||
:level7a :level7b :level7c :level7d
|
||||
:level8
|
||||
:level9a :level9b :level9c :level9d
|
||||
:level10
|
||||
:level11a :level11b :level11c :level11d
|
||||
:level12
|
||||
:level13a :level13b :level13c :level13d
|
||||
:level14
|
||||
:level15a :level15b :level15c :level15d
|
||||
:level16
|
||||
:level17a :level17b :level17c :level17d
|
||||
:level18
|
||||
:level19a :level19b :level19c :level19d
|
||||
:level20
|
||||
:level21a :level21b :level21c :level21d
|
||||
:level22
|
||||
:level23a :level23b :level23c :level23d
|
||||
:level24
|
||||
:level25a :level25b :level25c :level25d}
|
||||
(transitive-dependencies g3 :level26))))
|
||||
|
||||
|
||||
(deftest t-transitive-dependents
|
||||
(is (= '#{four seven}
|
||||
(transitive-dependents g2 'five)))
|
||||
(is (= '#{four seven six three}
|
||||
(transitive-dependents g2 'two))))
|
||||
|
||||
(defn- before?
|
||||
"True if x comes before y in an ordered collection."
|
||||
[coll x y]
|
||||
(loop [[item & more] (seq coll)]
|
||||
(cond (nil? item) true ; end of the seq
|
||||
(= x item) true ; x comes first
|
||||
(= y item) false
|
||||
:else (recur more))))
|
||||
|
||||
(deftest t-before
|
||||
(is (true? (before? [:a :b :c :d] :a :b)))
|
||||
(is (true? (before? [:a :b :c :d] :b :c)))
|
||||
(is (false? (before? [:a :b :c :d] :d :c)))
|
||||
(is (false? (before? [:a :b :c :d] :c :a))))
|
||||
|
||||
(deftest t-topo-comparator-1
|
||||
(let [sorted (sort (topo-comparator g1) [:d :a :b :foo])]
|
||||
(are [x y] (before? sorted x y)
|
||||
:a :b
|
||||
:a :d
|
||||
:a :foo
|
||||
:b :d
|
||||
:b :foo
|
||||
:d :foo)))
|
||||
|
||||
(deftest t-topo-comparator-2
|
||||
(let [sorted (sort (topo-comparator g2) '[three seven nine eight five])]
|
||||
(are [x y] (before? sorted x y)
|
||||
'three 'seven
|
||||
'three 'eight
|
||||
'three 'nine
|
||||
'five 'eight
|
||||
'five 'nine
|
||||
'seven 'eight
|
||||
'seven 'nine)))
|
||||
|
||||
(deftest t-topo-sort
|
||||
(let [sorted (topo-sort g2)]
|
||||
(are [x y] (before? sorted x y)
|
||||
'one 'two
|
||||
'one 'three
|
||||
'one 'four
|
||||
'one 'six
|
||||
'one 'seven
|
||||
'two 'three
|
||||
'two 'four
|
||||
'two 'six
|
||||
'two 'seven
|
||||
'three 'six
|
||||
'three 'seven
|
||||
'four 'seven
|
||||
'five 'four
|
||||
'five 'seven
|
||||
'six 'seven)))
|
||||
|
||||
(deftest t-no-cycles
|
||||
(is (thrown? Exception
|
||||
(-> (graph)
|
||||
(depend :a :b)
|
||||
(depend :b :c)
|
||||
(depend :c :a)))))
|
||||
|
||||
(deftest t-no-self-cycles
|
||||
(is (thrown? Exception
|
||||
(-> (graph)
|
||||
(depend :a :b)
|
||||
(depend :a :a)))))
|
||||
|
|
@ -1,20 +0,0 @@
|
|||
(ns clojure.tools.namespace.dir-test
|
||||
(:require [clojure.test :refer [deftest is]]
|
||||
[clojure.tools.namespace.test-helpers :as help]
|
||||
[clojure.tools.namespace.dir :as dir])
|
||||
(:import
|
||||
(java.io File)))
|
||||
|
||||
;; Only run this test on Java 1.7+, where java.nio.file.Files is available.
|
||||
(when (try (Class/forName "java.nio.file.Files")
|
||||
(catch ClassNotFoundException _ false))
|
||||
(deftest t-scan-by-canonical-path
|
||||
(let [dir (help/create-temp-dir "t-scan-by-canonical-path")
|
||||
main-clj (help/create-source dir 'example.main :clj '[example.one])
|
||||
one-cljc (help/create-source dir 'example.one :clj)
|
||||
other-dir (help/create-temp-dir "t-scan-by-canonical-path-other")
|
||||
link (File. other-dir "link")]
|
||||
(java.nio.file.Files/createSymbolicLink (.toPath link) (.toPath dir)
|
||||
(make-array java.nio.file.attribute.FileAttribute 0))
|
||||
(is (= (::dir/files (dir/scan-dirs {} [dir]))
|
||||
(::dir/files (dir/scan-dirs {} [link])))))))
|
||||
|
|
@ -1,29 +0,0 @@
|
|||
(ns clojure.tools.namespace.find-test
|
||||
(:require [clojure.test :refer [deftest is]]
|
||||
[clojure.tools.namespace.test-helpers :as help]
|
||||
[clojure.tools.namespace.find :as find])
|
||||
(:import (java.io File)))
|
||||
|
||||
(deftest t-find-clj-and-cljc-files
|
||||
"main.clj depends on one.cljc which depends on two.clj.
|
||||
two.cljs also exists but should not be returned"
|
||||
(let [dir (help/create-temp-dir "t-find-clj-and-cljc-files")
|
||||
main-clj (help/create-source dir 'example.main :clj '[example.one])
|
||||
one-cljc (help/create-source dir 'example.one :cljc '[example.two])
|
||||
two-clj (help/create-source dir 'example.two :clj)
|
||||
two-cljs (help/create-source dir 'example.two :cljs)]
|
||||
(is (help/same-files?
|
||||
[main-clj one-cljc two-clj]
|
||||
(find/find-sources-in-dir dir)))))
|
||||
|
||||
(deftest t-find-cljs-and-cljc-files
|
||||
"main.cljs depends on one.cljc which depends on two.cljs.
|
||||
two.clj also exists but should not be returned"
|
||||
(let [dir (help/create-temp-dir "t-find-cljs-and-cljc-files")
|
||||
main-cljs (help/create-source dir 'example.main :cljs '[example.one])
|
||||
one-cljc (help/create-source dir 'example.one :cljc '[example.two])
|
||||
two-clj (help/create-source dir 'example.two :clj)
|
||||
two-cljs (help/create-source dir 'example.two :cljs)]
|
||||
(is (help/same-files?
|
||||
[main-cljs one-cljc two-cljs]
|
||||
(find/find-sources-in-dir dir find/cljs)))))
|
||||
|
|
@ -1,52 +0,0 @@
|
|||
(ns clojure.tools.namespace.move-test
|
||||
(:require [clojure.java.io :as io]
|
||||
[clojure.test :refer [deftest is]]
|
||||
[clojure.tools.namespace.move :refer [move-ns]]
|
||||
[clojure.tools.namespace.test-helpers :as help])
|
||||
(:import (java.io File)))
|
||||
|
||||
(defn- create-file-one [dir]
|
||||
(help/create-source dir 'example.one :clj
|
||||
'[example.two example.three]
|
||||
'[(defn foo []
|
||||
(example.a.four/foo))]))
|
||||
|
||||
(defn- create-file-two [dir]
|
||||
(help/create-source dir 'example.two :clj
|
||||
'[example.three example.a.four]))
|
||||
|
||||
(defn- create-file-three [dir]
|
||||
(help/create-source dir 'example.three :clj
|
||||
'[example.five]))
|
||||
|
||||
(defn- create-file-four [dir]
|
||||
(help/create-source dir 'example.a.four :clj))
|
||||
|
||||
(deftest t-move-ns
|
||||
(let [temp-dir (help/create-temp-dir "tools-namespace-t-move-ns")
|
||||
src-dir (io/file temp-dir "src")
|
||||
example-dir (io/file temp-dir "src" "example")
|
||||
file-one (create-file-one src-dir)
|
||||
file-two (create-file-two src-dir)
|
||||
file-three (create-file-three src-dir)
|
||||
old-file-four (create-file-four src-dir)
|
||||
new-file-four (io/file example-dir "b" "four.clj")]
|
||||
|
||||
(let [file-three-last-modified (.lastModified file-three)]
|
||||
|
||||
(Thread/sleep 1500) ;; ensure file timestamps are different
|
||||
|
||||
(move-ns 'example.a.four 'example.b.four src-dir [src-dir])
|
||||
|
||||
(is (.exists new-file-four)
|
||||
"new file should exist")
|
||||
(is (not (.exists old-file-four))
|
||||
"old file should not exist")
|
||||
(is (not (.exists (.getParentFile old-file-four)))
|
||||
"old empty directory should not exist")
|
||||
(is (= file-three-last-modified (.lastModified file-three))
|
||||
"unaffected file should not have been modified")
|
||||
(is (not-any? #(.contains (slurp %) "example.a.four")
|
||||
[file-one file-two file-three new-file-four]))
|
||||
(is (every? #(.contains (slurp %) "example.b.four")
|
||||
[file-one file-two new-file-four])))))
|
||||
|
|
@ -1,210 +0,0 @@
|
|||
(ns clojure.tools.namespace.parse-test
|
||||
(:use [clojure.test :only (deftest is)]
|
||||
[clojure.tools.namespace.parse :only (deps-from-ns-decl
|
||||
read-ns-decl)]))
|
||||
|
||||
(def ns-decl-prefix-list
|
||||
'(ns com.example.one
|
||||
(:require (com.example two
|
||||
[three :as three]
|
||||
[four :refer (a b)])
|
||||
(com.example.sub [five :as five]
|
||||
six))
|
||||
(:use (com.example seven
|
||||
[eight :as eight]
|
||||
(nine :only (c d))
|
||||
[ten]))))
|
||||
|
||||
;; Some people like to write prefix lists as vectors, not lists. The
|
||||
;; use/require functions accept this form.
|
||||
(def ns-decl-prefix-list-as-vector
|
||||
'(ns com.example.one
|
||||
(:require [com.example
|
||||
two
|
||||
[three :as three]
|
||||
[four :refer (a b)]]
|
||||
[com.example.sub
|
||||
[five :as five]
|
||||
six])
|
||||
(:use [com.example
|
||||
seven
|
||||
[eight :as eight]
|
||||
(nine :only (c d))
|
||||
[ten]])))
|
||||
|
||||
(def ns-decl-prefix-list-clauses-as-vectors
|
||||
"Sometimes people even write the clauses inside ns as vectors, which
|
||||
clojure.core/ns allows. See TNS-21."
|
||||
'(ns com.example.one
|
||||
[:require [com.example
|
||||
two
|
||||
[three :as three]
|
||||
[four :refer (a b)]]
|
||||
[com.example.sub
|
||||
[five :as five]
|
||||
six]]
|
||||
[:use [com.example
|
||||
seven
|
||||
[eight :as eight]
|
||||
(nine :only (c d))
|
||||
[ten]]]))
|
||||
|
||||
(def deps-from-prefix-list
|
||||
'#{com.example.two
|
||||
com.example.three
|
||||
com.example.four
|
||||
com.example.sub.five
|
||||
com.example.sub.six
|
||||
com.example.seven
|
||||
com.example.eight
|
||||
com.example.nine
|
||||
com.example.ten})
|
||||
|
||||
(deftest t-prefix-list
|
||||
(is (= deps-from-prefix-list
|
||||
(deps-from-ns-decl ns-decl-prefix-list))))
|
||||
|
||||
(deftest t-prefix-list-as-vector
|
||||
(is (= deps-from-prefix-list
|
||||
(deps-from-ns-decl ns-decl-prefix-list-as-vector))))
|
||||
|
||||
(deftest t-prefix-list-clauses-as-vectors
|
||||
(is (= deps-from-prefix-list
|
||||
(deps-from-ns-decl ns-decl-prefix-list-clauses-as-vectors))))
|
||||
|
||||
(deftest t-no-deps-returns-empty-set
|
||||
(is (= #{} (deps-from-ns-decl '(ns com.example.one)))))
|
||||
|
||||
(def multiple-ns-decls
|
||||
'((ns one)
|
||||
(ns two (:require one))
|
||||
(ns three (:require [one :as o] [two :as t]))))
|
||||
|
||||
(def multiple-ns-decls-string
|
||||
" (println \"Code before first ns\")
|
||||
(ns one)
|
||||
(println \"Some code\")
|
||||
(defn hello-world [] \"Hello, World!\")
|
||||
(ns two (:require one))
|
||||
(println \"Some more code\")
|
||||
(ns three (:require [one :as o] [two :as t]))")
|
||||
|
||||
(deftest t-read-multiple-ns-decls
|
||||
(with-open [rdr (clojure.lang.LineNumberingPushbackReader.
|
||||
(java.io.PushbackReader.
|
||||
(java.io.StringReader. multiple-ns-decls-string)))]
|
||||
(is (= multiple-ns-decls
|
||||
(take-while identity (repeatedly #(read-ns-decl rdr)))))))
|
||||
|
||||
(def ns-docstring-example
|
||||
"The example ns declaration used in the docstring of clojure.core/ns"
|
||||
'(ns foo.bar
|
||||
(:refer-clojure :exclude [ancestors printf])
|
||||
(:require (clojure.contrib sql combinatorics))
|
||||
(:use (my.lib this that))
|
||||
(:import (java.util Date Timer Random)
|
||||
(java.sql Connection Statement))))
|
||||
|
||||
(def deps-from-ns-docstring-example
|
||||
'#{clojure.contrib.sql
|
||||
clojure.contrib.combinatorics
|
||||
my.lib.this
|
||||
my.lib.that})
|
||||
|
||||
(deftest t-ns-docstring-example
|
||||
(is (= deps-from-ns-docstring-example
|
||||
(deps-from-ns-decl ns-docstring-example))))
|
||||
|
||||
(def require-docstring-example
|
||||
"The example ns declaration used in the docstring of
|
||||
clojure.core/require"
|
||||
'(ns (:require (clojure zip [set :as s]))))
|
||||
|
||||
(def deps-from-require-docstring-example
|
||||
'#{clojure.zip
|
||||
clojure.set})
|
||||
|
||||
(deftest t-require-docstring-example
|
||||
(is (= deps-from-require-docstring-example
|
||||
(deps-from-ns-decl require-docstring-example))))
|
||||
|
||||
(def multiple-clauses
|
||||
"Example showing more than one :require or :use clause in one ns
|
||||
declaration, which clojure.core/ns allows."
|
||||
'(ns foo.bar
|
||||
(:require com.example.one)
|
||||
(:import java.io.File)
|
||||
(:require (com.example two three))
|
||||
(:use (com.example [four :only [x]]))
|
||||
(:use (com.example (five :only [x])))))
|
||||
|
||||
(def deps-from-multiple-clauses
|
||||
'#{com.example.one
|
||||
com.example.two
|
||||
com.example.three
|
||||
com.example.four
|
||||
com.example.five})
|
||||
|
||||
(deftest t-deps-from-multiple-clauses
|
||||
(is (= deps-from-multiple-clauses
|
||||
(deps-from-ns-decl multiple-clauses))))
|
||||
|
||||
(def clauses-without-keywords
|
||||
"Example of require/use clauses with symbols instead of keywords,
|
||||
which clojure.core/ns allows."
|
||||
'(ns foo.bar
|
||||
(require com.example.one)
|
||||
(import java.io.File)
|
||||
(use (com.example (prefixes (two :only [x])
|
||||
three)))))
|
||||
|
||||
(def deps-from-clauses-without-keywords
|
||||
'#{com.example.one
|
||||
com.example.prefixes.two
|
||||
com.example.prefixes.three})
|
||||
|
||||
(deftest t-clauses-without-keywords
|
||||
(is (= deps-from-clauses-without-keywords
|
||||
(deps-from-ns-decl clauses-without-keywords))))
|
||||
|
||||
(def reader-conditionals-string
|
||||
"(ns com.examples.one
|
||||
(:require #?(:clj clojure.string
|
||||
:cljs goog.string)))")
|
||||
|
||||
(deftest t-reader-conditionals
|
||||
;; TODO: the predicate wasn't added to bb yet, will come in version after 0.6.7
|
||||
(when true #_(resolve 'clojure.core/reader-conditional?)
|
||||
(let [actual (-> reader-conditionals-string
|
||||
java.io.StringReader.
|
||||
java.io.PushbackReader.
|
||||
clojure.lang.LineNumberingPushbackReader.
|
||||
read-ns-decl
|
||||
deps-from-ns-decl)]
|
||||
(is (= #{'clojure.string} actual)))))
|
||||
|
||||
(def ns-with-npm-dependency
|
||||
"(ns com.examples.one
|
||||
(:require [\"foobar\"] [baz]))")
|
||||
|
||||
(deftest npm-dependency
|
||||
(let [actual (-> ns-with-npm-dependency
|
||||
java.io.StringReader.
|
||||
java.io.PushbackReader.
|
||||
clojure.lang.LineNumberingPushbackReader.
|
||||
read-ns-decl
|
||||
deps-from-ns-decl)]
|
||||
(is (= #{'baz} actual))))
|
||||
|
||||
(def ns-with-require-macros
|
||||
"(ns com.examples.one
|
||||
(:require-macros [foo :refer [bar]]))")
|
||||
|
||||
(deftest require-macros
|
||||
(let [actual (-> ns-with-require-macros
|
||||
java.io.StringReader.
|
||||
java.io.PushbackReader.
|
||||
clojure.lang.LineNumberingPushbackReader.
|
||||
read-ns-decl
|
||||
deps-from-ns-decl)]
|
||||
(is (= #{'foo} actual))))
|
||||
|
|
@ -1,82 +0,0 @@
|
|||
(ns clojure.tools.namespace.test-helpers
|
||||
"Utilities to help with testing files and namespaces."
|
||||
(:require [clojure.java.io :as io]
|
||||
[clojure.string :as string])
|
||||
(:import (java.io Closeable File Writer PrintWriter)))
|
||||
|
||||
(defn create-temp-dir
|
||||
"Creates and returns a new temporary directory java.io.File."
|
||||
[name]
|
||||
(let [temp-file (File/createTempFile name nil)]
|
||||
(.delete temp-file)
|
||||
(.mkdirs temp-file)
|
||||
(println "Temporary directory" (.getAbsolutePath temp-file))
|
||||
temp-file))
|
||||
|
||||
(defn- write-contents
|
||||
"Writes contents into writer. Strings are written as-is via println,
|
||||
other types written as by prn."
|
||||
[^Writer writer contents]
|
||||
{:pre [(sequential? contents)]}
|
||||
(binding [*out* (PrintWriter. writer)]
|
||||
(doseq [content contents]
|
||||
(if (string? content)
|
||||
(println content)
|
||||
(prn content))
|
||||
(newline))))
|
||||
|
||||
(defn create-file
|
||||
"Creates a file from a vector of path elements. Writes contents into
|
||||
the file. Elements of contents may be data, written via prn, or
|
||||
strings, written directly."
|
||||
[path contents]
|
||||
{:pre [(vector? path)]}
|
||||
(let [^File file (apply io/file path)]
|
||||
(when-let [parent (.getParentFile file)]
|
||||
(.mkdirs parent))
|
||||
(with-open [wtr (io/writer file)]
|
||||
(write-contents wtr contents))
|
||||
file))
|
||||
|
||||
(defn- sym->path
|
||||
"Converts a symbol name into a vector of path parts, not including
|
||||
file extension."
|
||||
[symbol]
|
||||
{:pre [(symbol? symbol)]
|
||||
:post [(vector? %)]}
|
||||
(-> (name symbol)
|
||||
(string/replace \- \_)
|
||||
(string/split #"\.")))
|
||||
|
||||
(defn- source-path
|
||||
"Returns a vector of path components for namespace named sym,
|
||||
with given file extension (keyword)."
|
||||
[sym extension]
|
||||
(let [path (sym->path sym)
|
||||
basename (peek path)
|
||||
filename (str basename \. (name extension))]
|
||||
(conj (pop path) filename)))
|
||||
|
||||
(defn create-source
|
||||
"Creates a file at the correct path under base-dir for a namespace
|
||||
named sym, with file extension (keyword), containing a ns
|
||||
declaration which :require's the dependencies (symbols). Optional
|
||||
contents written after the ns declaration as by write-contents."
|
||||
([base-dir sym extension]
|
||||
(create-source base-dir sym extension nil nil))
|
||||
([base-dir sym extension dependencies]
|
||||
(create-source base-dir sym extension dependencies nil))
|
||||
([base-dir sym extension dependencies contents]
|
||||
(let [full-path (into [base-dir] (source-path sym extension))
|
||||
ns-decl (if (seq dependencies)
|
||||
(list 'ns sym (list* :require dependencies))
|
||||
(list 'ns sym))]
|
||||
(create-file full-path (into [ns-decl] contents)))))
|
||||
|
||||
(defn same-files?
|
||||
"True if files-a and files-b contain the same canonical File's,
|
||||
regardless of order."
|
||||
[files-a files-b]
|
||||
(= (sort (map #(.getCanonicalPath ^File %) files-a))
|
||||
(sort (map #(.getCanonicalPath ^File %) files-b))))
|
||||
|
||||
|
|
@ -1,10 +0,0 @@
|
|||
(ns cognitect.test-runner.sample-property-test
|
||||
(:require [clojure.test.check :as tc]
|
||||
[clojure.test.check.generators :as gen]
|
||||
[clojure.test.check.properties :as prop]
|
||||
[clojure.test.check.clojure-test :refer [defspec]]))
|
||||
|
||||
(defspec first-element-is-min-after-sorting 100
|
||||
(prop/for-all [v (gen/not-empty (gen/vector gen/int))]
|
||||
(= (apply min v)
|
||||
(first (sort v)))))
|
||||
|
|
@ -1,14 +0,0 @@
|
|||
(ns cognitect.test-runner.samples-test
|
||||
(:require [clojure.test :as t :refer [deftest is testing]]))
|
||||
|
||||
(deftest math-works
|
||||
(testing "basic addition and subtraction"
|
||||
(is (= 42 (+ 40 2)))
|
||||
(is (= 42 (- 44 2)))))
|
||||
|
||||
(deftest ^:integration test-i
|
||||
(is (= 1 1)))
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
@ -1,23 +0,0 @@
|
|||
(ns cognitect.test-runner-test
|
||||
(:require
|
||||
[clojure.test :refer :all]
|
||||
[cognitect.test-runner :as tr]))
|
||||
|
||||
(deftest ns-filters
|
||||
(are [ns-names ns-regexes available selected]
|
||||
(= selected (filter (#'tr/ns-filter {:namespace ns-names :namespace-regex ns-regexes}) available))
|
||||
|
||||
;; default settings (no -n / -r, use default for -r)
|
||||
nil nil nil []
|
||||
nil nil '[ns1-test ns2-test] '[ns1-test ns2-test]
|
||||
nil nil '[ns1-test ns2-test ns3 ns4 ns5] '[ns1-test ns2-test]
|
||||
|
||||
;; specific namespaces
|
||||
'#{ns3} nil '[ns1-test ns2-test] '[]
|
||||
'#{ns3 ns4} nil '[ns1-test ns2-test ns3 ns4 ns5] '[ns3 ns4]
|
||||
|
||||
;; regexes
|
||||
nil #{#"ns1.*" #"ns3"} '[ns1-test ns2-test ns3 ns4] '[ns1-test ns3]
|
||||
|
||||
;; both
|
||||
'#{ns3} '#{#"ns1.*"} '[ns1-test ns2-test ns3 ns4] '[ns1-test ns3]))
|
||||
Loading…
Reference in a new issue