From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!.POSTED!not-for-mail From: Alex Newsgroups: gmane.emacs.bugs Subject: bug#27559: 26.0.50; [PATCH] Add tests for cl-macs.el Date: Sun, 02 Jul 2017 23:54:26 -0600 Message-ID: <87zicmxdyl.fsf@lylat> NNTP-Posting-Host: blaine.gmane.org Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" X-Trace: blaine.gmane.org 1499061322 3951 195.159.176.226 (3 Jul 2017 05:55:22 GMT) X-Complaints-To: usenet@blaine.gmane.org NNTP-Posting-Date: Mon, 3 Jul 2017 05:55:22 +0000 (UTC) To: 27559@debbugs.gnu.org Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Mon Jul 03 07:55:13 2017 Return-path: Envelope-to: geb-bug-gnu-emacs@m.gmane.org Original-Received: from lists.gnu.org ([208.118.235.17]) by blaine.gmane.org with esmtp (Exim 4.84_2) (envelope-from ) id 1dRuKF-0000PJ-DQ for geb-bug-gnu-emacs@m.gmane.org; Mon, 03 Jul 2017 07:55:11 +0200 Original-Received: from localhost ([::1]:60461 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dRuKK-0002eF-IT for geb-bug-gnu-emacs@m.gmane.org; Mon, 03 Jul 2017 01:55:16 -0400 Original-Received: from eggs.gnu.org ([2001:4830:134:3::10]:54470) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dRuKC-0002aX-0Q for bug-gnu-emacs@gnu.org; Mon, 03 Jul 2017 01:55:10 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dRuK7-0001m3-23 for bug-gnu-emacs@gnu.org; Mon, 03 Jul 2017 01:55:08 -0400 Original-Received: from debbugs.gnu.org ([208.118.235.43]:46664) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1dRuK6-0001lv-T6 for bug-gnu-emacs@gnu.org; Mon, 03 Jul 2017 01:55:02 -0400 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1dRuK6-0005gg-KG for bug-gnu-emacs@gnu.org; Mon, 03 Jul 2017 01:55:02 -0400 X-Loop: help-debbugs@gnu.org Resent-From: Alex Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Mon, 03 Jul 2017 05:55:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: report 27559 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: patch X-Debbugs-Original-To: bug-gnu-emacs@gnu.org Original-Received: via spool by submit@debbugs.gnu.org id=B.149906129021839 (code B ref -1); Mon, 03 Jul 2017 05:55:02 +0000 Original-Received: (at submit) by debbugs.gnu.org; 3 Jul 2017 05:54:50 +0000 Original-Received: from localhost ([127.0.0.1]:49341 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1dRuJt-0005gA-UE for submit@debbugs.gnu.org; Mon, 03 Jul 2017 01:54:50 -0400 Original-Received: from eggs.gnu.org ([208.118.235.92]:35107) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1dRuJr-0005fw-AL for submit@debbugs.gnu.org; Mon, 03 Jul 2017 01:54:48 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dRuJj-0001fW-Qu for submit@debbugs.gnu.org; Mon, 03 Jul 2017 01:54:42 -0400 Original-Received: from lists.gnu.org ([2001:4830:134:3::11]:41610) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1dRuJj-0001ey-MK for submit@debbugs.gnu.org; Mon, 03 Jul 2017 01:54:39 -0400 Original-Received: from eggs.gnu.org ([2001:4830:134:3::10]:54290) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dRuJg-0002XL-Pf for bug-gnu-emacs@gnu.org; Mon, 03 Jul 2017 01:54:39 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dRuJb-0001d4-Mk for bug-gnu-emacs@gnu.org; Mon, 03 Jul 2017 01:54:36 -0400 Original-Received: from mail-io0-x22b.google.com ([2607:f8b0:4001:c06::22b]:35863) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1dRuJb-0001cv-C6 for bug-gnu-emacs@gnu.org; Mon, 03 Jul 2017 01:54:31 -0400 Original-Received: by mail-io0-x22b.google.com with SMTP id z62so51248397ioi.3 for ; Sun, 02 Jul 2017 22:54:31 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:subject:date:message-id:mime-version; bh=vD+lc5eEaqeCN+y2WaRACr4VvV1rLYGaa6P4bOXVy94=; b=NxHuWk5k4ycJ6U8qcWiq4H12KW8HymGDvNRQl/0Vvp4CZ+UWG0h9AC4eaSV7nq90eG +qmEdOGnUljidxL2rThDfp2VbrQ0NEOCsmzzUZrktrQ24DLB446E+oba6fyNAjrCmiGM urocGD88+1v4wVsna7H9nLdhkOdFjGtjLIGcbag8zC9rutHZHL+eNNkWaFy8irHeU45q 5thbPkrGwxFhj7gFtdE2hh59oSzHWcPh0XM68tLrbhDLJbEi+miDhEzwW8/LnlK9UisL kSdDVbbucDTmfImaIL2WCZr8lEZv80mkutgzHm8auE33GWp4o0fWHvJpthVczy8n6yiA SKcQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:mime-version; bh=vD+lc5eEaqeCN+y2WaRACr4VvV1rLYGaa6P4bOXVy94=; b=E1D5tDP7hchnkb+2Lk4Yb0+cCCxvUz98XAvzXoGeg5sEE+RH/4RjyuxmyZQHt1zsTn gWI/0NkV62NhToUo292BERM3v9+OhMKshOn9bzFFPSQJPIhke6GFBDnNI2x4HlQlB+bB +935dxFeie5rDuf56OACnlmdAgwCfpv94fXizsyE7CtY26BUI6eWm1Los72XEDYChogs UZS7EyWFS6uznjUhh9ipD97TmbO5O3nHTUqDEdWeDDQ8iigbn/L7SaKf79SbODYRCqaV s8ecixANymox/fU3xhjkHSwv3szcoLiczA8irEKvoItS3Qk27ZGHU3awUIc0G/byGuA9 t5Mg== X-Gm-Message-State: AKS2vOwmdiuh95LnNBv3LnHexLNo5OP2Ze2ieeV7HRfxhJo+R60fYz9k 55pORjUwg5C20shC X-Received: by 10.107.7.226 with SMTP id g95mr32073035ioi.33.1499061270376; Sun, 02 Jul 2017 22:54:30 -0700 (PDT) Original-Received: from lylat (S010664777d9cebe3.ss.shawcable.net. [70.64.85.59]) by smtp.gmail.com with ESMTPSA id 66sm7657793iov.21.2017.07.02.22.54.28 for (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Sun, 02 Jul 2017 22:54:28 -0700 (PDT) X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6.x X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 208.118.235.43 X-BeenThere: bug-gnu-emacs@gnu.org List-Id: "Bug reports for GNU Emacs, the Swiss army knife of text editors" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Original-Sender: "bug-gnu-emacs" Xref: news.gmane.org gmane.emacs.bugs:134112 Archived-At: --=-=-= Content-Type: text/plain This initial version just includes tests for cl-loop, many of which were adapted from Common Lisp the Language 2nd Edition. They are mostly ordered by their appearance in the Hyperspec. When I was just about finished I realized that I could have just used an ert wrapper macro to avoid all of the (eval (quote ...))) business, which would have the added bonus of easily evaluating most of the tests lexically. Should I redo it in this way? --=-=-= Content-Type: text/x-diff Content-Disposition: attachment; filename=0001-Add-tests-for-cl-macs.el.patch Content-Description: cl-loop tests >From 3c1abd54e52a01808de1ebd67a4fc49465700c11 Mon Sep 17 00:00:00 2001 From: Alexander Gramiak Date: Sun, 2 Jul 2017 23:46:50 -0600 Subject: [PATCH] Add tests for cl-macs.el * test/lisp/emacs-lisp/cl-lib-tests.el (cl-lib-test-loop): Remove this duplicate. (cl-loop-destructuring-with): Move to cl-macs-tests.el. * test/lisp/emacs-lisp/cl-macs-tests.el: New file. --- test/lisp/emacs-lisp/cl-lib-tests.el | 10 +- test/lisp/emacs-lisp/cl-macs-tests.el | 507 ++++++++++++++++++++++++++++++++++ 2 files changed, 509 insertions(+), 8 deletions(-) create mode 100644 test/lisp/emacs-lisp/cl-macs-tests.el diff --git a/test/lisp/emacs-lisp/cl-lib-tests.el b/test/lisp/emacs-lisp/cl-lib-tests.el index 65bd97f3b2..e1f0955839 100644 --- a/test/lisp/emacs-lisp/cl-lib-tests.el +++ b/test/lisp/emacs-lisp/cl-lib-tests.el @@ -1,4 +1,4 @@ -;;; cl-lib.el --- tests for emacs-lisp/cl-lib.el -*- lexical-binding:t -*- +;;; cl-lib-tests.el --- tests for emacs-lisp/cl-lib.el -*- lexical-binding:t -*- ;; Copyright (C) 2013-2017 Free Software Foundation, Inc. @@ -195,9 +195,6 @@ (should (eql (cl-mismatch "Aa" "aA") 0)) (should (eql (cl-mismatch '(a b c) '(a b d)) 2))) -(ert-deftest cl-lib-test-loop () - (should (eql (cl-loop with (a b c) = '(1 2 3) return (+ a b c)) 6))) - (ert-deftest cl-lib-keyword-names-versus-values () (should (equal (funcall (cl-function (lambda (&key a b) (list a b))) @@ -480,9 +477,6 @@ (should (= 239 (cl-parse-integer "zzef" :radix 16 :start 2))) (should (= -123 (cl-parse-integer " -123 ")))) -(ert-deftest cl-loop-destructuring-with () - (should (equal (cl-loop with (a b c) = '(1 2 3) return (+ a b c)) 6))) - (ert-deftest cl-flet-test () (should (equal (cl-flet ((f1 (x) x)) (let ((x #'f1)) (funcall x 5))) 5))) @@ -548,4 +542,4 @@ cl-lib-symbol-macrolet-4+5 (should cl-old-struct-compat-mode) (cl-old-struct-compat-mode (if saved 1 -1)))) -;;; cl-lib.el ends here +;;; cl-lib-tests.el ends here diff --git a/test/lisp/emacs-lisp/cl-macs-tests.el b/test/lisp/emacs-lisp/cl-macs-tests.el new file mode 100644 index 0000000000..03ce655fb8 --- /dev/null +++ b/test/lisp/emacs-lisp/cl-macs-tests.el @@ -0,0 +1,507 @@ +;;; cl-macs-tests.el --- tests for emacs-lisp/cl-macs.el -*- lexical-binding:t -*- + +;; Copyright (C) 2017 Free Software Foundation, Inc. + +;; This file is part of GNU Emacs. + +;; This program is free software: you can redistribute it and/or +;; modify it under the terms of the GNU General Public License as +;; published by the Free Software Foundation, either version 3 of the +;; License, or (at your option) any later version. +;; +;; This program is distributed in the hope that it will be useful, but +;; WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +;; General Public License for more details. +;; +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see `http://www.gnu.org/licenses/'. + +;;; Commentary: + +;;; Code: + +(require 'cl-lib) +(require 'cl-macs) +(require 'ert) + + +;;;; cl-loop tests -- many adapted from Steele's CLtL2 + +;;; ANSI 6.1.1.7 Destructuring +(ert-deftest cl-macs-loop-and-assignment () + ;; Bug#6583 + :expected-result :failed + (should (equal (eval '(cl-loop for numlist in '((1 2 4.0) (5 6 8.3) (8 9 10.4)) + for a = (cl-first numlist) + and b = (cl-second numlist) + and c = (cl-third numlist) + collect (list c b a))) + '((4.0 2 1) (8.3 6 5) (10.4 9 8))))) + +(ert-deftest cl-macs-loop-destructure () + (should (equal (eval '(cl-loop for (a b c) in '((1 2 4.0) (5 6 8.3) (8 9 10.4)) + collect (list c b a))) + '((4.0 2 1) (8.3 6 5) (10.4 9 8))))) + +(ert-deftest cl-macs-loop-destructure-nil () + (should (equal (eval '(cl-loop for (a nil b) = '(1 2 3) + do (cl-return (list a b)))) + '(1 3)))) + +(ert-deftest cl-macs-loop-destructure-cons () + (should (equal (eval '(cl-loop for ((a . b) (c . d)) in + '(((1.2 . 2.4) (3 . 4)) ((3.4 . 4.6) (5 . 6))) + collect (list a b c d))) + '((1.2 2.4 3 4) (3.4 4.6 5 6))))) + +(ert-deftest cl-loop-destructuring-with () + (should (equal (eval '(cl-loop with (a b c) = '(1 2 3) return (+ a b c))) 6))) + +;;; 6.1.2.1.1 The for-as-arithmetic subclause +(ert-deftest cl-macs-loop-for-as-arith () + "Test various for-as-arithmetic subclauses." + :expected-result :failed + (should (equal (eval '(cl-loop for i to 10 by 3 collect i)) + '(0 3 6 9))) + (should (equal (eval '(cl-loop for i upto 3 collect i)) + '(0 1 2 3))) + (should (equal (eval '(cl-loop for i below 3 collect i)) + '(0 1 2))) + (should (equal (eval '(cl-loop for i below 10 by 2 collect i)) + '(0 2 4 6 8))) + (should (equal (eval '(cl-loop for i downfrom 10 above 4 by 2 collect i)) + '(10 8 6))) + (should (equal (eval '(cl-loop for i from 10 downto 1 by 3 collect i)) + '(10 7 4 1))) + (should (equal (eval '(cl-loop for i above 0 by 2 downfrom 10 collect i)) + '(10 8 6 4 2))) + (should (equal (eval '(cl-loop for i downto 10 from 15 collect i)) + '(15 14 13 12 11 10)))) + +(ert-deftest cl-macs-loop-for-as-arith-order-side-effects () + "Test side effects generated by different arithmetic phrase order." + :expected-result :failed + (should + (equal (eval '(let ((x 1)) + (cl-loop for i from x to 10 by (cl-incf x) collect i))) + '(1 3 5 7 9))) + (should + (equal (eval '(let ((x 1)) + (cl-loop for i from x by (cl-incf x) to 10 collect i))) + '(1 3 5 7 9))) + (should + (equal (eval '(let ((x 1)) + (cl-loop for i to 10 from x by (cl-incf x) collect i))) + '(1 3 5 7 9))) + (should + (equal (eval '(let ((x 1)) + (cl-loop for i to 10 by (cl-incf x) from x collect i))) + '(2 4 6 8 10))) + (should + (equal (eval '(let ((x 1)) + (cl-loop for i by (cl-incf x) from x to 10 collect i))) + '(2 4 6 8 10))) + (should + (equal (eval '(let ((x 1)) + (cl-loop for i by (cl-incf x) to 10 from x collect i))) + '(2 4 6 8 10)))) + +(ert-deftest cl-macs-loop-for-as-arith-invalid () + "Test for invalid phrase combinations." + :expected-result :failed + ;; Mixing arithmetic-up and arithmetic-down* subclauses + (should-error (eval '(cl-loop for i downfrom 10 below 20 collect i))) + (should-error (eval '(cl-loop for i upfrom 20 above 10 collect i))) + (should-error (eval '(cl-loop for i upto 10 by 2 downfrom 5))) + ;; Repeated phrases + (should-error (eval '(cl-loop for i from 10 to 20 above 10))) + (should-error (eval '(cl-loop for i from 10 to 20 upfrom 0))) + (should-error (eval '(cl-loop for i by 2 to 10 by 5))) + ;; negative step + (should-error (eval '(cl-loop for i by -1))) + ;; no step given for a downward loop + (should-error (eval '(cl-loop for i downto -5 collect i)))) + + +;;; 6.1.2.1.2 The for-as-in-list subclause +(ert-deftest cl-macs-loop-for-as-in-list () + (should (equal (eval '(cl-loop for x in '(1 2 3 4 5 6) collect (* x x))) + '(1 4 9 16 25 36))) + (should (equal (eval '(cl-loop for x in '(1 2 3 4 5 6) by #'cddr collect (* x x))) + '(1 9 25)))) + +;;; 6.1.2.1.3 The for-as-on-list subclause +(ert-deftest cl-macs-loop-for-as-on-list () + (should (equal (eval '(cl-loop for x on '(1 2 3 4) collect x)) + '((1 2 3 4) (2 3 4) (3 4) (4)))) + (should (equal (eval '(cl-loop as (item) on '(1 2 3 4) by #'cddr collect item)) + '(1 3)))) + +;;; 6.1.2.1.4 The for-as-equals-then subclause +(ert-deftest cl-macs-loop-for-as-equals-then () + (should (equal (eval '(cl-loop for item = 1 then (+ item 10) + repeat 5 + collect item)) + '(1 11 21 31 41))) + (should (equal (eval '(cl-loop for x below 5 for y = nil then x collect (list x y))) + '((0 nil) (1 1) (2 2) (3 3) (4 4)))) + (should (equal (eval '(cl-loop for x below 5 and y = nil then x collect (list x y))) + '((0 nil) (1 0) (2 1) (3 2) (4 3)))) + (should (equal (eval '(cl-loop for x below 3 for y = (+ 10 x) nconc (list x y))) + '(0 10 1 11 2 12))) + (should (equal (eval '(cl-loop with start = 5 + for x = start + then (cl-incf start) + repeat 5 + collect x)) + '(5 6 7 8 9)))) + +;;; 6.1.2.1.5 The for-as-across subclause +(ert-deftest cl-macs-loop-for-as-across () + (should (string= (eval '(cl-loop for x across "aeiou" + concat (char-to-string x))) + "aeiou")) + (should (equal (eval '(cl-loop for v across (vector 1 2 3) vconcat (vector v (+ 10 v)))) + [1 11 2 12 3 13]))) + +;;; 6.1.2.1.6 The for-as-hash subclause +(ert-deftest cl-macs-loop-for-as-hash () + ;; example in Emacs manual 4.7.3 + (should (equal (eval '(let ((hash (make-hash-table))) + (setf (gethash 1 hash) 10) + (setf (gethash "test" hash) "string") + (setf (gethash 'test hash) 'value) + (cl-loop for k being the hash-keys of hash + using (hash-values v) + collect (list k v)))) + '((1 10) ("test" "string") (test value))))) + +;;; 6.1.2.2 Local Variable Initializations +(ert-deftest cl-macs-loop-with () + (should (equal (eval '(cl-loop with a = 1 + with b = (+ a 2) + with c = (+ b 3) + return (list a b c))) + '(1 3 6))) + (should (equal (eval '(let ((a 5) + (b 10)) + (cl-loop with a = 1 + and b = (+ a 2) + and c = (+ b 3) + return (list a b c)))) + '(1 7 13))) + (should (and (equal (eval '(cl-loop for i below 3 with loop-with + do (push (* i i) loop-with) + finally (cl-return loop-with))) + '(4 1 0)) + (not (boundp 'loop-with))))) + +;;; 6.1.3 Value Accumulation Clauses +(ert-deftest cl-macs-loop-accum () + (should (equal (eval '(cl-loop for name in '(fred sue alice joe june) + for kids in '((bob ken) () () (kris sunshine) ()) + collect name + append kids)) + '(fred bob ken sue alice joe kris sunshine june)))) + +(ert-deftest cl-macs-loop-collect () + (should (equal (eval '(cl-loop for i in '(bird 3 4 turtle (1 . 4) horse cat) + when (symbolp i) collect i)) + '(bird turtle horse cat))) + (should (equal (eval '(cl-loop for i from 1 to 10 + if (cl-oddp i) collect i)) + '(1 3 5 7 9))) + (should (equal (eval '(cl-loop for i in '(a b c d e f g) by #'cddr + collect i into my-list + finally return (nbutlast my-list))) + '(a c e)))) + +(ert-deftest cl-macs-loop-append/nconc () + (should (equal (eval '(cl-loop for x in '((a) (b) ((c))) + append x)) + '(a b (c)))) + (should (equal (eval '(cl-loop for i upfrom 0 + as x in '(a b (c)) + nconc (if (cl-evenp i) (list x) nil))) + '(a (c))))) + +(ert-deftest cl-macs-loop-count () + (should (eql (eval '(cl-loop for i in '(a b nil c nil d e) + count i)) + 5))) + +(ert-deftest cl-macs-loop-max/min () + (should (eql (eval '(cl-loop for i in '(2 1 5 3 4) + maximize i)) + 5)) + (should (eql (eval '(cl-loop for i in '(2 1 5 3 4) + minimize i)) + 1)) + (should (equal (eval '(cl-loop with series = '(4.3 1.2 5.7) + for v in series + minimize (round v) into min-result + maximize (round v) into max-result + collect (list min-result max-result))) + '((4 4) (1 4) (1 6))))) + +(ert-deftest cl-macs-loop-sum () + (should (eql (eval '(cl-loop for i in '(1 2 3 4 5) + sum i)) + 15)) + (should (eql (eval '(cl-loop with series = '(1.2 4.3 5.7) + for v in series + sum (* 2.0 v))) + 22.4))) + +;;; 6.1.4 Termination Test Clauses +(ert-deftest cl-macs-loop-repeat () + (should (equal (eval '(cl-loop with n = 4 + repeat (1+ n) + collect n)) + '(4 4 4 4 4))) + (should (equal (eval '(cl-loop for i upto 5 + repeat 3 + collect i)) + '(0 1 2)))) + +(ert-deftest cl-macs-loop-always () + (should (eval '(cl-loop for i from 0 to 10 + always (< i 11)))) + (should-not (eval '(cl-loop for i from 0 to 10 + always (< i 9) + finally (cl-return "you won't see this"))))) + +(ert-deftest cl-macs-loop-never () + (should (eval '(cl-loop for i from 0 to 10 + never (> i 11)))) + (should-not (eval '(cl-loop never t + finally (cl-return "you won't see this"))))) + +(ert-deftest cl-macs-loop-thereis () + (should (eql (eval '(cl-loop for i from 0 + thereis (when (> i 10) i))) + 11)) + (should (string= (eval '(cl-loop thereis "Here is my value" + finally (cl-return "you won't see this"))) + "Here is my value")) + (should (eval '(cl-loop for i to 10 + thereis (> i 11) + finally (cl-return i))))) + +(ert-deftest cl-macs-loop-anon-collection-conditional () + "Always/never/thereis should error when used with an anonymous +collection clause." + :expected-result :failed + (should-error (eval '(cl-loop always nil collect t))) + (should-error (eval '(cl-loop never t nconc t))) + (should-error (eval '(cl-loop thereis t append t)))) + +(ert-deftest cl-macs-loop-while () + (should (equal (eval '(let ((stack '(a b c d e f))) + (cl-loop while stack + for item = (length stack) then (pop stack) + collect item))) + '(6 a b c d e f)))) + +(ert-deftest cl-macs-loop-until () + (should (equal (eval '(cl-loop for i to 100 + collect 10 + until (= i 3) + collect i)) + '(10 0 10 1 10 2 10)))) + +;;; 6.1.5 Unconditional Execution Clauses +(ert-deftest cl-macs-loop-do () + (should (equal (eval '(cl-loop with list + for i from 1 to 3 + do + (push 10 list) + (push i list) + finally (cl-return list))) + '(3 10 2 10 1 10))) + (should (equal (eval '(cl-loop with res = 0 + for i from 1 to 10 + doing (cl-incf res i) + finally (cl-return res))) + 55)) + (should (equal (eval '(cl-loop for i from 10 + do (when (= i 15) + (cl-return i)) + finally (cl-return 0))) + 15))) + +;;; 6.1.6 Conditional Execution Clauses +(ert-deftest cl-macs-loop-when () + (should (equal (eval '(cl-loop for i in '(1 2 3 4 5 6) + when (and (> i 3) i) + collect it)) + '(4 5 6))) + (should (eql (eval '(cl-loop for i in '(1 2 3 4 5 6) + when (and (> i 3) i) + return it)) + 4)) + + (should (equal (eval '(cl-loop for elt in '(1 a 2 "a" (3 4) 5 6) + when (numberp elt) + when (cl-evenp elt) collect elt into even + else collect elt into odd + else + when (symbolp elt) collect elt into syms + else collect elt into other + finally return (list even odd syms other))) + '((2 6) (1 5) (a) ("a" (3 4)))))) + +(ert-deftest cl-macs-loop-if () + (should (equal (eval '(cl-loop for i to 5 + if (cl-evenp i) + collect i + and when (and (= i 2) 'two) + collect it + and if (< i 3) + collect "low")) + '(0 2 two "low" 4))) + (should (equal (eval '(cl-loop for i to 5 + if (cl-evenp i) + collect i + and when (and (= i 2) 'two) + collect it + end + and if (< i 3) + collect "low")) + '(0 "low" 2 two "low" 4))) + (should (equal (eval '(cl-loop with funny-numbers = '(6 13 -1) + for x below 10 + if (cl-evenp x) + collect x into evens + else + collect x into odds + and if (memq x funny-numbers) return (cdr it) + finally return (vector odds evens))) + [(1 3 5 7 9) (0 2 4 6 8)]))) + +(ert-deftest cl-macs-loop-unless () + (should (equal (eval '(cl-loop for i to 5 + unless (= i 3) + collect i + else + collect 'three)) + '(0 1 2 three 4 5)))) + + +;;; 6.1.7.1 Control Transfer Clauses +(ert-deftest cl-macs-loop-named () + (should (eql (eval '(cl-loop named finished + for i to 10 + when (> (* i i) 30) + do (cl-return-from finished i))) + 6))) + +;;; 6.1.7.2 Initial and Final Execution +(ert-deftest cl-macs-loop-initially () + (should (equal (eval '(let ((var (list 1 2 3 4 5))) + (cl-loop for i in var + collect i + initially + (setf (car var) 10) + (setf (cadr var) 20)))) + '(10 20 3 4 5)))) + +(ert-deftest cl-macs-loop-finally () + (should (eql (eval '(cl-loop for i from 10 + finally + (cl-incf i 10) + (cl-return i) + while (< i 20))) + 30))) + +;;; Emacs extensions to loop +(ert-deftest cl-macs-loop-in-ref () + (should (equal (eval '(cl-loop with my-list = (list 1 2 3 4 5) + for x in-ref my-list + do (cl-incf x) + finally return my-list)) + '(2 3 4 5 6)))) + +(ert-deftest cl-macs-loop-across-ref () + (should (equal (eval '(cl-loop with my-vec = ["one" "two" "three"] + for x across-ref my-vec + do (setf (aref x 0) (upcase (aref x 0))) + finally return my-vec)) + ["One" "Two" "Three"]))) + +(ert-deftest cl-macs-loop-being-elements () + (should (equal (eval '(let ((var "StRiNG")) + (cl-loop for x being the elements of var + collect (downcase x)))) + (string-to-list "string")))) + +(ert-deftest cl-macs-loop-being-elements-of-ref () + (should (equal (eval '(let ((var (list 1 2 3 4 5))) + (cl-loop for x being the elements of-ref var + do (cl-incf x) + finally return var))) + '(2 3 4 5 6)))) + +(ert-deftest cl-macs-loop-being-symbols () + (should (eq (eval '(cl-loop for sym being the symbols + when (eq sym 'cl-loop) + return 'cl-loop)) + 'cl-loop))) + +(ert-deftest cl-macs-loop-being-keymap () + (should (equal (eval '(let ((map (make-sparse-keymap)) + (parent (make-sparse-keymap)) + res) + (define-key map "f" #'forward-char) + (define-key map "b" #'backward-char) + (define-key parent "n" #'next-line) + (define-key parent "p" #'previous-line) + (set-keymap-parent map parent) + (cl-loop for b being the key-bindings of map + using (key-codes c) + do (push (list c b) res)) + (cl-loop for s being the key-seqs of map + using (key-bindings b) + do (push (list (cl-copy-seq s) b) res)) + res)) + '(([?n] next-line) ([?p] previous-line) + ([?f] forward-char) ([?b] backward-char) + (?n next-line) (?p previous-line) + (?f forward-char) (?b backward-char))))) + +(ert-deftest cl-macs-loop-being-overlays () + (should (equal (eval '(let ((ov (make-overlay (point) (point)))) + (overlay-put ov 'prop "test") + (cl-loop for o being the overlays + when (eq o ov) + return (overlay-get o 'prop)))) + "test"))) + +(ert-deftest cl-macs-loop-being-frames () + (should (eq (eval '(cl-loop with selected = (selected-frame) + for frame being the frames + when (eq frame selected) + return frame)) + (selected-frame)))) + +(ert-deftest cl-macs-loop-being-windows () + (should (eq (eval '(cl-loop with selected = (selected-window) + for window being the windows + when (eq window selected) + return window)) + (selected-window)))) + +(ert-deftest cl-macs-loop-being-buffers () + (should (eq (eval '(cl-loop with current = (current-buffer) + for buffer being the buffers + when (eq buffer current) + return buffer)) + (current-buffer)))) + +(ert-deftest cl-macs-loop-vconcat () + (should (equal (eval '(cl-loop for x in (list 1 2 3 4 5) + vconcat (vector (1+ x)))) + [2 3 4 5 6]))) + +;;; cl-macs-tests.el ends here -- 2.11.0 --=-=-=--