X-Git-Url: https://code.delx.au/gnu-emacs-elpa/blobdiff_plain/11b34357c50788ec5e6e5f433f9a2a9f55d5f7be..8b3326ff7251ba402002dfcbb9272f59547f09ab:/packages/stream/tests/stream-tests.el diff --git a/packages/stream/tests/stream-tests.el b/packages/stream/tests/stream-tests.el index 0033ed74a..16b5756ea 100644 --- a/packages/stream/tests/stream-tests.el +++ b/packages/stream/tests/stream-tests.el @@ -26,6 +26,7 @@ (require 'ert) (require 'stream) +(require 'cl-lib) (defun stream-to-list (stream) "Eagerly traverse STREAM and return a list of its elements." @@ -51,8 +52,37 @@ (should (= 4 (stream-first (stream-rest (stream-range 3))))) (should (= 5 (stream-first (stream-rest (stream-rest (stream-range 3))))))) -(ert-deftest stream-seq-p-test () - (should (seq-p (stream-range)))) +(ert-deftest stream-from-iterator-test () + (skip-unless (require 'generator nil t)) + (should (equal '(1 2) + (seq-into-sequence + (stream-from-iterator + (funcall (iter-lambda () + (iter-yield 1) + (iter-yield 2)))))))) + +(ert-deftest stream-append-test () + (should (stream-empty-p (stream-append))) + (should (let ((list '(1 2))) + (equal list (seq-into-sequence (stream-append (stream list)))))) + (should (= (seq-elt (stream-append + (stream (list 0 1)) + (stream-range 2)) + 4) + 4)) + (should (let ((stream (stream (list 0)))) + (and (= (seq-elt (stream-append stream (stream-range 1)) 10) + 10) + (stream-empty-p (stream-rest stream))))) + (should (equal (seq-into-sequence + (stream-append + (stream '(1)) + (stream '()) + (stream '(2 3)))) + '(1 2 3)))) + +(ert-deftest stream-seqp-test () + (should (seqp (stream-range)))) (ert-deftest stream-seq-elt-test () (should (null (seq-elt (stream-empty) 0))) @@ -108,18 +138,18 @@ (ert-deftest stream-seq-take-while-test () (let ((stream (stream '(1 3 2 5)))) (should (stream-empty-p (seq-take-while #'identity (stream-empty)))) - (should (streamp (seq-take-while #'oddp stream))) - (should (= 1 (stream-first (seq-take-while #'oddp stream)))) - (should (= 3 (stream-first (stream-rest (seq-take-while #'oddp stream))))) - (should (stream-empty-p (stream-rest (stream-rest (seq-take-while #'oddp stream))))))) + (should (streamp (seq-take-while #'cl-oddp stream))) + (should (= 1 (stream-first (seq-take-while #'cl-oddp stream)))) + (should (= 3 (stream-first (stream-rest (seq-take-while #'cl-oddp stream))))) + (should (stream-empty-p (stream-rest (stream-rest (seq-take-while #'cl-oddp stream))))))) (ert-deftest stream-seq-drop-while-test () (let ((stream (stream '(1 3 2 5)))) - (should (streamp (seq-drop-while #'evenp stream))) + (should (streamp (seq-drop-while #'cl-evenp stream))) (should (stream-empty-p (seq-drop-while #'identity (stream-empty)))) - (should (= 2 (stream-first (seq-drop-while #'evenp stream)))) - (should (= 5 (stream-first (stream-rest (seq-drop-while #'evenp stream))))) - (should (stream-empty-p (stream-rest (stream-rest (seq-drop-while #'evenp stream))))))) + (should (= 2 (stream-first (seq-drop-while #'cl-evenp stream)))) + (should (= 5 (stream-first (stream-rest (seq-drop-while #'cl-evenp stream))))) + (should (stream-empty-p (stream-rest (stream-rest (seq-drop-while #'cl-evenp stream))))))) (ert-deftest stream-seq-map-test () (should (stream-empty-p (seq-map #'- (stream-empty)))) @@ -135,16 +165,46 @@ (should (equal result '(4 3 2 1 0))))) (ert-deftest stream-seq-filter-test () - (should (stream-empty-p (seq-filter #'oddp (stream-empty)))) - (should (stream-empty-p (seq-filter #'oddp (stream-range 0 4 2)))) - (should (= 1 (stream-first (seq-filter #'oddp (stream-range 0 4))))) - (should (= 3 (stream-first (stream-rest (seq-filter #'oddp (stream-range 0 4)))))) - (should (stream-empty-p (stream-rest (stream-rest (seq-filter #'oddp (stream-range 0 4))))))) + (should (stream-empty-p (seq-filter #'cl-oddp (stream-empty)))) + (should (stream-empty-p (seq-filter #'cl-oddp (stream-range 0 4 2)))) + (should (= 1 (stream-first (seq-filter #'cl-oddp (stream-range 0 4))))) + (should (= 3 (stream-first (stream-rest (seq-filter #'cl-oddp (stream-range 0 4)))))) + (should (stream-empty-p (stream-rest (stream-rest (seq-filter #'cl-oddp (stream-range 0 4))))))) + +(ert-deftest stream-delay-test () + (should (streamp (stream-delay (stream-range)))) + (should (= 0 (stream-first (stream-delay (stream-range))))) + (should (= 1 (stream-first (stream-rest (stream-delay (stream-range)))))) + (should (let ((stream (stream-range 3 7))) + (equal (seq-into (stream-delay stream) 'list) + (seq-into stream 'list)))) + (should (null (seq-into (stream-delay (stream-empty)) 'list))) + (should (let* ((evaluated nil) + (one-plus (lambda (el) + (setq evaluated t) + (1+ el))) + (stream (seq-map one-plus (stream '(1))))) + (equal '(nil 2 t) + (list evaluated (stream-first stream) evaluated)))) + (should (let* ((a 0) + (set-a (lambda (x) (setq a x))) + (s (stream-delay (stream (list a)))) + res1 res2) + (funcall set-a 5) + (setq res1 (stream-first s)) + (funcall set-a 11) + (setq res2 (stream-first s)) + (and (equal res1 5) + (equal res2 5))))) (ert-deftest stream-seq-copy-test () (should (streamp (seq-copy (stream-range)))) (should (= 0 (stream-first (seq-copy (stream-range))))) - (should (= 1 (stream-first (stream-rest (seq-copy (stream-range))))))) + (should (= 1 (stream-first (stream-rest (seq-copy (stream-range)))))) + (should (let ((stream (stream-range 3 7))) + (equal (seq-into (seq-copy stream) 'list) + (seq-into stream 'list)))) + (should (null (seq-into (seq-copy (stream-empty)) 'list)))) (ert-deftest stream-range-test () (should (stream-empty-p (stream-range 0 0))) @@ -174,5 +234,36 @@ (seq-map #'identity stream) (should-not consumed))) +(ert-deftest stream-pop-test () + (let* ((str (stream '(1 2 3))) + (first (stream-pop str)) + (stream-empty (stream-empty))) + (should (= 1 first)) + (should (= 2 (stream-first str))) + (should (null (stream-pop stream-empty))))) + +(ert-deftest stream-scan-test () + (should (eq (seq-elt (stream-scan #'* 1 (stream-range 1)) 4) 24))) + +(ert-deftest stream-flush-test () + (should (let* ((times 0) + (count (lambda () (cl-incf times)))) + (letrec ((make-test-stream (lambda () (stream-cons (progn (funcall count) nil) + (funcall make-test-stream))))) + (stream-flush (seq-take (funcall make-test-stream) 5)) + (eq times 5))))) + +(ert-deftest stream-iterate-function-test () + (should (equal (list 0 1 2) (seq-into-sequence (seq-take (stream-iterate-function #'1+ 0) 3))))) + +(ert-deftest stream-concatenate-test () + (should (equal (seq-into-sequence + (stream-concatenate + (stream (list (stream (list 1 2 3)) + (stream (list)) + (stream (list 4)) + (stream (list 5 6 7 8 9)))))) + (list 1 2 3 4 5 6 7 8 9)))) + (provide 'stream-tests) ;;; stream-tests.el ends here