;; test_enumerable.nu
;; tests for Nu enumerable extensions.
;;
;; Copyright (c) 2007 Tim Burks, Radtastical Inc.
(class TestEnumerable is NuTestCase
(- testEach is
(set sum 0)
((array 100 200 300) each:
(do (n) (set sum (+ sum n))))
(assert_equal 600 sum)
(set sum "")
(function append-to-sum (x) (set sum (+ sum x)))
((array 100 200 300) each:append-to-sum)
(assert_equal "100200300" sum))
(- testEachWithIndex is
(set sum 0)
((array 100 200 300) eachWithIndex:
(do (n i) (set sum (+ sum (* (+ i 1) n)))))
(assert_equal (+ 100 (* 2 200) (* 3 300)) sum))
(- testSelect is
(set selection
((array 100 200 300) select:(do (n) (> n 150))))
(assert_equal 2 (selection count))
(assert_equal 200 (selection objectAtIndex:0))
(assert_equal 300 (selection objectAtIndex:1))
(set a (array 1 2 3 nil 4 5 6 nil 7 8 nil))
(assert_equal 11 (a count))
(assert_equal 8 ((a select) count)))
(- testSelectWithInteger is
(set selection
((array 1 2 3) select:(do (n) (% n 2))))
(assert_equal 2 (selection count))
(assert_equal 1 (selection objectAtIndex:0))
(assert_equal 3 (selection objectAtIndex:1)))
(- testFind is
(set found
((array 100 200 300) find:(do (n) (and (> n 150) (< n 250)))))
(assert_equal 200 found))
(- testFindWithInteger is
(set found
((array 1 2 3) find:(do (n) (- 1 (% n 2)))))
(assert_equal 2 found))
(- testMap is
(assert_equal 3 ((((array 100 200 300) map:(do (n) (n stringValue))) 1) length))
;; Testing mapping an operator onto an array
(set words (array "the girl" "from ipanema"))
(set regexen (words map: regex))
(set wanted (array /the girl/ /from ipanema/))
(assert_equal wanted regexen))
(- testMapWithIndex is
(set result ((array 0 100 200 300) mapWithIndex:
(do (n i) (+ n i))))
(assert_equal 0 (result 0))
(assert_equal 101 (result 1))
(assert_equal 202 (result 2))
(assert_equal 303 (result 3)))
(- testReduce is
(set testArray (array 100 200 300))
(set reduction
(testArray reduce:(do (sum n) (+ sum n)) from:0))
(assert_equal 600 reduction)
(set reduction ((array 100 200 300) reduce:+ from:0))
(assert_equal 600 reduction)
(assert_equal (testArray reduce:(do (sum n) (+ sum n)) from:0) (testArray reduce:+ from:0)))
(- testLeftReduce is
(set testArray (array 100 200 300))
(set r (testArray reduceLeft:(do (diff n) (- diff n)) from:600))
(assert_equal 0 r)
; testing using an operator.
(assert_equal r (testArray reduceLeft:- from:600)))
(- testEachInReverse is
(set title "")
((array "the" "girl" "from" "ipanema") eachInReverse:
(do (n) (set title (+ title n))))
(assert_equal title "ipanemafromgirlthe")
(set sum "")
(function append-to-sum (x) (set sum (+ sum x)))
((array 100 200 300) eachInReverse:append-to-sum)
(assert_equal "300200100" sum))
(- testMapSelector is
(assert_equal 3 ((((array 100 200 300) mapSelector:"stringValue") 1) length))))