]> code.delx.au - gnu-emacs-elpa/blob - packages/stream/tests/stream-tests.el
Merge commit '37c46180280f10fa5120a017acd04f7022d124e4'
[gnu-emacs-elpa] / packages / stream / tests / stream-tests.el
1 ;;; stream-tests.el --- Unit tests for stream.el -*- lexical-binding: t -*-
2
3 ;; Copyright (C) 2015 Free Software Foundation, Inc.
4
5 ;; Author: Nicolas Petton <nicolas@petton.fr>
6
7 ;; Maintainer: emacs-devel@gnu.org
8
9 ;; This file is part of GNU Emacs.
10
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.
15
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.
20
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/>.
23
24 ;;; Commentary:
25 ;;; Code:
26
27 (require 'ert)
28 (require 'stream)
29
30 (defun stream-to-list (stream)
31 "Eagerly traverse STREAM and return a list of its elements."
32 (let (result)
33 (seq-do (lambda (elt)
34 (push elt result))
35 stream)
36 (reverse result)))
37
38 (ert-deftest stream-empty-test ()
39 (should (streamp (stream-empty)))
40 (should (stream-empty-p (stream-empty))))
41
42 (ert-deftest stream-make-test ()
43 (should (streamp (stream-range)))
44 (should (not (stream-empty-p (stream-range))))) ;; Should use stream-list or something
45
46 (ert-deftest stream-first-test ()
47 (should (= 3 (stream-first (stream-range 3))))
48 (should (null (stream-first (stream-empty)))))
49
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)))))))
53
54 (ert-deftest stream-seq-p-test ()
55 (should (seq-p (stream-range))))
56
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))))
62
63 (ert-deftest stream-seq-length-test ()
64 (should (zerop (seq-length (stream-empty))))
65 (should (= 10 (seq-length (stream-range 0 10)))))
66
67 (ert-deftest stream-seq-doseq-test ()
68 (let ((stream (stream '(a b c d)))
69 (lst '()))
70 (seq-doseq (elt stream)
71 (push elt lst))
72 (should (equal '(d c b a) lst))))
73
74 (ert-deftest stream-seq-let-test ()
75 (seq-let (first _ third &rest rest) (stream-range 2 7)
76 (should (= first 2))
77 (should (= third 4))
78 ;; The rest of the stream shouldn't be consumed
79 (should (streamp 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))))))
83
84 (ert-deftest stream-seq-subseq-test ()
85 ;; TODO
86 )
87
88 (ert-deftest stream-seq-into-test ()
89 (should (streamp (seq-into (stream-empty) 'stream)))
90 (should (streamp (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))))
94
95 (ert-deftest stream-seq-take-test ()
96 (should (streamp (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))))))
101
102 (ert-deftest stream-seq-drop-test ()
103 (should (streamp (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))))
107
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 (streamp (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)))))))
115
116 (ert-deftest stream-seq-drop-while-test ()
117 (let ((stream (stream '(1 3 2 5))))
118 (should (streamp (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)))))))
123
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)))))))
128
129 (ert-deftest stream-seq-do-test ()
130 (let ((result '()))
131 (seq-do
132 (lambda (elt)
133 (push elt result))
134 (stream-range 0 5))
135 (should (equal result '(4 3 2 1 0)))))
136
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)))))))
143
144 (ert-deftest stream-seq-copy-test ()
145 (should (streamp (seq-copy (stream-range))))
146 (should (= 0 (stream-first (seq-copy (stream-range)))))
147 (should (= 1 (stream-first (stream-rest (seq-copy (stream-range)))))))
148
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)))))))
157
158 (ert-deftest stream-list-test ()
159 (dolist (list '(nil '(1 2 3) '(a . b)))
160 (should (equal list (stream-to-list (stream list))))))
161
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)))
170
171 (ert-deftest stream-seq-map-should-not-consume-stream-elements ()
172 (let* (consumed
173 (stream (stream-cons (setq consumed t) (stream-empty))))
174 (seq-map #'identity stream)
175 (should-not consumed)))
176
177 (provide 'stream-tests)
178 ;;; stream-tests.el ends here