1 ;;; stream-tests.el --- Unit tests for stream.el -*- lexical-binding: t -*-
3 ;; Copyright (C) 2015 Free Software Foundation, Inc.
5 ;; Author: Nicolas Petton <nicolas@petton.fr>
7 ;; Maintainer: emacs-devel@gnu.org
9 ;; This file is part of GNU Emacs.
11 ;; GNU Emacs is free software: you can redistribute it and/or modify
12 ;; it under the terms of the GNU General Public License as published by
13 ;; the Free Software Foundation, either version 3 of the License, or
14 ;; (at your option) any later version.
16 ;; GNU Emacs is distributed in the hope that it will be useful,
17 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
18 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 ;; GNU General Public License for more details.
21 ;; You should have received a copy of the GNU General Public License
22 ;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
30 (defun stream-to-list (stream)
31 "Eagerly traverse STREAM and return a list of its elements."
38 (ert-deftest stream-empty-test ()
39 (should (stream-p (stream-empty)))
40 (should (stream-empty-p (stream-empty))))
42 (ert-deftest stream-make-test ()
43 (should (stream-p (stream-range)))
44 (should (not (stream-empty-p (stream-range))))) ;; Should use stream-list or something
46 (ert-deftest stream-first-test ()
47 (should (= 3 (stream-first (stream-range 3))))
48 (should (null (stream-first (stream-empty)))))
50 (ert-deftest stream-rest-test ()
51 (should (= 4 (stream-first (stream-rest (stream-range 3)))))
52 (should (= 5 (stream-first (stream-rest (stream-rest (stream-range 3)))))))
54 (ert-deftest stream-seq-p-test ()
55 (should (seq-p (stream-range))))
57 (ert-deftest stream-seq-elt-test ()
58 (should (null (seq-elt (stream-empty) 0)))
59 (should (= 0 (seq-elt (stream-range) 0)))
60 (should (= 1 (seq-elt (stream-range) 1)))
61 (should (= 10 (seq-elt (stream-range) 10))))
63 (ert-deftest stream-seq-length-test ()
64 (should (zerop (seq-length (stream-empty))))
65 (should (= 10 (seq-length (stream-range 0 10)))))
67 (ert-deftest stream-seq-doseq-test ()
68 (let ((stream (stream '(a b c d)))
70 (seq-doseq (elt stream)
72 (should (equal '(d c b a) lst))))
74 (ert-deftest stream-seq-let-test ()
75 (seq-let (first _ third &rest rest) (stream-range 2 7)
78 ;; The rest of the stream shouldn't be consumed
79 (should (stream-p rest))
80 (should (= 5 (stream-first rest)))
81 (should (= 6 (stream-first (stream-rest rest))))
82 (should (stream-empty-p (stream-rest (stream-rest rest))))))
84 (ert-deftest stream-seq-subseq-test ()
88 (ert-deftest stream-seq-into-test ()
89 (should (stream-p (seq-into (stream-empty) 'stream)))
90 (should (stream-p (seq-into '(2 4 5) 'stream)))
91 (should (= 2 (stream-first (seq-into '(2 4 5) 'stream))))
92 (should (null (seq-into (stream-empty) 'list)))
93 (should (equal '(0 1 2 3 4 5 6 7 8 9) (seq-into (stream-range 0 10) 'list))))
95 (ert-deftest stream-seq-take-test ()
96 (should (stream-p (seq-take (stream-range) 2)))
97 (should (= 0 (stream-first (seq-take (stream-range) 2))))
98 (should (= 1 (stream-first (stream-rest (seq-take (stream-range) 2)))))
99 (should (null (stream-first (stream-rest (stream-rest (seq-take (stream-range) 2))))))
100 (should (stream-empty-p (stream-rest (stream-rest (seq-take (stream-range) 2))))))
102 (ert-deftest stream-seq-drop-test ()
103 (should (stream-p (seq-drop (stream-range) 2)))
104 (should (= 2 (stream-first (seq-drop (stream-range) 2))))
105 (should (= 3 (stream-first (stream-rest (seq-drop (stream-range) 2)))))
106 (should (stream-empty-p (seq-drop (stream-empty) 2))))
108 (ert-deftest stream-seq-take-while-test ()
109 (let ((stream (stream '(1 3 2 5))))
110 (should (stream-empty-p (seq-take-while #'identity (stream-empty))))
111 (should (stream-p (seq-take-while #'oddp stream)))
112 (should (= 1 (stream-first (seq-take-while #'oddp stream))))
113 (should (= 3 (stream-first (stream-rest (seq-take-while #'oddp stream)))))
114 (should (stream-empty-p (stream-rest (stream-rest (seq-take-while #'oddp stream)))))))
116 (ert-deftest stream-seq-drop-while-test ()
117 (let ((stream (stream '(1 3 2 5))))
118 (should (stream-p (seq-drop-while #'evenp stream)))
119 (should (stream-empty-p (seq-drop-while #'identity (stream-empty))))
120 (should (= 2 (stream-first (seq-drop-while #'evenp stream))))
121 (should (= 5 (stream-first (stream-rest (seq-drop-while #'evenp stream)))))
122 (should (stream-empty-p (stream-rest (stream-rest (seq-drop-while #'evenp stream)))))))
124 (ert-deftest stream-seq-map-test ()
125 (should (stream-empty-p (seq-map #'- (stream-empty))))
126 (should (= -1 (stream-first (seq-map #'- (stream-range 1)))))
127 (should (= -2 (stream-first (stream-rest (seq-map #'- (stream-range 1)))))))
129 (ert-deftest stream-seq-do-test ()
135 (should (equal result '(4 3 2 1 0)))))
137 (ert-deftest stream-seq-filter-test ()
138 (should (stream-empty-p (seq-filter #'oddp (stream-empty))))
139 (should (stream-empty-p (seq-filter #'oddp (stream-range 0 4 2))))
140 (should (= 1 (stream-first (seq-filter #'oddp (stream-range 0 4)))))
141 (should (= 3 (stream-first (stream-rest (seq-filter #'oddp (stream-range 0 4))))))
142 (should (stream-empty-p (stream-rest (stream-rest (seq-filter #'oddp (stream-range 0 4)))))))
144 (ert-deftest stream-seq-copy-test ()
145 (should (stream-p (seq-copy (stream-range))))
146 (should (= 0 (stream-first (seq-copy (stream-range)))))
147 (should (= 1 (stream-first (stream-rest (seq-copy (stream-range)))))))
149 (ert-deftest stream-range-test ()
150 (should (stream-empty-p (stream-range 0 0)))
151 (should (stream-empty-p (stream-range 3 3)))
152 (should (= 0 (stream-first (stream-range 0 6 2))))
153 (should (= 2 (stream-first (stream-rest (stream-range 0 6 2)))))
154 (should (= 4 (stream-first (stream-rest (stream-rest (stream-range 0 6 2))))))
155 (should (stream-empty-p (stream-rest (stream-rest (stream-rest (stream-range 0 6 2))))))
156 (should (= -4 (stream-first (stream-rest (stream-rest (stream-range 0 nil -2)))))))
158 (ert-deftest stream-list-test ()
159 (dolist (list '(nil '(1 2 3) '(a . b)))
160 (should (equal list (stream-to-list (stream list))))))
162 (ert-deftest stream-seq-subseq-test ()
163 (should (stream-empty-p (seq-subseq (stream-range 2 10) 0 0)))
164 (should (= (stream-first (seq-subseq (stream-range 2 10) 0 3)) 2))
165 (should (= (seq-length (seq-subseq (stream-range 2 10) 0 3)) 3))
166 (should (= (seq-elt (seq-subseq (stream-range 2 10) 0 3) 2) 4))
167 (should (= (stream-first (seq-subseq (stream-range 2 10) 1 3)) 3))
168 (should (= (seq-length (seq-subseq (stream-range 2 10) 1 3)) 2))
169 (should (= (seq-elt (seq-subseq (stream-range 2 10) 1 3) 1) 4)))
171 (provide 'stream-tests)
172 ;;; stream-tests.el ends here