Unverified Commit bc13b53d authored by Jorgen Schäfer's avatar Jorgen Schäfer Committed by GitHub

Merge pull request #133 from snogge/fix-specs-in-pending-suites

Keep specs in pending suites, fixes #116 
parents d07dbf39 553529f1
......@@ -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
......
......@@ -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.
......
......@@ -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
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment