emacs-orgmode@gnu.org archives
 help / color / mirror / code / Atom feed
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)))))


  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 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 \
    --subject='Re: Assistance Writing Test for Org Agenda Custom Bulk Function' \
    /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

Code repositories for project(s) associated with this 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).