summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJorgen Schäfer <Jorgen.Schaefer@gmail.com>2018-08-31 10:19:58 +0200
committerGitHub <noreply@github.com>2018-08-31 10:19:58 +0200
commitbc13b53deb1c2b590c33f5e03508b864a0116d5e (patch)
tree6146ff12d98eb067553f28db6843c8fbf45c271e
parentd07dbf392c2ff09e664969b151d0f2f7b56119ed (diff)
parent553529f1877209772e2026b1fe0a87a2830b1aaa (diff)
Merge pull request #133 from snogge/fix-specs-in-pending-suites
Keep specs in pending suites, fixes #116
-rw-r--r--buttercup.el60
-rw-r--r--docs/writing-tests.md11
-rw-r--r--tests/test-buttercup.el42
3 files changed, 81 insertions, 32 deletions
diff --git a/buttercup.el b/buttercup.el
index 1ca3898..d32e92b 100644
--- a/buttercup.el
+++ b/buttercup.el
@@ -915,27 +915,55 @@ FUNCTION is a function containing the body instructions passed to
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; Disabled Suites: xdescribe
-(defmacro xdescribe (description &rest body)
- "Like `describe', but mark the suite as disabled.
+(defun buttercup--disable-specs (forms)
+ "Process FORMS to make any suites or specs pending."
+ (when (eq (car forms) :var)
+ (setq forms (cddr forms)))
+ (let (retained inner)
+ (dolist (form forms (nreverse retained))
+ (pcase form
+ ;; Make it pending by just keeping the description
+ (`(it ,description . ,_)
+ (push (list 'it description) retained))
+ (`(xit ,description . ,_)
+ (push (list 'it description) retained))
+ ;; Just make nested describes into xdescribes and handle them
+ ;; in another macro invocation
+ (`(describe . ,tail)
+ (push (cons 'xdescribe tail) retained))
+ (`(xdescribe . ,tail)
+ (push (cons 'xdescribe tail) retained))
+ ;; Special case to ignore before-* and after-* forms
+ (`(before-each . ,_)) ; nop
+ (`(after-each . ,_)) ; nop
+ (`(before-all . ,_)) ; nop
+ (`(after-all . ,_)) ; nop
+ ;; Any list starting with a list, like a let varlist.
+ ((and (pred consp)
+ ls
+ (guard (consp (car ls))))
+ (dolist (elt (buttercup--disable-specs ls))
+ (push elt retained)))
+ ;; Any function call list
+ (`(,_ . ,tail)
+ (dolist (elt (buttercup--disable-specs tail))
+ (push elt retained)))
+ ;; non-cons items
+ ((and elt (guard (not (consp elt))))) ; nop
+ (_
+ (error "Unrecognized form in `xdescribe': `%s'" (pp-to-string form)))
+ ))))
-A disabled suite is not run.
+(defmacro xdescribe (description &rest body)
+ "Like `describe', but mark any specs as disabled.
DESCRIPTION is a string. BODY is a sequence of instructions,
mainly calls to `describe', `it' and `before-each'."
(declare (indent 1))
- `(buttercup-xdescribe ,description (lambda () ,@body)))
-
-(defun buttercup-xdescribe (description function)
- "Like `buttercup-describe', but mark the suite as disabled.
-
-A disabled suite is not run.
-
-DESCRIPTION has the same meaning as in `xdescribe'. FUNCTION
-is ignored.
-`describe'."
- (ignore function)
- (buttercup-describe description (lambda ()
- (signal 'buttercup-pending "PENDING"))))
+ `(describe ,description
+ ,@(buttercup--disable-specs body)
+ ;; make sure the suite is marked as pending
+ (signal 'buttercup-pending "PENDING")))
;;;;;;;;;;;;;;;;;;;;;;
;;; Pending Specs: xit
diff --git a/docs/writing-tests.md b/docs/writing-tests.md
index b980a18..c478111 100644
--- a/docs/writing-tests.md
+++ b/docs/writing-tests.md
@@ -298,10 +298,11 @@ walks through the `after-each` functions similarly.
## Disabling Suites
-Suites and specs can be disabled with the `xdescribe` and `xit`
-macros, respectively. These suites and any specs inside them are
-skipped when run and thus their results will not appear in the
-results.
+Suites and specs can be disabled by marking them as pending with the
+`xdescribe` and `xit` macros, respectively. Any suites or specs inside
+a `xdescribe' suite is also pending. Pending suites and specs will be
+listed as pending in the results, but the containing code will not be
+run.
```Emacs-Lisp
(xdescribe "A spec"
@@ -316,7 +317,7 @@ results.
## Pending Specs
-Pending specs do not run.
+Pending specs do not run, but will be listed in the results.
Any spec declared with `xit` is marked as pending.
diff --git a/tests/test-buttercup.el b/tests/test-buttercup.el
index 54df118..d7ff1d9 100644
--- a/tests/test-buttercup.el
+++ b/tests/test-buttercup.el
@@ -306,7 +306,7 @@
;;; Suites: describe
(describe "The `describe' macro"
- (it "should expand to a simple call to the describe function"
+ (it "should expand to a simple call to the buttercup-describe function"
(expect (macroexpand '(describe "description" (+ 1 1)))
:to-equal
'(buttercup-describe "description" (lambda () (+ 1 1)))))
@@ -461,19 +461,36 @@
(it "expands directly to a function call"
(expect (macroexpand '(xdescribe "bla bla" (+ 1 1)))
:to-equal
- '(buttercup-xdescribe "bla bla" (lambda () (+ 1 1))))))
-
-(describe "The `buttercup-xdescribe' function"
- (it "should be a no-op"
- (expect (buttercup-xdescribe
- "bla bla"
- (lambda () (error "Should not happen")))
- :not :to-throw))
+ '(buttercup-describe "bla bla"
+ (lambda ()
+ (signal 'buttercup-pending "PENDING")))))
+
+ (it "changes contained it-specs to pending specs"
+ (expect (macroexpand-all
+ '(xdescribe "bla bla"
+ (let ((a 1) b (c 2) (d (it "nested" (+ 1 1))))
+ (it "spec1" (+ 1 1))
+ (describe "inner suite"
+ (it "inner spec"))
+ (xit "spec2" (+ 1 1)))))
+ :to-equal
+ '(buttercup-describe
+ "bla bla"
+ #'(lambda ()
+ (buttercup-xit "nested")
+ (buttercup-xit "spec1")
+ (buttercup-describe
+ "inner suite"
+ #'(lambda ()
+ (buttercup-xit "inner spec")
+ (signal 'buttercup-pending "PENDING")))
+ (buttercup-xit "spec2")
+ (signal 'buttercup-pending "PENDING")))))
(it "should add a pending suite"
(let ((buttercup--current-suite nil)
(buttercup-suites nil))
- (buttercup-xdescribe
+ (xdescribe
"bla bla"
(lambda () nil))
(expect (buttercup-suite-status (car buttercup-suites))
@@ -960,6 +977,9 @@
(expect (length (cdr specs)) :to-equal 1)
(expect (cl-caadr specs) :to-equal "should fontify special keywords")))))
+;; Local Variables:
+;; indent-tabs-mode: nil
+;; sentence-end-double-space: nil
+;; End:
(provide 'test-buttercup)
-
;;; test-buttercup.el ends here