[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[elpa] externals/stream f384660 22/36: Add systematic tests against bogu
From: |
Stefan Monnier |
Subject: |
[elpa] externals/stream f384660 22/36: Add systematic tests against bogus element generation |
Date: |
Tue, 1 Dec 2020 17:22:51 -0500 (EST) |
branch: externals/stream
commit f384660db02ddc4e97f84f30557529ae0a3aea75
Author: Michael Heerdegen <michael_heerdegen@web.de>
Commit: Michael Heerdegen <michael_heerdegen@web.de>
Add systematic tests against bogus element generation
Also add a note about this problem in the header and how to avoid it.
---
stream.el | 13 ++++++++++++-
tests/stream-tests.el | 38 ++++++++++++++++++++++++++++++++------
2 files changed, 44 insertions(+), 7 deletions(-)
diff --git a/stream.el b/stream.el
index 9954fc8..ef19918 100644
--- a/stream.el
+++ b/stream.el
@@ -4,7 +4,7 @@
;; Author: Nicolas Petton <nicolas@petton.fr>
;; Keywords: stream, laziness, sequences
-;; Version: 2.2.1
+;; Version: 2.2.2
;; Package-Requires: ((emacs "25"))
;; Package: stream
@@ -49,6 +49,17 @@
;; (defun fib (a b)
;; (stream-cons a (fib b (+ a b))))
;; (fib 0 1)
+;;
+;; A note for developers: Please make sure to implement functions that
+;; process streams (build new streams out of given streams) in a way
+;; that no new elements in any argument stream are generated. This is
+;; most likely an error since it changes the argument stream. For
+;; example, a common error is to call `stream-empty-p' on an input
+;; stream and build the stream to return depending on the result.
+;; Instead, delay such tests until elements are requested from the
+;; resulting stream. A way to achieve this is to wrap such tests into
+;; `stream-make' or `stream-delay'. See the implementations of
+;; `stream-append' or `seq-drop-while' for example.
;;; Code:
diff --git a/tests/stream-tests.el b/tests/stream-tests.el
index 31c3530..e79c3ef 100644
--- a/tests/stream-tests.el
+++ b/tests/stream-tests.el
@@ -234,12 +234,6 @@
(should (= (seq-length (seq-subseq (stream-range 2 10) 1 3)) 2))
(should (= (seq-elt (seq-subseq (stream-range 2 10) 1 3) 1) 4)))
-(ert-deftest stream-seq-map-should-not-consume-stream-elements ()
- (let* (consumed
- (stream (stream-cons (setq consumed t) (stream-empty))))
- (seq-map #'identity stream)
- (should-not consumed)))
-
(ert-deftest stream-pop-test ()
(let* ((str (stream '(1 2 3)))
(first (stream-pop str))
@@ -271,5 +265,37 @@
(stream (list 5 6 7 8 9))))))
(list 1 2 3 4 5 6 7 8 9))))
+;; Tests whether calling stream processing functions ("transducers")
+;; doesn't generate elements from argument streams
+
+(defvar this-delayed-stream-function nil)
+
+(defun make-delayed-test-stream ()
+ (stream-make
+ (cons (prog1 1 (error "`%s' not completely delayed"
this-delayed-stream-function))
+ (make-delayed-test-stream))))
+
+(defmacro deftest-for-delayed-evaluation (call)
+ (let ((function (car call)))
+ `(ert-deftest ,(intern (concat (symbol-name function) "-delayed-test")) ()
+ (let ((this-delayed-stream-function ',function))
+ (should (prog1 t ,call))))))
+
+(deftest-for-delayed-evaluation (streamp (make-delayed-test-stream)))
+(deftest-for-delayed-evaluation (seqp (make-delayed-test-stream)))
+(deftest-for-delayed-evaluation (stream-append (make-delayed-test-stream)
(make-delayed-test-stream)))
+(deftest-for-delayed-evaluation (seq-take (make-delayed-test-stream) 2))
+(deftest-for-delayed-evaluation (seq-drop (make-delayed-test-stream) 2))
+(deftest-for-delayed-evaluation (seq-take-while #'numberp
(make-delayed-test-stream)))
+(deftest-for-delayed-evaluation (seq-take-until #'numberp
(make-delayed-test-stream)))
+(deftest-for-delayed-evaluation (seq-map #'identity
(make-delayed-test-stream)))
+(deftest-for-delayed-evaluation (seq-filter #'cl-evenp
(make-delayed-test-stream)))
+(deftest-for-delayed-evaluation (stream-delay (make-delayed-test-stream)))
+(deftest-for-delayed-evaluation (seq-copy (make-delayed-test-stream)))
+(deftest-for-delayed-evaluation (seq-subseq (make-delayed-test-stream) 2))
+(deftest-for-delayed-evaluation (stream-scan #'* 1 (make-delayed-test-stream)))
+(deftest-for-delayed-evaluation (stream-concatenate (stream (list
(make-delayed-test-stream)
+
(make-delayed-test-stream)))))
+
(provide 'stream-tests)
;;; stream-tests.el ends here
- [elpa] externals/stream 6a47b33 02/36: * packages/stream/stream.el: Require Emacs 25, (continued)
- [elpa] externals/stream 6a47b33 02/36: * packages/stream/stream.el: Require Emacs 25, Stefan Monnier, 2020/12/01
- [elpa] externals/stream 6bc197b 01/36: Add stream.el to ELPA, Stefan Monnier, 2020/12/01
- [elpa] externals/stream c92d3b4 08/36: * packages/stream/stream.el: Update to version 2.0.2., Stefan Monnier, 2020/12/01
- [elpa] externals/stream 11f19ab 10/36: Update stream.el to v2.0.5, Stefan Monnier, 2020/12/01
- [elpa] externals/stream 8af657a 12/36: * packages/stream/stream.el (streamp): Tiny optimization., Stefan Monnier, 2020/12/01
- [elpa] externals/stream 8239285 13/36: Fix compliler warnings in stream-tests.el, Stefan Monnier, 2020/12/01
- [elpa] externals/stream 18146ee 04/36: * packages/stream/stream.el: Update stream.el to v 1.1.0., Stefan Monnier, 2020/12/01
- [elpa] externals/stream 01fc059 03/36: * packages/stream/stream.el: Update stream to v 1.0.1., Stefan Monnier, 2020/12/01
- [elpa] externals/stream 1a61660 11/36: * stream.el: Implement `seqp' instead of `seq-p', Stefan Monnier, 2020/12/01
- [elpa] externals/stream 5762f78 21/36: Pinpoint semantics of `seq-subseq's implementation for streams, Stefan Monnier, 2020/12/01
- [elpa] externals/stream f384660 22/36: Add systematic tests against bogus element generation,
Stefan Monnier <=
- [elpa] externals/stream ec86243 24/36: Some details in the documentation, Stefan Monnier, 2020/12/01
- [elpa] externals/stream b0c8949 28/36: Implement `seq-mapn' method for streams, Stefan Monnier, 2020/12/01
- [elpa] externals/stream 7874a25 05/36: * packages/stream/tests/stream-tests.el: New tests., Stefan Monnier, 2020/12/01
- [elpa] externals/stream d77b733 09/36: Update stream.el to v2.0.2., Stefan Monnier, 2020/12/01
- [elpa] externals/stream fbe7ebd 06/36: Update stream.el to version 2.0.0, Stefan Monnier, 2020/12/01
- [elpa] externals/stream a8aa25c 07/36: * packages/stream/stream.el: Update stream.el to version 2.0.1., Stefan Monnier, 2020/12/01
- [elpa] externals/stream 2b2ba28 14/36: update stream.el to the latest version, Stefan Monnier, 2020/12/01
- [elpa] externals/stream 00e523f 15/36: Add stream stream-delay and stream-of-directory-files, Stefan Monnier, 2020/12/01
- [elpa] externals/stream ac42cc1 18/36: Fix some quoting problems in doc strings, Stefan Monnier, 2020/12/01
- [elpa] externals/stream a36469b 17/36: Add some more basic stream operations, Stefan Monnier, 2020/12/01