[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Assistance Writing Test for Org Agenda Custom Bulk Function
From: |
Kyle Meyer |
Subject: |
Re: Assistance Writing Test for Org Agenda Custom Bulk Function |
Date: |
Wed, 17 Feb 2021 22:58:41 -0500 |
Kevin Foley writes:
> I'm trying to mock the argument collecting function and the custom bulk
> function and then test that the arguments returned from the former are
> passed to the latter. I'd also like to test the argument function is
> only called once while the bulk function is called multiple times.
>
> Here is an example of what I'm trying to do:
>
> (org-test-with-temp-text-in-file
> "* TODO a\n*TODO b"
Unrelated note: there's a missing a space between the second "*" and
"TODO".
[...]
> (let ((f-called-cnt 0)
> (arg-f-call-cnt 0)
> (f-called-args nil))
> (cl-letf (((symbol-function 'read-char-exclusive)
> (lambda () ?P))
> (org-agenda-bulk-custom-functions
> '((?P (lambda (&rest args)
> (message "test" args)
> (setq f-called-cnt (1+ f-called-cnt)
> f-called-args args))
> (lambda ()
> (setq arg-f-call-cnt (1+ arg-f-call-cnt))
> '(1 2 3))))))
> (org-agenda-bulk-action)
> (org-test-agenda--kill-all-agendas)
>
> (should (= f-called-cnt 2))
> (should (= arg-f-call-cnt 1))
> (should (equal f-called-args '(1 2 3)))))))
>
> However, this fails with the error void-variable unless I first define
> the variables for storing the call counts/arguments. I understand that
> defvar makes the variables dynamically bound, however I'm struggling to
> understand why that's needed here. I've read the manual entries on
> variable binding but I seem to be missing something.
>
> Can someone help me understand what's going on here?
Perhaps you're not capturing the environment due to your quoting:
;; -*- lexical-binding: t; -*-
(let ((x 0))
'(t (lambda () x))) ;; => (y (lambda nil x))
(let ((x 0))
(list t (lambda () x))) ;; => (t (closure ((x . 0) t) nil x))
So try something like
(org-agenda-bulk-custom-functions
`((?P ,(lambda (&rest args)
(message "test" args)
(setq f-called-cnt (1+ f-called-cnt)
f-called-args args))
,(lambda ()
(setq arg-f-call-cnt (1+ arg-f-call-cnt))
'(1 2 3)))))
or
(org-agenda-bulk-custom-functions
(list
(list ?P
(lambda (&rest args)
(message "test" args)
(setq f-called-cnt (1+ f-called-cnt)
f-called-args args))
(lambda ()
(setq arg-f-call-cnt (1+ arg-f-call-cnt))
'(1 2 3)))))