Commit acccc0f0 authored by Ola Nilsson's avatar Ola Nilsson

Modify xdescribe to keep all contained specs as pending

Fixes #116
parent 3d3aff90
......@@ -915,15 +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)))
`(describe ,description
,@(buttercup--disable-specs body)
;; make sure the suite is marked as pending
(signal 'buttercup-pending "PENDING")))
(defun buttercup-xdescribe (description function)
"Like `buttercup-describe', but mark the suite as disabled.
......
......@@ -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,7 +461,42 @@
(it "expands directly to a function call"
(expect (macroexpand '(xdescribe "bla bla" (+ 1 1)))
:to-equal
'(buttercup-xdescribe "bla bla" (lambda () (+ 1 1))))))
'(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))
(xdescribe
"bla bla"
(lambda () nil))
(expect (buttercup-suite-status (car buttercup-suites))
:to-be
'pending))))
(describe "The `buttercup-xdescribe' function"
(it "should be a no-op"
......
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