(load "Test.carp") (use Test) (use StaticArray) (defn inc-ref [x] (+ @x 1)) (deftest test (let [arr $[1 2 4]] (assert-equal test $[2 4 8] (do (map! arr &(fn [val] (* @val 2))) arr) "map! works as expected")) (let [arr $[1 2 3]] (assert-equal test $[3 2 1] (do (reverse! arr) arr) "reverse! works as expected")) (assert-true test (= $[1 2 3] $[1 2 3]) "= works as expected I") (assert-false test (= $[1 2 3] $[1 2 3 4 5]) "= works as expected II") (assert-false test (= $[1 1 1] $[0 0 0]) "= works as expected III") (assert-equal test 5 (let [a $[0 1 2 3 4 5 6 7 8 9]] @(unsafe-nth a 5)) "unsafe-nth works as expected") (assert-equal test &[4 5 6] &(let [nested $[[1 2 3] [4 5 6] [7 8 9]]] @(unsafe-nth nested 1)) "unsafe-nth works as expected with heap allocated elements") (assert-equal test 10 (let [arr $[2 2 2 2]] (reduce &(fn [acc val] (+ acc @val)) 2 arr)) "reduce works as expected") (assert-equal test true (empty? (the (Ref (StaticArray Int)) $[])) "empty? works as expected I") (assert-equal test false (empty? $[1]) "empty? works as expected II") (assert-equal test true (any? &(fn [x] (= 0 @x)) $[0 1 2 3]) "any? works as expected I") (assert-equal test false (any? &(fn [x] (= 0 @x)) $[1 2 3 4]) "any? works as expected II") (assert-equal test true (all? &(fn [x] (< 0 @x)) $[1 2 3]) "all? works as expected I") (assert-equal test false (all? &(fn [x] (< 0 @x)) $[0 1 2]) "all? works as expected II") (assert-equal test &(Maybe.Just 3) &(find &(fn [x] (= 3 @x)) $[0 1 2 3]) "find works as expected I") (assert-equal test &(Maybe.Nothing) &(find &(fn [x] (= 4 @x)) $[0 1 2 3]) "find works as expected II") (assert-equal test &(Maybe.Nothing) &(find-index &(fn [i] (Int.even? @i)) $[1 3 5]) "find-index works I") (assert-equal test &(Maybe.Just 1) &(find-index &(fn [i] (Int.even? @i)) $[1 8 5]) "find-index works II") (assert-equal test 1 (unsafe-first $[1 2 3]) "unsafe-first works as expected") (assert-equal test &(Maybe.Just 1) &(first $[1 2 3]) "first works as expected") (assert-equal test &(the (Maybe Int) (Maybe.Nothing)) &(first $[]) "first works as expected on empty array") (assert-equal test \c (unsafe-last $[\a \b \c]) "unsafe-last works as expected") (assert-equal test &(Maybe.Just \c) &(last $[\a \b \c]) "last works as expected") (assert-equal test &(the (Maybe Char) (Maybe.Nothing)) &(last $[]) "last works as expected on empty array") (assert-equal test &(Maybe.Just 10) &(maximum $[8 10 9]) "maximum works as expected") (assert-equal test &(Maybe.Just (Pair.init 2 1)) &(maximum $[(Pair.init 1 3) (Pair.init 2 1) (Pair.init 2 0)]) "maximum works on pairs") (assert-equal test &(Maybe.Just 1) &(minimum $[3 1 2]) "minimum works as expected") (assert-equal test &(Maybe.Just (Pair.init 1 3)) &(minimum $[(Pair.init 1 3) (Pair.init 2 1) (Pair.init 2 0)]) "minimum works on pairs") (assert-equal test 55 (sum $[1 2 3 4 5 6 7 8 9 10]) "sum works as expected") (assert-equal test &(Maybe.Just 3) &(index-of $[1 2 3 4] &4) "index-of works as expected when element is in the array") (assert-equal test &(Maybe.Nothing) &(index-of $[1 2 3 4] &7) "index-of works as expected when element is not in the array") (assert-equal test 2 (element-count $[1 4 3 4] &4) "element-count works as expected") (assert-equal test 2 (predicate-count $[1 8 5 10 3] &(fn [i] (Int.even? @i))) "predicate-count works") (let [arr $[1 2]] (assert-equal test $[1 3] (do (aupdate! arr 1 &inc-ref) arr) "aupdate! works as expected")) (let [arr $[1 2]] (assert-equal test $[2 1] (do (StaticArray.swap! arr 0 1) arr) "swap! works as expected")) (assert-equal test &(Maybe.Nothing) &(nth $[0 1 2] 3) "nth works as expected I") (assert-equal test &(Maybe.Just 0) &(nth $[0 1 2] 0) "nth works as expected II") (assert-true test (contains? $[0 1 2] &1) "contains? works as expected I") (assert-false test (contains? $[0 1 2] &100) "contains? works as expected II"))