From 95a01f53720d34a0feba6ce0985a29bd4603e845 Mon Sep 17 00:00:00 2001 From: Andy Chambers Date: Sat, 8 Mar 2025 01:03:18 +0000 Subject: [PATCH 1/2] Add tests for reduce --- test/clojure/core_test/reduce.cljc | 73 ++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 test/clojure/core_test/reduce.cljc diff --git a/test/clojure/core_test/reduce.cljc b/test/clojure/core_test/reduce.cljc new file mode 100644 index 0000000..f56ec1e --- /dev/null +++ b/test/clojure/core_test/reduce.cljc @@ -0,0 +1,73 @@ +(ns clojure.core-test.reduce + (:require + [clojure.test :as t :refer [deftest testing is are]] + [clojure.core-test.portability #?(:cljs :refer-macros :default :refer) [when-var-exists]]) + #?(:clj (:import (clojure.lang IReduce)))) + +(def interop + {:int-new (fn [x] + (#?(:clj Integer. + :cljs js/Number.) x)) + + :Integer #?(:clj Integer/TYPE + :cljs js/Number) + + :Long #?(:clj Long/TYPE + :cljs js/Number) + + :Float #?(:clj Long/TYPE + :cljs js/Number) + + :Double #?(:clj Double/TYPE + :cljs js/Number) + + :Boolean #?(:clj Boolean/TYPE + :cljs js/Boolean)}) + + +(when-var-exists clojure.core/reduce + (deftest test-reduce + (testing "common" + (is (nil? (reduce nil nil nil))) + (is (thrown? #?(:clj Exception + :cljs js/Error) (reduce nil nil))) + (is (= 6 (reduce + 0 [1 2 3])))) + + (testing "edge cases" + (let [int-new (interop :int-new) + char-new (interop :char-new) + byte-new (interop :byte-new) + arange (range 1 100) ;; enough to cross nodes + avec (into [] arange) + alist (into () arange) + obj-array (into-array arange) + int-array (into-array (:Integer interop) (map #(int-new (int %)) arange)) + long-array (into-array (:Long interop) arange) + float-array (into-array (:Float interop) arange) + double-array (into-array (:Double interop) arange) + all-true (into-array (:Boolean interop) (repeat 10 true))] + (is (== 4950 + (reduce + arange) + (reduce + avec) + #?(:clj (.reduce ^IReduce avec +)) + (reduce + alist) + (reduce + obj-array) + (reduce + int-array) + (reduce + long-array) + (reduce + float-array) + (reduce + double-array))) + + (is (== 4951 + (reduce + 1 arange) + (reduce + 1 avec) + #?(:clj (.reduce ^IReduce avec + 1)) + (reduce + 1 alist) + (reduce + 1 obj-array) + (reduce + 1 int-array) + (reduce + 1 long-array) + (reduce + 1 float-array) + (reduce + 1 double-array))) + + (is (= true + (reduce #(and %1 %2) all-true) + (reduce #(and %1 %2) true all-true))))))) From 574cf2814949a87e42111deb6fa717462c0b2e31 Mon Sep 17 00:00:00 2001 From: Andy Chambers Date: Fri, 28 Mar 2025 12:51:58 +0000 Subject: [PATCH 2/2] Add tests for edge-cases described in the docstring --- test/clojure/core_test/reduce.cljc | 68 ++++++++++++++++++++---------- 1 file changed, 46 insertions(+), 22 deletions(-) diff --git a/test/clojure/core_test/reduce.cljc b/test/clojure/core_test/reduce.cljc index f56ec1e..7de1782 100644 --- a/test/clojure/core_test/reduce.cljc +++ b/test/clojure/core_test/reduce.cljc @@ -33,7 +33,28 @@ :cljs js/Error) (reduce nil nil))) (is (= 6 (reduce + 0 [1 2 3])))) - (testing "edge cases" + (testing "val is not supplied" + (is (= 3 (reduce (fn [a b] + (+ a b)) + [1 2]))) + + (testing "empty coll" + (is (= 1 (reduce (fn [] 1) [])))) + + (testing "coll with 1 item" + (is (= 1 (reduce (fn [] + (is false) + (throw (ex-info "should not get here" {}))) + [1]))))) + + (testing "val is supplied, empty coll" + (is (= 1 (reduce (fn [] + (is false) + (throw (ex-info "should not get here" {}))) + 1 + [])))) + + (testing "reduction by type" (let [int-new (interop :int-new) char-new (interop :char-new) byte-new (interop :byte-new) @@ -46,27 +67,30 @@ float-array (into-array (:Float interop) arange) double-array (into-array (:Double interop) arange) all-true (into-array (:Boolean interop) (repeat 10 true))] - (is (== 4950 - (reduce + arange) - (reduce + avec) - #?(:clj (.reduce ^IReduce avec +)) - (reduce + alist) - (reduce + obj-array) - (reduce + int-array) - (reduce + long-array) - (reduce + float-array) - (reduce + double-array))) - - (is (== 4951 - (reduce + 1 arange) - (reduce + 1 avec) - #?(:clj (.reduce ^IReduce avec + 1)) - (reduce + 1 alist) - (reduce + 1 obj-array) - (reduce + 1 int-array) - (reduce + 1 long-array) - (reduce + 1 float-array) - (reduce + 1 double-array))) + + (testing "val is not supplied" + (is (== 4950 + (reduce + arange) + (reduce + avec) + #?(:clj (.reduce ^IReduce avec +)) + (reduce + alist) + (reduce + obj-array) + (reduce + int-array) + (reduce + long-array) + (reduce + float-array) + (reduce + double-array)))) + + (testing "val is supplied" + (is (== 4951 + (reduce + 1 arange) + (reduce + 1 avec) + #?(:clj (.reduce ^IReduce avec + 1)) + (reduce + 1 alist) + (reduce + 1 obj-array) + (reduce + 1 int-array) + (reduce + 1 long-array) + (reduce + 1 float-array) + (reduce + 1 double-array)))) (is (= true (reduce #(and %1 %2) all-true)