diff options
author | Jorgen Schäfer <Jorgen.Schaefer@gmail.com> | 2018-08-31 10:19:58 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-08-31 10:19:58 +0200 |
commit | bc13b53deb1c2b590c33f5e03508b864a0116d5e (patch) | |
tree | 6146ff12d98eb067553f28db6843c8fbf45c271e | |
parent | d07dbf392c2ff09e664969b151d0f2f7b56119ed (diff) | |
parent | 553529f1877209772e2026b1fe0a87a2830b1aaa (diff) |
Merge pull request #133 from snogge/fix-specs-in-pending-suites
Keep specs in pending suites, fixes #116
-rw-r--r-- | buttercup.el | 60 | ||||
-rw-r--r-- | docs/writing-tests.md | 11 | ||||
-rw-r--r-- | tests/test-buttercup.el | 42 |
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 |