]> code.delx.au - gnu-emacs-elpa/blob - packages/stream/tests/stream-tests.el
Fix compliler warnings in stream-tests.el
[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 (require 'cl-lib)
30
31 (defun stream-to-list (stream)
32 "Eagerly traverse STREAM and return a list of its elements."
33 (let (result)
34 (seq-do (lambda (elt)
35 (push elt result))
36 stream)
37 (reverse result)))
38
39 (ert-deftest stream-empty-test ()
40 (should (streamp (stream-empty)))
41 (should (stream-empty-p (stream-empty))))
42
43 (ert-deftest stream-make-test ()
44 (should (streamp (stream-range)))
45 (should (not (stream-empty-p (stream-range))))) ;; Should use stream-list or something
46
47 (ert-deftest stream-first-test ()
48 (should (= 3 (stream-first (stream-range 3))))
49 (should (null (stream-first (stream-empty)))))
50
51 (ert-deftest stream-rest-test ()
52 (should (= 4 (stream-first (stream-rest (stream-range 3)))))
53 (should (= 5 (stream-first (stream-rest (stream-rest (stream-range 3)))))))
54
55 (ert-deftest stream-seqp-test ()
56 (should (seqp (stream-range))))
57
58 (ert-deftest stream-seq-elt-test ()
59 (should (null (seq-elt (stream-empty) 0)))
60 (should (= 0 (seq-elt (stream-range) 0)))
61 (should (= 1 (seq-elt (stream-range) 1)))
62 (should (= 10 (seq-elt (stream-range) 10))))
63
64 (ert-deftest stream-seq-length-test ()
65 (should (zerop (seq-length (stream-empty))))
66 (should (= 10 (seq-length (stream-range 0 10)))))
67
68 (ert-deftest stream-seq-doseq-test ()
69 (let ((stream (stream '(a b c d)))
70 (lst '()))
71 (seq-doseq (elt stream)
72 (push elt lst))
73 (should (equal '(d c b a) lst))))
74
75 (ert-deftest stream-seq-let-test ()
76 (seq-let (first _ third &rest rest) (stream-range 2 7)
77 (should (= first 2))
78 (should (= third 4))
79 ;; The rest of the stream shouldn't be consumed
80 (should (streamp rest))
81 (should (= 5 (stream-first rest)))
82 (should (= 6 (stream-first (stream-rest rest))))
83 (should (stream-empty-p (stream-rest (stream-rest rest))))))
84
85 (ert-deftest stream-seq-subseq-test ()
86 ;; TODO
87 )
88
89 (ert-deftest stream-seq-into-test ()
90 (should (streamp (seq-into (stream-empty) 'stream)))
91 (should (streamp (seq-into '(2 4 5) 'stream)))
92 (should (= 2 (stream-first (seq-into '(2 4 5) 'stream))))
93 (should (null (seq-into (stream-empty) 'list)))
94 (should (equal '(0 1 2 3 4 5 6 7 8 9) (seq-into (stream-range 0 10) 'list))))
95
96 (ert-deftest stream-seq-take-test ()
97 (should (streamp (seq-take (stream-range) 2)))
98 (should (= 0 (stream-first (seq-take (stream-range) 2))))
99 (should (= 1 (stream-first (stream-rest (seq-take (stream-range) 2)))))
100 (should (null (stream-first (stream-rest (stream-rest (seq-take (stream-range) 2))))))
101 (should (stream-empty-p (stream-rest (stream-rest (seq-take (stream-range) 2))))))
102
103 (ert-deftest stream-seq-drop-test ()
104 (should (streamp (seq-drop (stream-range) 2)))
105 (should (= 2 (stream-first (seq-drop (stream-range) 2))))
106 (should (= 3 (stream-first (stream-rest (seq-drop (stream-range) 2)))))
107 (should (stream-empty-p (seq-drop (stream-empty) 2))))
108
109 (ert-deftest stream-seq-take-while-test ()
110 (let ((stream (stream '(1 3 2 5))))
111 (should (stream-empty-p (seq-take-while #'identity (stream-empty))))
112 (should (streamp (seq-take-while #'cl-oddp stream)))
113 (should (= 1 (stream-first (seq-take-while #'cl-oddp stream))))
114 (should (= 3 (stream-first (stream-rest (seq-take-while #'cl-oddp stream)))))
115 (should (stream-empty-p (stream-rest (stream-rest (seq-take-while #'cl-oddp stream)))))))
116
117 (ert-deftest stream-seq-drop-while-test ()
118 (let ((stream (stream '(1 3 2 5))))
119 (should (streamp (seq-drop-while #'cl-evenp stream)))
120 (should (stream-empty-p (seq-drop-while #'identity (stream-empty))))
121 (should (= 2 (stream-first (seq-drop-while #'cl-evenp stream))))
122 (should (= 5 (stream-first (stream-rest (seq-drop-while #'cl-evenp stream)))))
123 (should (stream-empty-p (stream-rest (stream-rest (seq-drop-while #'cl-evenp stream)))))))
124
125 (ert-deftest stream-seq-map-test ()
126 (should (stream-empty-p (seq-map #'- (stream-empty))))
127 (should (= -1 (stream-first (seq-map #'- (stream-range 1)))))
128 (should (= -2 (stream-first (stream-rest (seq-map #'- (stream-range 1)))))))
129
130 (ert-deftest stream-seq-do-test ()
131 (let ((result '()))
132 (seq-do
133 (lambda (elt)
134 (push elt result))
135 (stream-range 0 5))
136 (should (equal result '(4 3 2 1 0)))))
137
138 (ert-deftest stream-seq-filter-test ()
139 (should (stream-empty-p (seq-filter #'cl-oddp (stream-empty))))
140 (should (stream-empty-p (seq-filter #'cl-oddp (stream-range 0 4 2))))
141 (should (= 1 (stream-first (seq-filter #'cl-oddp (stream-range 0 4)))))
142 (should (= 3 (stream-first (stream-rest (seq-filter #'cl-oddp (stream-range 0 4))))))
143 (should (stream-empty-p (stream-rest (stream-rest (seq-filter #'cl-oddp (stream-range 0 4)))))))
144
145 (ert-deftest stream-seq-copy-test ()
146 (should (streamp (seq-copy (stream-range))))
147 (should (= 0 (stream-first (seq-copy (stream-range)))))
148 (should (= 1 (stream-first (stream-rest (seq-copy (stream-range)))))))
149
150 (ert-deftest stream-range-test ()
151 (should (stream-empty-p (stream-range 0 0)))
152 (should (stream-empty-p (stream-range 3 3)))
153 (should (= 0 (stream-first (stream-range 0 6 2))))
154 (should (= 2 (stream-first (stream-rest (stream-range 0 6 2)))))
155 (should (= 4 (stream-first (stream-rest (stream-rest (stream-range 0 6 2))))))
156 (should (stream-empty-p (stream-rest (stream-rest (stream-rest (stream-range 0 6 2))))))
157 (should (= -4 (stream-first (stream-rest (stream-rest (stream-range 0 nil -2)))))))
158
159 (ert-deftest stream-list-test ()
160 (dolist (list '(nil '(1 2 3) '(a . b)))
161 (should (equal list (stream-to-list (stream list))))))
162
163 (ert-deftest stream-seq-subseq-test ()
164 (should (stream-empty-p (seq-subseq (stream-range 2 10) 0 0)))
165 (should (= (stream-first (seq-subseq (stream-range 2 10) 0 3)) 2))
166 (should (= (seq-length (seq-subseq (stream-range 2 10) 0 3)) 3))
167 (should (= (seq-elt (seq-subseq (stream-range 2 10) 0 3) 2) 4))
168 (should (= (stream-first (seq-subseq (stream-range 2 10) 1 3)) 3))
169 (should (= (seq-length (seq-subseq (stream-range 2 10) 1 3)) 2))
170 (should (= (seq-elt (seq-subseq (stream-range 2 10) 1 3) 1) 4)))
171
172 (ert-deftest stream-seq-map-should-not-consume-stream-elements ()
173 (let* (consumed
174 (stream (stream-cons (setq consumed t) (stream-empty))))
175 (seq-map #'identity stream)
176 (should-not consumed)))
177
178 (provide 'stream-tests)
179 ;;; stream-tests.el ends here