From 55aeefb0fca06b03da46ee5725cd8b290b0c582f Mon Sep 17 00:00:00 2001 From: Antoine Belvire Date: Sun, 9 Nov 2025 23:06:10 +0100 Subject: [PATCH] Test persistent! This closes #394. --- test/clojure/core_test/assoc_bang.cljc | 8 ++++- test/clojure/core_test/disj_bang.cljc | 8 ++++- test/clojure/core_test/dissoc_bang.cljc | 7 ++-- test/clojure/core_test/persistent_bang.cljc | 38 +++++++++++++++++++++ 4 files changed, 57 insertions(+), 4 deletions(-) create mode 100644 test/clojure/core_test/persistent_bang.cljc diff --git a/test/clojure/core_test/assoc_bang.cljc b/test/clojure/core_test/assoc_bang.cljc index fe2b8fe..0a1931a 100644 --- a/test/clojure/core_test/assoc_bang.cljc +++ b/test/clojure/core_test/assoc_bang.cljc @@ -1,5 +1,5 @@ (ns clojure.core-test.assoc-bang - (:require [clojure.test :refer [deftest testing are]] + (:require [clojure.test :refer [are deftest is testing]] [clojure.core-test.portability #?(:cljs :refer-macros :default :refer) [when-var-exists]])) (when-var-exists assoc! @@ -49,6 +49,12 @@ [1] [0 1 1] [1] [0 1 1 2 2])) + (testing "cannot assoc! transient after persistent! call" + (let [t (transient {:a 1}), _ (persistent! t)] + (is (thrown? #?(:cljs js/Error :cljr Exception :default Error) (assoc! t :b 2)))) + (let [t (transient [1]), _ (persistent! t)] + (is (thrown? #?(:cljs js/Error :cljr Exception :default Error) (assoc! t 0 2))))) + (testing "bad shape" (are [coll] (thrown? #?(:cljs js/Error :default Exception) (assoc! coll 1 3)) nil diff --git a/test/clojure/core_test/disj_bang.cljc b/test/clojure/core_test/disj_bang.cljc index d28313a..5ef4551 100644 --- a/test/clojure/core_test/disj_bang.cljc +++ b/test/clojure/core_test/disj_bang.cljc @@ -1,9 +1,10 @@ (ns clojure.core-test.disj-bang - (:require [clojure.test :refer [deftest testing are]] + (:require [clojure.test :refer [are deftest is testing]] [clojure.core-test.portability #?(:cljs :refer-macros :default :refer) [when-var-exists]])) (when-var-exists disj! (deftest test-disj! + (testing "nominal cases" (are [expected set keys] (= expected (persistent! (apply disj! (transient set) keys))) #{} #{} [nil] @@ -15,6 +16,11 @@ #{[3 3]} #{[1 1] 2 [3 3]} [[1 1] 2] #{:a :b} #{:a :b :c} [:c] #{true nil} #{true false nil} [false])) + + (testing "cannot disj! transient after persistent! call" + (let [t (transient #{1 2 3}), _ (persistent! t)] + (is (thrown? #?(:cljs js/Error :cljr Exception :default Error) (disj! t 1))))) + (testing "bad shape" (are [set keys] (thrown? #?(:cljs js/Error :default Exception) (apply disj! set keys)) nil [nil] diff --git a/test/clojure/core_test/dissoc_bang.cljc b/test/clojure/core_test/dissoc_bang.cljc index 92aa958..8d8ef7f 100644 --- a/test/clojure/core_test/dissoc_bang.cljc +++ b/test/clojure/core_test/dissoc_bang.cljc @@ -1,9 +1,8 @@ (ns clojure.core-test.dissoc-bang - (:require [clojure.test :refer [deftest testing are]] + (:require [clojure.test :refer [are deftest is testing]] [clojure.core-test.portability #?(:cljs :refer-macros :default :refer) [when-var-exists]])) (when-var-exists dissoc! - (deftest test-dissoc! (testing "non-nil" @@ -21,6 +20,10 @@ {} {nil nil} [nil] {} {nil nil} [nil nil])) + (testing "cannot dissoc! transient after persistent! call" + (let [t (transient {:a 1}), _ (persistent! t)] + (is (thrown? #?(:cljs js/Error :cljr Exception :default Error) (dissoc! t :a))))) + (testing "bad shape" (are [m keys] (thrown? #?(:cljs js/Error :default Exception) (apply dissoc! m keys)) {:a 1} [:a] diff --git a/test/clojure/core_test/persistent_bang.cljc b/test/clojure/core_test/persistent_bang.cljc new file mode 100644 index 0000000..4cf9858 --- /dev/null +++ b/test/clojure/core_test/persistent_bang.cljc @@ -0,0 +1,38 @@ +(ns clojure.core-test.persistent-bang + (:require [clojure.test :refer [are deftest is testing]] + [clojure.core-test.portability #?(:cljs :refer-macros :default :refer) [when-var-exists]])) + +(when-var-exists persistent! + (deftest test-persistent! + + (testing "map" + (are [expected coll] (= expected (persistent! coll)) + {} (transient {}) + {nil nil} (transient {nil nil}) + {:a 1 :b 2} (transient {:a 1 :b 2}))) + + (testing "vector" + (are [expected coll] (= expected (persistent! coll)) + [] (transient []) + [nil] (transient [nil]) + [1 2 3] (transient [1 2 3]))) + + (testing "set" + (are [expected coll] (= expected (persistent! coll)) + #{} (transient #{}) + #{nil} (transient #{nil}) + #{:a :b :c} (transient #{:a :b :c}))) + + (testing "calling persistent! a second time throws" + (let [coll (transient {}), _ (persistent! coll)] + (is (thrown? #?(:cljs js/Error :cljr Exception :default Error) (persistent! coll))))) + + (testing "bad shape" + (are [coll] (thrown? #?(:cljs js/Error :default Exception) (persistent! coll)) + nil + {:a 1 :b 2} + [1 2 3] + '(1 2 3) + #{1 2 3} + true + false))))