aboutsummaryrefslogtreecommitdiffhomepage
path: root/gtwiwtg-test.lisp
blob: 80c3c86fa63091a1c40c0f4292109e417996bba2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
(defpackage :gtwiwtg-test
  (:use :cl :gtwiwtg :prove))

(in-package :gtwiwtg-test)

(defmacro autoplan (&rest test-forms)
  `(progn
     (plan ,(length test-forms))
     ,@test-forms
     (finalize)))

(autoplan 

 (is (take 4 (range)) '(0 1 2 3))


 (is (collect (range :from 2 :to -1 :by -0.5))
     '(2.0 1.5 1.0 0.5 0.0 -0.5))


 (is (collect (range :from 2 :to -1 :by -0.5 :inclusive t))
     '(2.0 1.5 1.0 0.5 0.0 -0.5 -1.0))

 (ok (let ((r (range)))
       (take 1 r)
       (gtwiwtg::stopped-p r)))

 (ok (not (gtwiwtg::stopped-p (range))))

 (is '(4 5 6) (collect (seq '(1 2 3 4 5 6) :start 3)))

 (is (collect (filter! (complement #'alpha-char-p) (seq "1234abcd5e6f")))
     '(#\1 #\2 #\3 #\4 #\5 #\6))

 (is '(1 2 3 5 8 13)
     (take 6 (from-recurrence #'+ 1 0)))


 (let ((s (open (asdf:system-source-file "gtwiwtg-test"))))
   (size (from-input-stream s (lambda (s) (read-line s nil nil))))
   (ok (not (open-stream-p s))))

 (let* ((file  (asdf:system-source-file "gtwiwtg-test"))
        (stat (osicat-posix:stat file)))
   (is (osicat-posix:stat-size stat)
       (1-  (size (file-bytes file))))) ;; b/c NIL is returned as the last generated value

 (let* ((file  (asdf:system-source-file "gtwiwtg-test"))
        (stat (osicat-posix:stat file)))
   (is (osicat-posix:stat-size stat)
       (1-  (size (file-chars file)))))

 (is (list 10 20 30 40)
     (take 4  (map! (lambda (x) (* x 10))
                    (range :from 1))))

 (is (list 20 40 60 80 100)
     (take 5 (map! (lambda (x) (* 10 x))
                   (filter! #'evenp (range :from 1)))))

 (is (list 0 1 2 3 #\a #\b #\c -10 -20 -30)
     (take 10 (concat! (times 4)
                       (seq "abc")
                       (range :from -10 :by -10))))

 (is '(("one" 1 :one) ("two" 2 :two) ("three" 3 :three))
     (collect (zip! (seq '("one" "two" "three"))
                    (range :from 1)
                    (repeater :one :two :three))))

(is '(-200 -180 -160 -140 -120 -100 -80 -60 -40 -20 -20 -15 -10 -5 0 0 1 2 3 4 5 6 7
      8 9 20 40 60 80 100 120 140 160 180 200)
    (collect
        (merge! #'< 
                (range :from -200 :by 20 :to 200 :inclusive t) 
                (times 10)
                (range :from -20 :by 5 :to 0))))


(is (collect
        (merge! #'< 
                (times 3)
                (range :from -200 :by 50 :to 200 :inclusive t) 
                (range :from 0 :by -5 :to -20 :inclusive t)))
    '(-200 -150 -100 -50 -20 -15 -10 -5 0 0 0 1 2 50 100 150 200))

;; don't be fooled by the last example. Merge is only guaranteed to
;; produce sorted outputs if the inputs are all sorted the same way.
;; here is an example showing that the end result isn't always sorted
;; if the arguments are sorted in different ways:

(is (collect
        (merge! #'< 
                (times 3)
                (range :from 200 :by -50 :to -200 :inclusive t) 
                (range :from 0 :by -5 :to -20 :inclusive t)))
    '(0 -5 -10 -15 -20 -50 -100 -150 -200 0 0 1 2 50 100 150 200))

(is (collect (intersperse! (times 5) (repeater 'a 'b 'c) (range :by -10)))
    '(0 A 0 1 B -10 2 C -20 3 A -30 4 B -40))

(is (collect (truncate! 20 (range)))
    '(0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19))

(is (pick-out '(4 1 1 4 2) (seq "generators"))
    '(#\r #\e #\e #\r #\n))


 (let ((res (make-resumable!
             (concat! (seq "hello")
                      (indexed! (filter! 'alpha-char-p (seq "a b c 1 2 3 easy as")))))))
   (take 1 res)
   (setf res (resume! res))
   (is '(#\e #\l #\l #\o (0 #\a) (1 #\b) (2 #\c) (3 #\e) (4 #\a) (5 #\s) (6 #\y)
         (7 #\a) (8 #\s)) 
       (collect res)))

 )