From: Kyle Meyer <kyle@kyleam.com>
To: Kevin Foley <kevin@kevinjfoley.me>
Cc: emacs-orgmode@gnu.org
Subject: Re: Assistance Writing Test for Org Agenda Custom Bulk Function
Date: Wed, 17 Feb 2021 22:58:41 -0500 [thread overview]
Message-ID: <87wnv62fim.fsf@kyleam.com> (raw)
In-Reply-To: <m2eehgkjch.fsf@Kevins-MBP.home.lan>
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)))))
next prev parent reply other threads:[~2021-02-18 3:59 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-02-15 23:21 Assistance Writing Test for Org Agenda Custom Bulk Function Kevin Foley
2021-02-18 3:58 ` Kyle Meyer [this message]
2021-02-18 14:08 ` Kevin Foley
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: https://www.orgmode.org/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=87wnv62fim.fsf@kyleam.com \
--to=kyle@kyleam.com \
--cc=emacs-orgmode@gnu.org \
--cc=kevin@kevinjfoley.me \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://git.savannah.gnu.org/cgit/emacs/org-mode.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).