From 980e75eacc7d8ba72f8aa668ef6f398f3fddb1ac Mon Sep 17 00:00:00 2001 From: Ambrose Bonnaire-Sergeant Date: Wed, 5 Feb 2025 22:18:14 -0600 Subject: [PATCH 01/48] clojure.string test stubs --- test/clojure/string_test/blank_qmark.cljc | 8 ++++++++ test/clojure/string_test/capitalize.cljc | 8 ++++++++ test/clojure/string_test/ends_with_qmark.cljc | 8 ++++++++ test/clojure/string_test/escape.cljc | 8 ++++++++ test/clojure/string_test/includes_qmark.cljc | 8 ++++++++ test/clojure/string_test/lower_case.cljc | 8 ++++++++ test/clojure/string_test/reverse.cljc | 8 ++++++++ test/clojure/string_test/starts_with_qmark.cljc | 8 ++++++++ test/clojure/string_test/upper_case.cljc | 7 +++++++ 9 files changed, 71 insertions(+) create mode 100644 test/clojure/string_test/blank_qmark.cljc create mode 100644 test/clojure/string_test/capitalize.cljc create mode 100644 test/clojure/string_test/ends_with_qmark.cljc create mode 100644 test/clojure/string_test/escape.cljc create mode 100644 test/clojure/string_test/includes_qmark.cljc create mode 100644 test/clojure/string_test/lower_case.cljc create mode 100644 test/clojure/string_test/reverse.cljc create mode 100644 test/clojure/string_test/starts_with_qmark.cljc create mode 100644 test/clojure/string_test/upper_case.cljc diff --git a/test/clojure/string_test/blank_qmark.cljc b/test/clojure/string_test/blank_qmark.cljc new file mode 100644 index 0000000..629d3f8 --- /dev/null +++ b/test/clojure/string_test/blank_qmark.cljc @@ -0,0 +1,8 @@ +(ns clojure.string-test.blank-qmark + (:require [clojure.string :as str] + [clojure.test :as t :refer [deftest testing is are]] + [clojure.core-test.portability #?(:cljs :refer-macros :default :refer) [when-var-exists]])) + +(when-var-exists str/blank? + (deftest test-blank? + (is false))) diff --git a/test/clojure/string_test/capitalize.cljc b/test/clojure/string_test/capitalize.cljc new file mode 100644 index 0000000..14e8b9b --- /dev/null +++ b/test/clojure/string_test/capitalize.cljc @@ -0,0 +1,8 @@ +(ns clojure.string-test.capitalize + (:require [clojure.string :as str] + [clojure.test :as t :refer [deftest testing is are]] + [clojure.core-test.portability #?(:cljs :refer-macros :default :refer) [when-var-exists]])) + +(when-var-exists str/capitalize + (deftest test-capitalize + )) diff --git a/test/clojure/string_test/ends_with_qmark.cljc b/test/clojure/string_test/ends_with_qmark.cljc new file mode 100644 index 0000000..5bcc875 --- /dev/null +++ b/test/clojure/string_test/ends_with_qmark.cljc @@ -0,0 +1,8 @@ +(ns clojure.core-test.ends-with? + (:require [clojure.string :as str] + [clojure.test :as t :refer [deftest testing is are]] + [clojure.core-test.portability #?(:cljs :refer-macros :default :refer) [when-var-exists]])) + +(when-var-exists str/ends-with? + (deftest test-ends-with? + )) diff --git a/test/clojure/string_test/escape.cljc b/test/clojure/string_test/escape.cljc new file mode 100644 index 0000000..b97e65c --- /dev/null +++ b/test/clojure/string_test/escape.cljc @@ -0,0 +1,8 @@ +(ns clojure.string-test.escape + (:require [clojure.string :as str] + [clojure.test :as t :refer [deftest testing is are]] + [clojure.core-test.portability #?(:cljs :refer-macros :default :refer) [when-var-exists]])) + +(when-var-exists str/escape + (deftest test-escape + )) diff --git a/test/clojure/string_test/includes_qmark.cljc b/test/clojure/string_test/includes_qmark.cljc new file mode 100644 index 0000000..612b136 --- /dev/null +++ b/test/clojure/string_test/includes_qmark.cljc @@ -0,0 +1,8 @@ +(ns clojure.string-test.includes-qmark + (:require [clojure.string :as str] + [clojure.test :as t :refer [deftest testing is are]] + [clojure.core-test.portability #?(:cljs :refer-macros :default :refer) [when-var-exists]])) + +(when-var-exists str/includes? + (deftest test-includes? + )) diff --git a/test/clojure/string_test/lower_case.cljc b/test/clojure/string_test/lower_case.cljc new file mode 100644 index 0000000..9b43c46 --- /dev/null +++ b/test/clojure/string_test/lower_case.cljc @@ -0,0 +1,8 @@ +(ns clojure.string-test.lower-case + (:require [clojure.string :as str] + [clojure.test :as t :refer [deftest testing is are]] + [clojure.core-test.portability #?(:cljs :refer-macros :default :refer) [when-var-exists]])) + +(when-var-exists str/lower-case + (deftest test-lower-case + )) diff --git a/test/clojure/string_test/reverse.cljc b/test/clojure/string_test/reverse.cljc new file mode 100644 index 0000000..35abf67 --- /dev/null +++ b/test/clojure/string_test/reverse.cljc @@ -0,0 +1,8 @@ +(ns clojure.string-test.reverse + (:require [clojure.string :as str] + [clojure.test :as t :refer [deftest testing is are]] + [clojure.core-test.portability #?(:cljs :refer-macros :default :refer) [when-var-exists]])) + +(when-var-exists str/reverse + (deftest test-reverse + )) diff --git a/test/clojure/string_test/starts_with_qmark.cljc b/test/clojure/string_test/starts_with_qmark.cljc new file mode 100644 index 0000000..bd79eb4 --- /dev/null +++ b/test/clojure/string_test/starts_with_qmark.cljc @@ -0,0 +1,8 @@ +(ns clojure.string-test.starts-with-qmark + (:require [clojure.string :as str] + [clojure.test :as t :refer [deftest testing is are]] + [clojure.core-test.portability #?(:cljs :refer-macros :default :refer) [when-var-exists]])) + +(when-var-exists str/starts-with? + (deftest test-starts-with? + )) diff --git a/test/clojure/string_test/upper_case.cljc b/test/clojure/string_test/upper_case.cljc new file mode 100644 index 0000000..f442ede --- /dev/null +++ b/test/clojure/string_test/upper_case.cljc @@ -0,0 +1,7 @@ +(ns clojure.string-test.upper-case + (:require [clojure.test :as t :refer [deftest testing is are]] + [clojure.core-test.portability #?(:cljs :refer-macros :default :refer) [when-var-exists]])) + +(when-var-exists str/upper-case + (deftest test-upper-case + )) From 2314ed55bdc2bbdc48149048aec5439e522686b5 Mon Sep 17 00:00:00 2001 From: Ambrose Bonnaire-Sergeant Date: Wed, 5 Feb 2025 22:23:39 -0600 Subject: [PATCH 02/48] fill in --- test/clojure/string_test/blank_qmark.cljc | 7 ++++++- test/clojure/string_test/capitalize.cljc | 4 +++- test/clojure/string_test/ends_with_qmark.cljc | 4 +++- test/clojure/string_test/escape.cljc | 10 +++++++++- test/clojure/string_test/lower_case.cljc | 8 +++++++- test/clojure/string_test/reverse.cljc | 3 ++- test/clojure/string_test/starts_with_qmark.cljc | 4 +++- test/clojure/string_test/upper_case.cljc | 8 +++++++- 8 files changed, 40 insertions(+), 8 deletions(-) diff --git a/test/clojure/string_test/blank_qmark.cljc b/test/clojure/string_test/blank_qmark.cljc index 629d3f8..96c3537 100644 --- a/test/clojure/string_test/blank_qmark.cljc +++ b/test/clojure/string_test/blank_qmark.cljc @@ -5,4 +5,9 @@ (when-var-exists str/blank? (deftest test-blank? - (is false))) + (is (str/blank? "")) + (is (str/blank? nil)) + (is (str/blank? " ")) + (is (str/blank? " \t ")) + (is (not (str/blank? "nil"))) + (is (not (str/blank? " as df "))))) diff --git a/test/clojure/string_test/capitalize.cljc b/test/clojure/string_test/capitalize.cljc index 14e8b9b..954e5ad 100644 --- a/test/clojure/string_test/capitalize.cljc +++ b/test/clojure/string_test/capitalize.cljc @@ -5,4 +5,6 @@ (when-var-exists str/capitalize (deftest test-capitalize - )) + (is (= "" (str/capitalize ""))) + (is (= "A" (str/capitalize "a"))) + (is (= "A thing" (str/capitalize "a Thing"))))) diff --git a/test/clojure/string_test/ends_with_qmark.cljc b/test/clojure/string_test/ends_with_qmark.cljc index 5bcc875..3672475 100644 --- a/test/clojure/string_test/ends_with_qmark.cljc +++ b/test/clojure/string_test/ends_with_qmark.cljc @@ -5,4 +5,6 @@ (when-var-exists str/ends-with? (deftest test-ends-with? - )) + (is (str/ends-with? "" "")) + (is (str/ends-with? "a-test" "t")) + (is (not (str/ends-with? "a-test" "s"))))) diff --git a/test/clojure/string_test/escape.cljc b/test/clojure/string_test/escape.cljc index b97e65c..de6bbd2 100644 --- a/test/clojure/string_test/escape.cljc +++ b/test/clojure/string_test/escape.cljc @@ -3,6 +3,14 @@ [clojure.test :as t :refer [deftest testing is are]] [clojure.core-test.portability #?(:cljs :refer-macros :default :refer) [when-var-exists]])) +;;https://github.com/jank-lang/jank/issues/226 +(def char-a \a) +(def char-c \c) + (when-var-exists str/escape (deftest test-escape - )) + (is (= "" (str/escape "" {}))) + (is (= "" (str/escape "" {char-a "A_A"}))) + (is (= "" (str/escape "" {char-c "C_C"}))) + (is (= "" (str/escape "" {char-a "A_A" char-c "C_C"}))) + (is (= "A_AbC_C" (str/escape "abc" {char-a "A_A" char-c "C_C"}))))) diff --git a/test/clojure/string_test/lower_case.cljc b/test/clojure/string_test/lower_case.cljc index 9b43c46..5d11609 100644 --- a/test/clojure/string_test/lower_case.cljc +++ b/test/clojure/string_test/lower_case.cljc @@ -5,4 +5,10 @@ (when-var-exists str/lower-case (deftest test-lower-case - )) + (is (= "" (str/lower-case ""))) + (is (= "asdf" (str/lower-case "ASDF"))) + (is (= "asdf" (str/lower-case "asdf"))) + (is (string? (str/lower-case "asdf"))) + (let [s "ASDF"] + (is (= "asdf" (str/lower-case "ASDF"))) + (is (= "ASDF" s) "original string mutated")))) diff --git a/test/clojure/string_test/reverse.cljc b/test/clojure/string_test/reverse.cljc index 35abf67..a2ef4ec 100644 --- a/test/clojure/string_test/reverse.cljc +++ b/test/clojure/string_test/reverse.cljc @@ -5,4 +5,5 @@ (when-var-exists str/reverse (deftest test-reverse - )) + (is (= "" (str/reverse ""))) + (is (= "tset-a" (str/reverse "a-test"))))) diff --git a/test/clojure/string_test/starts_with_qmark.cljc b/test/clojure/string_test/starts_with_qmark.cljc index bd79eb4..b3241de 100644 --- a/test/clojure/string_test/starts_with_qmark.cljc +++ b/test/clojure/string_test/starts_with_qmark.cljc @@ -5,4 +5,6 @@ (when-var-exists str/starts-with? (deftest test-starts-with? - )) + (is (str/starts-with? "" "")) + (is (str/starts-with? "a-test" "a")) + (is (not (str/starts-with? "a-test" "b"))))) diff --git a/test/clojure/string_test/upper_case.cljc b/test/clojure/string_test/upper_case.cljc index f442ede..ca081c8 100644 --- a/test/clojure/string_test/upper_case.cljc +++ b/test/clojure/string_test/upper_case.cljc @@ -4,4 +4,10 @@ (when-var-exists str/upper-case (deftest test-upper-case - )) + (is (= "" (str/upper-case ""))) + (is (= "ASDF" (str/upper-case "asdf"))) + (is (= "ASDF" (str/upper-case "ASDF"))) + (is (string? (str/upper-case "ASDF"))) + (let [s "asdf"] + (is (= "ASDF" (str/upper-case "asdf"))) + (is (= "asdf" s) "original string mutated")))) From f9fccde2c22bc27480ec46a2cb3c16213bc09afc Mon Sep 17 00:00:00 2001 From: Ambrose Bonnaire-Sergeant Date: Wed, 5 Feb 2025 22:24:21 -0600 Subject: [PATCH 03/48] fix --- test/clojure/string_test/ends_with_qmark.cljc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/clojure/string_test/ends_with_qmark.cljc b/test/clojure/string_test/ends_with_qmark.cljc index 3672475..22bb83a 100644 --- a/test/clojure/string_test/ends_with_qmark.cljc +++ b/test/clojure/string_test/ends_with_qmark.cljc @@ -1,4 +1,4 @@ -(ns clojure.core-test.ends-with? +(ns clojure.string-test.ends-with-qmark (:require [clojure.string :as str] [clojure.test :as t :refer [deftest testing is are]] [clojure.core-test.portability #?(:cljs :refer-macros :default :refer) [when-var-exists]])) From 1b7f3e559382b4cd123205387d64674a711fb108 Mon Sep 17 00:00:00 2001 From: Ambrose Bonnaire-Sergeant Date: Wed, 5 Feb 2025 23:07:14 -0600 Subject: [PATCH 04/48] upgrade bb new-test, add deps.edn --- README.md | 6 ++++-- bb.edn | 14 ++++++++++++-- bb/new_test.clj | 34 ++++++++++++++++++++++------------ deps.edn | 1 + templates/test-template.cljc | 7 ++++--- 5 files changed, 43 insertions(+), 19 deletions(-) create mode 100644 deps.edn diff --git a/README.md b/README.md index 0177976..2a67830 100644 --- a/README.md +++ b/README.md @@ -83,8 +83,8 @@ The following tasks are available: test-jvm Runs JVM tests test-cljs Runs CLJS tests -new-test Creates new test for the Clojure symbols named by - +new-test Creates new test for the Clojure symbols named by . Unqualified symbols assume clojure.core +nrepl Starts an nrepl server on port 1339 using an .nrepl-port file ``` Currently, there are tasks to run the Clojure JVM and Clojurescript test suites. @@ -95,6 +95,8 @@ wanted to test a function named `clojure.core/foo`, for instance, you would type: ```bash +bb new-test clojure.core/foo +;; or bb new-test foo ``` diff --git a/bb.edn b/bb.edn index ffc15d6..d2967e0 100644 --- a/bb.edn +++ b/bb.edn @@ -5,6 +5,16 @@ :task (shell "lein test")} test-cljs {:doc "Runs CLJS tests" :task (shell "npx shadow-cljs compile test")} - new-test {:doc "Creates new test for the Clojure symbols named by " + new-test {:doc "Creates new test for the Clojure symbols named by . Unqualified symbols assume clojure.core" :requires ([new-test]) - :task (new-test/new-test *command-line-args*)}}} + :task (new-test/new-test *command-line-args*)} + nrepl {:doc "Starts an nrepl server on port 1339 using an .nrepl-port file" + :requires ([babashka.fs :as fs] + [babashka.nrepl.server :as srv]) + :task (do (srv/start-server! {:host "localhost" + :port 1339}) + (spit ".nrepl-port" "1339") + (-> (Runtime/getRuntime) + (.addShutdownHook + (Thread. (fn [] (fs/delete ".nrepl-port"))))) + (deref (promise)))}}} diff --git a/bb/new_test.clj b/bb/new_test.clj index d0dbb62..1fe1411 100644 --- a/bb/new_test.clj +++ b/bb/new_test.clj @@ -6,8 +6,8 @@ [selmer.util :as util])) ;;; *, +, !, -, _, ', ?, <, > and = -(defn sym-name->ns-name - "Replace special characters in symbol name to make an ns-name." +(defn sym-name->ns-suffix + "Replace special characters in symbol name to make the final component of the ns name." [sym] (let [n (name sym) ns-sym (-> (if (str/starts-with? n "-") @@ -26,31 +26,41 @@ (subs ns-sym 1) ns-sym))) -(defn ns-name->file-name +(defn ns-suffix->file-name "Replace hyphens with underscores to create the file name." [ns-name] (str/replace ns-name "-" "_")) +(defn ns->resource [nsym] + (-> nsym namespace-munge (str/replace "." "/"))) + (defn new-test "Create a new test file for the symbol which is the first command line argument." [args] (if (zero? (count args)) (println "Please supply one or more Clojure symbols corresponding to the new tests.") - (loop [[sym-name & args] args] - (when sym-name - (let [ns-name (sym-name->ns-name sym-name) - file-name (ns-name->file-name ns-name) - dest-file-name (str "test/clojure/core_test/" file-name ".cljc")] + (loop [[sym & args] (map symbol args)] + (when sym + (let [sym-name (if (namespace sym) + (-> sym name symbol) + sym) + base-ns (or (some-> sym namespace symbol) + 'clojure.core) + ns-suffix (sym-name->ns-suffix sym-name) + file-name (namespace-munge ns-suffix) + dest-file-name (format "test/%s_test/%s.cljc" (ns->resource base-ns) file-name)] (if (fs/exists? dest-file-name) (println dest-file-name "already exists. No action taken.") (do (println "Creating" dest-file-name) (let [template (slurp "templates/test-template.cljc")] (spit dest-file-name (util/without-escaping - (s/render template {:sym-name sym-name - :ns-name ns-name + (s/render template {:base-ns base-ns + :sym-name sym-name + :ns-suffix ns-suffix :file-name file-name}))))))) (recur args))))) - - +(comment + (namespace-munge 'clojure.string) + ) diff --git a/deps.edn b/deps.edn new file mode 100644 index 0000000..cb36f2d --- /dev/null +++ b/deps.edn @@ -0,0 +1 @@ +{:paths ["test"]} diff --git a/templates/test-template.cljc b/templates/test-template.cljc index ff6840b..2305ce1 100644 --- a/templates/test-template.cljc +++ b/templates/test-template.cljc @@ -1,8 +1,9 @@ -(ns clojure.core-test.{{ns-name}} - (:require [clojure.test :as t :refer [deftest testing is are]] +(ns {{base-ns}}-test.{{ns-suffix}} + (:require {{base-ns}} + [clojure.test :as t :refer [deftest testing is are]] [clojure.core-test.portability #?(:cljs :refer-macros :default :refer) [when-var-exists]])) -(when-var-exists clojure.core/{{sym-name}} +(when-var-exists {{base-ns}}/{{sym-name}} (deftest test-{{sym-name}} ;; `testing` sections are optional, depending on how you want to ;; structure your tests. If you have a lot of tests and they group From 2bd8ec13dbb0669796dae7386f34c2f96add5803 Mon Sep 17 00:00:00 2001 From: Ambrose Bonnaire-Sergeant Date: Wed, 5 Feb 2025 23:08:57 -0600 Subject: [PATCH 05/48] rm --- bb/new_test.clj | 4 ---- 1 file changed, 4 deletions(-) diff --git a/bb/new_test.clj b/bb/new_test.clj index 1fe1411..c4a9ed5 100644 --- a/bb/new_test.clj +++ b/bb/new_test.clj @@ -60,7 +60,3 @@ :ns-suffix ns-suffix :file-name file-name}))))))) (recur args))))) - -(comment - (namespace-munge 'clojure.string) - ) From c8548a3c9f31d5ae24c7a5b0632a0bd892d59510 Mon Sep 17 00:00:00 2001 From: Ambrose Bonnaire-Sergeant Date: Wed, 5 Feb 2025 23:12:22 -0600 Subject: [PATCH 06/48] wip --- test/clojure/string_test/includes_qmark.cljc | 8 -------- test/clojure/string_test/upper_case.cljc | 3 ++- 2 files changed, 2 insertions(+), 9 deletions(-) delete mode 100644 test/clojure/string_test/includes_qmark.cljc diff --git a/test/clojure/string_test/includes_qmark.cljc b/test/clojure/string_test/includes_qmark.cljc deleted file mode 100644 index 612b136..0000000 --- a/test/clojure/string_test/includes_qmark.cljc +++ /dev/null @@ -1,8 +0,0 @@ -(ns clojure.string-test.includes-qmark - (:require [clojure.string :as str] - [clojure.test :as t :refer [deftest testing is are]] - [clojure.core-test.portability #?(:cljs :refer-macros :default :refer) [when-var-exists]])) - -(when-var-exists str/includes? - (deftest test-includes? - )) diff --git a/test/clojure/string_test/upper_case.cljc b/test/clojure/string_test/upper_case.cljc index ca081c8..73bcc24 100644 --- a/test/clojure/string_test/upper_case.cljc +++ b/test/clojure/string_test/upper_case.cljc @@ -1,5 +1,6 @@ (ns clojure.string-test.upper-case - (:require [clojure.test :as t :refer [deftest testing is are]] + (:require [clojure.string :as str] + [clojure.test :as t :refer [deftest testing is are]] [clojure.core-test.portability #?(:cljs :refer-macros :default :refer) [when-var-exists]])) (when-var-exists str/upper-case From 2806fe6fc71eea3a0501cca1fa549ead7812a24a Mon Sep 17 00:00:00 2001 From: Ambrose Bonnaire-Sergeant Date: Wed, 5 Feb 2025 23:33:51 -0600 Subject: [PATCH 07/48] clean up --- deps.edn | 1 - 1 file changed, 1 deletion(-) delete mode 100644 deps.edn diff --git a/deps.edn b/deps.edn deleted file mode 100644 index cb36f2d..0000000 --- a/deps.edn +++ /dev/null @@ -1 +0,0 @@ -{:paths ["test"]} From 8466c7b3837a51670a2a71a30e7bc3daa9468d2f Mon Sep 17 00:00:00 2001 From: Ambrose Bonnaire-Sergeant Date: Thu, 6 Feb 2025 14:02:14 -0600 Subject: [PATCH 08/48] captialize corner cases --- test/clojure/string_test/capitalize.cljc | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/test/clojure/string_test/capitalize.cljc b/test/clojure/string_test/capitalize.cljc index 954e5ad..3b99208 100644 --- a/test/clojure/string_test/capitalize.cljc +++ b/test/clojure/string_test/capitalize.cljc @@ -5,6 +5,13 @@ (when-var-exists str/capitalize (deftest test-capitalize + (is (thrown? Exception (str/capitalize nil))) + (is (= "1" (str/capitalize 1))) + (is (= "Asdf" (str/capitalize 'Asdf))) + (is (= "Asdf" (str/capitalize 'Asdf))) + (is (= ":clojure.string-test.capitalize/asdf" (str/capitalize ::asdf))) + (is (= ":clojure.string-test.capitalize/asdf" (str/capitalize ::Asdf))) (is (= "" (str/capitalize ""))) (is (= "A" (str/capitalize "a"))) - (is (= "A thing" (str/capitalize "a Thing"))))) + (is (= "A thing" (str/capitalize "a Thing"))) + (is (= "A thing" (str/capitalize "A thing"))))) From 41c9b36a766d105e529912c8feff6fb02c29e6dd Mon Sep 17 00:00:00 2001 From: Ambrose Bonnaire-Sergeant Date: Thu, 6 Feb 2025 14:04:42 -0600 Subject: [PATCH 09/48] wip --- test/clojure/string_test/capitalize.cljc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/clojure/string_test/capitalize.cljc b/test/clojure/string_test/capitalize.cljc index 3b99208..8bfc3d7 100644 --- a/test/clojure/string_test/capitalize.cljc +++ b/test/clojure/string_test/capitalize.cljc @@ -5,7 +5,7 @@ (when-var-exists str/capitalize (deftest test-capitalize - (is (thrown? Exception (str/capitalize nil))) + (is (thrown? #?(:cljs :default :default Exception) (str/capitalize nil))) (is (= "1" (str/capitalize 1))) (is (= "Asdf" (str/capitalize 'Asdf))) (is (= "Asdf" (str/capitalize 'Asdf))) From edb2686fa7260db9c20fa223648a55d55d1263ce Mon Sep 17 00:00:00 2001 From: Ambrose Bonnaire-Sergeant Date: Thu, 6 Feb 2025 15:04:10 -0600 Subject: [PATCH 10/48] jank compatible --- test/clojure/string_test/capitalize.cljc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/clojure/string_test/capitalize.cljc b/test/clojure/string_test/capitalize.cljc index 8bfc3d7..8624a95 100644 --- a/test/clojure/string_test/capitalize.cljc +++ b/test/clojure/string_test/capitalize.cljc @@ -5,7 +5,7 @@ (when-var-exists str/capitalize (deftest test-capitalize - (is (thrown? #?(:cljs :default :default Exception) (str/capitalize nil))) + (is (thrown? #?(:cljs :default :clj Exception) (str/capitalize nil))) (is (= "1" (str/capitalize 1))) (is (= "Asdf" (str/capitalize 'Asdf))) (is (= "Asdf" (str/capitalize 'Asdf))) From 05a43a3d13e4144ff22224340fd05751aa1fb881 Mon Sep 17 00:00:00 2001 From: Ambrose Bonnaire-Sergeant Date: Fri, 7 Feb 2025 14:34:01 -0600 Subject: [PATCH 11/48] rm jank workaround --- test/clojure/string_test/escape.cljc | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/test/clojure/string_test/escape.cljc b/test/clojure/string_test/escape.cljc index de6bbd2..5e1beaf 100644 --- a/test/clojure/string_test/escape.cljc +++ b/test/clojure/string_test/escape.cljc @@ -3,14 +3,10 @@ [clojure.test :as t :refer [deftest testing is are]] [clojure.core-test.portability #?(:cljs :refer-macros :default :refer) [when-var-exists]])) -;;https://github.com/jank-lang/jank/issues/226 -(def char-a \a) -(def char-c \c) - (when-var-exists str/escape (deftest test-escape (is (= "" (str/escape "" {}))) - (is (= "" (str/escape "" {char-a "A_A"}))) - (is (= "" (str/escape "" {char-c "C_C"}))) - (is (= "" (str/escape "" {char-a "A_A" char-c "C_C"}))) - (is (= "A_AbC_C" (str/escape "abc" {char-a "A_A" char-c "C_C"}))))) + (is (= "" (str/escape "" {\a "A_A"}))) + (is (= "" (str/escape "" {\c "C_C"}))) + (is (= "" (str/escape "" {\a "A_A" \c "C_C"}))) + (is (= "A_AbC_C" (str/escape "abc" {\a "A_A" \c "C_C"}))))) From 27ae141644784b25da1519607f44d594c115c8bc Mon Sep 17 00:00:00 2001 From: Ambrose Bonnaire-Sergeant Date: Fri, 7 Feb 2025 19:06:56 -0600 Subject: [PATCH 12/48] add subs cases --- test/clojure/core_test/subs.cljc | 564 ++++++++++++++++++++++++++++++- 1 file changed, 558 insertions(+), 6 deletions(-) diff --git a/test/clojure/core_test/subs.cljc b/test/clojure/core_test/subs.cljc index 1c83480..6632283 100644 --- a/test/clojure/core_test/subs.cljc +++ b/test/clojure/core_test/subs.cljc @@ -2,14 +2,566 @@ (:require [clojure.test :as t :refer [deftest is]] [clojure.core-test.portability #?(:cljs :refer-macros :default :refer) [when-var-exists]])) +;(defn- generate-cases [] +; (let [v "abcdefghijkl"] +; (distinct +; (for [len (range (count v)) +; :let [v (subs v len)] +; i (range (- (count v)) (+ 5 (count v))) +; j (range (- (count v)) (+ 5 (count v))) +; e (concat (try [(list 'is (list '= (subs v i) (list 'subs v i)))] (catch Throwable _)) +; (try [(list 'is (list '= (subs v i j) (list 'subs v i j)))] (catch Throwable _)))] +; e)))) +;(comment +;(clojure.pprint/pprint (generate-cases)) +; ) + (when-var-exists clojure.core/subs (deftest test-subs - (is (= "bcde" (subs "abcde" 1))) - (is (= "bcd" (subs "abcde" 1 4))) - (is (= "abc" (subs "abcde" 0 3))) - (is (= "" (subs "abcde" 0 0))) - (is (= "" (subs "abcde" 5))) - (is (= "" (subs "abcde" 5 5))) + (is (= "abcdefghijkl" (subs "abcdefghijkl" 0))) + (is (= "" (subs "abcdefghijkl" 0 0))) + (is (= "a" (subs "abcdefghijkl" 0 1))) + (is (= "ab" (subs "abcdefghijkl" 0 2))) + (is (= "abc" (subs "abcdefghijkl" 0 3))) + (is (= "abcd" (subs "abcdefghijkl" 0 4))) + (is (= "abcde" (subs "abcdefghijkl" 0 5))) + (is (= "abcdef" (subs "abcdefghijkl" 0 6))) + (is (= "abcdefg" (subs "abcdefghijkl" 0 7))) + (is (= "abcdefgh" (subs "abcdefghijkl" 0 8))) + (is (= "abcdefghi" (subs "abcdefghijkl" 0 9))) + (is (= "abcdefghij" (subs "abcdefghijkl" 0 10))) + (is (= "abcdefghijk" (subs "abcdefghijkl" 0 11))) + (is (= "abcdefghijkl" (subs "abcdefghijkl" 0 12))) + (is (= "bcdefghijkl" (subs "abcdefghijkl" 1))) + (is (= "" (subs "abcdefghijkl" 1 1))) + (is (= "b" (subs "abcdefghijkl" 1 2))) + (is (= "bc" (subs "abcdefghijkl" 1 3))) + (is (= "bcd" (subs "abcdefghijkl" 1 4))) + (is (= "bcde" (subs "abcdefghijkl" 1 5))) + (is (= "bcdef" (subs "abcdefghijkl" 1 6))) + (is (= "bcdefg" (subs "abcdefghijkl" 1 7))) + (is (= "bcdefgh" (subs "abcdefghijkl" 1 8))) + (is (= "bcdefghi" (subs "abcdefghijkl" 1 9))) + (is (= "bcdefghij" (subs "abcdefghijkl" 1 10))) + (is (= "bcdefghijk" (subs "abcdefghijkl" 1 11))) + (is (= "bcdefghijkl" (subs "abcdefghijkl" 1 12))) + (is (= "cdefghijkl" (subs "abcdefghijkl" 2))) + (is (= "" (subs "abcdefghijkl" 2 2))) + (is (= "c" (subs "abcdefghijkl" 2 3))) + (is (= "cd" (subs "abcdefghijkl" 2 4))) + (is (= "cde" (subs "abcdefghijkl" 2 5))) + (is (= "cdef" (subs "abcdefghijkl" 2 6))) + (is (= "cdefg" (subs "abcdefghijkl" 2 7))) + (is (= "cdefgh" (subs "abcdefghijkl" 2 8))) + (is (= "cdefghi" (subs "abcdefghijkl" 2 9))) + (is (= "cdefghij" (subs "abcdefghijkl" 2 10))) + (is (= "cdefghijk" (subs "abcdefghijkl" 2 11))) + (is (= "cdefghijkl" (subs "abcdefghijkl" 2 12))) + (is (= "defghijkl" (subs "abcdefghijkl" 3))) + (is (= "" (subs "abcdefghijkl" 3 3))) + (is (= "d" (subs "abcdefghijkl" 3 4))) + (is (= "de" (subs "abcdefghijkl" 3 5))) + (is (= "def" (subs "abcdefghijkl" 3 6))) + (is (= "defg" (subs "abcdefghijkl" 3 7))) + (is (= "defgh" (subs "abcdefghijkl" 3 8))) + (is (= "defghi" (subs "abcdefghijkl" 3 9))) + (is (= "defghij" (subs "abcdefghijkl" 3 10))) + (is (= "defghijk" (subs "abcdefghijkl" 3 11))) + (is (= "defghijkl" (subs "abcdefghijkl" 3 12))) + (is (= "efghijkl" (subs "abcdefghijkl" 4))) + (is (= "" (subs "abcdefghijkl" 4 4))) + (is (= "e" (subs "abcdefghijkl" 4 5))) + (is (= "ef" (subs "abcdefghijkl" 4 6))) + (is (= "efg" (subs "abcdefghijkl" 4 7))) + (is (= "efgh" (subs "abcdefghijkl" 4 8))) + (is (= "efghi" (subs "abcdefghijkl" 4 9))) + (is (= "efghij" (subs "abcdefghijkl" 4 10))) + (is (= "efghijk" (subs "abcdefghijkl" 4 11))) + (is (= "efghijkl" (subs "abcdefghijkl" 4 12))) + (is (= "fghijkl" (subs "abcdefghijkl" 5))) + (is (= "" (subs "abcdefghijkl" 5 5))) + (is (= "f" (subs "abcdefghijkl" 5 6))) + (is (= "fg" (subs "abcdefghijkl" 5 7))) + (is (= "fgh" (subs "abcdefghijkl" 5 8))) + (is (= "fghi" (subs "abcdefghijkl" 5 9))) + (is (= "fghij" (subs "abcdefghijkl" 5 10))) + (is (= "fghijk" (subs "abcdefghijkl" 5 11))) + (is (= "fghijkl" (subs "abcdefghijkl" 5 12))) + (is (= "ghijkl" (subs "abcdefghijkl" 6))) + (is (= "" (subs "abcdefghijkl" 6 6))) + (is (= "g" (subs "abcdefghijkl" 6 7))) + (is (= "gh" (subs "abcdefghijkl" 6 8))) + (is (= "ghi" (subs "abcdefghijkl" 6 9))) + (is (= "ghij" (subs "abcdefghijkl" 6 10))) + (is (= "ghijk" (subs "abcdefghijkl" 6 11))) + (is (= "ghijkl" (subs "abcdefghijkl" 6 12))) + (is (= "hijkl" (subs "abcdefghijkl" 7))) + (is (= "" (subs "abcdefghijkl" 7 7))) + (is (= "h" (subs "abcdefghijkl" 7 8))) + (is (= "hi" (subs "abcdefghijkl" 7 9))) + (is (= "hij" (subs "abcdefghijkl" 7 10))) + (is (= "hijk" (subs "abcdefghijkl" 7 11))) + (is (= "hijkl" (subs "abcdefghijkl" 7 12))) + (is (= "ijkl" (subs "abcdefghijkl" 8))) + (is (= "" (subs "abcdefghijkl" 8 8))) + (is (= "i" (subs "abcdefghijkl" 8 9))) + (is (= "ij" (subs "abcdefghijkl" 8 10))) + (is (= "ijk" (subs "abcdefghijkl" 8 11))) + (is (= "ijkl" (subs "abcdefghijkl" 8 12))) + (is (= "jkl" (subs "abcdefghijkl" 9))) + (is (= "" (subs "abcdefghijkl" 9 9))) + (is (= "j" (subs "abcdefghijkl" 9 10))) + (is (= "jk" (subs "abcdefghijkl" 9 11))) + (is (= "jkl" (subs "abcdefghijkl" 9 12))) + (is (= "kl" (subs "abcdefghijkl" 10))) + (is (= "" (subs "abcdefghijkl" 10 10))) + (is (= "k" (subs "abcdefghijkl" 10 11))) + (is (= "kl" (subs "abcdefghijkl" 10 12))) + (is (= "l" (subs "abcdefghijkl" 11))) + (is (= "" (subs "abcdefghijkl" 11 11))) + (is (= "l" (subs "abcdefghijkl" 11 12))) + (is (= "" (subs "abcdefghijkl" 12))) + (is (= "" (subs "abcdefghijkl" 12 12))) + (is (= "bcdefghijkl" (subs "bcdefghijkl" 0))) + (is (= "" (subs "bcdefghijkl" 0 0))) + (is (= "b" (subs "bcdefghijkl" 0 1))) + (is (= "bc" (subs "bcdefghijkl" 0 2))) + (is (= "bcd" (subs "bcdefghijkl" 0 3))) + (is (= "bcde" (subs "bcdefghijkl" 0 4))) + (is (= "bcdef" (subs "bcdefghijkl" 0 5))) + (is (= "bcdefg" (subs "bcdefghijkl" 0 6))) + (is (= "bcdefgh" (subs "bcdefghijkl" 0 7))) + (is (= "bcdefghi" (subs "bcdefghijkl" 0 8))) + (is (= "bcdefghij" (subs "bcdefghijkl" 0 9))) + (is (= "bcdefghijk" (subs "bcdefghijkl" 0 10))) + (is (= "bcdefghijkl" (subs "bcdefghijkl" 0 11))) + (is (= "cdefghijkl" (subs "bcdefghijkl" 1))) + (is (= "" (subs "bcdefghijkl" 1 1))) + (is (= "c" (subs "bcdefghijkl" 1 2))) + (is (= "cd" (subs "bcdefghijkl" 1 3))) + (is (= "cde" (subs "bcdefghijkl" 1 4))) + (is (= "cdef" (subs "bcdefghijkl" 1 5))) + (is (= "cdefg" (subs "bcdefghijkl" 1 6))) + (is (= "cdefgh" (subs "bcdefghijkl" 1 7))) + (is (= "cdefghi" (subs "bcdefghijkl" 1 8))) + (is (= "cdefghij" (subs "bcdefghijkl" 1 9))) + (is (= "cdefghijk" (subs "bcdefghijkl" 1 10))) + (is (= "cdefghijkl" (subs "bcdefghijkl" 1 11))) + (is (= "defghijkl" (subs "bcdefghijkl" 2))) + (is (= "" (subs "bcdefghijkl" 2 2))) + (is (= "d" (subs "bcdefghijkl" 2 3))) + (is (= "de" (subs "bcdefghijkl" 2 4))) + (is (= "def" (subs "bcdefghijkl" 2 5))) + (is (= "defg" (subs "bcdefghijkl" 2 6))) + (is (= "defgh" (subs "bcdefghijkl" 2 7))) + (is (= "defghi" (subs "bcdefghijkl" 2 8))) + (is (= "defghij" (subs "bcdefghijkl" 2 9))) + (is (= "defghijk" (subs "bcdefghijkl" 2 10))) + (is (= "defghijkl" (subs "bcdefghijkl" 2 11))) + (is (= "efghijkl" (subs "bcdefghijkl" 3))) + (is (= "" (subs "bcdefghijkl" 3 3))) + (is (= "e" (subs "bcdefghijkl" 3 4))) + (is (= "ef" (subs "bcdefghijkl" 3 5))) + (is (= "efg" (subs "bcdefghijkl" 3 6))) + (is (= "efgh" (subs "bcdefghijkl" 3 7))) + (is (= "efghi" (subs "bcdefghijkl" 3 8))) + (is (= "efghij" (subs "bcdefghijkl" 3 9))) + (is (= "efghijk" (subs "bcdefghijkl" 3 10))) + (is (= "efghijkl" (subs "bcdefghijkl" 3 11))) + (is (= "fghijkl" (subs "bcdefghijkl" 4))) + (is (= "" (subs "bcdefghijkl" 4 4))) + (is (= "f" (subs "bcdefghijkl" 4 5))) + (is (= "fg" (subs "bcdefghijkl" 4 6))) + (is (= "fgh" (subs "bcdefghijkl" 4 7))) + (is (= "fghi" (subs "bcdefghijkl" 4 8))) + (is (= "fghij" (subs "bcdefghijkl" 4 9))) + (is (= "fghijk" (subs "bcdefghijkl" 4 10))) + (is (= "fghijkl" (subs "bcdefghijkl" 4 11))) + (is (= "ghijkl" (subs "bcdefghijkl" 5))) + (is (= "" (subs "bcdefghijkl" 5 5))) + (is (= "g" (subs "bcdefghijkl" 5 6))) + (is (= "gh" (subs "bcdefghijkl" 5 7))) + (is (= "ghi" (subs "bcdefghijkl" 5 8))) + (is (= "ghij" (subs "bcdefghijkl" 5 9))) + (is (= "ghijk" (subs "bcdefghijkl" 5 10))) + (is (= "ghijkl" (subs "bcdefghijkl" 5 11))) + (is (= "hijkl" (subs "bcdefghijkl" 6))) + (is (= "" (subs "bcdefghijkl" 6 6))) + (is (= "h" (subs "bcdefghijkl" 6 7))) + (is (= "hi" (subs "bcdefghijkl" 6 8))) + (is (= "hij" (subs "bcdefghijkl" 6 9))) + (is (= "hijk" (subs "bcdefghijkl" 6 10))) + (is (= "hijkl" (subs "bcdefghijkl" 6 11))) + (is (= "ijkl" (subs "bcdefghijkl" 7))) + (is (= "" (subs "bcdefghijkl" 7 7))) + (is (= "i" (subs "bcdefghijkl" 7 8))) + (is (= "ij" (subs "bcdefghijkl" 7 9))) + (is (= "ijk" (subs "bcdefghijkl" 7 10))) + (is (= "ijkl" (subs "bcdefghijkl" 7 11))) + (is (= "jkl" (subs "bcdefghijkl" 8))) + (is (= "" (subs "bcdefghijkl" 8 8))) + (is (= "j" (subs "bcdefghijkl" 8 9))) + (is (= "jk" (subs "bcdefghijkl" 8 10))) + (is (= "jkl" (subs "bcdefghijkl" 8 11))) + (is (= "kl" (subs "bcdefghijkl" 9))) + (is (= "" (subs "bcdefghijkl" 9 9))) + (is (= "k" (subs "bcdefghijkl" 9 10))) + (is (= "kl" (subs "bcdefghijkl" 9 11))) + (is (= "l" (subs "bcdefghijkl" 10))) + (is (= "" (subs "bcdefghijkl" 10 10))) + (is (= "l" (subs "bcdefghijkl" 10 11))) + (is (= "" (subs "bcdefghijkl" 11))) + (is (= "" (subs "bcdefghijkl" 11 11))) + (is (= "cdefghijkl" (subs "cdefghijkl" 0))) + (is (= "" (subs "cdefghijkl" 0 0))) + (is (= "c" (subs "cdefghijkl" 0 1))) + (is (= "cd" (subs "cdefghijkl" 0 2))) + (is (= "cde" (subs "cdefghijkl" 0 3))) + (is (= "cdef" (subs "cdefghijkl" 0 4))) + (is (= "cdefg" (subs "cdefghijkl" 0 5))) + (is (= "cdefgh" (subs "cdefghijkl" 0 6))) + (is (= "cdefghi" (subs "cdefghijkl" 0 7))) + (is (= "cdefghij" (subs "cdefghijkl" 0 8))) + (is (= "cdefghijk" (subs "cdefghijkl" 0 9))) + (is (= "cdefghijkl" (subs "cdefghijkl" 0 10))) + (is (= "defghijkl" (subs "cdefghijkl" 1))) + (is (= "" (subs "cdefghijkl" 1 1))) + (is (= "d" (subs "cdefghijkl" 1 2))) + (is (= "de" (subs "cdefghijkl" 1 3))) + (is (= "def" (subs "cdefghijkl" 1 4))) + (is (= "defg" (subs "cdefghijkl" 1 5))) + (is (= "defgh" (subs "cdefghijkl" 1 6))) + (is (= "defghi" (subs "cdefghijkl" 1 7))) + (is (= "defghij" (subs "cdefghijkl" 1 8))) + (is (= "defghijk" (subs "cdefghijkl" 1 9))) + (is (= "defghijkl" (subs "cdefghijkl" 1 10))) + (is (= "efghijkl" (subs "cdefghijkl" 2))) + (is (= "" (subs "cdefghijkl" 2 2))) + (is (= "e" (subs "cdefghijkl" 2 3))) + (is (= "ef" (subs "cdefghijkl" 2 4))) + (is (= "efg" (subs "cdefghijkl" 2 5))) + (is (= "efgh" (subs "cdefghijkl" 2 6))) + (is (= "efghi" (subs "cdefghijkl" 2 7))) + (is (= "efghij" (subs "cdefghijkl" 2 8))) + (is (= "efghijk" (subs "cdefghijkl" 2 9))) + (is (= "efghijkl" (subs "cdefghijkl" 2 10))) + (is (= "fghijkl" (subs "cdefghijkl" 3))) + (is (= "" (subs "cdefghijkl" 3 3))) + (is (= "f" (subs "cdefghijkl" 3 4))) + (is (= "fg" (subs "cdefghijkl" 3 5))) + (is (= "fgh" (subs "cdefghijkl" 3 6))) + (is (= "fghi" (subs "cdefghijkl" 3 7))) + (is (= "fghij" (subs "cdefghijkl" 3 8))) + (is (= "fghijk" (subs "cdefghijkl" 3 9))) + (is (= "fghijkl" (subs "cdefghijkl" 3 10))) + (is (= "ghijkl" (subs "cdefghijkl" 4))) + (is (= "" (subs "cdefghijkl" 4 4))) + (is (= "g" (subs "cdefghijkl" 4 5))) + (is (= "gh" (subs "cdefghijkl" 4 6))) + (is (= "ghi" (subs "cdefghijkl" 4 7))) + (is (= "ghij" (subs "cdefghijkl" 4 8))) + (is (= "ghijk" (subs "cdefghijkl" 4 9))) + (is (= "ghijkl" (subs "cdefghijkl" 4 10))) + (is (= "hijkl" (subs "cdefghijkl" 5))) + (is (= "" (subs "cdefghijkl" 5 5))) + (is (= "h" (subs "cdefghijkl" 5 6))) + (is (= "hi" (subs "cdefghijkl" 5 7))) + (is (= "hij" (subs "cdefghijkl" 5 8))) + (is (= "hijk" (subs "cdefghijkl" 5 9))) + (is (= "hijkl" (subs "cdefghijkl" 5 10))) + (is (= "ijkl" (subs "cdefghijkl" 6))) + (is (= "" (subs "cdefghijkl" 6 6))) + (is (= "i" (subs "cdefghijkl" 6 7))) + (is (= "ij" (subs "cdefghijkl" 6 8))) + (is (= "ijk" (subs "cdefghijkl" 6 9))) + (is (= "ijkl" (subs "cdefghijkl" 6 10))) + (is (= "jkl" (subs "cdefghijkl" 7))) + (is (= "" (subs "cdefghijkl" 7 7))) + (is (= "j" (subs "cdefghijkl" 7 8))) + (is (= "jk" (subs "cdefghijkl" 7 9))) + (is (= "jkl" (subs "cdefghijkl" 7 10))) + (is (= "kl" (subs "cdefghijkl" 8))) + (is (= "" (subs "cdefghijkl" 8 8))) + (is (= "k" (subs "cdefghijkl" 8 9))) + (is (= "kl" (subs "cdefghijkl" 8 10))) + (is (= "l" (subs "cdefghijkl" 9))) + (is (= "" (subs "cdefghijkl" 9 9))) + (is (= "l" (subs "cdefghijkl" 9 10))) + (is (= "" (subs "cdefghijkl" 10))) + (is (= "" (subs "cdefghijkl" 10 10))) + (is (= "defghijkl" (subs "defghijkl" 0))) + (is (= "" (subs "defghijkl" 0 0))) + (is (= "d" (subs "defghijkl" 0 1))) + (is (= "de" (subs "defghijkl" 0 2))) + (is (= "def" (subs "defghijkl" 0 3))) + (is (= "defg" (subs "defghijkl" 0 4))) + (is (= "defgh" (subs "defghijkl" 0 5))) + (is (= "defghi" (subs "defghijkl" 0 6))) + (is (= "defghij" (subs "defghijkl" 0 7))) + (is (= "defghijk" (subs "defghijkl" 0 8))) + (is (= "defghijkl" (subs "defghijkl" 0 9))) + (is (= "efghijkl" (subs "defghijkl" 1))) + (is (= "" (subs "defghijkl" 1 1))) + (is (= "e" (subs "defghijkl" 1 2))) + (is (= "ef" (subs "defghijkl" 1 3))) + (is (= "efg" (subs "defghijkl" 1 4))) + (is (= "efgh" (subs "defghijkl" 1 5))) + (is (= "efghi" (subs "defghijkl" 1 6))) + (is (= "efghij" (subs "defghijkl" 1 7))) + (is (= "efghijk" (subs "defghijkl" 1 8))) + (is (= "efghijkl" (subs "defghijkl" 1 9))) + (is (= "fghijkl" (subs "defghijkl" 2))) + (is (= "" (subs "defghijkl" 2 2))) + (is (= "f" (subs "defghijkl" 2 3))) + (is (= "fg" (subs "defghijkl" 2 4))) + (is (= "fgh" (subs "defghijkl" 2 5))) + (is (= "fghi" (subs "defghijkl" 2 6))) + (is (= "fghij" (subs "defghijkl" 2 7))) + (is (= "fghijk" (subs "defghijkl" 2 8))) + (is (= "fghijkl" (subs "defghijkl" 2 9))) + (is (= "ghijkl" (subs "defghijkl" 3))) + (is (= "" (subs "defghijkl" 3 3))) + (is (= "g" (subs "defghijkl" 3 4))) + (is (= "gh" (subs "defghijkl" 3 5))) + (is (= "ghi" (subs "defghijkl" 3 6))) + (is (= "ghij" (subs "defghijkl" 3 7))) + (is (= "ghijk" (subs "defghijkl" 3 8))) + (is (= "ghijkl" (subs "defghijkl" 3 9))) + (is (= "hijkl" (subs "defghijkl" 4))) + (is (= "" (subs "defghijkl" 4 4))) + (is (= "h" (subs "defghijkl" 4 5))) + (is (= "hi" (subs "defghijkl" 4 6))) + (is (= "hij" (subs "defghijkl" 4 7))) + (is (= "hijk" (subs "defghijkl" 4 8))) + (is (= "hijkl" (subs "defghijkl" 4 9))) + (is (= "ijkl" (subs "defghijkl" 5))) + (is (= "" (subs "defghijkl" 5 5))) + (is (= "i" (subs "defghijkl" 5 6))) + (is (= "ij" (subs "defghijkl" 5 7))) + (is (= "ijk" (subs "defghijkl" 5 8))) + (is (= "ijkl" (subs "defghijkl" 5 9))) + (is (= "jkl" (subs "defghijkl" 6))) + (is (= "" (subs "defghijkl" 6 6))) + (is (= "j" (subs "defghijkl" 6 7))) + (is (= "jk" (subs "defghijkl" 6 8))) + (is (= "jkl" (subs "defghijkl" 6 9))) + (is (= "kl" (subs "defghijkl" 7))) + (is (= "" (subs "defghijkl" 7 7))) + (is (= "k" (subs "defghijkl" 7 8))) + (is (= "kl" (subs "defghijkl" 7 9))) + (is (= "l" (subs "defghijkl" 8))) + (is (= "" (subs "defghijkl" 8 8))) + (is (= "l" (subs "defghijkl" 8 9))) + (is (= "" (subs "defghijkl" 9))) + (is (= "" (subs "defghijkl" 9 9))) + (is (= "efghijkl" (subs "efghijkl" 0))) + (is (= "" (subs "efghijkl" 0 0))) + (is (= "e" (subs "efghijkl" 0 1))) + (is (= "ef" (subs "efghijkl" 0 2))) + (is (= "efg" (subs "efghijkl" 0 3))) + (is (= "efgh" (subs "efghijkl" 0 4))) + (is (= "efghi" (subs "efghijkl" 0 5))) + (is (= "efghij" (subs "efghijkl" 0 6))) + (is (= "efghijk" (subs "efghijkl" 0 7))) + (is (= "efghijkl" (subs "efghijkl" 0 8))) + (is (= "fghijkl" (subs "efghijkl" 1))) + (is (= "" (subs "efghijkl" 1 1))) + (is (= "f" (subs "efghijkl" 1 2))) + (is (= "fg" (subs "efghijkl" 1 3))) + (is (= "fgh" (subs "efghijkl" 1 4))) + (is (= "fghi" (subs "efghijkl" 1 5))) + (is (= "fghij" (subs "efghijkl" 1 6))) + (is (= "fghijk" (subs "efghijkl" 1 7))) + (is (= "fghijkl" (subs "efghijkl" 1 8))) + (is (= "ghijkl" (subs "efghijkl" 2))) + (is (= "" (subs "efghijkl" 2 2))) + (is (= "g" (subs "efghijkl" 2 3))) + (is (= "gh" (subs "efghijkl" 2 4))) + (is (= "ghi" (subs "efghijkl" 2 5))) + (is (= "ghij" (subs "efghijkl" 2 6))) + (is (= "ghijk" (subs "efghijkl" 2 7))) + (is (= "ghijkl" (subs "efghijkl" 2 8))) + (is (= "hijkl" (subs "efghijkl" 3))) + (is (= "" (subs "efghijkl" 3 3))) + (is (= "h" (subs "efghijkl" 3 4))) + (is (= "hi" (subs "efghijkl" 3 5))) + (is (= "hij" (subs "efghijkl" 3 6))) + (is (= "hijk" (subs "efghijkl" 3 7))) + (is (= "hijkl" (subs "efghijkl" 3 8))) + (is (= "ijkl" (subs "efghijkl" 4))) + (is (= "" (subs "efghijkl" 4 4))) + (is (= "i" (subs "efghijkl" 4 5))) + (is (= "ij" (subs "efghijkl" 4 6))) + (is (= "ijk" (subs "efghijkl" 4 7))) + (is (= "ijkl" (subs "efghijkl" 4 8))) + (is (= "jkl" (subs "efghijkl" 5))) + (is (= "" (subs "efghijkl" 5 5))) + (is (= "j" (subs "efghijkl" 5 6))) + (is (= "jk" (subs "efghijkl" 5 7))) + (is (= "jkl" (subs "efghijkl" 5 8))) + (is (= "kl" (subs "efghijkl" 6))) + (is (= "" (subs "efghijkl" 6 6))) + (is (= "k" (subs "efghijkl" 6 7))) + (is (= "kl" (subs "efghijkl" 6 8))) + (is (= "l" (subs "efghijkl" 7))) + (is (= "" (subs "efghijkl" 7 7))) + (is (= "l" (subs "efghijkl" 7 8))) + (is (= "" (subs "efghijkl" 8))) + (is (= "" (subs "efghijkl" 8 8))) + (is (= "fghijkl" (subs "fghijkl" 0))) + (is (= "" (subs "fghijkl" 0 0))) + (is (= "f" (subs "fghijkl" 0 1))) + (is (= "fg" (subs "fghijkl" 0 2))) + (is (= "fgh" (subs "fghijkl" 0 3))) + (is (= "fghi" (subs "fghijkl" 0 4))) + (is (= "fghij" (subs "fghijkl" 0 5))) + (is (= "fghijk" (subs "fghijkl" 0 6))) + (is (= "fghijkl" (subs "fghijkl" 0 7))) + (is (= "ghijkl" (subs "fghijkl" 1))) + (is (= "" (subs "fghijkl" 1 1))) + (is (= "g" (subs "fghijkl" 1 2))) + (is (= "gh" (subs "fghijkl" 1 3))) + (is (= "ghi" (subs "fghijkl" 1 4))) + (is (= "ghij" (subs "fghijkl" 1 5))) + (is (= "ghijk" (subs "fghijkl" 1 6))) + (is (= "ghijkl" (subs "fghijkl" 1 7))) + (is (= "hijkl" (subs "fghijkl" 2))) + (is (= "" (subs "fghijkl" 2 2))) + (is (= "h" (subs "fghijkl" 2 3))) + (is (= "hi" (subs "fghijkl" 2 4))) + (is (= "hij" (subs "fghijkl" 2 5))) + (is (= "hijk" (subs "fghijkl" 2 6))) + (is (= "hijkl" (subs "fghijkl" 2 7))) + (is (= "ijkl" (subs "fghijkl" 3))) + (is (= "" (subs "fghijkl" 3 3))) + (is (= "i" (subs "fghijkl" 3 4))) + (is (= "ij" (subs "fghijkl" 3 5))) + (is (= "ijk" (subs "fghijkl" 3 6))) + (is (= "ijkl" (subs "fghijkl" 3 7))) + (is (= "jkl" (subs "fghijkl" 4))) + (is (= "" (subs "fghijkl" 4 4))) + (is (= "j" (subs "fghijkl" 4 5))) + (is (= "jk" (subs "fghijkl" 4 6))) + (is (= "jkl" (subs "fghijkl" 4 7))) + (is (= "kl" (subs "fghijkl" 5))) + (is (= "" (subs "fghijkl" 5 5))) + (is (= "k" (subs "fghijkl" 5 6))) + (is (= "kl" (subs "fghijkl" 5 7))) + (is (= "l" (subs "fghijkl" 6))) + (is (= "" (subs "fghijkl" 6 6))) + (is (= "l" (subs "fghijkl" 6 7))) + (is (= "" (subs "fghijkl" 7))) + (is (= "" (subs "fghijkl" 7 7))) + (is (= "ghijkl" (subs "ghijkl" 0))) + (is (= "" (subs "ghijkl" 0 0))) + (is (= "g" (subs "ghijkl" 0 1))) + (is (= "gh" (subs "ghijkl" 0 2))) + (is (= "ghi" (subs "ghijkl" 0 3))) + (is (= "ghij" (subs "ghijkl" 0 4))) + (is (= "ghijk" (subs "ghijkl" 0 5))) + (is (= "ghijkl" (subs "ghijkl" 0 6))) + (is (= "hijkl" (subs "ghijkl" 1))) + (is (= "" (subs "ghijkl" 1 1))) + (is (= "h" (subs "ghijkl" 1 2))) + (is (= "hi" (subs "ghijkl" 1 3))) + (is (= "hij" (subs "ghijkl" 1 4))) + (is (= "hijk" (subs "ghijkl" 1 5))) + (is (= "hijkl" (subs "ghijkl" 1 6))) + (is (= "ijkl" (subs "ghijkl" 2))) + (is (= "" (subs "ghijkl" 2 2))) + (is (= "i" (subs "ghijkl" 2 3))) + (is (= "ij" (subs "ghijkl" 2 4))) + (is (= "ijk" (subs "ghijkl" 2 5))) + (is (= "ijkl" (subs "ghijkl" 2 6))) + (is (= "jkl" (subs "ghijkl" 3))) + (is (= "" (subs "ghijkl" 3 3))) + (is (= "j" (subs "ghijkl" 3 4))) + (is (= "jk" (subs "ghijkl" 3 5))) + (is (= "jkl" (subs "ghijkl" 3 6))) + (is (= "kl" (subs "ghijkl" 4))) + (is (= "" (subs "ghijkl" 4 4))) + (is (= "k" (subs "ghijkl" 4 5))) + (is (= "kl" (subs "ghijkl" 4 6))) + (is (= "l" (subs "ghijkl" 5))) + (is (= "" (subs "ghijkl" 5 5))) + (is (= "l" (subs "ghijkl" 5 6))) + (is (= "" (subs "ghijkl" 6))) + (is (= "" (subs "ghijkl" 6 6))) + (is (= "hijkl" (subs "hijkl" 0))) + (is (= "" (subs "hijkl" 0 0))) + (is (= "h" (subs "hijkl" 0 1))) + (is (= "hi" (subs "hijkl" 0 2))) + (is (= "hij" (subs "hijkl" 0 3))) + (is (= "hijk" (subs "hijkl" 0 4))) + (is (= "hijkl" (subs "hijkl" 0 5))) + (is (= "ijkl" (subs "hijkl" 1))) + (is (= "" (subs "hijkl" 1 1))) + (is (= "i" (subs "hijkl" 1 2))) + (is (= "ij" (subs "hijkl" 1 3))) + (is (= "ijk" (subs "hijkl" 1 4))) + (is (= "ijkl" (subs "hijkl" 1 5))) + (is (= "jkl" (subs "hijkl" 2))) + (is (= "" (subs "hijkl" 2 2))) + (is (= "j" (subs "hijkl" 2 3))) + (is (= "jk" (subs "hijkl" 2 4))) + (is (= "jkl" (subs "hijkl" 2 5))) + (is (= "kl" (subs "hijkl" 3))) + (is (= "" (subs "hijkl" 3 3))) + (is (= "k" (subs "hijkl" 3 4))) + (is (= "kl" (subs "hijkl" 3 5))) + (is (= "l" (subs "hijkl" 4))) + (is (= "" (subs "hijkl" 4 4))) + (is (= "l" (subs "hijkl" 4 5))) + (is (= "" (subs "hijkl" 5))) + (is (= "" (subs "hijkl" 5 5))) + (is (= "ijkl" (subs "ijkl" 0))) + (is (= "" (subs "ijkl" 0 0))) + (is (= "i" (subs "ijkl" 0 1))) + (is (= "ij" (subs "ijkl" 0 2))) + (is (= "ijk" (subs "ijkl" 0 3))) + (is (= "ijkl" (subs "ijkl" 0 4))) + (is (= "jkl" (subs "ijkl" 1))) + (is (= "" (subs "ijkl" 1 1))) + (is (= "j" (subs "ijkl" 1 2))) + (is (= "jk" (subs "ijkl" 1 3))) + (is (= "jkl" (subs "ijkl" 1 4))) + (is (= "kl" (subs "ijkl" 2))) + (is (= "" (subs "ijkl" 2 2))) + (is (= "k" (subs "ijkl" 2 3))) + (is (= "kl" (subs "ijkl" 2 4))) + (is (= "l" (subs "ijkl" 3))) + (is (= "" (subs "ijkl" 3 3))) + (is (= "l" (subs "ijkl" 3 4))) + (is (= "" (subs "ijkl" 4))) + (is (= "" (subs "ijkl" 4 4))) + (is (= "jkl" (subs "jkl" 0))) + (is (= "" (subs "jkl" 0 0))) + (is (= "j" (subs "jkl" 0 1))) + (is (= "jk" (subs "jkl" 0 2))) + (is (= "jkl" (subs "jkl" 0 3))) + (is (= "kl" (subs "jkl" 1))) + (is (= "" (subs "jkl" 1 1))) + (is (= "k" (subs "jkl" 1 2))) + (is (= "kl" (subs "jkl" 1 3))) + (is (= "l" (subs "jkl" 2))) + (is (= "" (subs "jkl" 2 2))) + (is (= "l" (subs "jkl" 2 3))) + (is (= "" (subs "jkl" 3))) + (is (= "" (subs "jkl" 3 3))) + (is (= "kl" (subs "kl" 0))) + (is (= "" (subs "kl" 0 0))) + (is (= "k" (subs "kl" 0 1))) + (is (= "kl" (subs "kl" 0 2))) + (is (= "l" (subs "kl" 1))) + (is (= "" (subs "kl" 1 1))) + (is (= "l" (subs "kl" 1 2))) + (is (= "" (subs "kl" 2))) + (is (= "" (subs "kl" 2 2))) + (is (= "l" (subs "l" 0))) + (is (= "" (subs "l" 0 0))) + (is (= "l" (subs "l" 0 1))) + (is (= "" (subs "l" 1))) + (is (= "" (subs "l" 1 1))) #?@(:cljs [(is (= "b" (subs "abcde" 2 1))) (is (= "bcde" (subs "abcde" 1 6))) From a0fe39da5c241dd91a331d172340850c4cd1a94d Mon Sep 17 00:00:00 2001 From: Ambrose Bonnaire-Sergeant Date: Fri, 7 Feb 2025 19:16:58 -0600 Subject: [PATCH 13/48] auto --- test/clojure/core_test/subs.cljc | 908 ++++++++++++++++--------------- 1 file changed, 455 insertions(+), 453 deletions(-) diff --git a/test/clojure/core_test/subs.cljc b/test/clojure/core_test/subs.cljc index 6632283..e4a808f 100644 --- a/test/clojure/core_test/subs.cljc +++ b/test/clojure/core_test/subs.cljc @@ -2,22 +2,464 @@ (:require [clojure.test :as t :refer [deftest is]] [clojure.core-test.portability #?(:cljs :refer-macros :default :refer) [when-var-exists]])) -;(defn- generate-cases [] -; (let [v "abcdefghijkl"] -; (distinct -; (for [len (range (count v)) -; :let [v (subs v len)] -; i (range (- (count v)) (+ 5 (count v))) -; j (range (- (count v)) (+ 5 (count v))) -; e (concat (try [(list 'is (list '= (subs v i) (list 'subs v i)))] (catch Throwable _)) -; (try [(list 'is (list '= (subs v i j) (list 'subs v i j)))] (catch Throwable _)))] -; e)))) -;(comment -;(clojure.pprint/pprint (generate-cases)) -; ) +(defn- generate-cases [] + (let [v "abcdefghijkl"] + (distinct + (for [len (range (inc (count v))) + :let [v (subs v 0 len)] + i (range (- (count v)) (+ 5 (count v))) + j (range (- (count v)) (+ 5 (count v))) + e (concat (try [(list 'is (list '= (subs v i) (list 'subs v i)))] (catch Throwable _)) + (try [(list 'is (list '= (subs v i j) (list 'subs v i j)))] (catch Throwable _)))] + e)))) +(comment +(clojure.pprint/pprint (generate-cases)) + ) (when-var-exists clojure.core/subs (deftest test-subs + (is (= "" (subs "" 0))) + (is (= "" (subs "" 0 0))) + (is (= "a" (subs "a" 0))) + (is (= "" (subs "a" 0 0))) + (is (= "a" (subs "a" 0 1))) + (is (= "" (subs "a" 1))) + (is (= "" (subs "a" 1 1))) + (is (= "ab" (subs "ab" 0))) + (is (= "" (subs "ab" 0 0))) + (is (= "a" (subs "ab" 0 1))) + (is (= "ab" (subs "ab" 0 2))) + (is (= "b" (subs "ab" 1))) + (is (= "" (subs "ab" 1 1))) + (is (= "b" (subs "ab" 1 2))) + (is (= "" (subs "ab" 2))) + (is (= "" (subs "ab" 2 2))) + (is (= "abc" (subs "abc" 0))) + (is (= "" (subs "abc" 0 0))) + (is (= "a" (subs "abc" 0 1))) + (is (= "ab" (subs "abc" 0 2))) + (is (= "abc" (subs "abc" 0 3))) + (is (= "bc" (subs "abc" 1))) + (is (= "" (subs "abc" 1 1))) + (is (= "b" (subs "abc" 1 2))) + (is (= "bc" (subs "abc" 1 3))) + (is (= "c" (subs "abc" 2))) + (is (= "" (subs "abc" 2 2))) + (is (= "c" (subs "abc" 2 3))) + (is (= "" (subs "abc" 3))) + (is (= "" (subs "abc" 3 3))) + (is (= "abcd" (subs "abcd" 0))) + (is (= "" (subs "abcd" 0 0))) + (is (= "a" (subs "abcd" 0 1))) + (is (= "ab" (subs "abcd" 0 2))) + (is (= "abc" (subs "abcd" 0 3))) + (is (= "abcd" (subs "abcd" 0 4))) + (is (= "bcd" (subs "abcd" 1))) + (is (= "" (subs "abcd" 1 1))) + (is (= "b" (subs "abcd" 1 2))) + (is (= "bc" (subs "abcd" 1 3))) + (is (= "bcd" (subs "abcd" 1 4))) + (is (= "cd" (subs "abcd" 2))) + (is (= "" (subs "abcd" 2 2))) + (is (= "c" (subs "abcd" 2 3))) + (is (= "cd" (subs "abcd" 2 4))) + (is (= "d" (subs "abcd" 3))) + (is (= "" (subs "abcd" 3 3))) + (is (= "d" (subs "abcd" 3 4))) + (is (= "" (subs "abcd" 4))) + (is (= "" (subs "abcd" 4 4))) + (is (= "abcde" (subs "abcde" 0))) + (is (= "" (subs "abcde" 0 0))) + (is (= "a" (subs "abcde" 0 1))) + (is (= "ab" (subs "abcde" 0 2))) + (is (= "abc" (subs "abcde" 0 3))) + (is (= "abcd" (subs "abcde" 0 4))) + (is (= "abcde" (subs "abcde" 0 5))) + (is (= "bcde" (subs "abcde" 1))) + (is (= "" (subs "abcde" 1 1))) + (is (= "b" (subs "abcde" 1 2))) + (is (= "bc" (subs "abcde" 1 3))) + (is (= "bcd" (subs "abcde" 1 4))) + (is (= "bcde" (subs "abcde" 1 5))) + (is (= "cde" (subs "abcde" 2))) + (is (= "" (subs "abcde" 2 2))) + (is (= "c" (subs "abcde" 2 3))) + (is (= "cd" (subs "abcde" 2 4))) + (is (= "cde" (subs "abcde" 2 5))) + (is (= "de" (subs "abcde" 3))) + (is (= "" (subs "abcde" 3 3))) + (is (= "d" (subs "abcde" 3 4))) + (is (= "de" (subs "abcde" 3 5))) + (is (= "e" (subs "abcde" 4))) + (is (= "" (subs "abcde" 4 4))) + (is (= "e" (subs "abcde" 4 5))) + (is (= "" (subs "abcde" 5))) + (is (= "" (subs "abcde" 5 5))) + (is (= "abcdef" (subs "abcdef" 0))) + (is (= "" (subs "abcdef" 0 0))) + (is (= "a" (subs "abcdef" 0 1))) + (is (= "ab" (subs "abcdef" 0 2))) + (is (= "abc" (subs "abcdef" 0 3))) + (is (= "abcd" (subs "abcdef" 0 4))) + (is (= "abcde" (subs "abcdef" 0 5))) + (is (= "abcdef" (subs "abcdef" 0 6))) + (is (= "bcdef" (subs "abcdef" 1))) + (is (= "" (subs "abcdef" 1 1))) + (is (= "b" (subs "abcdef" 1 2))) + (is (= "bc" (subs "abcdef" 1 3))) + (is (= "bcd" (subs "abcdef" 1 4))) + (is (= "bcde" (subs "abcdef" 1 5))) + (is (= "bcdef" (subs "abcdef" 1 6))) + (is (= "cdef" (subs "abcdef" 2))) + (is (= "" (subs "abcdef" 2 2))) + (is (= "c" (subs "abcdef" 2 3))) + (is (= "cd" (subs "abcdef" 2 4))) + (is (= "cde" (subs "abcdef" 2 5))) + (is (= "cdef" (subs "abcdef" 2 6))) + (is (= "def" (subs "abcdef" 3))) + (is (= "" (subs "abcdef" 3 3))) + (is (= "d" (subs "abcdef" 3 4))) + (is (= "de" (subs "abcdef" 3 5))) + (is (= "def" (subs "abcdef" 3 6))) + (is (= "ef" (subs "abcdef" 4))) + (is (= "" (subs "abcdef" 4 4))) + (is (= "e" (subs "abcdef" 4 5))) + (is (= "ef" (subs "abcdef" 4 6))) + (is (= "f" (subs "abcdef" 5))) + (is (= "" (subs "abcdef" 5 5))) + (is (= "f" (subs "abcdef" 5 6))) + (is (= "" (subs "abcdef" 6))) + (is (= "" (subs "abcdef" 6 6))) + (is (= "abcdefg" (subs "abcdefg" 0))) + (is (= "" (subs "abcdefg" 0 0))) + (is (= "a" (subs "abcdefg" 0 1))) + (is (= "ab" (subs "abcdefg" 0 2))) + (is (= "abc" (subs "abcdefg" 0 3))) + (is (= "abcd" (subs "abcdefg" 0 4))) + (is (= "abcde" (subs "abcdefg" 0 5))) + (is (= "abcdef" (subs "abcdefg" 0 6))) + (is (= "abcdefg" (subs "abcdefg" 0 7))) + (is (= "bcdefg" (subs "abcdefg" 1))) + (is (= "" (subs "abcdefg" 1 1))) + (is (= "b" (subs "abcdefg" 1 2))) + (is (= "bc" (subs "abcdefg" 1 3))) + (is (= "bcd" (subs "abcdefg" 1 4))) + (is (= "bcde" (subs "abcdefg" 1 5))) + (is (= "bcdef" (subs "abcdefg" 1 6))) + (is (= "bcdefg" (subs "abcdefg" 1 7))) + (is (= "cdefg" (subs "abcdefg" 2))) + (is (= "" (subs "abcdefg" 2 2))) + (is (= "c" (subs "abcdefg" 2 3))) + (is (= "cd" (subs "abcdefg" 2 4))) + (is (= "cde" (subs "abcdefg" 2 5))) + (is (= "cdef" (subs "abcdefg" 2 6))) + (is (= "cdefg" (subs "abcdefg" 2 7))) + (is (= "defg" (subs "abcdefg" 3))) + (is (= "" (subs "abcdefg" 3 3))) + (is (= "d" (subs "abcdefg" 3 4))) + (is (= "de" (subs "abcdefg" 3 5))) + (is (= "def" (subs "abcdefg" 3 6))) + (is (= "defg" (subs "abcdefg" 3 7))) + (is (= "efg" (subs "abcdefg" 4))) + (is (= "" (subs "abcdefg" 4 4))) + (is (= "e" (subs "abcdefg" 4 5))) + (is (= "ef" (subs "abcdefg" 4 6))) + (is (= "efg" (subs "abcdefg" 4 7))) + (is (= "fg" (subs "abcdefg" 5))) + (is (= "" (subs "abcdefg" 5 5))) + (is (= "f" (subs "abcdefg" 5 6))) + (is (= "fg" (subs "abcdefg" 5 7))) + (is (= "g" (subs "abcdefg" 6))) + (is (= "" (subs "abcdefg" 6 6))) + (is (= "g" (subs "abcdefg" 6 7))) + (is (= "" (subs "abcdefg" 7))) + (is (= "" (subs "abcdefg" 7 7))) + (is (= "abcdefgh" (subs "abcdefgh" 0))) + (is (= "" (subs "abcdefgh" 0 0))) + (is (= "a" (subs "abcdefgh" 0 1))) + (is (= "ab" (subs "abcdefgh" 0 2))) + (is (= "abc" (subs "abcdefgh" 0 3))) + (is (= "abcd" (subs "abcdefgh" 0 4))) + (is (= "abcde" (subs "abcdefgh" 0 5))) + (is (= "abcdef" (subs "abcdefgh" 0 6))) + (is (= "abcdefg" (subs "abcdefgh" 0 7))) + (is (= "abcdefgh" (subs "abcdefgh" 0 8))) + (is (= "bcdefgh" (subs "abcdefgh" 1))) + (is (= "" (subs "abcdefgh" 1 1))) + (is (= "b" (subs "abcdefgh" 1 2))) + (is (= "bc" (subs "abcdefgh" 1 3))) + (is (= "bcd" (subs "abcdefgh" 1 4))) + (is (= "bcde" (subs "abcdefgh" 1 5))) + (is (= "bcdef" (subs "abcdefgh" 1 6))) + (is (= "bcdefg" (subs "abcdefgh" 1 7))) + (is (= "bcdefgh" (subs "abcdefgh" 1 8))) + (is (= "cdefgh" (subs "abcdefgh" 2))) + (is (= "" (subs "abcdefgh" 2 2))) + (is (= "c" (subs "abcdefgh" 2 3))) + (is (= "cd" (subs "abcdefgh" 2 4))) + (is (= "cde" (subs "abcdefgh" 2 5))) + (is (= "cdef" (subs "abcdefgh" 2 6))) + (is (= "cdefg" (subs "abcdefgh" 2 7))) + (is (= "cdefgh" (subs "abcdefgh" 2 8))) + (is (= "defgh" (subs "abcdefgh" 3))) + (is (= "" (subs "abcdefgh" 3 3))) + (is (= "d" (subs "abcdefgh" 3 4))) + (is (= "de" (subs "abcdefgh" 3 5))) + (is (= "def" (subs "abcdefgh" 3 6))) + (is (= "defg" (subs "abcdefgh" 3 7))) + (is (= "defgh" (subs "abcdefgh" 3 8))) + (is (= "efgh" (subs "abcdefgh" 4))) + (is (= "" (subs "abcdefgh" 4 4))) + (is (= "e" (subs "abcdefgh" 4 5))) + (is (= "ef" (subs "abcdefgh" 4 6))) + (is (= "efg" (subs "abcdefgh" 4 7))) + (is (= "efgh" (subs "abcdefgh" 4 8))) + (is (= "fgh" (subs "abcdefgh" 5))) + (is (= "" (subs "abcdefgh" 5 5))) + (is (= "f" (subs "abcdefgh" 5 6))) + (is (= "fg" (subs "abcdefgh" 5 7))) + (is (= "fgh" (subs "abcdefgh" 5 8))) + (is (= "gh" (subs "abcdefgh" 6))) + (is (= "" (subs "abcdefgh" 6 6))) + (is (= "g" (subs "abcdefgh" 6 7))) + (is (= "gh" (subs "abcdefgh" 6 8))) + (is (= "h" (subs "abcdefgh" 7))) + (is (= "" (subs "abcdefgh" 7 7))) + (is (= "h" (subs "abcdefgh" 7 8))) + (is (= "" (subs "abcdefgh" 8))) + (is (= "" (subs "abcdefgh" 8 8))) + (is (= "abcdefghi" (subs "abcdefghi" 0))) + (is (= "" (subs "abcdefghi" 0 0))) + (is (= "a" (subs "abcdefghi" 0 1))) + (is (= "ab" (subs "abcdefghi" 0 2))) + (is (= "abc" (subs "abcdefghi" 0 3))) + (is (= "abcd" (subs "abcdefghi" 0 4))) + (is (= "abcde" (subs "abcdefghi" 0 5))) + (is (= "abcdef" (subs "abcdefghi" 0 6))) + (is (= "abcdefg" (subs "abcdefghi" 0 7))) + (is (= "abcdefgh" (subs "abcdefghi" 0 8))) + (is (= "abcdefghi" (subs "abcdefghi" 0 9))) + (is (= "bcdefghi" (subs "abcdefghi" 1))) + (is (= "" (subs "abcdefghi" 1 1))) + (is (= "b" (subs "abcdefghi" 1 2))) + (is (= "bc" (subs "abcdefghi" 1 3))) + (is (= "bcd" (subs "abcdefghi" 1 4))) + (is (= "bcde" (subs "abcdefghi" 1 5))) + (is (= "bcdef" (subs "abcdefghi" 1 6))) + (is (= "bcdefg" (subs "abcdefghi" 1 7))) + (is (= "bcdefgh" (subs "abcdefghi" 1 8))) + (is (= "bcdefghi" (subs "abcdefghi" 1 9))) + (is (= "cdefghi" (subs "abcdefghi" 2))) + (is (= "" (subs "abcdefghi" 2 2))) + (is (= "c" (subs "abcdefghi" 2 3))) + (is (= "cd" (subs "abcdefghi" 2 4))) + (is (= "cde" (subs "abcdefghi" 2 5))) + (is (= "cdef" (subs "abcdefghi" 2 6))) + (is (= "cdefg" (subs "abcdefghi" 2 7))) + (is (= "cdefgh" (subs "abcdefghi" 2 8))) + (is (= "cdefghi" (subs "abcdefghi" 2 9))) + (is (= "defghi" (subs "abcdefghi" 3))) + (is (= "" (subs "abcdefghi" 3 3))) + (is (= "d" (subs "abcdefghi" 3 4))) + (is (= "de" (subs "abcdefghi" 3 5))) + (is (= "def" (subs "abcdefghi" 3 6))) + (is (= "defg" (subs "abcdefghi" 3 7))) + (is (= "defgh" (subs "abcdefghi" 3 8))) + (is (= "defghi" (subs "abcdefghi" 3 9))) + (is (= "efghi" (subs "abcdefghi" 4))) + (is (= "" (subs "abcdefghi" 4 4))) + (is (= "e" (subs "abcdefghi" 4 5))) + (is (= "ef" (subs "abcdefghi" 4 6))) + (is (= "efg" (subs "abcdefghi" 4 7))) + (is (= "efgh" (subs "abcdefghi" 4 8))) + (is (= "efghi" (subs "abcdefghi" 4 9))) + (is (= "fghi" (subs "abcdefghi" 5))) + (is (= "" (subs "abcdefghi" 5 5))) + (is (= "f" (subs "abcdefghi" 5 6))) + (is (= "fg" (subs "abcdefghi" 5 7))) + (is (= "fgh" (subs "abcdefghi" 5 8))) + (is (= "fghi" (subs "abcdefghi" 5 9))) + (is (= "ghi" (subs "abcdefghi" 6))) + (is (= "" (subs "abcdefghi" 6 6))) + (is (= "g" (subs "abcdefghi" 6 7))) + (is (= "gh" (subs "abcdefghi" 6 8))) + (is (= "ghi" (subs "abcdefghi" 6 9))) + (is (= "hi" (subs "abcdefghi" 7))) + (is (= "" (subs "abcdefghi" 7 7))) + (is (= "h" (subs "abcdefghi" 7 8))) + (is (= "hi" (subs "abcdefghi" 7 9))) + (is (= "i" (subs "abcdefghi" 8))) + (is (= "" (subs "abcdefghi" 8 8))) + (is (= "i" (subs "abcdefghi" 8 9))) + (is (= "" (subs "abcdefghi" 9))) + (is (= "" (subs "abcdefghi" 9 9))) + (is (= "abcdefghij" (subs "abcdefghij" 0))) + (is (= "" (subs "abcdefghij" 0 0))) + (is (= "a" (subs "abcdefghij" 0 1))) + (is (= "ab" (subs "abcdefghij" 0 2))) + (is (= "abc" (subs "abcdefghij" 0 3))) + (is (= "abcd" (subs "abcdefghij" 0 4))) + (is (= "abcde" (subs "abcdefghij" 0 5))) + (is (= "abcdef" (subs "abcdefghij" 0 6))) + (is (= "abcdefg" (subs "abcdefghij" 0 7))) + (is (= "abcdefgh" (subs "abcdefghij" 0 8))) + (is (= "abcdefghi" (subs "abcdefghij" 0 9))) + (is (= "abcdefghij" (subs "abcdefghij" 0 10))) + (is (= "bcdefghij" (subs "abcdefghij" 1))) + (is (= "" (subs "abcdefghij" 1 1))) + (is (= "b" (subs "abcdefghij" 1 2))) + (is (= "bc" (subs "abcdefghij" 1 3))) + (is (= "bcd" (subs "abcdefghij" 1 4))) + (is (= "bcde" (subs "abcdefghij" 1 5))) + (is (= "bcdef" (subs "abcdefghij" 1 6))) + (is (= "bcdefg" (subs "abcdefghij" 1 7))) + (is (= "bcdefgh" (subs "abcdefghij" 1 8))) + (is (= "bcdefghi" (subs "abcdefghij" 1 9))) + (is (= "bcdefghij" (subs "abcdefghij" 1 10))) + (is (= "cdefghij" (subs "abcdefghij" 2))) + (is (= "" (subs "abcdefghij" 2 2))) + (is (= "c" (subs "abcdefghij" 2 3))) + (is (= "cd" (subs "abcdefghij" 2 4))) + (is (= "cde" (subs "abcdefghij" 2 5))) + (is (= "cdef" (subs "abcdefghij" 2 6))) + (is (= "cdefg" (subs "abcdefghij" 2 7))) + (is (= "cdefgh" (subs "abcdefghij" 2 8))) + (is (= "cdefghi" (subs "abcdefghij" 2 9))) + (is (= "cdefghij" (subs "abcdefghij" 2 10))) + (is (= "defghij" (subs "abcdefghij" 3))) + (is (= "" (subs "abcdefghij" 3 3))) + (is (= "d" (subs "abcdefghij" 3 4))) + (is (= "de" (subs "abcdefghij" 3 5))) + (is (= "def" (subs "abcdefghij" 3 6))) + (is (= "defg" (subs "abcdefghij" 3 7))) + (is (= "defgh" (subs "abcdefghij" 3 8))) + (is (= "defghi" (subs "abcdefghij" 3 9))) + (is (= "defghij" (subs "abcdefghij" 3 10))) + (is (= "efghij" (subs "abcdefghij" 4))) + (is (= "" (subs "abcdefghij" 4 4))) + (is (= "e" (subs "abcdefghij" 4 5))) + (is (= "ef" (subs "abcdefghij" 4 6))) + (is (= "efg" (subs "abcdefghij" 4 7))) + (is (= "efgh" (subs "abcdefghij" 4 8))) + (is (= "efghi" (subs "abcdefghij" 4 9))) + (is (= "efghij" (subs "abcdefghij" 4 10))) + (is (= "fghij" (subs "abcdefghij" 5))) + (is (= "" (subs "abcdefghij" 5 5))) + (is (= "f" (subs "abcdefghij" 5 6))) + (is (= "fg" (subs "abcdefghij" 5 7))) + (is (= "fgh" (subs "abcdefghij" 5 8))) + (is (= "fghi" (subs "abcdefghij" 5 9))) + (is (= "fghij" (subs "abcdefghij" 5 10))) + (is (= "ghij" (subs "abcdefghij" 6))) + (is (= "" (subs "abcdefghij" 6 6))) + (is (= "g" (subs "abcdefghij" 6 7))) + (is (= "gh" (subs "abcdefghij" 6 8))) + (is (= "ghi" (subs "abcdefghij" 6 9))) + (is (= "ghij" (subs "abcdefghij" 6 10))) + (is (= "hij" (subs "abcdefghij" 7))) + (is (= "" (subs "abcdefghij" 7 7))) + (is (= "h" (subs "abcdefghij" 7 8))) + (is (= "hi" (subs "abcdefghij" 7 9))) + (is (= "hij" (subs "abcdefghij" 7 10))) + (is (= "ij" (subs "abcdefghij" 8))) + (is (= "" (subs "abcdefghij" 8 8))) + (is (= "i" (subs "abcdefghij" 8 9))) + (is (= "ij" (subs "abcdefghij" 8 10))) + (is (= "j" (subs "abcdefghij" 9))) + (is (= "" (subs "abcdefghij" 9 9))) + (is (= "j" (subs "abcdefghij" 9 10))) + (is (= "" (subs "abcdefghij" 10))) + (is (= "" (subs "abcdefghij" 10 10))) + (is (= "abcdefghijk" (subs "abcdefghijk" 0))) + (is (= "" (subs "abcdefghijk" 0 0))) + (is (= "a" (subs "abcdefghijk" 0 1))) + (is (= "ab" (subs "abcdefghijk" 0 2))) + (is (= "abc" (subs "abcdefghijk" 0 3))) + (is (= "abcd" (subs "abcdefghijk" 0 4))) + (is (= "abcde" (subs "abcdefghijk" 0 5))) + (is (= "abcdef" (subs "abcdefghijk" 0 6))) + (is (= "abcdefg" (subs "abcdefghijk" 0 7))) + (is (= "abcdefgh" (subs "abcdefghijk" 0 8))) + (is (= "abcdefghi" (subs "abcdefghijk" 0 9))) + (is (= "abcdefghij" (subs "abcdefghijk" 0 10))) + (is (= "abcdefghijk" (subs "abcdefghijk" 0 11))) + (is (= "bcdefghijk" (subs "abcdefghijk" 1))) + (is (= "" (subs "abcdefghijk" 1 1))) + (is (= "b" (subs "abcdefghijk" 1 2))) + (is (= "bc" (subs "abcdefghijk" 1 3))) + (is (= "bcd" (subs "abcdefghijk" 1 4))) + (is (= "bcde" (subs "abcdefghijk" 1 5))) + (is (= "bcdef" (subs "abcdefghijk" 1 6))) + (is (= "bcdefg" (subs "abcdefghijk" 1 7))) + (is (= "bcdefgh" (subs "abcdefghijk" 1 8))) + (is (= "bcdefghi" (subs "abcdefghijk" 1 9))) + (is (= "bcdefghij" (subs "abcdefghijk" 1 10))) + (is (= "bcdefghijk" (subs "abcdefghijk" 1 11))) + (is (= "cdefghijk" (subs "abcdefghijk" 2))) + (is (= "" (subs "abcdefghijk" 2 2))) + (is (= "c" (subs "abcdefghijk" 2 3))) + (is (= "cd" (subs "abcdefghijk" 2 4))) + (is (= "cde" (subs "abcdefghijk" 2 5))) + (is (= "cdef" (subs "abcdefghijk" 2 6))) + (is (= "cdefg" (subs "abcdefghijk" 2 7))) + (is (= "cdefgh" (subs "abcdefghijk" 2 8))) + (is (= "cdefghi" (subs "abcdefghijk" 2 9))) + (is (= "cdefghij" (subs "abcdefghijk" 2 10))) + (is (= "cdefghijk" (subs "abcdefghijk" 2 11))) + (is (= "defghijk" (subs "abcdefghijk" 3))) + (is (= "" (subs "abcdefghijk" 3 3))) + (is (= "d" (subs "abcdefghijk" 3 4))) + (is (= "de" (subs "abcdefghijk" 3 5))) + (is (= "def" (subs "abcdefghijk" 3 6))) + (is (= "defg" (subs "abcdefghijk" 3 7))) + (is (= "defgh" (subs "abcdefghijk" 3 8))) + (is (= "defghi" (subs "abcdefghijk" 3 9))) + (is (= "defghij" (subs "abcdefghijk" 3 10))) + (is (= "defghijk" (subs "abcdefghijk" 3 11))) + (is (= "efghijk" (subs "abcdefghijk" 4))) + (is (= "" (subs "abcdefghijk" 4 4))) + (is (= "e" (subs "abcdefghijk" 4 5))) + (is (= "ef" (subs "abcdefghijk" 4 6))) + (is (= "efg" (subs "abcdefghijk" 4 7))) + (is (= "efgh" (subs "abcdefghijk" 4 8))) + (is (= "efghi" (subs "abcdefghijk" 4 9))) + (is (= "efghij" (subs "abcdefghijk" 4 10))) + (is (= "efghijk" (subs "abcdefghijk" 4 11))) + (is (= "fghijk" (subs "abcdefghijk" 5))) + (is (= "" (subs "abcdefghijk" 5 5))) + (is (= "f" (subs "abcdefghijk" 5 6))) + (is (= "fg" (subs "abcdefghijk" 5 7))) + (is (= "fgh" (subs "abcdefghijk" 5 8))) + (is (= "fghi" (subs "abcdefghijk" 5 9))) + (is (= "fghij" (subs "abcdefghijk" 5 10))) + (is (= "fghijk" (subs "abcdefghijk" 5 11))) + (is (= "ghijk" (subs "abcdefghijk" 6))) + (is (= "" (subs "abcdefghijk" 6 6))) + (is (= "g" (subs "abcdefghijk" 6 7))) + (is (= "gh" (subs "abcdefghijk" 6 8))) + (is (= "ghi" (subs "abcdefghijk" 6 9))) + (is (= "ghij" (subs "abcdefghijk" 6 10))) + (is (= "ghijk" (subs "abcdefghijk" 6 11))) + (is (= "hijk" (subs "abcdefghijk" 7))) + (is (= "" (subs "abcdefghijk" 7 7))) + (is (= "h" (subs "abcdefghijk" 7 8))) + (is (= "hi" (subs "abcdefghijk" 7 9))) + (is (= "hij" (subs "abcdefghijk" 7 10))) + (is (= "hijk" (subs "abcdefghijk" 7 11))) + (is (= "ijk" (subs "abcdefghijk" 8))) + (is (= "" (subs "abcdefghijk" 8 8))) + (is (= "i" (subs "abcdefghijk" 8 9))) + (is (= "ij" (subs "abcdefghijk" 8 10))) + (is (= "ijk" (subs "abcdefghijk" 8 11))) + (is (= "jk" (subs "abcdefghijk" 9))) + (is (= "" (subs "abcdefghijk" 9 9))) + (is (= "j" (subs "abcdefghijk" 9 10))) + (is (= "jk" (subs "abcdefghijk" 9 11))) + (is (= "k" (subs "abcdefghijk" 10))) + (is (= "" (subs "abcdefghijk" 10 10))) + (is (= "k" (subs "abcdefghijk" 10 11))) + (is (= "" (subs "abcdefghijk" 11))) + (is (= "" (subs "abcdefghijk" 11 11))) (is (= "abcdefghijkl" (subs "abcdefghijkl" 0))) (is (= "" (subs "abcdefghijkl" 0 0))) (is (= "a" (subs "abcdefghijkl" 0 1))) @@ -122,446 +564,6 @@ (is (= "l" (subs "abcdefghijkl" 11 12))) (is (= "" (subs "abcdefghijkl" 12))) (is (= "" (subs "abcdefghijkl" 12 12))) - (is (= "bcdefghijkl" (subs "bcdefghijkl" 0))) - (is (= "" (subs "bcdefghijkl" 0 0))) - (is (= "b" (subs "bcdefghijkl" 0 1))) - (is (= "bc" (subs "bcdefghijkl" 0 2))) - (is (= "bcd" (subs "bcdefghijkl" 0 3))) - (is (= "bcde" (subs "bcdefghijkl" 0 4))) - (is (= "bcdef" (subs "bcdefghijkl" 0 5))) - (is (= "bcdefg" (subs "bcdefghijkl" 0 6))) - (is (= "bcdefgh" (subs "bcdefghijkl" 0 7))) - (is (= "bcdefghi" (subs "bcdefghijkl" 0 8))) - (is (= "bcdefghij" (subs "bcdefghijkl" 0 9))) - (is (= "bcdefghijk" (subs "bcdefghijkl" 0 10))) - (is (= "bcdefghijkl" (subs "bcdefghijkl" 0 11))) - (is (= "cdefghijkl" (subs "bcdefghijkl" 1))) - (is (= "" (subs "bcdefghijkl" 1 1))) - (is (= "c" (subs "bcdefghijkl" 1 2))) - (is (= "cd" (subs "bcdefghijkl" 1 3))) - (is (= "cde" (subs "bcdefghijkl" 1 4))) - (is (= "cdef" (subs "bcdefghijkl" 1 5))) - (is (= "cdefg" (subs "bcdefghijkl" 1 6))) - (is (= "cdefgh" (subs "bcdefghijkl" 1 7))) - (is (= "cdefghi" (subs "bcdefghijkl" 1 8))) - (is (= "cdefghij" (subs "bcdefghijkl" 1 9))) - (is (= "cdefghijk" (subs "bcdefghijkl" 1 10))) - (is (= "cdefghijkl" (subs "bcdefghijkl" 1 11))) - (is (= "defghijkl" (subs "bcdefghijkl" 2))) - (is (= "" (subs "bcdefghijkl" 2 2))) - (is (= "d" (subs "bcdefghijkl" 2 3))) - (is (= "de" (subs "bcdefghijkl" 2 4))) - (is (= "def" (subs "bcdefghijkl" 2 5))) - (is (= "defg" (subs "bcdefghijkl" 2 6))) - (is (= "defgh" (subs "bcdefghijkl" 2 7))) - (is (= "defghi" (subs "bcdefghijkl" 2 8))) - (is (= "defghij" (subs "bcdefghijkl" 2 9))) - (is (= "defghijk" (subs "bcdefghijkl" 2 10))) - (is (= "defghijkl" (subs "bcdefghijkl" 2 11))) - (is (= "efghijkl" (subs "bcdefghijkl" 3))) - (is (= "" (subs "bcdefghijkl" 3 3))) - (is (= "e" (subs "bcdefghijkl" 3 4))) - (is (= "ef" (subs "bcdefghijkl" 3 5))) - (is (= "efg" (subs "bcdefghijkl" 3 6))) - (is (= "efgh" (subs "bcdefghijkl" 3 7))) - (is (= "efghi" (subs "bcdefghijkl" 3 8))) - (is (= "efghij" (subs "bcdefghijkl" 3 9))) - (is (= "efghijk" (subs "bcdefghijkl" 3 10))) - (is (= "efghijkl" (subs "bcdefghijkl" 3 11))) - (is (= "fghijkl" (subs "bcdefghijkl" 4))) - (is (= "" (subs "bcdefghijkl" 4 4))) - (is (= "f" (subs "bcdefghijkl" 4 5))) - (is (= "fg" (subs "bcdefghijkl" 4 6))) - (is (= "fgh" (subs "bcdefghijkl" 4 7))) - (is (= "fghi" (subs "bcdefghijkl" 4 8))) - (is (= "fghij" (subs "bcdefghijkl" 4 9))) - (is (= "fghijk" (subs "bcdefghijkl" 4 10))) - (is (= "fghijkl" (subs "bcdefghijkl" 4 11))) - (is (= "ghijkl" (subs "bcdefghijkl" 5))) - (is (= "" (subs "bcdefghijkl" 5 5))) - (is (= "g" (subs "bcdefghijkl" 5 6))) - (is (= "gh" (subs "bcdefghijkl" 5 7))) - (is (= "ghi" (subs "bcdefghijkl" 5 8))) - (is (= "ghij" (subs "bcdefghijkl" 5 9))) - (is (= "ghijk" (subs "bcdefghijkl" 5 10))) - (is (= "ghijkl" (subs "bcdefghijkl" 5 11))) - (is (= "hijkl" (subs "bcdefghijkl" 6))) - (is (= "" (subs "bcdefghijkl" 6 6))) - (is (= "h" (subs "bcdefghijkl" 6 7))) - (is (= "hi" (subs "bcdefghijkl" 6 8))) - (is (= "hij" (subs "bcdefghijkl" 6 9))) - (is (= "hijk" (subs "bcdefghijkl" 6 10))) - (is (= "hijkl" (subs "bcdefghijkl" 6 11))) - (is (= "ijkl" (subs "bcdefghijkl" 7))) - (is (= "" (subs "bcdefghijkl" 7 7))) - (is (= "i" (subs "bcdefghijkl" 7 8))) - (is (= "ij" (subs "bcdefghijkl" 7 9))) - (is (= "ijk" (subs "bcdefghijkl" 7 10))) - (is (= "ijkl" (subs "bcdefghijkl" 7 11))) - (is (= "jkl" (subs "bcdefghijkl" 8))) - (is (= "" (subs "bcdefghijkl" 8 8))) - (is (= "j" (subs "bcdefghijkl" 8 9))) - (is (= "jk" (subs "bcdefghijkl" 8 10))) - (is (= "jkl" (subs "bcdefghijkl" 8 11))) - (is (= "kl" (subs "bcdefghijkl" 9))) - (is (= "" (subs "bcdefghijkl" 9 9))) - (is (= "k" (subs "bcdefghijkl" 9 10))) - (is (= "kl" (subs "bcdefghijkl" 9 11))) - (is (= "l" (subs "bcdefghijkl" 10))) - (is (= "" (subs "bcdefghijkl" 10 10))) - (is (= "l" (subs "bcdefghijkl" 10 11))) - (is (= "" (subs "bcdefghijkl" 11))) - (is (= "" (subs "bcdefghijkl" 11 11))) - (is (= "cdefghijkl" (subs "cdefghijkl" 0))) - (is (= "" (subs "cdefghijkl" 0 0))) - (is (= "c" (subs "cdefghijkl" 0 1))) - (is (= "cd" (subs "cdefghijkl" 0 2))) - (is (= "cde" (subs "cdefghijkl" 0 3))) - (is (= "cdef" (subs "cdefghijkl" 0 4))) - (is (= "cdefg" (subs "cdefghijkl" 0 5))) - (is (= "cdefgh" (subs "cdefghijkl" 0 6))) - (is (= "cdefghi" (subs "cdefghijkl" 0 7))) - (is (= "cdefghij" (subs "cdefghijkl" 0 8))) - (is (= "cdefghijk" (subs "cdefghijkl" 0 9))) - (is (= "cdefghijkl" (subs "cdefghijkl" 0 10))) - (is (= "defghijkl" (subs "cdefghijkl" 1))) - (is (= "" (subs "cdefghijkl" 1 1))) - (is (= "d" (subs "cdefghijkl" 1 2))) - (is (= "de" (subs "cdefghijkl" 1 3))) - (is (= "def" (subs "cdefghijkl" 1 4))) - (is (= "defg" (subs "cdefghijkl" 1 5))) - (is (= "defgh" (subs "cdefghijkl" 1 6))) - (is (= "defghi" (subs "cdefghijkl" 1 7))) - (is (= "defghij" (subs "cdefghijkl" 1 8))) - (is (= "defghijk" (subs "cdefghijkl" 1 9))) - (is (= "defghijkl" (subs "cdefghijkl" 1 10))) - (is (= "efghijkl" (subs "cdefghijkl" 2))) - (is (= "" (subs "cdefghijkl" 2 2))) - (is (= "e" (subs "cdefghijkl" 2 3))) - (is (= "ef" (subs "cdefghijkl" 2 4))) - (is (= "efg" (subs "cdefghijkl" 2 5))) - (is (= "efgh" (subs "cdefghijkl" 2 6))) - (is (= "efghi" (subs "cdefghijkl" 2 7))) - (is (= "efghij" (subs "cdefghijkl" 2 8))) - (is (= "efghijk" (subs "cdefghijkl" 2 9))) - (is (= "efghijkl" (subs "cdefghijkl" 2 10))) - (is (= "fghijkl" (subs "cdefghijkl" 3))) - (is (= "" (subs "cdefghijkl" 3 3))) - (is (= "f" (subs "cdefghijkl" 3 4))) - (is (= "fg" (subs "cdefghijkl" 3 5))) - (is (= "fgh" (subs "cdefghijkl" 3 6))) - (is (= "fghi" (subs "cdefghijkl" 3 7))) - (is (= "fghij" (subs "cdefghijkl" 3 8))) - (is (= "fghijk" (subs "cdefghijkl" 3 9))) - (is (= "fghijkl" (subs "cdefghijkl" 3 10))) - (is (= "ghijkl" (subs "cdefghijkl" 4))) - (is (= "" (subs "cdefghijkl" 4 4))) - (is (= "g" (subs "cdefghijkl" 4 5))) - (is (= "gh" (subs "cdefghijkl" 4 6))) - (is (= "ghi" (subs "cdefghijkl" 4 7))) - (is (= "ghij" (subs "cdefghijkl" 4 8))) - (is (= "ghijk" (subs "cdefghijkl" 4 9))) - (is (= "ghijkl" (subs "cdefghijkl" 4 10))) - (is (= "hijkl" (subs "cdefghijkl" 5))) - (is (= "" (subs "cdefghijkl" 5 5))) - (is (= "h" (subs "cdefghijkl" 5 6))) - (is (= "hi" (subs "cdefghijkl" 5 7))) - (is (= "hij" (subs "cdefghijkl" 5 8))) - (is (= "hijk" (subs "cdefghijkl" 5 9))) - (is (= "hijkl" (subs "cdefghijkl" 5 10))) - (is (= "ijkl" (subs "cdefghijkl" 6))) - (is (= "" (subs "cdefghijkl" 6 6))) - (is (= "i" (subs "cdefghijkl" 6 7))) - (is (= "ij" (subs "cdefghijkl" 6 8))) - (is (= "ijk" (subs "cdefghijkl" 6 9))) - (is (= "ijkl" (subs "cdefghijkl" 6 10))) - (is (= "jkl" (subs "cdefghijkl" 7))) - (is (= "" (subs "cdefghijkl" 7 7))) - (is (= "j" (subs "cdefghijkl" 7 8))) - (is (= "jk" (subs "cdefghijkl" 7 9))) - (is (= "jkl" (subs "cdefghijkl" 7 10))) - (is (= "kl" (subs "cdefghijkl" 8))) - (is (= "" (subs "cdefghijkl" 8 8))) - (is (= "k" (subs "cdefghijkl" 8 9))) - (is (= "kl" (subs "cdefghijkl" 8 10))) - (is (= "l" (subs "cdefghijkl" 9))) - (is (= "" (subs "cdefghijkl" 9 9))) - (is (= "l" (subs "cdefghijkl" 9 10))) - (is (= "" (subs "cdefghijkl" 10))) - (is (= "" (subs "cdefghijkl" 10 10))) - (is (= "defghijkl" (subs "defghijkl" 0))) - (is (= "" (subs "defghijkl" 0 0))) - (is (= "d" (subs "defghijkl" 0 1))) - (is (= "de" (subs "defghijkl" 0 2))) - (is (= "def" (subs "defghijkl" 0 3))) - (is (= "defg" (subs "defghijkl" 0 4))) - (is (= "defgh" (subs "defghijkl" 0 5))) - (is (= "defghi" (subs "defghijkl" 0 6))) - (is (= "defghij" (subs "defghijkl" 0 7))) - (is (= "defghijk" (subs "defghijkl" 0 8))) - (is (= "defghijkl" (subs "defghijkl" 0 9))) - (is (= "efghijkl" (subs "defghijkl" 1))) - (is (= "" (subs "defghijkl" 1 1))) - (is (= "e" (subs "defghijkl" 1 2))) - (is (= "ef" (subs "defghijkl" 1 3))) - (is (= "efg" (subs "defghijkl" 1 4))) - (is (= "efgh" (subs "defghijkl" 1 5))) - (is (= "efghi" (subs "defghijkl" 1 6))) - (is (= "efghij" (subs "defghijkl" 1 7))) - (is (= "efghijk" (subs "defghijkl" 1 8))) - (is (= "efghijkl" (subs "defghijkl" 1 9))) - (is (= "fghijkl" (subs "defghijkl" 2))) - (is (= "" (subs "defghijkl" 2 2))) - (is (= "f" (subs "defghijkl" 2 3))) - (is (= "fg" (subs "defghijkl" 2 4))) - (is (= "fgh" (subs "defghijkl" 2 5))) - (is (= "fghi" (subs "defghijkl" 2 6))) - (is (= "fghij" (subs "defghijkl" 2 7))) - (is (= "fghijk" (subs "defghijkl" 2 8))) - (is (= "fghijkl" (subs "defghijkl" 2 9))) - (is (= "ghijkl" (subs "defghijkl" 3))) - (is (= "" (subs "defghijkl" 3 3))) - (is (= "g" (subs "defghijkl" 3 4))) - (is (= "gh" (subs "defghijkl" 3 5))) - (is (= "ghi" (subs "defghijkl" 3 6))) - (is (= "ghij" (subs "defghijkl" 3 7))) - (is (= "ghijk" (subs "defghijkl" 3 8))) - (is (= "ghijkl" (subs "defghijkl" 3 9))) - (is (= "hijkl" (subs "defghijkl" 4))) - (is (= "" (subs "defghijkl" 4 4))) - (is (= "h" (subs "defghijkl" 4 5))) - (is (= "hi" (subs "defghijkl" 4 6))) - (is (= "hij" (subs "defghijkl" 4 7))) - (is (= "hijk" (subs "defghijkl" 4 8))) - (is (= "hijkl" (subs "defghijkl" 4 9))) - (is (= "ijkl" (subs "defghijkl" 5))) - (is (= "" (subs "defghijkl" 5 5))) - (is (= "i" (subs "defghijkl" 5 6))) - (is (= "ij" (subs "defghijkl" 5 7))) - (is (= "ijk" (subs "defghijkl" 5 8))) - (is (= "ijkl" (subs "defghijkl" 5 9))) - (is (= "jkl" (subs "defghijkl" 6))) - (is (= "" (subs "defghijkl" 6 6))) - (is (= "j" (subs "defghijkl" 6 7))) - (is (= "jk" (subs "defghijkl" 6 8))) - (is (= "jkl" (subs "defghijkl" 6 9))) - (is (= "kl" (subs "defghijkl" 7))) - (is (= "" (subs "defghijkl" 7 7))) - (is (= "k" (subs "defghijkl" 7 8))) - (is (= "kl" (subs "defghijkl" 7 9))) - (is (= "l" (subs "defghijkl" 8))) - (is (= "" (subs "defghijkl" 8 8))) - (is (= "l" (subs "defghijkl" 8 9))) - (is (= "" (subs "defghijkl" 9))) - (is (= "" (subs "defghijkl" 9 9))) - (is (= "efghijkl" (subs "efghijkl" 0))) - (is (= "" (subs "efghijkl" 0 0))) - (is (= "e" (subs "efghijkl" 0 1))) - (is (= "ef" (subs "efghijkl" 0 2))) - (is (= "efg" (subs "efghijkl" 0 3))) - (is (= "efgh" (subs "efghijkl" 0 4))) - (is (= "efghi" (subs "efghijkl" 0 5))) - (is (= "efghij" (subs "efghijkl" 0 6))) - (is (= "efghijk" (subs "efghijkl" 0 7))) - (is (= "efghijkl" (subs "efghijkl" 0 8))) - (is (= "fghijkl" (subs "efghijkl" 1))) - (is (= "" (subs "efghijkl" 1 1))) - (is (= "f" (subs "efghijkl" 1 2))) - (is (= "fg" (subs "efghijkl" 1 3))) - (is (= "fgh" (subs "efghijkl" 1 4))) - (is (= "fghi" (subs "efghijkl" 1 5))) - (is (= "fghij" (subs "efghijkl" 1 6))) - (is (= "fghijk" (subs "efghijkl" 1 7))) - (is (= "fghijkl" (subs "efghijkl" 1 8))) - (is (= "ghijkl" (subs "efghijkl" 2))) - (is (= "" (subs "efghijkl" 2 2))) - (is (= "g" (subs "efghijkl" 2 3))) - (is (= "gh" (subs "efghijkl" 2 4))) - (is (= "ghi" (subs "efghijkl" 2 5))) - (is (= "ghij" (subs "efghijkl" 2 6))) - (is (= "ghijk" (subs "efghijkl" 2 7))) - (is (= "ghijkl" (subs "efghijkl" 2 8))) - (is (= "hijkl" (subs "efghijkl" 3))) - (is (= "" (subs "efghijkl" 3 3))) - (is (= "h" (subs "efghijkl" 3 4))) - (is (= "hi" (subs "efghijkl" 3 5))) - (is (= "hij" (subs "efghijkl" 3 6))) - (is (= "hijk" (subs "efghijkl" 3 7))) - (is (= "hijkl" (subs "efghijkl" 3 8))) - (is (= "ijkl" (subs "efghijkl" 4))) - (is (= "" (subs "efghijkl" 4 4))) - (is (= "i" (subs "efghijkl" 4 5))) - (is (= "ij" (subs "efghijkl" 4 6))) - (is (= "ijk" (subs "efghijkl" 4 7))) - (is (= "ijkl" (subs "efghijkl" 4 8))) - (is (= "jkl" (subs "efghijkl" 5))) - (is (= "" (subs "efghijkl" 5 5))) - (is (= "j" (subs "efghijkl" 5 6))) - (is (= "jk" (subs "efghijkl" 5 7))) - (is (= "jkl" (subs "efghijkl" 5 8))) - (is (= "kl" (subs "efghijkl" 6))) - (is (= "" (subs "efghijkl" 6 6))) - (is (= "k" (subs "efghijkl" 6 7))) - (is (= "kl" (subs "efghijkl" 6 8))) - (is (= "l" (subs "efghijkl" 7))) - (is (= "" (subs "efghijkl" 7 7))) - (is (= "l" (subs "efghijkl" 7 8))) - (is (= "" (subs "efghijkl" 8))) - (is (= "" (subs "efghijkl" 8 8))) - (is (= "fghijkl" (subs "fghijkl" 0))) - (is (= "" (subs "fghijkl" 0 0))) - (is (= "f" (subs "fghijkl" 0 1))) - (is (= "fg" (subs "fghijkl" 0 2))) - (is (= "fgh" (subs "fghijkl" 0 3))) - (is (= "fghi" (subs "fghijkl" 0 4))) - (is (= "fghij" (subs "fghijkl" 0 5))) - (is (= "fghijk" (subs "fghijkl" 0 6))) - (is (= "fghijkl" (subs "fghijkl" 0 7))) - (is (= "ghijkl" (subs "fghijkl" 1))) - (is (= "" (subs "fghijkl" 1 1))) - (is (= "g" (subs "fghijkl" 1 2))) - (is (= "gh" (subs "fghijkl" 1 3))) - (is (= "ghi" (subs "fghijkl" 1 4))) - (is (= "ghij" (subs "fghijkl" 1 5))) - (is (= "ghijk" (subs "fghijkl" 1 6))) - (is (= "ghijkl" (subs "fghijkl" 1 7))) - (is (= "hijkl" (subs "fghijkl" 2))) - (is (= "" (subs "fghijkl" 2 2))) - (is (= "h" (subs "fghijkl" 2 3))) - (is (= "hi" (subs "fghijkl" 2 4))) - (is (= "hij" (subs "fghijkl" 2 5))) - (is (= "hijk" (subs "fghijkl" 2 6))) - (is (= "hijkl" (subs "fghijkl" 2 7))) - (is (= "ijkl" (subs "fghijkl" 3))) - (is (= "" (subs "fghijkl" 3 3))) - (is (= "i" (subs "fghijkl" 3 4))) - (is (= "ij" (subs "fghijkl" 3 5))) - (is (= "ijk" (subs "fghijkl" 3 6))) - (is (= "ijkl" (subs "fghijkl" 3 7))) - (is (= "jkl" (subs "fghijkl" 4))) - (is (= "" (subs "fghijkl" 4 4))) - (is (= "j" (subs "fghijkl" 4 5))) - (is (= "jk" (subs "fghijkl" 4 6))) - (is (= "jkl" (subs "fghijkl" 4 7))) - (is (= "kl" (subs "fghijkl" 5))) - (is (= "" (subs "fghijkl" 5 5))) - (is (= "k" (subs "fghijkl" 5 6))) - (is (= "kl" (subs "fghijkl" 5 7))) - (is (= "l" (subs "fghijkl" 6))) - (is (= "" (subs "fghijkl" 6 6))) - (is (= "l" (subs "fghijkl" 6 7))) - (is (= "" (subs "fghijkl" 7))) - (is (= "" (subs "fghijkl" 7 7))) - (is (= "ghijkl" (subs "ghijkl" 0))) - (is (= "" (subs "ghijkl" 0 0))) - (is (= "g" (subs "ghijkl" 0 1))) - (is (= "gh" (subs "ghijkl" 0 2))) - (is (= "ghi" (subs "ghijkl" 0 3))) - (is (= "ghij" (subs "ghijkl" 0 4))) - (is (= "ghijk" (subs "ghijkl" 0 5))) - (is (= "ghijkl" (subs "ghijkl" 0 6))) - (is (= "hijkl" (subs "ghijkl" 1))) - (is (= "" (subs "ghijkl" 1 1))) - (is (= "h" (subs "ghijkl" 1 2))) - (is (= "hi" (subs "ghijkl" 1 3))) - (is (= "hij" (subs "ghijkl" 1 4))) - (is (= "hijk" (subs "ghijkl" 1 5))) - (is (= "hijkl" (subs "ghijkl" 1 6))) - (is (= "ijkl" (subs "ghijkl" 2))) - (is (= "" (subs "ghijkl" 2 2))) - (is (= "i" (subs "ghijkl" 2 3))) - (is (= "ij" (subs "ghijkl" 2 4))) - (is (= "ijk" (subs "ghijkl" 2 5))) - (is (= "ijkl" (subs "ghijkl" 2 6))) - (is (= "jkl" (subs "ghijkl" 3))) - (is (= "" (subs "ghijkl" 3 3))) - (is (= "j" (subs "ghijkl" 3 4))) - (is (= "jk" (subs "ghijkl" 3 5))) - (is (= "jkl" (subs "ghijkl" 3 6))) - (is (= "kl" (subs "ghijkl" 4))) - (is (= "" (subs "ghijkl" 4 4))) - (is (= "k" (subs "ghijkl" 4 5))) - (is (= "kl" (subs "ghijkl" 4 6))) - (is (= "l" (subs "ghijkl" 5))) - (is (= "" (subs "ghijkl" 5 5))) - (is (= "l" (subs "ghijkl" 5 6))) - (is (= "" (subs "ghijkl" 6))) - (is (= "" (subs "ghijkl" 6 6))) - (is (= "hijkl" (subs "hijkl" 0))) - (is (= "" (subs "hijkl" 0 0))) - (is (= "h" (subs "hijkl" 0 1))) - (is (= "hi" (subs "hijkl" 0 2))) - (is (= "hij" (subs "hijkl" 0 3))) - (is (= "hijk" (subs "hijkl" 0 4))) - (is (= "hijkl" (subs "hijkl" 0 5))) - (is (= "ijkl" (subs "hijkl" 1))) - (is (= "" (subs "hijkl" 1 1))) - (is (= "i" (subs "hijkl" 1 2))) - (is (= "ij" (subs "hijkl" 1 3))) - (is (= "ijk" (subs "hijkl" 1 4))) - (is (= "ijkl" (subs "hijkl" 1 5))) - (is (= "jkl" (subs "hijkl" 2))) - (is (= "" (subs "hijkl" 2 2))) - (is (= "j" (subs "hijkl" 2 3))) - (is (= "jk" (subs "hijkl" 2 4))) - (is (= "jkl" (subs "hijkl" 2 5))) - (is (= "kl" (subs "hijkl" 3))) - (is (= "" (subs "hijkl" 3 3))) - (is (= "k" (subs "hijkl" 3 4))) - (is (= "kl" (subs "hijkl" 3 5))) - (is (= "l" (subs "hijkl" 4))) - (is (= "" (subs "hijkl" 4 4))) - (is (= "l" (subs "hijkl" 4 5))) - (is (= "" (subs "hijkl" 5))) - (is (= "" (subs "hijkl" 5 5))) - (is (= "ijkl" (subs "ijkl" 0))) - (is (= "" (subs "ijkl" 0 0))) - (is (= "i" (subs "ijkl" 0 1))) - (is (= "ij" (subs "ijkl" 0 2))) - (is (= "ijk" (subs "ijkl" 0 3))) - (is (= "ijkl" (subs "ijkl" 0 4))) - (is (= "jkl" (subs "ijkl" 1))) - (is (= "" (subs "ijkl" 1 1))) - (is (= "j" (subs "ijkl" 1 2))) - (is (= "jk" (subs "ijkl" 1 3))) - (is (= "jkl" (subs "ijkl" 1 4))) - (is (= "kl" (subs "ijkl" 2))) - (is (= "" (subs "ijkl" 2 2))) - (is (= "k" (subs "ijkl" 2 3))) - (is (= "kl" (subs "ijkl" 2 4))) - (is (= "l" (subs "ijkl" 3))) - (is (= "" (subs "ijkl" 3 3))) - (is (= "l" (subs "ijkl" 3 4))) - (is (= "" (subs "ijkl" 4))) - (is (= "" (subs "ijkl" 4 4))) - (is (= "jkl" (subs "jkl" 0))) - (is (= "" (subs "jkl" 0 0))) - (is (= "j" (subs "jkl" 0 1))) - (is (= "jk" (subs "jkl" 0 2))) - (is (= "jkl" (subs "jkl" 0 3))) - (is (= "kl" (subs "jkl" 1))) - (is (= "" (subs "jkl" 1 1))) - (is (= "k" (subs "jkl" 1 2))) - (is (= "kl" (subs "jkl" 1 3))) - (is (= "l" (subs "jkl" 2))) - (is (= "" (subs "jkl" 2 2))) - (is (= "l" (subs "jkl" 2 3))) - (is (= "" (subs "jkl" 3))) - (is (= "" (subs "jkl" 3 3))) - (is (= "kl" (subs "kl" 0))) - (is (= "" (subs "kl" 0 0))) - (is (= "k" (subs "kl" 0 1))) - (is (= "kl" (subs "kl" 0 2))) - (is (= "l" (subs "kl" 1))) - (is (= "" (subs "kl" 1 1))) - (is (= "l" (subs "kl" 1 2))) - (is (= "" (subs "kl" 2))) - (is (= "" (subs "kl" 2 2))) - (is (= "l" (subs "l" 0))) - (is (= "" (subs "l" 0 0))) - (is (= "l" (subs "l" 0 1))) - (is (= "" (subs "l" 1))) - (is (= "" (subs "l" 1 1))) #?@(:cljs [(is (= "b" (subs "abcde" 2 1))) (is (= "bcde" (subs "abcde" 1 6))) From 73dff22bb9dd74f83499b1b50e3ef08c9da3a161 Mon Sep 17 00:00:00 2001 From: Ambrose Bonnaire-Sergeant Date: Fri, 7 Feb 2025 21:58:13 -0600 Subject: [PATCH 14/48] undo --- test/clojure/core_test/subs.cljc | 576 +------------------------------ 1 file changed, 11 insertions(+), 565 deletions(-) diff --git a/test/clojure/core_test/subs.cljc b/test/clojure/core_test/subs.cljc index e4a808f..f2cdd42 100644 --- a/test/clojure/core_test/subs.cljc +++ b/test/clojure/core_test/subs.cljc @@ -2,568 +2,14 @@ (:require [clojure.test :as t :refer [deftest is]] [clojure.core-test.portability #?(:cljs :refer-macros :default :refer) [when-var-exists]])) -(defn- generate-cases [] - (let [v "abcdefghijkl"] - (distinct - (for [len (range (inc (count v))) - :let [v (subs v 0 len)] - i (range (- (count v)) (+ 5 (count v))) - j (range (- (count v)) (+ 5 (count v))) - e (concat (try [(list 'is (list '= (subs v i) (list 'subs v i)))] (catch Throwable _)) - (try [(list 'is (list '= (subs v i j) (list 'subs v i j)))] (catch Throwable _)))] - e)))) -(comment -(clojure.pprint/pprint (generate-cases)) - ) - (when-var-exists clojure.core/subs (deftest test-subs - (is (= "" (subs "" 0))) - (is (= "" (subs "" 0 0))) - (is (= "a" (subs "a" 0))) - (is (= "" (subs "a" 0 0))) - (is (= "a" (subs "a" 0 1))) - (is (= "" (subs "a" 1))) - (is (= "" (subs "a" 1 1))) - (is (= "ab" (subs "ab" 0))) - (is (= "" (subs "ab" 0 0))) - (is (= "a" (subs "ab" 0 1))) - (is (= "ab" (subs "ab" 0 2))) - (is (= "b" (subs "ab" 1))) - (is (= "" (subs "ab" 1 1))) - (is (= "b" (subs "ab" 1 2))) - (is (= "" (subs "ab" 2))) - (is (= "" (subs "ab" 2 2))) - (is (= "abc" (subs "abc" 0))) - (is (= "" (subs "abc" 0 0))) - (is (= "a" (subs "abc" 0 1))) - (is (= "ab" (subs "abc" 0 2))) - (is (= "abc" (subs "abc" 0 3))) - (is (= "bc" (subs "abc" 1))) - (is (= "" (subs "abc" 1 1))) - (is (= "b" (subs "abc" 1 2))) - (is (= "bc" (subs "abc" 1 3))) - (is (= "c" (subs "abc" 2))) - (is (= "" (subs "abc" 2 2))) - (is (= "c" (subs "abc" 2 3))) - (is (= "" (subs "abc" 3))) - (is (= "" (subs "abc" 3 3))) - (is (= "abcd" (subs "abcd" 0))) - (is (= "" (subs "abcd" 0 0))) - (is (= "a" (subs "abcd" 0 1))) - (is (= "ab" (subs "abcd" 0 2))) - (is (= "abc" (subs "abcd" 0 3))) - (is (= "abcd" (subs "abcd" 0 4))) - (is (= "bcd" (subs "abcd" 1))) - (is (= "" (subs "abcd" 1 1))) - (is (= "b" (subs "abcd" 1 2))) - (is (= "bc" (subs "abcd" 1 3))) - (is (= "bcd" (subs "abcd" 1 4))) - (is (= "cd" (subs "abcd" 2))) - (is (= "" (subs "abcd" 2 2))) - (is (= "c" (subs "abcd" 2 3))) - (is (= "cd" (subs "abcd" 2 4))) - (is (= "d" (subs "abcd" 3))) - (is (= "" (subs "abcd" 3 3))) - (is (= "d" (subs "abcd" 3 4))) - (is (= "" (subs "abcd" 4))) - (is (= "" (subs "abcd" 4 4))) - (is (= "abcde" (subs "abcde" 0))) - (is (= "" (subs "abcde" 0 0))) - (is (= "a" (subs "abcde" 0 1))) - (is (= "ab" (subs "abcde" 0 2))) - (is (= "abc" (subs "abcde" 0 3))) - (is (= "abcd" (subs "abcde" 0 4))) - (is (= "abcde" (subs "abcde" 0 5))) (is (= "bcde" (subs "abcde" 1))) - (is (= "" (subs "abcde" 1 1))) - (is (= "b" (subs "abcde" 1 2))) - (is (= "bc" (subs "abcde" 1 3))) (is (= "bcd" (subs "abcde" 1 4))) - (is (= "bcde" (subs "abcde" 1 5))) - (is (= "cde" (subs "abcde" 2))) - (is (= "" (subs "abcde" 2 2))) - (is (= "c" (subs "abcde" 2 3))) - (is (= "cd" (subs "abcde" 2 4))) - (is (= "cde" (subs "abcde" 2 5))) - (is (= "de" (subs "abcde" 3))) - (is (= "" (subs "abcde" 3 3))) - (is (= "d" (subs "abcde" 3 4))) - (is (= "de" (subs "abcde" 3 5))) - (is (= "e" (subs "abcde" 4))) - (is (= "" (subs "abcde" 4 4))) - (is (= "e" (subs "abcde" 4 5))) + (is (= "abc" (subs "abcde" 0 3))) + (is (= "" (subs "abcde" 0 0))) (is (= "" (subs "abcde" 5))) (is (= "" (subs "abcde" 5 5))) - (is (= "abcdef" (subs "abcdef" 0))) - (is (= "" (subs "abcdef" 0 0))) - (is (= "a" (subs "abcdef" 0 1))) - (is (= "ab" (subs "abcdef" 0 2))) - (is (= "abc" (subs "abcdef" 0 3))) - (is (= "abcd" (subs "abcdef" 0 4))) - (is (= "abcde" (subs "abcdef" 0 5))) - (is (= "abcdef" (subs "abcdef" 0 6))) - (is (= "bcdef" (subs "abcdef" 1))) - (is (= "" (subs "abcdef" 1 1))) - (is (= "b" (subs "abcdef" 1 2))) - (is (= "bc" (subs "abcdef" 1 3))) - (is (= "bcd" (subs "abcdef" 1 4))) - (is (= "bcde" (subs "abcdef" 1 5))) - (is (= "bcdef" (subs "abcdef" 1 6))) - (is (= "cdef" (subs "abcdef" 2))) - (is (= "" (subs "abcdef" 2 2))) - (is (= "c" (subs "abcdef" 2 3))) - (is (= "cd" (subs "abcdef" 2 4))) - (is (= "cde" (subs "abcdef" 2 5))) - (is (= "cdef" (subs "abcdef" 2 6))) - (is (= "def" (subs "abcdef" 3))) - (is (= "" (subs "abcdef" 3 3))) - (is (= "d" (subs "abcdef" 3 4))) - (is (= "de" (subs "abcdef" 3 5))) - (is (= "def" (subs "abcdef" 3 6))) - (is (= "ef" (subs "abcdef" 4))) - (is (= "" (subs "abcdef" 4 4))) - (is (= "e" (subs "abcdef" 4 5))) - (is (= "ef" (subs "abcdef" 4 6))) - (is (= "f" (subs "abcdef" 5))) - (is (= "" (subs "abcdef" 5 5))) - (is (= "f" (subs "abcdef" 5 6))) - (is (= "" (subs "abcdef" 6))) - (is (= "" (subs "abcdef" 6 6))) - (is (= "abcdefg" (subs "abcdefg" 0))) - (is (= "" (subs "abcdefg" 0 0))) - (is (= "a" (subs "abcdefg" 0 1))) - (is (= "ab" (subs "abcdefg" 0 2))) - (is (= "abc" (subs "abcdefg" 0 3))) - (is (= "abcd" (subs "abcdefg" 0 4))) - (is (= "abcde" (subs "abcdefg" 0 5))) - (is (= "abcdef" (subs "abcdefg" 0 6))) - (is (= "abcdefg" (subs "abcdefg" 0 7))) - (is (= "bcdefg" (subs "abcdefg" 1))) - (is (= "" (subs "abcdefg" 1 1))) - (is (= "b" (subs "abcdefg" 1 2))) - (is (= "bc" (subs "abcdefg" 1 3))) - (is (= "bcd" (subs "abcdefg" 1 4))) - (is (= "bcde" (subs "abcdefg" 1 5))) - (is (= "bcdef" (subs "abcdefg" 1 6))) - (is (= "bcdefg" (subs "abcdefg" 1 7))) - (is (= "cdefg" (subs "abcdefg" 2))) - (is (= "" (subs "abcdefg" 2 2))) - (is (= "c" (subs "abcdefg" 2 3))) - (is (= "cd" (subs "abcdefg" 2 4))) - (is (= "cde" (subs "abcdefg" 2 5))) - (is (= "cdef" (subs "abcdefg" 2 6))) - (is (= "cdefg" (subs "abcdefg" 2 7))) - (is (= "defg" (subs "abcdefg" 3))) - (is (= "" (subs "abcdefg" 3 3))) - (is (= "d" (subs "abcdefg" 3 4))) - (is (= "de" (subs "abcdefg" 3 5))) - (is (= "def" (subs "abcdefg" 3 6))) - (is (= "defg" (subs "abcdefg" 3 7))) - (is (= "efg" (subs "abcdefg" 4))) - (is (= "" (subs "abcdefg" 4 4))) - (is (= "e" (subs "abcdefg" 4 5))) - (is (= "ef" (subs "abcdefg" 4 6))) - (is (= "efg" (subs "abcdefg" 4 7))) - (is (= "fg" (subs "abcdefg" 5))) - (is (= "" (subs "abcdefg" 5 5))) - (is (= "f" (subs "abcdefg" 5 6))) - (is (= "fg" (subs "abcdefg" 5 7))) - (is (= "g" (subs "abcdefg" 6))) - (is (= "" (subs "abcdefg" 6 6))) - (is (= "g" (subs "abcdefg" 6 7))) - (is (= "" (subs "abcdefg" 7))) - (is (= "" (subs "abcdefg" 7 7))) - (is (= "abcdefgh" (subs "abcdefgh" 0))) - (is (= "" (subs "abcdefgh" 0 0))) - (is (= "a" (subs "abcdefgh" 0 1))) - (is (= "ab" (subs "abcdefgh" 0 2))) - (is (= "abc" (subs "abcdefgh" 0 3))) - (is (= "abcd" (subs "abcdefgh" 0 4))) - (is (= "abcde" (subs "abcdefgh" 0 5))) - (is (= "abcdef" (subs "abcdefgh" 0 6))) - (is (= "abcdefg" (subs "abcdefgh" 0 7))) - (is (= "abcdefgh" (subs "abcdefgh" 0 8))) - (is (= "bcdefgh" (subs "abcdefgh" 1))) - (is (= "" (subs "abcdefgh" 1 1))) - (is (= "b" (subs "abcdefgh" 1 2))) - (is (= "bc" (subs "abcdefgh" 1 3))) - (is (= "bcd" (subs "abcdefgh" 1 4))) - (is (= "bcde" (subs "abcdefgh" 1 5))) - (is (= "bcdef" (subs "abcdefgh" 1 6))) - (is (= "bcdefg" (subs "abcdefgh" 1 7))) - (is (= "bcdefgh" (subs "abcdefgh" 1 8))) - (is (= "cdefgh" (subs "abcdefgh" 2))) - (is (= "" (subs "abcdefgh" 2 2))) - (is (= "c" (subs "abcdefgh" 2 3))) - (is (= "cd" (subs "abcdefgh" 2 4))) - (is (= "cde" (subs "abcdefgh" 2 5))) - (is (= "cdef" (subs "abcdefgh" 2 6))) - (is (= "cdefg" (subs "abcdefgh" 2 7))) - (is (= "cdefgh" (subs "abcdefgh" 2 8))) - (is (= "defgh" (subs "abcdefgh" 3))) - (is (= "" (subs "abcdefgh" 3 3))) - (is (= "d" (subs "abcdefgh" 3 4))) - (is (= "de" (subs "abcdefgh" 3 5))) - (is (= "def" (subs "abcdefgh" 3 6))) - (is (= "defg" (subs "abcdefgh" 3 7))) - (is (= "defgh" (subs "abcdefgh" 3 8))) - (is (= "efgh" (subs "abcdefgh" 4))) - (is (= "" (subs "abcdefgh" 4 4))) - (is (= "e" (subs "abcdefgh" 4 5))) - (is (= "ef" (subs "abcdefgh" 4 6))) - (is (= "efg" (subs "abcdefgh" 4 7))) - (is (= "efgh" (subs "abcdefgh" 4 8))) - (is (= "fgh" (subs "abcdefgh" 5))) - (is (= "" (subs "abcdefgh" 5 5))) - (is (= "f" (subs "abcdefgh" 5 6))) - (is (= "fg" (subs "abcdefgh" 5 7))) - (is (= "fgh" (subs "abcdefgh" 5 8))) - (is (= "gh" (subs "abcdefgh" 6))) - (is (= "" (subs "abcdefgh" 6 6))) - (is (= "g" (subs "abcdefgh" 6 7))) - (is (= "gh" (subs "abcdefgh" 6 8))) - (is (= "h" (subs "abcdefgh" 7))) - (is (= "" (subs "abcdefgh" 7 7))) - (is (= "h" (subs "abcdefgh" 7 8))) - (is (= "" (subs "abcdefgh" 8))) - (is (= "" (subs "abcdefgh" 8 8))) - (is (= "abcdefghi" (subs "abcdefghi" 0))) - (is (= "" (subs "abcdefghi" 0 0))) - (is (= "a" (subs "abcdefghi" 0 1))) - (is (= "ab" (subs "abcdefghi" 0 2))) - (is (= "abc" (subs "abcdefghi" 0 3))) - (is (= "abcd" (subs "abcdefghi" 0 4))) - (is (= "abcde" (subs "abcdefghi" 0 5))) - (is (= "abcdef" (subs "abcdefghi" 0 6))) - (is (= "abcdefg" (subs "abcdefghi" 0 7))) - (is (= "abcdefgh" (subs "abcdefghi" 0 8))) - (is (= "abcdefghi" (subs "abcdefghi" 0 9))) - (is (= "bcdefghi" (subs "abcdefghi" 1))) - (is (= "" (subs "abcdefghi" 1 1))) - (is (= "b" (subs "abcdefghi" 1 2))) - (is (= "bc" (subs "abcdefghi" 1 3))) - (is (= "bcd" (subs "abcdefghi" 1 4))) - (is (= "bcde" (subs "abcdefghi" 1 5))) - (is (= "bcdef" (subs "abcdefghi" 1 6))) - (is (= "bcdefg" (subs "abcdefghi" 1 7))) - (is (= "bcdefgh" (subs "abcdefghi" 1 8))) - (is (= "bcdefghi" (subs "abcdefghi" 1 9))) - (is (= "cdefghi" (subs "abcdefghi" 2))) - (is (= "" (subs "abcdefghi" 2 2))) - (is (= "c" (subs "abcdefghi" 2 3))) - (is (= "cd" (subs "abcdefghi" 2 4))) - (is (= "cde" (subs "abcdefghi" 2 5))) - (is (= "cdef" (subs "abcdefghi" 2 6))) - (is (= "cdefg" (subs "abcdefghi" 2 7))) - (is (= "cdefgh" (subs "abcdefghi" 2 8))) - (is (= "cdefghi" (subs "abcdefghi" 2 9))) - (is (= "defghi" (subs "abcdefghi" 3))) - (is (= "" (subs "abcdefghi" 3 3))) - (is (= "d" (subs "abcdefghi" 3 4))) - (is (= "de" (subs "abcdefghi" 3 5))) - (is (= "def" (subs "abcdefghi" 3 6))) - (is (= "defg" (subs "abcdefghi" 3 7))) - (is (= "defgh" (subs "abcdefghi" 3 8))) - (is (= "defghi" (subs "abcdefghi" 3 9))) - (is (= "efghi" (subs "abcdefghi" 4))) - (is (= "" (subs "abcdefghi" 4 4))) - (is (= "e" (subs "abcdefghi" 4 5))) - (is (= "ef" (subs "abcdefghi" 4 6))) - (is (= "efg" (subs "abcdefghi" 4 7))) - (is (= "efgh" (subs "abcdefghi" 4 8))) - (is (= "efghi" (subs "abcdefghi" 4 9))) - (is (= "fghi" (subs "abcdefghi" 5))) - (is (= "" (subs "abcdefghi" 5 5))) - (is (= "f" (subs "abcdefghi" 5 6))) - (is (= "fg" (subs "abcdefghi" 5 7))) - (is (= "fgh" (subs "abcdefghi" 5 8))) - (is (= "fghi" (subs "abcdefghi" 5 9))) - (is (= "ghi" (subs "abcdefghi" 6))) - (is (= "" (subs "abcdefghi" 6 6))) - (is (= "g" (subs "abcdefghi" 6 7))) - (is (= "gh" (subs "abcdefghi" 6 8))) - (is (= "ghi" (subs "abcdefghi" 6 9))) - (is (= "hi" (subs "abcdefghi" 7))) - (is (= "" (subs "abcdefghi" 7 7))) - (is (= "h" (subs "abcdefghi" 7 8))) - (is (= "hi" (subs "abcdefghi" 7 9))) - (is (= "i" (subs "abcdefghi" 8))) - (is (= "" (subs "abcdefghi" 8 8))) - (is (= "i" (subs "abcdefghi" 8 9))) - (is (= "" (subs "abcdefghi" 9))) - (is (= "" (subs "abcdefghi" 9 9))) - (is (= "abcdefghij" (subs "abcdefghij" 0))) - (is (= "" (subs "abcdefghij" 0 0))) - (is (= "a" (subs "abcdefghij" 0 1))) - (is (= "ab" (subs "abcdefghij" 0 2))) - (is (= "abc" (subs "abcdefghij" 0 3))) - (is (= "abcd" (subs "abcdefghij" 0 4))) - (is (= "abcde" (subs "abcdefghij" 0 5))) - (is (= "abcdef" (subs "abcdefghij" 0 6))) - (is (= "abcdefg" (subs "abcdefghij" 0 7))) - (is (= "abcdefgh" (subs "abcdefghij" 0 8))) - (is (= "abcdefghi" (subs "abcdefghij" 0 9))) - (is (= "abcdefghij" (subs "abcdefghij" 0 10))) - (is (= "bcdefghij" (subs "abcdefghij" 1))) - (is (= "" (subs "abcdefghij" 1 1))) - (is (= "b" (subs "abcdefghij" 1 2))) - (is (= "bc" (subs "abcdefghij" 1 3))) - (is (= "bcd" (subs "abcdefghij" 1 4))) - (is (= "bcde" (subs "abcdefghij" 1 5))) - (is (= "bcdef" (subs "abcdefghij" 1 6))) - (is (= "bcdefg" (subs "abcdefghij" 1 7))) - (is (= "bcdefgh" (subs "abcdefghij" 1 8))) - (is (= "bcdefghi" (subs "abcdefghij" 1 9))) - (is (= "bcdefghij" (subs "abcdefghij" 1 10))) - (is (= "cdefghij" (subs "abcdefghij" 2))) - (is (= "" (subs "abcdefghij" 2 2))) - (is (= "c" (subs "abcdefghij" 2 3))) - (is (= "cd" (subs "abcdefghij" 2 4))) - (is (= "cde" (subs "abcdefghij" 2 5))) - (is (= "cdef" (subs "abcdefghij" 2 6))) - (is (= "cdefg" (subs "abcdefghij" 2 7))) - (is (= "cdefgh" (subs "abcdefghij" 2 8))) - (is (= "cdefghi" (subs "abcdefghij" 2 9))) - (is (= "cdefghij" (subs "abcdefghij" 2 10))) - (is (= "defghij" (subs "abcdefghij" 3))) - (is (= "" (subs "abcdefghij" 3 3))) - (is (= "d" (subs "abcdefghij" 3 4))) - (is (= "de" (subs "abcdefghij" 3 5))) - (is (= "def" (subs "abcdefghij" 3 6))) - (is (= "defg" (subs "abcdefghij" 3 7))) - (is (= "defgh" (subs "abcdefghij" 3 8))) - (is (= "defghi" (subs "abcdefghij" 3 9))) - (is (= "defghij" (subs "abcdefghij" 3 10))) - (is (= "efghij" (subs "abcdefghij" 4))) - (is (= "" (subs "abcdefghij" 4 4))) - (is (= "e" (subs "abcdefghij" 4 5))) - (is (= "ef" (subs "abcdefghij" 4 6))) - (is (= "efg" (subs "abcdefghij" 4 7))) - (is (= "efgh" (subs "abcdefghij" 4 8))) - (is (= "efghi" (subs "abcdefghij" 4 9))) - (is (= "efghij" (subs "abcdefghij" 4 10))) - (is (= "fghij" (subs "abcdefghij" 5))) - (is (= "" (subs "abcdefghij" 5 5))) - (is (= "f" (subs "abcdefghij" 5 6))) - (is (= "fg" (subs "abcdefghij" 5 7))) - (is (= "fgh" (subs "abcdefghij" 5 8))) - (is (= "fghi" (subs "abcdefghij" 5 9))) - (is (= "fghij" (subs "abcdefghij" 5 10))) - (is (= "ghij" (subs "abcdefghij" 6))) - (is (= "" (subs "abcdefghij" 6 6))) - (is (= "g" (subs "abcdefghij" 6 7))) - (is (= "gh" (subs "abcdefghij" 6 8))) - (is (= "ghi" (subs "abcdefghij" 6 9))) - (is (= "ghij" (subs "abcdefghij" 6 10))) - (is (= "hij" (subs "abcdefghij" 7))) - (is (= "" (subs "abcdefghij" 7 7))) - (is (= "h" (subs "abcdefghij" 7 8))) - (is (= "hi" (subs "abcdefghij" 7 9))) - (is (= "hij" (subs "abcdefghij" 7 10))) - (is (= "ij" (subs "abcdefghij" 8))) - (is (= "" (subs "abcdefghij" 8 8))) - (is (= "i" (subs "abcdefghij" 8 9))) - (is (= "ij" (subs "abcdefghij" 8 10))) - (is (= "j" (subs "abcdefghij" 9))) - (is (= "" (subs "abcdefghij" 9 9))) - (is (= "j" (subs "abcdefghij" 9 10))) - (is (= "" (subs "abcdefghij" 10))) - (is (= "" (subs "abcdefghij" 10 10))) - (is (= "abcdefghijk" (subs "abcdefghijk" 0))) - (is (= "" (subs "abcdefghijk" 0 0))) - (is (= "a" (subs "abcdefghijk" 0 1))) - (is (= "ab" (subs "abcdefghijk" 0 2))) - (is (= "abc" (subs "abcdefghijk" 0 3))) - (is (= "abcd" (subs "abcdefghijk" 0 4))) - (is (= "abcde" (subs "abcdefghijk" 0 5))) - (is (= "abcdef" (subs "abcdefghijk" 0 6))) - (is (= "abcdefg" (subs "abcdefghijk" 0 7))) - (is (= "abcdefgh" (subs "abcdefghijk" 0 8))) - (is (= "abcdefghi" (subs "abcdefghijk" 0 9))) - (is (= "abcdefghij" (subs "abcdefghijk" 0 10))) - (is (= "abcdefghijk" (subs "abcdefghijk" 0 11))) - (is (= "bcdefghijk" (subs "abcdefghijk" 1))) - (is (= "" (subs "abcdefghijk" 1 1))) - (is (= "b" (subs "abcdefghijk" 1 2))) - (is (= "bc" (subs "abcdefghijk" 1 3))) - (is (= "bcd" (subs "abcdefghijk" 1 4))) - (is (= "bcde" (subs "abcdefghijk" 1 5))) - (is (= "bcdef" (subs "abcdefghijk" 1 6))) - (is (= "bcdefg" (subs "abcdefghijk" 1 7))) - (is (= "bcdefgh" (subs "abcdefghijk" 1 8))) - (is (= "bcdefghi" (subs "abcdefghijk" 1 9))) - (is (= "bcdefghij" (subs "abcdefghijk" 1 10))) - (is (= "bcdefghijk" (subs "abcdefghijk" 1 11))) - (is (= "cdefghijk" (subs "abcdefghijk" 2))) - (is (= "" (subs "abcdefghijk" 2 2))) - (is (= "c" (subs "abcdefghijk" 2 3))) - (is (= "cd" (subs "abcdefghijk" 2 4))) - (is (= "cde" (subs "abcdefghijk" 2 5))) - (is (= "cdef" (subs "abcdefghijk" 2 6))) - (is (= "cdefg" (subs "abcdefghijk" 2 7))) - (is (= "cdefgh" (subs "abcdefghijk" 2 8))) - (is (= "cdefghi" (subs "abcdefghijk" 2 9))) - (is (= "cdefghij" (subs "abcdefghijk" 2 10))) - (is (= "cdefghijk" (subs "abcdefghijk" 2 11))) - (is (= "defghijk" (subs "abcdefghijk" 3))) - (is (= "" (subs "abcdefghijk" 3 3))) - (is (= "d" (subs "abcdefghijk" 3 4))) - (is (= "de" (subs "abcdefghijk" 3 5))) - (is (= "def" (subs "abcdefghijk" 3 6))) - (is (= "defg" (subs "abcdefghijk" 3 7))) - (is (= "defgh" (subs "abcdefghijk" 3 8))) - (is (= "defghi" (subs "abcdefghijk" 3 9))) - (is (= "defghij" (subs "abcdefghijk" 3 10))) - (is (= "defghijk" (subs "abcdefghijk" 3 11))) - (is (= "efghijk" (subs "abcdefghijk" 4))) - (is (= "" (subs "abcdefghijk" 4 4))) - (is (= "e" (subs "abcdefghijk" 4 5))) - (is (= "ef" (subs "abcdefghijk" 4 6))) - (is (= "efg" (subs "abcdefghijk" 4 7))) - (is (= "efgh" (subs "abcdefghijk" 4 8))) - (is (= "efghi" (subs "abcdefghijk" 4 9))) - (is (= "efghij" (subs "abcdefghijk" 4 10))) - (is (= "efghijk" (subs "abcdefghijk" 4 11))) - (is (= "fghijk" (subs "abcdefghijk" 5))) - (is (= "" (subs "abcdefghijk" 5 5))) - (is (= "f" (subs "abcdefghijk" 5 6))) - (is (= "fg" (subs "abcdefghijk" 5 7))) - (is (= "fgh" (subs "abcdefghijk" 5 8))) - (is (= "fghi" (subs "abcdefghijk" 5 9))) - (is (= "fghij" (subs "abcdefghijk" 5 10))) - (is (= "fghijk" (subs "abcdefghijk" 5 11))) - (is (= "ghijk" (subs "abcdefghijk" 6))) - (is (= "" (subs "abcdefghijk" 6 6))) - (is (= "g" (subs "abcdefghijk" 6 7))) - (is (= "gh" (subs "abcdefghijk" 6 8))) - (is (= "ghi" (subs "abcdefghijk" 6 9))) - (is (= "ghij" (subs "abcdefghijk" 6 10))) - (is (= "ghijk" (subs "abcdefghijk" 6 11))) - (is (= "hijk" (subs "abcdefghijk" 7))) - (is (= "" (subs "abcdefghijk" 7 7))) - (is (= "h" (subs "abcdefghijk" 7 8))) - (is (= "hi" (subs "abcdefghijk" 7 9))) - (is (= "hij" (subs "abcdefghijk" 7 10))) - (is (= "hijk" (subs "abcdefghijk" 7 11))) - (is (= "ijk" (subs "abcdefghijk" 8))) - (is (= "" (subs "abcdefghijk" 8 8))) - (is (= "i" (subs "abcdefghijk" 8 9))) - (is (= "ij" (subs "abcdefghijk" 8 10))) - (is (= "ijk" (subs "abcdefghijk" 8 11))) - (is (= "jk" (subs "abcdefghijk" 9))) - (is (= "" (subs "abcdefghijk" 9 9))) - (is (= "j" (subs "abcdefghijk" 9 10))) - (is (= "jk" (subs "abcdefghijk" 9 11))) - (is (= "k" (subs "abcdefghijk" 10))) - (is (= "" (subs "abcdefghijk" 10 10))) - (is (= "k" (subs "abcdefghijk" 10 11))) - (is (= "" (subs "abcdefghijk" 11))) - (is (= "" (subs "abcdefghijk" 11 11))) - (is (= "abcdefghijkl" (subs "abcdefghijkl" 0))) - (is (= "" (subs "abcdefghijkl" 0 0))) - (is (= "a" (subs "abcdefghijkl" 0 1))) - (is (= "ab" (subs "abcdefghijkl" 0 2))) - (is (= "abc" (subs "abcdefghijkl" 0 3))) - (is (= "abcd" (subs "abcdefghijkl" 0 4))) - (is (= "abcde" (subs "abcdefghijkl" 0 5))) - (is (= "abcdef" (subs "abcdefghijkl" 0 6))) - (is (= "abcdefg" (subs "abcdefghijkl" 0 7))) - (is (= "abcdefgh" (subs "abcdefghijkl" 0 8))) - (is (= "abcdefghi" (subs "abcdefghijkl" 0 9))) - (is (= "abcdefghij" (subs "abcdefghijkl" 0 10))) - (is (= "abcdefghijk" (subs "abcdefghijkl" 0 11))) - (is (= "abcdefghijkl" (subs "abcdefghijkl" 0 12))) - (is (= "bcdefghijkl" (subs "abcdefghijkl" 1))) - (is (= "" (subs "abcdefghijkl" 1 1))) - (is (= "b" (subs "abcdefghijkl" 1 2))) - (is (= "bc" (subs "abcdefghijkl" 1 3))) - (is (= "bcd" (subs "abcdefghijkl" 1 4))) - (is (= "bcde" (subs "abcdefghijkl" 1 5))) - (is (= "bcdef" (subs "abcdefghijkl" 1 6))) - (is (= "bcdefg" (subs "abcdefghijkl" 1 7))) - (is (= "bcdefgh" (subs "abcdefghijkl" 1 8))) - (is (= "bcdefghi" (subs "abcdefghijkl" 1 9))) - (is (= "bcdefghij" (subs "abcdefghijkl" 1 10))) - (is (= "bcdefghijk" (subs "abcdefghijkl" 1 11))) - (is (= "bcdefghijkl" (subs "abcdefghijkl" 1 12))) - (is (= "cdefghijkl" (subs "abcdefghijkl" 2))) - (is (= "" (subs "abcdefghijkl" 2 2))) - (is (= "c" (subs "abcdefghijkl" 2 3))) - (is (= "cd" (subs "abcdefghijkl" 2 4))) - (is (= "cde" (subs "abcdefghijkl" 2 5))) - (is (= "cdef" (subs "abcdefghijkl" 2 6))) - (is (= "cdefg" (subs "abcdefghijkl" 2 7))) - (is (= "cdefgh" (subs "abcdefghijkl" 2 8))) - (is (= "cdefghi" (subs "abcdefghijkl" 2 9))) - (is (= "cdefghij" (subs "abcdefghijkl" 2 10))) - (is (= "cdefghijk" (subs "abcdefghijkl" 2 11))) - (is (= "cdefghijkl" (subs "abcdefghijkl" 2 12))) - (is (= "defghijkl" (subs "abcdefghijkl" 3))) - (is (= "" (subs "abcdefghijkl" 3 3))) - (is (= "d" (subs "abcdefghijkl" 3 4))) - (is (= "de" (subs "abcdefghijkl" 3 5))) - (is (= "def" (subs "abcdefghijkl" 3 6))) - (is (= "defg" (subs "abcdefghijkl" 3 7))) - (is (= "defgh" (subs "abcdefghijkl" 3 8))) - (is (= "defghi" (subs "abcdefghijkl" 3 9))) - (is (= "defghij" (subs "abcdefghijkl" 3 10))) - (is (= "defghijk" (subs "abcdefghijkl" 3 11))) - (is (= "defghijkl" (subs "abcdefghijkl" 3 12))) - (is (= "efghijkl" (subs "abcdefghijkl" 4))) - (is (= "" (subs "abcdefghijkl" 4 4))) - (is (= "e" (subs "abcdefghijkl" 4 5))) - (is (= "ef" (subs "abcdefghijkl" 4 6))) - (is (= "efg" (subs "abcdefghijkl" 4 7))) - (is (= "efgh" (subs "abcdefghijkl" 4 8))) - (is (= "efghi" (subs "abcdefghijkl" 4 9))) - (is (= "efghij" (subs "abcdefghijkl" 4 10))) - (is (= "efghijk" (subs "abcdefghijkl" 4 11))) - (is (= "efghijkl" (subs "abcdefghijkl" 4 12))) - (is (= "fghijkl" (subs "abcdefghijkl" 5))) - (is (= "" (subs "abcdefghijkl" 5 5))) - (is (= "f" (subs "abcdefghijkl" 5 6))) - (is (= "fg" (subs "abcdefghijkl" 5 7))) - (is (= "fgh" (subs "abcdefghijkl" 5 8))) - (is (= "fghi" (subs "abcdefghijkl" 5 9))) - (is (= "fghij" (subs "abcdefghijkl" 5 10))) - (is (= "fghijk" (subs "abcdefghijkl" 5 11))) - (is (= "fghijkl" (subs "abcdefghijkl" 5 12))) - (is (= "ghijkl" (subs "abcdefghijkl" 6))) - (is (= "" (subs "abcdefghijkl" 6 6))) - (is (= "g" (subs "abcdefghijkl" 6 7))) - (is (= "gh" (subs "abcdefghijkl" 6 8))) - (is (= "ghi" (subs "abcdefghijkl" 6 9))) - (is (= "ghij" (subs "abcdefghijkl" 6 10))) - (is (= "ghijk" (subs "abcdefghijkl" 6 11))) - (is (= "ghijkl" (subs "abcdefghijkl" 6 12))) - (is (= "hijkl" (subs "abcdefghijkl" 7))) - (is (= "" (subs "abcdefghijkl" 7 7))) - (is (= "h" (subs "abcdefghijkl" 7 8))) - (is (= "hi" (subs "abcdefghijkl" 7 9))) - (is (= "hij" (subs "abcdefghijkl" 7 10))) - (is (= "hijk" (subs "abcdefghijkl" 7 11))) - (is (= "hijkl" (subs "abcdefghijkl" 7 12))) - (is (= "ijkl" (subs "abcdefghijkl" 8))) - (is (= "" (subs "abcdefghijkl" 8 8))) - (is (= "i" (subs "abcdefghijkl" 8 9))) - (is (= "ij" (subs "abcdefghijkl" 8 10))) - (is (= "ijk" (subs "abcdefghijkl" 8 11))) - (is (= "ijkl" (subs "abcdefghijkl" 8 12))) - (is (= "jkl" (subs "abcdefghijkl" 9))) - (is (= "" (subs "abcdefghijkl" 9 9))) - (is (= "j" (subs "abcdefghijkl" 9 10))) - (is (= "jk" (subs "abcdefghijkl" 9 11))) - (is (= "jkl" (subs "abcdefghijkl" 9 12))) - (is (= "kl" (subs "abcdefghijkl" 10))) - (is (= "" (subs "abcdefghijkl" 10 10))) - (is (= "k" (subs "abcdefghijkl" 10 11))) - (is (= "kl" (subs "abcdefghijkl" 10 12))) - (is (= "l" (subs "abcdefghijkl" 11))) - (is (= "" (subs "abcdefghijkl" 11 11))) - (is (= "l" (subs "abcdefghijkl" 11 12))) - (is (= "" (subs "abcdefghijkl" 12))) - (is (= "" (subs "abcdefghijkl" 12 12))) #?@(:cljs [(is (= "b" (subs "abcde" 2 1))) (is (= "bcde" (subs "abcde" 1 6))) @@ -575,12 +21,12 @@ (is (= "ab" (subs "abcde" nil 2))) (is (= "a" (subs "abcde" 1 nil)))] :default - [(is (thrown? #?(:clj Exception) (subs "abcde" 2 1))) - (is (thrown? #?(:clj Exception) (subs "abcde" 1 6))) - (is (thrown? #?(:clj Exception) (subs "abcde" 1 200))) - (is (thrown? #?(:clj Exception) (subs "abcde" -1))) - (is (thrown? #?(:clj Exception) (subs "abcde" -1 3))) - (is (thrown? #?(:clj Exception) (subs "abcde" -1 -3))) - (is (thrown? #?(:clj Exception) (subs nil 1 2))) - (is (thrown? #?(:clj Exception) (subs "abcde" nil 2))) - (is (thrown? #?(:clj Exception) (subs "abcde" 1 nil)))]))) + [(is (thrown? Exception (subs "abcde" 2 1))) + (is (thrown? Exception (subs "abcde" 1 6))) + (is (thrown? Exception (subs "abcde" 1 200))) + (is (thrown? Exception (subs "abcde" -1))) + (is (thrown? Exception (subs "abcde" -1 3))) + (is (thrown? Exception (subs "abcde" -1 -3))) + (is (thrown? Exception (subs nil 1 2))) + (is (thrown? Exception (subs "abcde" nil 2))) + (is (thrown? Exception (subs "abcde" 1 nil)))]))) From d76831cce4cb598e3ec6096937f03ab512e43dca Mon Sep 17 00:00:00 2001 From: Ambrose Bonnaire-Sergeant Date: Fri, 7 Feb 2025 22:03:05 -0600 Subject: [PATCH 15/48] subs --- test/clojure/core_test/subs.cljc | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/test/clojure/core_test/subs.cljc b/test/clojure/core_test/subs.cljc index f2cdd42..73adbcc 100644 --- a/test/clojure/core_test/subs.cljc +++ b/test/clojure/core_test/subs.cljc @@ -4,12 +4,17 @@ (when-var-exists clojure.core/subs (deftest test-subs + (is (= "abcde" (subs "abcde" 0))) + (is (= "abcde" (subs "abcde" 0 5))) (is (= "bcde" (subs "abcde" 1))) (is (= "bcd" (subs "abcde" 1 4))) (is (= "abc" (subs "abcde" 0 3))) + (is (= "" (subs "" 0 0))) + (is (= "" (subs "" 0))) (is (= "" (subs "abcde" 0 0))) (is (= "" (subs "abcde" 5))) (is (= "" (subs "abcde" 5 5))) + (is (= "" (subs "abcde" 4 4))) #?@(:cljs [(is (= "b" (subs "abcde" 2 1))) (is (= "bcde" (subs "abcde" 1 6))) From f21c832c8aeee3b3536af9097f56877d65c4f1fe Mon Sep 17 00:00:00 2001 From: Ambrose Bonnaire-Sergeant Date: Fri, 7 Feb 2025 22:07:13 -0600 Subject: [PATCH 16/48] update build --- .github/workflows/ci.yml | 34 +++++++++++++++++----------------- .gitignore | 1 + 2 files changed, 18 insertions(+), 17 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 2218a71..70b7a27 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -19,28 +19,22 @@ jobs: steps: - name: Checkout - uses: actions/checkout@v3 + uses: actions/checkout@v4 - # It is important to install java before installing clojure tools which needs java - # exclusions: babashka, clj-kondo and cljstyle - name: Prepare java - uses: actions/setup-java@v3 + uses: actions/setup-java@v4 with: distribution: "zulu" java-version: "17" - name: Install clojure tools - uses: DeLaGuardo/setup-clojure@12.5 + uses: DeLaGuardo/setup-clojure@13.1 with: - # Install just one or all simultaneously - # The value must indicate a particular version of the tool, or use 'latest' - # to always provision the latest version cli: 1.10.1.693 # Clojure CLI based on tools.deps lein: 2.11.2 # Leiningen - # Optional step: - name: Cache clojure dependencies - uses: actions/cache@v3 + uses: actions/cache@v4 with: path: | ~/.m2/repository @@ -48,9 +42,6 @@ jobs: ~/.deps.clj # List all files containing dependencies: key: cljdeps-${{ hashFiles('project.clj') }} - # key: cljdeps-${{ hashFiles('deps.edn', 'bb.edn') }} - # key: cljdeps-${{ hashFiles('project.clj') }} - # key: cljdeps-${{ hashFiles('build.boot') }} restore-keys: cljdeps- - name: Run Tests @@ -66,16 +57,25 @@ jobs: steps: - name: Checkout - uses: actions/checkout@v3 + uses: actions/checkout@v4 - # It is important to install java before installing clojure tools which needs java - # exclusions: babashka, clj-kondo and cljstyle - name: Prepare java - uses: actions/setup-java@v3 + uses: actions/setup-java@v4 with: distribution: "zulu" java-version: "17" + - name: Cache clojure dependencies + uses: actions/cache@v4 + with: + path: | + ~/.m2/repository + ~/.gitlibs + ~/.deps.clj + # List all files containing dependencies: + key: cljsdeps-${{ hashFiles('project.clj') }} + restore-keys: cljsdeps- + - name: Prepare node uses: actions/setup-node@v4 with: diff --git a/.gitignore b/.gitignore index 655f25f..d12196d 100644 --- a/.gitignore +++ b/.gitignore @@ -17,3 +17,4 @@ pom.xml.asc .*.swp /node_modules /.shadow-cljs +.cpcache From 0877a2334a61b942088cdfec7f18d541afcf2a89 Mon Sep 17 00:00:00 2001 From: Ambrose Bonnaire-Sergeant Date: Fri, 7 Feb 2025 22:16:41 -0600 Subject: [PATCH 17/48] simplify --- .github/workflows/ci.yml | 84 +++++++--------------------------------- project.clj | 2 +- 2 files changed, 16 insertions(+), 70 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 70b7a27..1fb5e54 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -8,87 +8,33 @@ on: workflow_dispatch: # Supports manual triggering jobs: - clojure: - strategy: - matrix: - # Uncomment to enable all of them - # os: [ubuntu-latest, macOS-latest, windows-latest] - os: [ubuntu-latest] - - runs-on: ${{ matrix.os }} - + test: + runs-on: ubuntu-latest steps: - - name: Checkout - uses: actions/checkout@v4 - - - name: Prepare java - uses: actions/setup-java@v4 + - uses: actions/checkout@v4 + - uses: actions/setup-java@v4 with: - distribution: "zulu" - java-version: "17" - - - name: Install clojure tools - uses: DeLaGuardo/setup-clojure@13.1 + distribution: "temurin" + java-version: "21" + - uses: DeLaGuardo/setup-clojure@13.1 with: - cli: 1.10.1.693 # Clojure CLI based on tools.deps - lein: 2.11.2 # Leiningen - - - name: Cache clojure dependencies - uses: actions/cache@v4 + cli: 1.12.0.1501 + lein: 2.11.2 + - uses: actions/cache@v4 with: path: | ~/.m2/repository ~/.gitlibs ~/.deps.clj - # List all files containing dependencies: key: cljdeps-${{ hashFiles('project.clj') }} restore-keys: cljdeps- - - - name: Run Tests - run: lein test - clojurescript: - strategy: - matrix: - # Uncomment to enable all of them - # os: [ubuntu-latest, macOS-latest, windows-latest] - os: [ubuntu-latest] - - runs-on: ${{ matrix.os }} - - steps: - - name: Checkout - uses: actions/checkout@v4 - - - name: Prepare java - uses: actions/setup-java@v4 - with: - distribution: "zulu" - java-version: "17" - - - name: Cache clojure dependencies - uses: actions/cache@v4 - with: - path: | - ~/.m2/repository - ~/.gitlibs - ~/.deps.clj - # List all files containing dependencies: - key: cljsdeps-${{ hashFiles('project.clj') }} - restore-keys: cljsdeps- - - - name: Prepare node - uses: actions/setup-node@v4 + - uses: actions/setup-node@v4 with: node-version: "23.x" check-latest: true cache: 'npm' cache-dependency-path: "package-lock.json" - - - name: Install Node Dependencies - run: npm ci - - - name: Compile Tests - run: npm run build - - - name: Run Tests - run: npm test + - run: lein test + - run: npm ci + - run: npm run build + - run: npm test diff --git a/project.clj b/project.clj index 4a5331d..651f1eb 100644 --- a/project.clj +++ b/project.clj @@ -1,4 +1,4 @@ -(defproject clojure.core-test "0.1.0-SNAPSHOT" +(defproject io.github.jank-lang/clojure-test-suite "0.1.0-SNAPSHOT" :description "Dialect-independent tests for clojure.core, focused on locking down how Clojure JVM behaves so that other dialects to reach parity." :url "https://github.com/jank-lang/clojure.core-test" :license {:name "MPL 2.0" From 27a1af14a86cca14c76758a0e713f167bd51d527 Mon Sep 17 00:00:00 2001 From: Ambrose Bonnaire-Sergeant Date: Fri, 7 Feb 2025 22:18:38 -0600 Subject: [PATCH 18/48] update --- README.md | 2 +- package.json | 4 ++-- project.clj | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 2a67830..034af7e 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ yet, so we're just focusing on building out the test cases for now. ## How to contribute Anyone with Clojure knowledge can help out! -Check out the latest progress and the steps for helping out here: https://github.com/jank-lang/clojure.core-test/issues/1 +Check out the latest progress and the steps for helping out here: https://github.com/jank-lang/clojure-test-suite/issues/1 ## Running the tests diff --git a/package.json b/package.json index 25d8535..68b6bf5 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { - "name": "clojure.core-test", + "name": "io.github.jank-lang/clojure-test-suite", "version": "1.0.0", "description": "Node config for compiling tests to js", - "repository": "https://github.com/jank-lang/clojure.core-test", + "repository": "https://github.com/jank-lang/clojure-test-suite", "directories": { "test": "test" }, diff --git a/project.clj b/project.clj index 651f1eb..d8e3724 100644 --- a/project.clj +++ b/project.clj @@ -1,6 +1,6 @@ (defproject io.github.jank-lang/clojure-test-suite "0.1.0-SNAPSHOT" :description "Dialect-independent tests for clojure.core, focused on locking down how Clojure JVM behaves so that other dialects to reach parity." - :url "https://github.com/jank-lang/clojure.core-test" + :url "https://github.com/jank-lang/clojure-test-suite" :license {:name "MPL 2.0" :url "https://www.mozilla.org/en-US/MPL/2.0/"} :dependencies [[org.clojure/clojure "1.12.0"]] From 226cb42b3664cc64bf9a1018302cb5144b4976cb Mon Sep 17 00:00:00 2001 From: Ambrose Bonnaire-Sergeant Date: Fri, 7 Feb 2025 22:23:00 -0600 Subject: [PATCH 19/48] tests --- test/clojure/string_test/capitalize.cljc | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/test/clojure/string_test/capitalize.cljc b/test/clojure/string_test/capitalize.cljc index 8624a95..d38b331 100644 --- a/test/clojure/string_test/capitalize.cljc +++ b/test/clojure/string_test/capitalize.cljc @@ -6,12 +6,14 @@ (when-var-exists str/capitalize (deftest test-capitalize (is (thrown? #?(:cljs :default :clj Exception) (str/capitalize nil))) - (is (= "1" (str/capitalize 1))) - (is (= "Asdf" (str/capitalize 'Asdf))) - (is (= "Asdf" (str/capitalize 'Asdf))) - (is (= ":clojure.string-test.capitalize/asdf" (str/capitalize ::asdf))) - (is (= ":clojure.string-test.capitalize/asdf" (str/capitalize ::Asdf))) + #?(:cljs nil + :default (do (is (= "1" (str/capitalize 1))) + (is (= "Asdf" (str/capitalize 'Asdf))) + (is (= "Asdf" (str/capitalize 'Asdf))) + (is (= ":clojure.string-test.capitalize/asdf" (str/capitalize ::asdf))) + (is (= ":clojure.string-test.capitalize/asdf" (str/capitalize ::Asdf))))) (is (= "" (str/capitalize ""))) (is (= "A" (str/capitalize "a"))) (is (= "A thing" (str/capitalize "a Thing"))) + (is (= "A thing" (str/capitalize "A THING"))) (is (= "A thing" (str/capitalize "A thing"))))) From 58a00f7ea84985b7db554c44216fffafe8fd32bb Mon Sep 17 00:00:00 2001 From: Ambrose Bonnaire-Sergeant Date: Fri, 7 Feb 2025 22:25:46 -0600 Subject: [PATCH 20/48] wip --- .github/workflows/ci.yml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 1fb5e54..2b13354 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -7,6 +7,9 @@ on: branches: [main] workflow_dispatch: # Supports manual triggering +env: + CACHE_VERSION: "v1" + jobs: test: runs-on: ubuntu-latest @@ -26,8 +29,8 @@ jobs: ~/.m2/repository ~/.gitlibs ~/.deps.clj - key: cljdeps-${{ hashFiles('project.clj') }} - restore-keys: cljdeps- + key: cljdeps-${{ env.CACHE_VERSION }}-${{ hashFiles('project.clj') }} + restore-keys: cljdeps-${{ env.CACHE_VERSION }}- - uses: actions/setup-node@v4 with: node-version: "23.x" From 8561855df7178267644e44737d2669f83c20b2b8 Mon Sep 17 00:00:00 2001 From: Ambrose Bonnaire-Sergeant Date: Fri, 7 Feb 2025 22:27:52 -0600 Subject: [PATCH 21/48] try cache From 27fe23f1c00de12947c4ba4ff681616ca30c2915 Mon Sep 17 00:00:00 2001 From: Ambrose Bonnaire-Sergeant Date: Mon, 24 Feb 2025 15:03:29 -0600 Subject: [PATCH 22/48] move unrelated changes to another pr --- .github/workflows/ci.yml | 91 ++++++++++++++++++++++++++++-------- README.md | 8 ++-- bb.edn | 14 +----- bb/new_test.clj | 32 ++++++------- package.json | 4 +- project.clj | 4 +- templates/test-template.cljc | 7 ++- 7 files changed, 96 insertions(+), 64 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 2b13354..2218a71 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -7,37 +7,88 @@ on: branches: [main] workflow_dispatch: # Supports manual triggering -env: - CACHE_VERSION: "v1" - jobs: - test: - runs-on: ubuntu-latest + clojure: + strategy: + matrix: + # Uncomment to enable all of them + # os: [ubuntu-latest, macOS-latest, windows-latest] + os: [ubuntu-latest] + + runs-on: ${{ matrix.os }} + steps: - - uses: actions/checkout@v4 - - uses: actions/setup-java@v4 + - name: Checkout + uses: actions/checkout@v3 + + # It is important to install java before installing clojure tools which needs java + # exclusions: babashka, clj-kondo and cljstyle + - name: Prepare java + uses: actions/setup-java@v3 with: - distribution: "temurin" - java-version: "21" - - uses: DeLaGuardo/setup-clojure@13.1 + distribution: "zulu" + java-version: "17" + + - name: Install clojure tools + uses: DeLaGuardo/setup-clojure@12.5 with: - cli: 1.12.0.1501 - lein: 2.11.2 - - uses: actions/cache@v4 + # Install just one or all simultaneously + # The value must indicate a particular version of the tool, or use 'latest' + # to always provision the latest version + cli: 1.10.1.693 # Clojure CLI based on tools.deps + lein: 2.11.2 # Leiningen + + # Optional step: + - name: Cache clojure dependencies + uses: actions/cache@v3 with: path: | ~/.m2/repository ~/.gitlibs ~/.deps.clj - key: cljdeps-${{ env.CACHE_VERSION }}-${{ hashFiles('project.clj') }} - restore-keys: cljdeps-${{ env.CACHE_VERSION }}- - - uses: actions/setup-node@v4 + # List all files containing dependencies: + key: cljdeps-${{ hashFiles('project.clj') }} + # key: cljdeps-${{ hashFiles('deps.edn', 'bb.edn') }} + # key: cljdeps-${{ hashFiles('project.clj') }} + # key: cljdeps-${{ hashFiles('build.boot') }} + restore-keys: cljdeps- + + - name: Run Tests + run: lein test + clojurescript: + strategy: + matrix: + # Uncomment to enable all of them + # os: [ubuntu-latest, macOS-latest, windows-latest] + os: [ubuntu-latest] + + runs-on: ${{ matrix.os }} + + steps: + - name: Checkout + uses: actions/checkout@v3 + + # It is important to install java before installing clojure tools which needs java + # exclusions: babashka, clj-kondo and cljstyle + - name: Prepare java + uses: actions/setup-java@v3 + with: + distribution: "zulu" + java-version: "17" + + - name: Prepare node + uses: actions/setup-node@v4 with: node-version: "23.x" check-latest: true cache: 'npm' cache-dependency-path: "package-lock.json" - - run: lein test - - run: npm ci - - run: npm run build - - run: npm test + + - name: Install Node Dependencies + run: npm ci + + - name: Compile Tests + run: npm run build + + - name: Run Tests + run: npm test diff --git a/README.md b/README.md index 034af7e..0177976 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ yet, so we're just focusing on building out the test cases for now. ## How to contribute Anyone with Clojure knowledge can help out! -Check out the latest progress and the steps for helping out here: https://github.com/jank-lang/clojure-test-suite/issues/1 +Check out the latest progress and the steps for helping out here: https://github.com/jank-lang/clojure.core-test/issues/1 ## Running the tests @@ -83,8 +83,8 @@ The following tasks are available: test-jvm Runs JVM tests test-cljs Runs CLJS tests -new-test Creates new test for the Clojure symbols named by . Unqualified symbols assume clojure.core -nrepl Starts an nrepl server on port 1339 using an .nrepl-port file +new-test Creates new test for the Clojure symbols named by + ``` Currently, there are tasks to run the Clojure JVM and Clojurescript test suites. @@ -95,8 +95,6 @@ wanted to test a function named `clojure.core/foo`, for instance, you would type: ```bash -bb new-test clojure.core/foo -;; or bb new-test foo ``` diff --git a/bb.edn b/bb.edn index d2967e0..ffc15d6 100644 --- a/bb.edn +++ b/bb.edn @@ -5,16 +5,6 @@ :task (shell "lein test")} test-cljs {:doc "Runs CLJS tests" :task (shell "npx shadow-cljs compile test")} - new-test {:doc "Creates new test for the Clojure symbols named by . Unqualified symbols assume clojure.core" + new-test {:doc "Creates new test for the Clojure symbols named by " :requires ([new-test]) - :task (new-test/new-test *command-line-args*)} - nrepl {:doc "Starts an nrepl server on port 1339 using an .nrepl-port file" - :requires ([babashka.fs :as fs] - [babashka.nrepl.server :as srv]) - :task (do (srv/start-server! {:host "localhost" - :port 1339}) - (spit ".nrepl-port" "1339") - (-> (Runtime/getRuntime) - (.addShutdownHook - (Thread. (fn [] (fs/delete ".nrepl-port"))))) - (deref (promise)))}}} + :task (new-test/new-test *command-line-args*)}}} diff --git a/bb/new_test.clj b/bb/new_test.clj index c4a9ed5..d0dbb62 100644 --- a/bb/new_test.clj +++ b/bb/new_test.clj @@ -6,8 +6,8 @@ [selmer.util :as util])) ;;; *, +, !, -, _, ', ?, <, > and = -(defn sym-name->ns-suffix - "Replace special characters in symbol name to make the final component of the ns name." +(defn sym-name->ns-name + "Replace special characters in symbol name to make an ns-name." [sym] (let [n (name sym) ns-sym (-> (if (str/starts-with? n "-") @@ -26,37 +26,31 @@ (subs ns-sym 1) ns-sym))) -(defn ns-suffix->file-name +(defn ns-name->file-name "Replace hyphens with underscores to create the file name." [ns-name] (str/replace ns-name "-" "_")) -(defn ns->resource [nsym] - (-> nsym namespace-munge (str/replace "." "/"))) - (defn new-test "Create a new test file for the symbol which is the first command line argument." [args] (if (zero? (count args)) (println "Please supply one or more Clojure symbols corresponding to the new tests.") - (loop [[sym & args] (map symbol args)] - (when sym - (let [sym-name (if (namespace sym) - (-> sym name symbol) - sym) - base-ns (or (some-> sym namespace symbol) - 'clojure.core) - ns-suffix (sym-name->ns-suffix sym-name) - file-name (namespace-munge ns-suffix) - dest-file-name (format "test/%s_test/%s.cljc" (ns->resource base-ns) file-name)] + (loop [[sym-name & args] args] + (when sym-name + (let [ns-name (sym-name->ns-name sym-name) + file-name (ns-name->file-name ns-name) + dest-file-name (str "test/clojure/core_test/" file-name ".cljc")] (if (fs/exists? dest-file-name) (println dest-file-name "already exists. No action taken.") (do (println "Creating" dest-file-name) (let [template (slurp "templates/test-template.cljc")] (spit dest-file-name (util/without-escaping - (s/render template {:base-ns base-ns - :sym-name sym-name - :ns-suffix ns-suffix + (s/render template {:sym-name sym-name + :ns-name ns-name :file-name file-name}))))))) (recur args))))) + + + diff --git a/package.json b/package.json index 68b6bf5..25d8535 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { - "name": "io.github.jank-lang/clojure-test-suite", + "name": "clojure.core-test", "version": "1.0.0", "description": "Node config for compiling tests to js", - "repository": "https://github.com/jank-lang/clojure-test-suite", + "repository": "https://github.com/jank-lang/clojure.core-test", "directories": { "test": "test" }, diff --git a/project.clj b/project.clj index d8e3724..4a5331d 100644 --- a/project.clj +++ b/project.clj @@ -1,6 +1,6 @@ -(defproject io.github.jank-lang/clojure-test-suite "0.1.0-SNAPSHOT" +(defproject clojure.core-test "0.1.0-SNAPSHOT" :description "Dialect-independent tests for clojure.core, focused on locking down how Clojure JVM behaves so that other dialects to reach parity." - :url "https://github.com/jank-lang/clojure-test-suite" + :url "https://github.com/jank-lang/clojure.core-test" :license {:name "MPL 2.0" :url "https://www.mozilla.org/en-US/MPL/2.0/"} :dependencies [[org.clojure/clojure "1.12.0"]] diff --git a/templates/test-template.cljc b/templates/test-template.cljc index 2305ce1..ff6840b 100644 --- a/templates/test-template.cljc +++ b/templates/test-template.cljc @@ -1,9 +1,8 @@ -(ns {{base-ns}}-test.{{ns-suffix}} - (:require {{base-ns}} - [clojure.test :as t :refer [deftest testing is are]] +(ns clojure.core-test.{{ns-name}} + (:require [clojure.test :as t :refer [deftest testing is are]] [clojure.core-test.portability #?(:cljs :refer-macros :default :refer) [when-var-exists]])) -(when-var-exists {{base-ns}}/{{sym-name}} +(when-var-exists clojure.core/{{sym-name}} (deftest test-{{sym-name}} ;; `testing` sections are optional, depending on how you want to ;; structure your tests. If you have a lot of tests and they group From 34a6e8c50fa23ac4c6bc12ecbbd2f49ea6aa8f80 Mon Sep 17 00:00:00 2001 From: Ambrose Bonnaire-Sergeant Date: Mon, 24 Feb 2025 15:10:42 -0600 Subject: [PATCH 23/48] wip --- test/clojure/core_test/subs.cljc | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/test/clojure/core_test/subs.cljc b/test/clojure/core_test/subs.cljc index 73adbcc..a94b545 100644 --- a/test/clojure/core_test/subs.cljc +++ b/test/clojure/core_test/subs.cljc @@ -26,12 +26,12 @@ (is (= "ab" (subs "abcde" nil 2))) (is (= "a" (subs "abcde" 1 nil)))] :default - [(is (thrown? Exception (subs "abcde" 2 1))) - (is (thrown? Exception (subs "abcde" 1 6))) - (is (thrown? Exception (subs "abcde" 1 200))) - (is (thrown? Exception (subs "abcde" -1))) - (is (thrown? Exception (subs "abcde" -1 3))) - (is (thrown? Exception (subs "abcde" -1 -3))) - (is (thrown? Exception (subs nil 1 2))) - (is (thrown? Exception (subs "abcde" nil 2))) - (is (thrown? Exception (subs "abcde" 1 nil)))]))) + [(is (thrown? #?(:clj Exception) (subs "abcde" 2 1))) + (is (thrown? #?(:clj Exception) (subs "abcde" 1 6))) + (is (thrown? #?(:clj Exception) (subs "abcde" 1 200))) + (is (thrown? #?(:clj Exception) (subs "abcde" -1))) + (is (thrown? #?(:clj Exception) (subs "abcde" -1 3))) + (is (thrown? #?(:clj Exception) (subs "abcde" -1 -3))) + (is (thrown? #?(:clj Exception) (subs nil 1 2))) + (is (thrown? #?(:clj Exception) (subs "abcde" nil 2))) + (is (thrown? #?(:clj Exception) (subs "abcde" 1 nil)))]))) From 2de4dd1f3c2b4573c9df17811e17d1b2f8c6c41a Mon Sep 17 00:00:00 2001 From: Ambrose Bonnaire-Sergeant Date: Mon, 24 Feb 2025 15:12:23 -0600 Subject: [PATCH 24/48] try --- test/clojure/string_test/blank_qmark.cljc | 1 + 1 file changed, 1 insertion(+) diff --git a/test/clojure/string_test/blank_qmark.cljc b/test/clojure/string_test/blank_qmark.cljc index 96c3537..f16d456 100644 --- a/test/clojure/string_test/blank_qmark.cljc +++ b/test/clojure/string_test/blank_qmark.cljc @@ -9,5 +9,6 @@ (is (str/blank? nil)) (is (str/blank? " ")) (is (str/blank? " \t ")) + (is (thrown? #?(:cljs :default :clj Exception) (str/blank? (symbol "")))) (is (not (str/blank? "nil"))) (is (not (str/blank? " as df "))))) From 82404851406184e382f4e2c591dd746e907fbe84 Mon Sep 17 00:00:00 2001 From: Ambrose Bonnaire-Sergeant Date: Mon, 24 Feb 2025 15:15:04 -0600 Subject: [PATCH 25/48] try --- test/clojure/string_test/blank_qmark.cljc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test/clojure/string_test/blank_qmark.cljc b/test/clojure/string_test/blank_qmark.cljc index f16d456..b16d4c3 100644 --- a/test/clojure/string_test/blank_qmark.cljc +++ b/test/clojure/string_test/blank_qmark.cljc @@ -9,6 +9,7 @@ (is (str/blank? nil)) (is (str/blank? " ")) (is (str/blank? " \t ")) - (is (thrown? #?(:cljs :default :clj Exception) (str/blank? (symbol "")))) + #?(:cljs (is (not (str/blank? (symbol "")))) + :default (is (thrown? #?(:clj Exception) (str/blank? (symbol ""))))) (is (not (str/blank? "nil"))) (is (not (str/blank? " as df "))))) From 2c23802be726096b2f20067fa9104183b9a4681b Mon Sep 17 00:00:00 2001 From: Ambrose Bonnaire-Sergeant Date: Mon, 24 Feb 2025 15:19:38 -0600 Subject: [PATCH 26/48] more --- test/clojure/string_test/blank_qmark.cljc | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/test/clojure/string_test/blank_qmark.cljc b/test/clojure/string_test/blank_qmark.cljc index b16d4c3..bd7122a 100644 --- a/test/clojure/string_test/blank_qmark.cljc +++ b/test/clojure/string_test/blank_qmark.cljc @@ -9,7 +9,14 @@ (is (str/blank? nil)) (is (str/blank? " ")) (is (str/blank? " \t ")) - #?(:cljs (is (not (str/blank? (symbol "")))) + #?(:cljs (is (str/blank? (symbol ""))) :default (is (thrown? #?(:clj Exception) (str/blank? (symbol ""))))) + #?(:cljs (is (str/blank? (keyword ""))) + :default (is (thrown? #?(:clj Exception) (str/blank? (keyword ""))))) + #?(:cljs (is (not (str/blank? 1))) + :default (is (thrown? #?(:clj Exception) (str/blank? 1)))) + #?(:cljs (is (str/blank? \space)) + :default (is (thrown? #?(:clj Exception) (str/blank? \space)))) + (is (not (str/blank? "nil"))) (is (not (str/blank? "nil"))) (is (not (str/blank? " as df "))))) From 3c24bb28c03b42d03e89864e91d04199ecd77702 Mon Sep 17 00:00:00 2001 From: Ambrose Bonnaire-Sergeant Date: Mon, 24 Feb 2025 15:21:51 -0600 Subject: [PATCH 27/48] wip --- test/clojure/string_test/blank_qmark.cljc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/clojure/string_test/blank_qmark.cljc b/test/clojure/string_test/blank_qmark.cljc index bd7122a..0fec284 100644 --- a/test/clojure/string_test/blank_qmark.cljc +++ b/test/clojure/string_test/blank_qmark.cljc @@ -11,7 +11,7 @@ (is (str/blank? " \t ")) #?(:cljs (is (str/blank? (symbol ""))) :default (is (thrown? #?(:clj Exception) (str/blank? (symbol ""))))) - #?(:cljs (is (str/blank? (keyword ""))) + #?(:cljs (is (not (str/blank? (keyword "")))) :default (is (thrown? #?(:clj Exception) (str/blank? (keyword ""))))) #?(:cljs (is (not (str/blank? 1))) :default (is (thrown? #?(:clj Exception) (str/blank? 1)))) From 8b4c8ce461a41933ec6840c29b719ed6f14313a8 Mon Sep 17 00:00:00 2001 From: Ambrose Bonnaire-Sergeant Date: Mon, 24 Feb 2025 15:22:45 -0600 Subject: [PATCH 28/48] wip --- test/clojure/string_test/blank_qmark.cljc | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/test/clojure/string_test/blank_qmark.cljc b/test/clojure/string_test/blank_qmark.cljc index 0fec284..65b016b 100644 --- a/test/clojure/string_test/blank_qmark.cljc +++ b/test/clojure/string_test/blank_qmark.cljc @@ -9,14 +9,16 @@ (is (str/blank? nil)) (is (str/blank? " ")) (is (str/blank? " \t ")) - #?(:cljs (is (str/blank? (symbol ""))) + #?(:cljs (do (is (str/blank? (symbol ""))) + (is (not (str/blank? 'a)))) :default (is (thrown? #?(:clj Exception) (str/blank? (symbol ""))))) - #?(:cljs (is (not (str/blank? (keyword "")))) + #?(:cljs (do (is (not (str/blank? (keyword "")))) + (is (not (str/blank? :a)))) :default (is (thrown? #?(:clj Exception) (str/blank? (keyword ""))))) #?(:cljs (is (not (str/blank? 1))) :default (is (thrown? #?(:clj Exception) (str/blank? 1)))) - #?(:cljs (is (str/blank? \space)) + #?(:cljs (do (is (str/blank? \space)) + (is (str/blank? \a))) :default (is (thrown? #?(:clj Exception) (str/blank? \space)))) (is (not (str/blank? "nil"))) - (is (not (str/blank? "nil"))) (is (not (str/blank? " as df "))))) From 4722dbe100ac99e75707e924dee8cc673fe4ef97 Mon Sep 17 00:00:00 2001 From: Ambrose Bonnaire-Sergeant Date: Mon, 24 Feb 2025 15:26:33 -0600 Subject: [PATCH 29/48] test return --- test/clojure/string_test/blank_qmark.cljc | 26 +++++++++++------------ 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/test/clojure/string_test/blank_qmark.cljc b/test/clojure/string_test/blank_qmark.cljc index 65b016b..53cb09a 100644 --- a/test/clojure/string_test/blank_qmark.cljc +++ b/test/clojure/string_test/blank_qmark.cljc @@ -5,20 +5,20 @@ (when-var-exists str/blank? (deftest test-blank? - (is (str/blank? "")) - (is (str/blank? nil)) - (is (str/blank? " ")) - (is (str/blank? " \t ")) - #?(:cljs (do (is (str/blank? (symbol ""))) - (is (not (str/blank? 'a)))) + (is (true? (str/blank? ""))) + (is (true? (str/blank? nil))) + (is (true? (str/blank? " "))) + (is (true? (str/blank? " \t "))) + #?(:cljs (do (is (true? (str/blank? (symbol "")))) + (is (false? (str/blank? 'a)))) :default (is (thrown? #?(:clj Exception) (str/blank? (symbol ""))))) - #?(:cljs (do (is (not (str/blank? (keyword "")))) - (is (not (str/blank? :a)))) + #?(:cljs (do (is (false? (str/blank? (keyword "")))) + (is (false? (str/blank? :a)))) :default (is (thrown? #?(:clj Exception) (str/blank? (keyword ""))))) - #?(:cljs (is (not (str/blank? 1))) + #?(:cljs (is (false? (str/blank? 1))) :default (is (thrown? #?(:clj Exception) (str/blank? 1)))) - #?(:cljs (do (is (str/blank? \space)) - (is (str/blank? \a))) + #?(:cljs (do (is (true? (str/blank? \space))) + (is (true? (str/blank? \a)))) :default (is (thrown? #?(:clj Exception) (str/blank? \space)))) - (is (not (str/blank? "nil"))) - (is (not (str/blank? " as df "))))) + (is (false? (str/blank? "nil"))) + (is (false? (str/blank? " as df "))))) From d0f0503702b1bf528cd49cf4904ffc67f2ed2e5c Mon Sep 17 00:00:00 2001 From: Ambrose Bonnaire-Sergeant Date: Mon, 24 Feb 2025 15:30:45 -0600 Subject: [PATCH 30/48] try --- test/clojure/string_test/ends_with_qmark.cljc | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/test/clojure/string_test/ends_with_qmark.cljc b/test/clojure/string_test/ends_with_qmark.cljc index 22bb83a..b9e1395 100644 --- a/test/clojure/string_test/ends_with_qmark.cljc +++ b/test/clojure/string_test/ends_with_qmark.cljc @@ -5,6 +5,9 @@ (when-var-exists str/ends-with? (deftest test-ends-with? - (is (str/ends-with? "" "")) - (is (str/ends-with? "a-test" "t")) - (is (not (str/ends-with? "a-test" "s"))))) + (is (true? (str/ends-with? "" ""))) + #?(:cljs (is (false? (str/ends-with? "" nil))) + :default (is (thrown? #?(:clj Exception) (str/ends-with? "" nil)))) + (is (false? (str/ends-with? "" "a"))) + (is (true? (str/ends-with? "a-test" "t"))) + (is (false? (str/ends-with? "a-test" "s"))))) From 0bdbd6cba0d140b0489e904ed87d24a12ea27989 Mon Sep 17 00:00:00 2001 From: Ambrose Bonnaire-Sergeant Date: Mon, 24 Feb 2025 15:33:31 -0600 Subject: [PATCH 31/48] stuff --- test/clojure/string_test/ends_with_qmark.cljc | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/test/clojure/string_test/ends_with_qmark.cljc b/test/clojure/string_test/ends_with_qmark.cljc index b9e1395..7f39ff1 100644 --- a/test/clojure/string_test/ends_with_qmark.cljc +++ b/test/clojure/string_test/ends_with_qmark.cljc @@ -8,6 +8,11 @@ (is (true? (str/ends-with? "" ""))) #?(:cljs (is (false? (str/ends-with? "" nil))) :default (is (thrown? #?(:clj Exception) (str/ends-with? "" nil)))) + #?(:cljs (is (true? (str/ends-with? "a" :a))) + :default (is (thrown? #?(:clj Exception) (str/ends-with? "a" :a)))) + #?(:cljs (is (true? (str/ends-with? "a" 'a))) + :default (is (thrown? #?(:clj Exception) (str/ends-with? "a" 'a)))) (is (false? (str/ends-with? "" "a"))) + (is (true? (str/ends-with? "a-test" ""))) (is (true? (str/ends-with? "a-test" "t"))) (is (false? (str/ends-with? "a-test" "s"))))) From 24092019c971580dba1634e76ccf1b9befeaaf07 Mon Sep 17 00:00:00 2001 From: Ambrose Bonnaire-Sergeant Date: Mon, 24 Feb 2025 15:38:07 -0600 Subject: [PATCH 32/48] more --- test/clojure/string_test/ends_with_qmark.cljc | 20 ++++++++++++---- .../string_test/starts_with_qmark.cljc | 23 ++++++++++++++++--- 2 files changed, 35 insertions(+), 8 deletions(-) diff --git a/test/clojure/string_test/ends_with_qmark.cljc b/test/clojure/string_test/ends_with_qmark.cljc index 7f39ff1..23f208b 100644 --- a/test/clojure/string_test/ends_with_qmark.cljc +++ b/test/clojure/string_test/ends_with_qmark.cljc @@ -8,11 +8,21 @@ (is (true? (str/ends-with? "" ""))) #?(:cljs (is (false? (str/ends-with? "" nil))) :default (is (thrown? #?(:clj Exception) (str/ends-with? "" nil)))) - #?(:cljs (is (true? (str/ends-with? "a" :a))) - :default (is (thrown? #?(:clj Exception) (str/ends-with? "a" :a)))) - #?(:cljs (is (true? (str/ends-with? "a" 'a))) - :default (is (thrown? #?(:clj Exception) (str/ends-with? "a" 'a)))) + #?(:cljs (do (is (true? (str/ends-with? "ab" :b))) + (is (false? (str/ends-with? "ab" :a)))) + :default (is (thrown? #?(:clj Exception) (str/ends-with? "ab" :b)))) + #?(:cljs (do (is (true? (str/ends-with? "ab" 'b))) + (is (false? (str/ends-with? "ab" 'a)))) + :default (is (thrown? #?(:clj Exception) (str/ends-with? "ab" 'b)))) + #?(:cljs (do (is (true? (str/ends-with? 'ab "b"))) + (is (false? (str/ends-with? 'ab "a")))) + :default (is (thrown? #?(:clj Exception) (str/ends-with? 'ab "b")))) + #?(:cljs (do (is (true? (str/ends-with? :ab "b"))) + (is (false? (str/ends-with? :ab "a")))) + :default (is (thrown? #?(:clj Exception) (str/ends-with? :ab "b")))) (is (false? (str/ends-with? "" "a"))) (is (true? (str/ends-with? "a-test" ""))) (is (true? (str/ends-with? "a-test" "t"))) - (is (false? (str/ends-with? "a-test" "s"))))) + (is (true? (str/ends-with? "a-test" "a-test"))) + (is (false? (str/ends-with? "a-test" "s"))) + (is (false? (str/ends-with? "a-test" "a"))))) diff --git a/test/clojure/string_test/starts_with_qmark.cljc b/test/clojure/string_test/starts_with_qmark.cljc index b3241de..3be3b15 100644 --- a/test/clojure/string_test/starts_with_qmark.cljc +++ b/test/clojure/string_test/starts_with_qmark.cljc @@ -5,6 +5,23 @@ (when-var-exists str/starts-with? (deftest test-starts-with? - (is (str/starts-with? "" "")) - (is (str/starts-with? "a-test" "a")) - (is (not (str/starts-with? "a-test" "b"))))) + (is (true? (str/starts-with? "" ""))) + #?(:cljs (is (false? (str/starts-with? "" nil))) + :default (is (thrown? #?(:clj Exception) (str/starts-with? "" nil)))) + #?(:cljs (do (is (true? (str/starts-with? "ab" :a))) + (is (false? (str/starts-with? "ab" :b)))) + :default (is (thrown? #?(:clj Exception) (str/starts-with? "ab" :a)))) + #?(:cljs (is (true? (str/starts-with? "ab" 'a))) + :default (is (thrown? #?(:clj Exception) (str/starts-with? "a" 'a)))) + #?(:cljs (do (is (false? (str/starts-with? 'ab "b"))) + (is (true? (str/starts-with? 'ab "a")))) + :default (is (thrown? #?(:clj Exception) (str/starts-with? 'ab "b")))) + #?(:cljs (do (is (false? (str/starts-with? :ab "b"))) + (is (true? (str/starts-with? :ab "a")))) + :default (is (thrown? #?(:clj Exception) (str/starts-with? :ab "b")))) + (is (false? (str/starts-with? "" "a"))) + (is (true? (str/starts-with? "a-test" ""))) + (is (true? (str/starts-with? "a-test" "a"))) + (is (true? (str/starts-with? "a-test" "a-test"))) + (is (false? (str/starts-with? "a-test" "-"))) + (is (false? (str/starts-with? "a-test" "t")))) From ef842235f0ff052f30572aec024ae563b9e4d1fe Mon Sep 17 00:00:00 2001 From: Ambrose Bonnaire-Sergeant Date: Mon, 24 Feb 2025 15:38:25 -0600 Subject: [PATCH 33/48] fix --- test/clojure/string_test/starts_with_qmark.cljc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/clojure/string_test/starts_with_qmark.cljc b/test/clojure/string_test/starts_with_qmark.cljc index 3be3b15..79cbe89 100644 --- a/test/clojure/string_test/starts_with_qmark.cljc +++ b/test/clojure/string_test/starts_with_qmark.cljc @@ -24,4 +24,4 @@ (is (true? (str/starts-with? "a-test" "a"))) (is (true? (str/starts-with? "a-test" "a-test"))) (is (false? (str/starts-with? "a-test" "-"))) - (is (false? (str/starts-with? "a-test" "t")))) + (is (false? (str/starts-with? "a-test" "t"))))) From e2d247ed0003c8d543657d753de2a0738f03cd1e Mon Sep 17 00:00:00 2001 From: Ambrose Bonnaire-Sergeant Date: Mon, 24 Feb 2025 15:42:57 -0600 Subject: [PATCH 34/48] nil --- test/clojure/string_test/ends_with_qmark.cljc | 14 ++++++++------ test/clojure/string_test/starts_with_qmark.cljc | 15 +++++++++------ 2 files changed, 17 insertions(+), 12 deletions(-) diff --git a/test/clojure/string_test/ends_with_qmark.cljc b/test/clojure/string_test/ends_with_qmark.cljc index 23f208b..51a21a2 100644 --- a/test/clojure/string_test/ends_with_qmark.cljc +++ b/test/clojure/string_test/ends_with_qmark.cljc @@ -8,18 +8,20 @@ (is (true? (str/ends-with? "" ""))) #?(:cljs (is (false? (str/ends-with? "" nil))) :default (is (thrown? #?(:clj Exception) (str/ends-with? "" nil)))) + #?(:cljs (do (is (true? (str/ends-with? nil ""))) + (is (true? (str/ends-with? nil "l"))) + (is (false? (str/ends-with? nil "n")))) + :default (is (thrown? #?(:clj Exception) (str/ends-with? nil "")))) #?(:cljs (do (is (true? (str/ends-with? "ab" :b))) (is (false? (str/ends-with? "ab" :a)))) :default (is (thrown? #?(:clj Exception) (str/ends-with? "ab" :b)))) #?(:cljs (do (is (true? (str/ends-with? "ab" 'b))) (is (false? (str/ends-with? "ab" 'a)))) :default (is (thrown? #?(:clj Exception) (str/ends-with? "ab" 'b)))) - #?(:cljs (do (is (true? (str/ends-with? 'ab "b"))) - (is (false? (str/ends-with? 'ab "a")))) - :default (is (thrown? #?(:clj Exception) (str/ends-with? 'ab "b")))) - #?(:cljs (do (is (true? (str/ends-with? :ab "b"))) - (is (false? (str/ends-with? :ab "a")))) - :default (is (thrown? #?(:clj Exception) (str/ends-with? :ab "b")))) + (is (true? (str/ends-with? 'ab "b"))) + (is (false? (str/ends-with? 'ab "a"))) + (is (true? (str/ends-with? :ab "b"))) + (is (false? (str/ends-with? :ab "a"))) (is (false? (str/ends-with? "" "a"))) (is (true? (str/ends-with? "a-test" ""))) (is (true? (str/ends-with? "a-test" "t"))) diff --git a/test/clojure/string_test/starts_with_qmark.cljc b/test/clojure/string_test/starts_with_qmark.cljc index 79cbe89..044e397 100644 --- a/test/clojure/string_test/starts_with_qmark.cljc +++ b/test/clojure/string_test/starts_with_qmark.cljc @@ -8,17 +8,20 @@ (is (true? (str/starts-with? "" ""))) #?(:cljs (is (false? (str/starts-with? "" nil))) :default (is (thrown? #?(:clj Exception) (str/starts-with? "" nil)))) + #?(:cljs (do (is (true? (str/starts-with? nil ""))) + (is (true? (str/starts-with? nil "n"))) + (is (true? (str/starts-with? nil "l")))) + :default (is (thrown? #?(:clj Exception) (str/starts-with? nil "")))) #?(:cljs (do (is (true? (str/starts-with? "ab" :a))) (is (false? (str/starts-with? "ab" :b)))) :default (is (thrown? #?(:clj Exception) (str/starts-with? "ab" :a)))) #?(:cljs (is (true? (str/starts-with? "ab" 'a))) :default (is (thrown? #?(:clj Exception) (str/starts-with? "a" 'a)))) - #?(:cljs (do (is (false? (str/starts-with? 'ab "b"))) - (is (true? (str/starts-with? 'ab "a")))) - :default (is (thrown? #?(:clj Exception) (str/starts-with? 'ab "b")))) - #?(:cljs (do (is (false? (str/starts-with? :ab "b"))) - (is (true? (str/starts-with? :ab "a")))) - :default (is (thrown? #?(:clj Exception) (str/starts-with? :ab "b")))) + (is (false? (str/starts-with? 'ab "b"))) + (is (true? (str/starts-with? 'ab "a"))) + (is (false? (str/starts-with? :ab "b"))) + (is (false? (str/starts-with? :ab "a"))) + (is (true? (str/starts-with? :ab ":a"))) (is (false? (str/starts-with? "" "a"))) (is (true? (str/starts-with? "a-test" ""))) (is (true? (str/starts-with? "a-test" "a"))) From b4716140a0946b71efd78fa3bd6e94236b2c1afe Mon Sep 17 00:00:00 2001 From: Ambrose Bonnaire-Sergeant Date: Mon, 24 Feb 2025 15:47:35 -0600 Subject: [PATCH 35/48] wip --- test/clojure/string_test/blank_qmark.cljc | 2 +- test/clojure/string_test/ends_with_qmark.cljc | 9 +++------ test/clojure/string_test/lower_case.cljc | 1 - 3 files changed, 4 insertions(+), 8 deletions(-) diff --git a/test/clojure/string_test/blank_qmark.cljc b/test/clojure/string_test/blank_qmark.cljc index 53cb09a..1d253b6 100644 --- a/test/clojure/string_test/blank_qmark.cljc +++ b/test/clojure/string_test/blank_qmark.cljc @@ -18,7 +18,7 @@ #?(:cljs (is (false? (str/blank? 1))) :default (is (thrown? #?(:clj Exception) (str/blank? 1)))) #?(:cljs (do (is (true? (str/blank? \space))) - (is (true? (str/blank? \a)))) + (is (false? (str/blank? \a)))) :default (is (thrown? #?(:clj Exception) (str/blank? \space)))) (is (false? (str/blank? "nil"))) (is (false? (str/blank? " as df "))))) diff --git a/test/clojure/string_test/ends_with_qmark.cljc b/test/clojure/string_test/ends_with_qmark.cljc index 51a21a2..663ecf6 100644 --- a/test/clojure/string_test/ends_with_qmark.cljc +++ b/test/clojure/string_test/ends_with_qmark.cljc @@ -8,19 +8,16 @@ (is (true? (str/ends-with? "" ""))) #?(:cljs (is (false? (str/ends-with? "" nil))) :default (is (thrown? #?(:clj Exception) (str/ends-with? "" nil)))) - #?(:cljs (do (is (true? (str/ends-with? nil ""))) - (is (true? (str/ends-with? nil "l"))) - (is (false? (str/ends-with? nil "n")))) - :default (is (thrown? #?(:clj Exception) (str/ends-with? nil "")))) + (is (thrown? #?(:clj Exception) (str/ends-with? nil ""))) #?(:cljs (do (is (true? (str/ends-with? "ab" :b))) (is (false? (str/ends-with? "ab" :a)))) :default (is (thrown? #?(:clj Exception) (str/ends-with? "ab" :b)))) #?(:cljs (do (is (true? (str/ends-with? "ab" 'b))) (is (false? (str/ends-with? "ab" 'a)))) :default (is (thrown? #?(:clj Exception) (str/ends-with? "ab" 'b)))) - (is (true? (str/ends-with? 'ab "b"))) + (is (#?(:cljs false? :default true?) (str/ends-with? 'ab "b"))) (is (false? (str/ends-with? 'ab "a"))) - (is (true? (str/ends-with? :ab "b"))) + (is (#?(:cljs false? :default true?) (str/ends-with? :ab "b"))) (is (false? (str/ends-with? :ab "a"))) (is (false? (str/ends-with? "" "a"))) (is (true? (str/ends-with? "a-test" ""))) diff --git a/test/clojure/string_test/lower_case.cljc b/test/clojure/string_test/lower_case.cljc index 5d11609..ae8c465 100644 --- a/test/clojure/string_test/lower_case.cljc +++ b/test/clojure/string_test/lower_case.cljc @@ -8,7 +8,6 @@ (is (= "" (str/lower-case ""))) (is (= "asdf" (str/lower-case "ASDF"))) (is (= "asdf" (str/lower-case "asdf"))) - (is (string? (str/lower-case "asdf"))) (let [s "ASDF"] (is (= "asdf" (str/lower-case "ASDF"))) (is (= "ASDF" s) "original string mutated")))) From a0ad8261ec4bec4a48b83fcbb8372f1e68eb9d71 Mon Sep 17 00:00:00 2001 From: Ambrose Bonnaire-Sergeant Date: Mon, 24 Feb 2025 15:51:06 -0600 Subject: [PATCH 36/48] wip --- test/clojure/string_test/upper_case.cljc | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/test/clojure/string_test/upper_case.cljc b/test/clojure/string_test/upper_case.cljc index 73bcc24..2274ee0 100644 --- a/test/clojure/string_test/upper_case.cljc +++ b/test/clojure/string_test/upper_case.cljc @@ -5,10 +5,13 @@ (when-var-exists str/upper-case (deftest test-upper-case + (is (thrown? #?(:clj Exception) (str/upper-case nil))) (is (= "" (str/upper-case ""))) - (is (= "ASDF" (str/upper-case "asdf"))) + (is (= "ASDF" (str/upper-case "aSDf"))) (is (= "ASDF" (str/upper-case "ASDF"))) - (is (string? (str/upper-case "ASDF"))) (let [s "asdf"] (is (= "ASDF" (str/upper-case "asdf"))) - (is (= "asdf" s) "original string mutated")))) + (is (= "asdf" s) "original string mutated")) + (is (= ":ASDF" (str/upper-case :asdf))) + (is (= ":ASDF/ASDF" (str/upper-case :asdf/asdf))) + (is (= "ASDF" (str/upper-case 'asdf))))) From 73e0fcf7349d27371b7d17216716507b4493a14d Mon Sep 17 00:00:00 2001 From: Ambrose Bonnaire-Sergeant Date: Mon, 24 Feb 2025 15:53:11 -0600 Subject: [PATCH 37/48] wip --- test/clojure/string_test/lower_case.cljc | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/test/clojure/string_test/lower_case.cljc b/test/clojure/string_test/lower_case.cljc index ae8c465..76d94be 100644 --- a/test/clojure/string_test/lower_case.cljc +++ b/test/clojure/string_test/lower_case.cljc @@ -5,9 +5,13 @@ (when-var-exists str/lower-case (deftest test-lower-case + (is (thrown? #?(:clj Exception) (str/lower-case nil))) (is (= "" (str/lower-case ""))) - (is (= "asdf" (str/lower-case "ASDF"))) + (is (= "asdf" (str/lower-case "AsdF"))) (is (= "asdf" (str/lower-case "asdf"))) (let [s "ASDF"] (is (= "asdf" (str/lower-case "ASDF"))) - (is (= "ASDF" s) "original string mutated")))) + (is (= "ASDF" s) "original string mutated")) + (is (= ":asdf" (str/upper-case :ASDF))) + (is (= ":asdf/asdf" (str/upper-case :ASDF/ASDF))) + (is (= "sdf" (str/upper-case 'ASDF))))) From 39466776dd1346a027bb7cc6319264c63706d725 Mon Sep 17 00:00:00 2001 From: Ambrose Bonnaire-Sergeant Date: Mon, 24 Feb 2025 15:54:20 -0600 Subject: [PATCH 38/48] wip --- test/clojure/string_test/ends_with_qmark.cljc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test/clojure/string_test/ends_with_qmark.cljc b/test/clojure/string_test/ends_with_qmark.cljc index 663ecf6..d978200 100644 --- a/test/clojure/string_test/ends_with_qmark.cljc +++ b/test/clojure/string_test/ends_with_qmark.cljc @@ -8,7 +8,8 @@ (is (true? (str/ends-with? "" ""))) #?(:cljs (is (false? (str/ends-with? "" nil))) :default (is (thrown? #?(:clj Exception) (str/ends-with? "" nil)))) - (is (thrown? #?(:clj Exception) (str/ends-with? nil ""))) + #?(:cljs (is (false? (str/ends-with? nil ""))) + :default (is (thrown? #?(:clj Exception) (str/ends-with? nil "")))) #?(:cljs (do (is (true? (str/ends-with? "ab" :b))) (is (false? (str/ends-with? "ab" :a)))) :default (is (thrown? #?(:clj Exception) (str/ends-with? "ab" :b)))) From d558584b30037bf26c53d2c5bca56e8aded42475 Mon Sep 17 00:00:00 2001 From: Ambrose Bonnaire-Sergeant Date: Mon, 24 Feb 2025 16:13:48 -0600 Subject: [PATCH 39/48] wip --- test/clojure/string_test/ends_with_qmark.cljc | 11 +++---- test/clojure/string_test/lower_case.cljc | 11 ++++--- .../string_test/starts_with_qmark.cljc | 29 ++++++++++++------- test/clojure/string_test/upper_case.cljc | 13 ++++++--- 4 files changed, 38 insertions(+), 26 deletions(-) diff --git a/test/clojure/string_test/ends_with_qmark.cljc b/test/clojure/string_test/ends_with_qmark.cljc index d978200..8b0a48c 100644 --- a/test/clojure/string_test/ends_with_qmark.cljc +++ b/test/clojure/string_test/ends_with_qmark.cljc @@ -6,15 +6,12 @@ (when-var-exists str/ends-with? (deftest test-ends-with? (is (true? (str/ends-with? "" ""))) - #?(:cljs (is (false? (str/ends-with? "" nil))) - :default (is (thrown? #?(:clj Exception) (str/ends-with? "" nil)))) - #?(:cljs (is (false? (str/ends-with? nil ""))) - :default (is (thrown? #?(:clj Exception) (str/ends-with? nil "")))) - #?(:cljs (do (is (true? (str/ends-with? "ab" :b))) + (is (thrown? #?(:cljs :default :clj Exception) (str/ends-with? "" nil))) + (is (thrown? #?(:cljs :default :clj Exception) (str/ends-with? nil ""))) + #?(:cljs (do (is (false? (str/ends-with? "ab" :b))) (is (false? (str/ends-with? "ab" :a)))) :default (is (thrown? #?(:clj Exception) (str/ends-with? "ab" :b)))) - #?(:cljs (do (is (true? (str/ends-with? "ab" 'b))) - (is (false? (str/ends-with? "ab" 'a)))) + #?(:cljs (is (false? (str/ends-with? "ab" 'b))) :default (is (thrown? #?(:clj Exception) (str/ends-with? "ab" 'b)))) (is (#?(:cljs false? :default true?) (str/ends-with? 'ab "b"))) (is (false? (str/ends-with? 'ab "a"))) diff --git a/test/clojure/string_test/lower_case.cljc b/test/clojure/string_test/lower_case.cljc index 76d94be..a55c98b 100644 --- a/test/clojure/string_test/lower_case.cljc +++ b/test/clojure/string_test/lower_case.cljc @@ -5,13 +5,16 @@ (when-var-exists str/lower-case (deftest test-lower-case - (is (thrown? #?(:clj Exception) (str/lower-case nil))) + (is (thrown? #?(:cljs :default :clj Exception) (str/lower-case nil))) (is (= "" (str/lower-case ""))) (is (= "asdf" (str/lower-case "AsdF"))) (is (= "asdf" (str/lower-case "asdf"))) (let [s "ASDF"] (is (= "asdf" (str/lower-case "ASDF"))) (is (= "ASDF" s) "original string mutated")) - (is (= ":asdf" (str/upper-case :ASDF))) - (is (= ":asdf/asdf" (str/upper-case :ASDF/ASDF))) - (is (= "sdf" (str/upper-case 'ASDF))))) + #?(:cljs (is (thrown? :default (str/lower-case :ASDF))) + :default (is (= ":asdf" (str/lower-case :ASDF)))) + #?(:cljs (is (thrown? :default (str/lower-case :ASDF/ASDF))) + :default (is (= ":asdf/asdf" (str/lower-case :ASDF/ASDF)))) + #?(:cljs (is (thrown? :default (str/lower-case 'ASDF))) + :default (is (= "asdf" (str/lower-case 'ASDF)))))) diff --git a/test/clojure/string_test/starts_with_qmark.cljc b/test/clojure/string_test/starts_with_qmark.cljc index 044e397..0107d18 100644 --- a/test/clojure/string_test/starts_with_qmark.cljc +++ b/test/clojure/string_test/starts_with_qmark.cljc @@ -8,23 +8,30 @@ (is (true? (str/starts-with? "" ""))) #?(:cljs (is (false? (str/starts-with? "" nil))) :default (is (thrown? #?(:clj Exception) (str/starts-with? "" nil)))) - #?(:cljs (do (is (true? (str/starts-with? nil ""))) - (is (true? (str/starts-with? nil "n"))) - (is (true? (str/starts-with? nil "l")))) - :default (is (thrown? #?(:clj Exception) (str/starts-with? nil "")))) - #?(:cljs (do (is (true? (str/starts-with? "ab" :a))) + (is (thrown? #?(:cljs :default :clj Exception) (str/starts-with? nil ""))) + #?(:cljs (do (is (false? (str/starts-with? "ab" :a))) + (is (true? (str/starts-with? ":ab" :a))) (is (false? (str/starts-with? "ab" :b)))) :default (is (thrown? #?(:clj Exception) (str/starts-with? "ab" :a)))) #?(:cljs (is (true? (str/starts-with? "ab" 'a))) :default (is (thrown? #?(:clj Exception) (str/starts-with? "a" 'a)))) - (is (false? (str/starts-with? 'ab "b"))) - (is (true? (str/starts-with? 'ab "a"))) - (is (false? (str/starts-with? :ab "b"))) - (is (false? (str/starts-with? :ab "a"))) - (is (true? (str/starts-with? :ab ":a"))) (is (false? (str/starts-with? "" "a"))) (is (true? (str/starts-with? "a-test" ""))) (is (true? (str/starts-with? "a-test" "a"))) (is (true? (str/starts-with? "a-test" "a-test"))) (is (false? (str/starts-with? "a-test" "-"))) - (is (false? (str/starts-with? "a-test" "t"))))) + (is (false? (str/starts-with? "a-test" "t"))) + #?(:cljs (is (thrown? :default (str/starts-with? 'ab ":a"))) + :default (do (is (false? (str/starts-with? 'ab "b"))) + (is (true? (str/starts-with? 'ab "a"))))) + #?(:cljs (is (thrown? :default (str/starts-with? :ab ":a"))) + :default (do (is (false? (str/starts-with? :ab "b"))) + (is (false? (str/starts-with? :ab "a"))) + (is (true? (str/starts-with? :ab ":a"))))) + #?(:cljs (is (thrown? :default (str/starts-with? 'a/b ":a"))) + :default (do (is (false? (str/starts-with? 'a/b "b"))) + (is (true? (str/starts-with? 'a/b "a"))))) + #?(:cljs (is (thrown? :default (str/starts-with? :a/b ":a"))) + :default (do (is (false? (str/starts-with? :a/b "b"))) + (is (false? (str/starts-with? :a/b "a"))) + (is (true? (str/starts-with? :a/b ":a"))))))) diff --git a/test/clojure/string_test/upper_case.cljc b/test/clojure/string_test/upper_case.cljc index 2274ee0..070ac56 100644 --- a/test/clojure/string_test/upper_case.cljc +++ b/test/clojure/string_test/upper_case.cljc @@ -5,13 +5,18 @@ (when-var-exists str/upper-case (deftest test-upper-case - (is (thrown? #?(:clj Exception) (str/upper-case nil))) + (is (thrown? #?(:cljs :default :clj Exception) (str/upper-case nil))) (is (= "" (str/upper-case ""))) (is (= "ASDF" (str/upper-case "aSDf"))) (is (= "ASDF" (str/upper-case "ASDF"))) (let [s "asdf"] (is (= "ASDF" (str/upper-case "asdf"))) (is (= "asdf" s) "original string mutated")) - (is (= ":ASDF" (str/upper-case :asdf))) - (is (= ":ASDF/ASDF" (str/upper-case :asdf/asdf))) - (is (= "ASDF" (str/upper-case 'asdf))))) + #?(:cljs (is (thrown? :default (str/upper-case :asdf))) + :default (is (= ":ASDF" (str/upper-case :asdf)))) + #?(:cljs (is (thrown? :default (str/upper-case :asdf/asdf))) + :default (is (= ":ASDF/ASDF" (str/upper-case :asdf/asdf)))) + #?(:cljs (is (thrown? :default (str/upper-case 'asdf))) + :default (is (= "ASDF" (str/upper-case 'asdf)))) + #?(:cljs (is (thrown? :default (str/upper-case 'asdf/asdf))) + :default (is (= "ASDF/ASDF" (str/upper-case 'asdf/asdf)))))) From b8217a841b4ebf74ce81af795f6e3f9aa701486a Mon Sep 17 00:00:00 2001 From: Ambrose Bonnaire-Sergeant Date: Mon, 24 Feb 2025 16:16:34 -0600 Subject: [PATCH 40/48] wip --- test/clojure/string_test/capitalize.cljc | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/test/clojure/string_test/capitalize.cljc b/test/clojure/string_test/capitalize.cljc index d38b331..5302662 100644 --- a/test/clojure/string_test/capitalize.cljc +++ b/test/clojure/string_test/capitalize.cljc @@ -6,12 +6,15 @@ (when-var-exists str/capitalize (deftest test-capitalize (is (thrown? #?(:cljs :default :clj Exception) (str/capitalize nil))) - #?(:cljs nil + #?(:cljs (do (is (thrown? :default (str/capitalize 1))) + (is (thrown? :default (str/capitalize 'a))) + (is (thrown? :default (str/capitalize 'a/a))) + (is (thrown? :default (str/capitalize :a))) + (is (thrown? :default (str/capitalize :a/a)))) :default (do (is (= "1" (str/capitalize 1))) (is (= "Asdf" (str/capitalize 'Asdf))) - (is (= "Asdf" (str/capitalize 'Asdf))) - (is (= ":clojure.string-test.capitalize/asdf" (str/capitalize ::asdf))) - (is (= ":clojure.string-test.capitalize/asdf" (str/capitalize ::Asdf))))) + (is (= "Asdf/asdf" (str/capitalize 'asDf/aSdf))) + (is (= ":asdf/asdf" (str/capitalize :asDf/aSdf))))) (is (= "" (str/capitalize ""))) (is (= "A" (str/capitalize "a"))) (is (= "A thing" (str/capitalize "a Thing"))) From 07622ee52fd22d08172723954ec08d9884e9ad71 Mon Sep 17 00:00:00 2001 From: Ambrose Bonnaire-Sergeant Date: Mon, 24 Feb 2025 16:22:18 -0600 Subject: [PATCH 41/48] junk --- test/clojure/string_test/escape.cljc | 11 ++++++++--- test/clojure/string_test/reverse.cljc | 6 +++++- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/test/clojure/string_test/escape.cljc b/test/clojure/string_test/escape.cljc index 5e1beaf..654fc2d 100644 --- a/test/clojure/string_test/escape.cljc +++ b/test/clojure/string_test/escape.cljc @@ -6,7 +6,12 @@ (when-var-exists str/escape (deftest test-escape (is (= "" (str/escape "" {}))) - (is (= "" (str/escape "" {\a "A_A"}))) (is (= "" (str/escape "" {\c "C_C"}))) - (is (= "" (str/escape "" {\a "A_A" \c "C_C"}))) - (is (= "A_AbC_C" (str/escape "abc" {\a "A_A" \c "C_C"}))))) + (is (= "A_Abc" (str/escape "abc" {\a "A_A"}))) + (is (= "A_AbC_C" (str/escape "abc" {\a "A_A" \c "C_C"}))) + (is (= "A_AbC_C" (str/escape "abc" {\a "A_A" \c "C_C" (int \a) 1 nil 'junk :garbage 42.42}))) + (is (= "A_AbC_C" (str/escape "abc" {\a "A_A" \c "C_C"}))) + (is (thrown? #?(:cljs :default :clj Exception) (str/escape nil {\a "A_A" \c "C_C"}))) + (is (thrown? #?(:cljs :default :clj Exception) (str/escape 1 {\a "A_A" \c "C_C"}))) + (is (thrown? #?(:cljs :default :clj Exception) (str/escape 'a {\a "A_A" \c "C_C"}))) + (is (thrown? #?(:cljs :default :clj Exception) (str/escape :a {\a "A_A" \c "C_C"}))))) diff --git a/test/clojure/string_test/reverse.cljc b/test/clojure/string_test/reverse.cljc index a2ef4ec..a61ceb8 100644 --- a/test/clojure/string_test/reverse.cljc +++ b/test/clojure/string_test/reverse.cljc @@ -6,4 +6,8 @@ (when-var-exists str/reverse (deftest test-reverse (is (= "" (str/reverse ""))) - (is (= "tset-a" (str/reverse "a-test"))))) + (is (= "tset-a" (str/reverse "a-test"))) + (is (thrown? #?(:cljs :default :clj Exception) (str/reverse nil))) + (is (thrown? #?(:cljs :default :clj Exception) (str/reverse 1))) + (is (thrown? #?(:cljs :default :clj Exception) (str/reverse 'a-test))) + (is (thrown? #?(:cljs :default :clj Exception) (str/reverse :a-test))))) From 3aa89077106a5f58572b4f110322a88af868d9a1 Mon Sep 17 00:00:00 2001 From: Ambrose Bonnaire-Sergeant Date: Mon, 24 Feb 2025 16:24:11 -0600 Subject: [PATCH 42/48] unicode --- test/clojure/string_test/reverse.cljc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/test/clojure/string_test/reverse.cljc b/test/clojure/string_test/reverse.cljc index a61ceb8..5b0730a 100644 --- a/test/clojure/string_test/reverse.cljc +++ b/test/clojure/string_test/reverse.cljc @@ -6,6 +6,8 @@ (when-var-exists str/reverse (deftest test-reverse (is (= "" (str/reverse ""))) + (is (= "֎" (str/reverse "֎"))) + (is (= "a֎" (str/reverse "֎a"))) (is (= "tset-a" (str/reverse "a-test"))) (is (thrown? #?(:cljs :default :clj Exception) (str/reverse nil))) (is (thrown? #?(:cljs :default :clj Exception) (str/reverse 1))) From 4fd588d0cfc7e3a9e19f6610e10e436d0095779b Mon Sep 17 00:00:00 2001 From: Ambrose Bonnaire-Sergeant Date: Mon, 24 Feb 2025 16:25:09 -0600 Subject: [PATCH 43/48] unicode --- test/clojure/string_test/ends_with_qmark.cljc | 1 + test/clojure/string_test/starts_with_qmark.cljc | 1 + 2 files changed, 2 insertions(+) diff --git a/test/clojure/string_test/ends_with_qmark.cljc b/test/clojure/string_test/ends_with_qmark.cljc index 8b0a48c..249c764 100644 --- a/test/clojure/string_test/ends_with_qmark.cljc +++ b/test/clojure/string_test/ends_with_qmark.cljc @@ -19,6 +19,7 @@ (is (false? (str/ends-with? :ab "a"))) (is (false? (str/ends-with? "" "a"))) (is (true? (str/ends-with? "a-test" ""))) + (is (true? (str/ends-with? "a-test֎" "֎"))) (is (true? (str/ends-with? "a-test" "t"))) (is (true? (str/ends-with? "a-test" "a-test"))) (is (false? (str/ends-with? "a-test" "s"))) diff --git a/test/clojure/string_test/starts_with_qmark.cljc b/test/clojure/string_test/starts_with_qmark.cljc index 0107d18..2290aaa 100644 --- a/test/clojure/string_test/starts_with_qmark.cljc +++ b/test/clojure/string_test/starts_with_qmark.cljc @@ -17,6 +17,7 @@ :default (is (thrown? #?(:clj Exception) (str/starts-with? "a" 'a)))) (is (false? (str/starts-with? "" "a"))) (is (true? (str/starts-with? "a-test" ""))) + (is (true? (str/starts-with? "֎a-test" "֎"))) (is (true? (str/starts-with? "a-test" "a"))) (is (true? (str/starts-with? "a-test" "a-test"))) (is (false? (str/starts-with? "a-test" "-"))) From 0881a498a301c309a7a3a990992f28adcf0caf42 Mon Sep 17 00:00:00 2001 From: Ambrose Bonnaire-Sergeant Date: Mon, 24 Feb 2025 16:28:40 -0600 Subject: [PATCH 44/48] unicode --- test/clojure/core_test/subs.cljc | 9 +++++++++ test/clojure/string_test/blank_qmark.cljc | 1 + test/clojure/string_test/capitalize.cljc | 1 + test/clojure/string_test/lower_case.cljc | 1 + test/clojure/string_test/upper_case.cljc | 1 + 5 files changed, 13 insertions(+) diff --git a/test/clojure/core_test/subs.cljc b/test/clojure/core_test/subs.cljc index a94b545..58bc039 100644 --- a/test/clojure/core_test/subs.cljc +++ b/test/clojure/core_test/subs.cljc @@ -6,15 +6,24 @@ (deftest test-subs (is (= "abcde" (subs "abcde" 0))) (is (= "abcde" (subs "abcde" 0 5))) + (is (= "ab֎de" (subs "ab֎de" 0))) + (is (= "ab֎de" (subs "ab֎de" 0 5))) (is (= "bcde" (subs "abcde" 1))) + (is (= "bcde" (subs "֎bcde" 1))) (is (= "bcd" (subs "abcde" 1 4))) + (is (= "bcd" (subs "֎bcde" 1 4))) (is (= "abc" (subs "abcde" 0 3))) + (is (= "ab֎" (subs "ab֎de" 0 3))) (is (= "" (subs "" 0 0))) (is (= "" (subs "" 0))) (is (= "" (subs "abcde" 0 0))) + (is (= "" (subs "֎bcde" 0 0))) (is (= "" (subs "abcde" 5))) + (is (= "" (subs "abcd֎" 5))) (is (= "" (subs "abcde" 5 5))) + (is (= "" (subs "abcd֎" 5 5))) (is (= "" (subs "abcde" 4 4))) + (is (= "" (subs "abc֎e" 4 4))) #?@(:cljs [(is (= "b" (subs "abcde" 2 1))) (is (= "bcde" (subs "abcde" 1 6))) diff --git a/test/clojure/string_test/blank_qmark.cljc b/test/clojure/string_test/blank_qmark.cljc index 1d253b6..3b1eebd 100644 --- a/test/clojure/string_test/blank_qmark.cljc +++ b/test/clojure/string_test/blank_qmark.cljc @@ -7,6 +7,7 @@ (deftest test-blank? (is (true? (str/blank? ""))) (is (true? (str/blank? nil))) + (is (false? (str/blank? "֎"))) (is (true? (str/blank? " "))) (is (true? (str/blank? " \t "))) #?(:cljs (do (is (true? (str/blank? (symbol "")))) diff --git a/test/clojure/string_test/capitalize.cljc b/test/clojure/string_test/capitalize.cljc index 5302662..e48d0a4 100644 --- a/test/clojure/string_test/capitalize.cljc +++ b/test/clojure/string_test/capitalize.cljc @@ -17,6 +17,7 @@ (is (= ":asdf/asdf" (str/capitalize :asDf/aSdf))))) (is (= "" (str/capitalize ""))) (is (= "A" (str/capitalize "a"))) + (is (= "֎" (str/capitalize "֎"))) (is (= "A thing" (str/capitalize "a Thing"))) (is (= "A thing" (str/capitalize "A THING"))) (is (= "A thing" (str/capitalize "A thing"))))) diff --git a/test/clojure/string_test/lower_case.cljc b/test/clojure/string_test/lower_case.cljc index a55c98b..1f922e2 100644 --- a/test/clojure/string_test/lower_case.cljc +++ b/test/clojure/string_test/lower_case.cljc @@ -7,6 +7,7 @@ (deftest test-lower-case (is (thrown? #?(:cljs :default :clj Exception) (str/lower-case nil))) (is (= "" (str/lower-case ""))) + (is (= "֎" (str/lower-case "֎"))) (is (= "asdf" (str/lower-case "AsdF"))) (is (= "asdf" (str/lower-case "asdf"))) (let [s "ASDF"] diff --git a/test/clojure/string_test/upper_case.cljc b/test/clojure/string_test/upper_case.cljc index 070ac56..6150999 100644 --- a/test/clojure/string_test/upper_case.cljc +++ b/test/clojure/string_test/upper_case.cljc @@ -7,6 +7,7 @@ (deftest test-upper-case (is (thrown? #?(:cljs :default :clj Exception) (str/upper-case nil))) (is (= "" (str/upper-case ""))) + (is (= "֎" (str/upper-case "֎"))) (is (= "ASDF" (str/upper-case "aSDf"))) (is (= "ASDF" (str/upper-case "ASDF"))) (let [s "asdf"] From d91512bdd44f435ce5d1d04e7f0ede3f66c5843b Mon Sep 17 00:00:00 2001 From: Ambrose Bonnaire-Sergeant Date: Mon, 24 Feb 2025 16:31:33 -0600 Subject: [PATCH 45/48] whitespace --- test/clojure/string_test/blank_qmark.cljc | 3 +++ 1 file changed, 3 insertions(+) diff --git a/test/clojure/string_test/blank_qmark.cljc b/test/clojure/string_test/blank_qmark.cljc index 3b1eebd..adbb042 100644 --- a/test/clojure/string_test/blank_qmark.cljc +++ b/test/clojure/string_test/blank_qmark.cljc @@ -8,6 +8,9 @@ (is (true? (str/blank? ""))) (is (true? (str/blank? nil))) (is (false? (str/blank? "֎"))) + (testing "https://unicodeplus.com/U+2007" + #?(:cljs (is (true? (str/blank? " "))) + :default (is (false? (str/blank? " "))))) (is (true? (str/blank? " "))) (is (true? (str/blank? " \t "))) #?(:cljs (do (is (true? (str/blank? (symbol "")))) From 1ca7f15ecad88ac934019f11fd680617612a9429 Mon Sep 17 00:00:00 2001 From: Ambrose Bonnaire-Sergeant Date: Mon, 24 Feb 2025 16:32:47 -0600 Subject: [PATCH 46/48] unicode --- test/clojure/string_test/blank_qmark.cljc | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/test/clojure/string_test/blank_qmark.cljc b/test/clojure/string_test/blank_qmark.cljc index adbb042..6d16b62 100644 --- a/test/clojure/string_test/blank_qmark.cljc +++ b/test/clojure/string_test/blank_qmark.cljc @@ -10,7 +10,9 @@ (is (false? (str/blank? "֎"))) (testing "https://unicodeplus.com/U+2007" #?(:cljs (is (true? (str/blank? " "))) - :default (is (false? (str/blank? " "))))) + :default (is (false? (str/blank? " ")))) + #?(:cljs (is (true? (str/blank? "\u2007"))) + :default (is (false? (str/blank? "\u2007"))))) (is (true? (str/blank? " "))) (is (true? (str/blank? " \t "))) #?(:cljs (do (is (true? (str/blank? (symbol "")))) From 202df84d4b87ad4ccb826a1693f81066ae8e7932 Mon Sep 17 00:00:00 2001 From: Ambrose Bonnaire-Sergeant Date: Mon, 24 Feb 2025 16:33:24 -0600 Subject: [PATCH 47/48] wip --- test/clojure/string_test/blank_qmark.cljc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/clojure/string_test/blank_qmark.cljc b/test/clojure/string_test/blank_qmark.cljc index 6d16b62..73adeae 100644 --- a/test/clojure/string_test/blank_qmark.cljc +++ b/test/clojure/string_test/blank_qmark.cljc @@ -8,7 +8,7 @@ (is (true? (str/blank? ""))) (is (true? (str/blank? nil))) (is (false? (str/blank? "֎"))) - (testing "https://unicodeplus.com/U+2007" + (testing "U+2007" #?(:cljs (is (true? (str/blank? " "))) :default (is (false? (str/blank? " ")))) #?(:cljs (is (true? (str/blank? "\u2007"))) From 1ba1a6da4c63b7e1c2cfc268d3563faa058248bc Mon Sep 17 00:00:00 2001 From: Ambrose Bonnaire-Sergeant Date: Mon, 24 Feb 2025 16:36:57 -0600 Subject: [PATCH 48/48] reader cond --- test/clojure/string_test/blank_qmark.cljc | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/test/clojure/string_test/blank_qmark.cljc b/test/clojure/string_test/blank_qmark.cljc index 73adeae..52f6e25 100644 --- a/test/clojure/string_test/blank_qmark.cljc +++ b/test/clojure/string_test/blank_qmark.cljc @@ -9,10 +9,8 @@ (is (true? (str/blank? nil))) (is (false? (str/blank? "֎"))) (testing "U+2007" - #?(:cljs (is (true? (str/blank? " "))) - :default (is (false? (str/blank? " ")))) - #?(:cljs (is (true? (str/blank? "\u2007"))) - :default (is (false? (str/blank? "\u2007"))))) + (is (#?(:cljs true? :default false?) (str/blank? " "))) + (is (#?(:cljs true? :default false?) (str/blank? "\u2007")))) (is (true? (str/blank? " "))) (is (true? (str/blank? " \t "))) #?(:cljs (do (is (true? (str/blank? (symbol ""))))