diff --git a/CHANGELOG.md b/CHANGELOG.md index 48fd22e6..6c57bec7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -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 diff --git a/deps.edn b/deps.edn index 90d20af1..eb07e9a8 100644 --- a/deps.edn +++ b/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"} diff --git a/project.clj b/project.clj index 0726898c..106731db 100644 --- a/project.clj +++ b/project.clj @@ -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"] diff --git a/sci b/sci index 6cdf788a..71782ebb 160000 --- a/sci +++ b/sci @@ -1 +1 @@ -Subproject commit 6cdf788aca5dcd579b77688a4efa24325e7852ff +Subproject commit 71782ebbeb43927780570a67a6b119a7b428a495 diff --git a/script/install-clojure b/script/install-clojure index 40b096a7..d0d5e24b 100755 --- a/script/install-clojure +++ b/script/install-clojure @@ -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" diff --git a/script/lib_tests/run_all_libtests b/script/lib_tests/run_all_libtests index 99f55079..a5409d57 100755 --- a/script/lib_tests/run_all_libtests +++ b/script/lib_tests/run_all_libtests @@ -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" "$@" diff --git a/src/babashka/impl/clojure/tools/reader.clj b/src/babashka/impl/clojure/tools/reader.clj new file mode 100644 index 00000000..29f67289 --- /dev/null +++ b/src/babashka/impl/clojure/tools/reader.clj @@ -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)}) diff --git a/src/babashka/impl/clojure/tools/reader_types.clj b/src/babashka/impl/clojure/tools/reader_types.clj index c88f036d..4d45ee25 100644 --- a/src/babashka/impl/clojure/tools/reader_types.clj +++ b/src/babashka/impl/clojure/tools/reader_types.clj @@ -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)}) diff --git a/src/babashka/main.clj b/src/babashka/main.clj index b7514eb1..42ef4266 100644 --- a/src/babashka/main.clj +++ b/src/babashka/main.clj @@ -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 diff --git a/test-resources/lib_tests/bb-tested-libs.edn b/test-resources/lib_tests/bb-tested-libs.edn index 513917a5..d549dfa2 100644 --- a/test-resources/lib_tests/bb-tested-libs.edn +++ b/test-resources/lib_tests/bb-tested-libs.edn @@ -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"]}} diff --git a/test-resources/lib_tests/clojure/tools/namespace/dependency_test.clj b/test-resources/lib_tests/clojure/tools/namespace/dependency_test.clj deleted file mode 100644 index 5aedb27f..00000000 --- a/test-resources/lib_tests/clojure/tools/namespace/dependency_test.clj +++ /dev/null @@ -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))))) diff --git a/test-resources/lib_tests/clojure/tools/namespace/dir_test.clj b/test-resources/lib_tests/clojure/tools/namespace/dir_test.clj deleted file mode 100644 index 60e56427..00000000 --- a/test-resources/lib_tests/clojure/tools/namespace/dir_test.clj +++ /dev/null @@ -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]))))))) diff --git a/test-resources/lib_tests/clojure/tools/namespace/find_test.clj b/test-resources/lib_tests/clojure/tools/namespace/find_test.clj deleted file mode 100644 index d081e84a..00000000 --- a/test-resources/lib_tests/clojure/tools/namespace/find_test.clj +++ /dev/null @@ -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))))) diff --git a/test-resources/lib_tests/clojure/tools/namespace/move_test.clj b/test-resources/lib_tests/clojure/tools/namespace/move_test.clj deleted file mode 100644 index 47de7ac4..00000000 --- a/test-resources/lib_tests/clojure/tools/namespace/move_test.clj +++ /dev/null @@ -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]))))) diff --git a/test-resources/lib_tests/clojure/tools/namespace/parse_test.clj b/test-resources/lib_tests/clojure/tools/namespace/parse_test.clj deleted file mode 100644 index b6ac6aaa..00000000 --- a/test-resources/lib_tests/clojure/tools/namespace/parse_test.clj +++ /dev/null @@ -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)))) diff --git a/test-resources/lib_tests/clojure/tools/namespace/test_helpers.clj b/test-resources/lib_tests/clojure/tools/namespace/test_helpers.clj deleted file mode 100644 index 62679e69..00000000 --- a/test-resources/lib_tests/clojure/tools/namespace/test_helpers.clj +++ /dev/null @@ -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)))) - diff --git a/test-resources/lib_tests/cognitect/test_runner/sample_property_test.clj b/test-resources/lib_tests/cognitect/test_runner/sample_property_test.clj deleted file mode 100644 index 1792beae..00000000 --- a/test-resources/lib_tests/cognitect/test_runner/sample_property_test.clj +++ /dev/null @@ -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))))) diff --git a/test-resources/lib_tests/cognitect/test_runner/samples_test.clj b/test-resources/lib_tests/cognitect/test_runner/samples_test.clj deleted file mode 100644 index e4ec385c..00000000 --- a/test-resources/lib_tests/cognitect/test_runner/samples_test.clj +++ /dev/null @@ -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))) - - - - diff --git a/test-resources/lib_tests/cognitect/test_runner_test.clj b/test-resources/lib_tests/cognitect/test_runner_test.clj deleted file mode 100644 index e1ea8deb..00000000 --- a/test-resources/lib_tests/cognitect/test_runner_test.clj +++ /dev/null @@ -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])) \ No newline at end of file