|
| 1 | +(ns clojure.core-test.reduce |
| 2 | + (:require |
| 3 | + [clojure.test :as t :refer [deftest testing is are]] |
| 4 | + [clojure.core-test.portability #?(:cljs :refer-macros :default :refer) [when-var-exists]]) |
| 5 | + #?(:clj (:import (clojure.lang IReduce)))) |
| 6 | + |
| 7 | +(def interop |
| 8 | + {:int-new (fn [x] |
| 9 | + (#?(:clj Integer. |
| 10 | + :cljs js/Number.) x)) |
| 11 | + |
| 12 | + :Integer #?(:clj Integer/TYPE |
| 13 | + :cljs js/Number) |
| 14 | + |
| 15 | + :Long #?(:clj Long/TYPE |
| 16 | + :cljs js/Number) |
| 17 | + |
| 18 | + :Float #?(:clj Long/TYPE |
| 19 | + :cljs js/Number) |
| 20 | + |
| 21 | + :Double #?(:clj Double/TYPE |
| 22 | + :cljs js/Number) |
| 23 | + |
| 24 | + :Boolean #?(:clj Boolean/TYPE |
| 25 | + :cljs js/Boolean)}) |
| 26 | + |
| 27 | + |
| 28 | +(when-var-exists clojure.core/reduce |
| 29 | + (deftest test-reduce |
| 30 | + (testing "common" |
| 31 | + (is (nil? (reduce nil nil nil))) |
| 32 | + (is (thrown? #?(:clj Exception |
| 33 | + :cljs js/Error) (reduce nil nil))) |
| 34 | + (is (= 6 (reduce + 0 [1 2 3])))) |
| 35 | + |
| 36 | + (testing "edge cases" |
| 37 | + (let [int-new (interop :int-new) |
| 38 | + char-new (interop :char-new) |
| 39 | + byte-new (interop :byte-new) |
| 40 | + arange (range 1 100) ;; enough to cross nodes |
| 41 | + avec (into [] arange) |
| 42 | + alist (into () arange) |
| 43 | + obj-array (into-array arange) |
| 44 | + int-array (into-array (:Integer interop) (map #(int-new (int %)) arange)) |
| 45 | + long-array (into-array (:Long interop) arange) |
| 46 | + float-array (into-array (:Float interop) arange) |
| 47 | + double-array (into-array (:Double interop) arange) |
| 48 | + all-true (into-array (:Boolean interop) (repeat 10 true))] |
| 49 | + (is (== 4950 |
| 50 | + (reduce + arange) |
| 51 | + (reduce + avec) |
| 52 | + #?(:clj (.reduce ^IReduce avec +)) |
| 53 | + (reduce + alist) |
| 54 | + (reduce + obj-array) |
| 55 | + (reduce + int-array) |
| 56 | + (reduce + long-array) |
| 57 | + (reduce + float-array) |
| 58 | + (reduce + double-array))) |
| 59 | + |
| 60 | + (is (== 4951 |
| 61 | + (reduce + 1 arange) |
| 62 | + (reduce + 1 avec) |
| 63 | + #?(:clj (.reduce ^IReduce avec + 1)) |
| 64 | + (reduce + 1 alist) |
| 65 | + (reduce + 1 obj-array) |
| 66 | + (reduce + 1 int-array) |
| 67 | + (reduce + 1 long-array) |
| 68 | + (reduce + 1 float-array) |
| 69 | + (reduce + 1 double-array))) |
| 70 | + |
| 71 | + (is (= true |
| 72 | + (reduce #(and %1 %2) all-true) |
| 73 | + (reduce #(and %1 %2) true all-true))))))) |
0 commit comments