From mboxrd@z Thu Jan 1 00:00:00 1970 From: Sebastian Miele Subject: Re: [PATCH 2/2] test-ob-emacs-lisp: Test :lexical src block header argument Date: Thu, 14 Mar 2019 19:28:47 +0000 Message-ID: <87y35hs1ao.fsf@gmail.com> References: <87sgvpg3bq.fsf@gmail.com> <87y35hv6yg.fsf@nicolasgoaziou.fr> Reply-To: sebastian.miele@gmail.com Mime-Version: 1.0 Content-Type: text/plain Return-path: Received: from eggs.gnu.org ([209.51.188.92]:34242) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h4WTw-00030J-70 for emacs-orgmode@gnu.org; Thu, 14 Mar 2019 15:57:40 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1h4WTt-0005sJ-Sw for emacs-orgmode@gnu.org; Thu, 14 Mar 2019 15:57:36 -0400 Received: from mail-wm1-x32c.google.com ([2a00:1450:4864:20::32c]:53227) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1h4WTt-0005rJ-Hg for emacs-orgmode@gnu.org; Thu, 14 Mar 2019 15:57:33 -0400 Received: by mail-wm1-x32c.google.com with SMTP id f65so4340723wma.2 for ; Thu, 14 Mar 2019 12:57:33 -0700 (PDT) In-reply-to: <87y35hv6yg.fsf@nicolasgoaziou.fr> List-Id: "General discussions about Org-mode." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-orgmode-bounces+geo-emacs-orgmode=m.gmane.org@gnu.org Sender: "Emacs-orgmode" To: Nicolas Goaziou Cc: emacs-orgmode@gnu.org Nicolas Goaziou writes: > [...] > > > However, your tests are very convoluted. It is better than no test, but > if, unfortunately, one of them fail in some distant future, it may take > more time understanding what happens in the test than actually fixing > the bug. > > Would you mind rewriting them with simple macros like, e.g., > `org-test-with-temp-text', and use as little helper functions as > possible? IMO, code repetition in tests is not a problem. > After some initial tooth-grinding, I did rewrite them, and actually like the result more than the previous version. Thank you for the suggestion! Here is the updated patch: * testing/lisp/test-ob-emacs-lisp.el (ob-emacs-lisp/dynamic-lexical-execute, ob-emacs-lisp/dynamic-lexical-edit): Add tests that check the correct handling of the :lexical header argument when executing source blocks and when creating editing buffers for source blocks. --- testing/lisp/test-ob-emacs-lisp.el | 89 ++++++++++++++++++++++++++++++ 1 file changed, 89 insertions(+) diff --git a/testing/lisp/test-ob-emacs-lisp.el b/testing/lisp/test-ob-emacs-lisp.el index 078cad988..24a373f86 100644 --- a/testing/lisp/test-ob-emacs-lisp.el +++ b/testing/lisp/test-ob-emacs-lisp.el @@ -76,6 +76,95 @@ (buffer-substring-no-properties (line-beginning-position 2) (line-end-position 2)))))) +(ert-deftest ob-emacs-lisp/dynamic-lexical-execute () + (cl-flet ((execute (text) + (org-test-with-temp-text-in-file text + (org-babel-next-src-block) + (org-babel-execute-maybe) + (re-search-forward "results" nil t) + (re-search-forward ": " nil t) + (buffer-substring-no-properties (point) (point-at-eol))))) + + (should (string= "dynamic" (execute " +#+begin_src emacs-lisp :lexical no :results verbatim +(let ((x 'dynamic)) (funcall (let ((x 'lexical)) (lambda () x)))) +#+end_src"))) + + (should (string= "lexical" (execute " +#+begin_src emacs-lisp :lexical yes :results verbatim +(let ((x 'dynamic)) (funcall (let ((x 'lexical)) (lambda () x)))) +#+end_src"))) + + (should (string= "dynamic" (let ((x 'dynamic)) (execute " +#+begin_src emacs-lisp :lexical no :results verbatim +x +#+end_src")))) + + (should (string= "lexical" (let ((x 'dynamic)) (execute " +#+begin_src emacs-lisp :lexical '((x . lexical)) :results verbatim +x +#+end_src")))) + + ;; Src block execution uses `eval'. As of 2019-02-26, `eval' does + ;; not dynamically bind `lexical-binding' to the value of its + ;; LEXICAL parameter. Hence, (eval 'lexical-binding LEXICAL) + ;; evaluates to the same value that just `lexical-binding' + ;; evaluates to, even if LEXICAL is different. So tests like the + ;; following do not work here: + ;; + ;; (should (string= "t" (execute " + ;; #+begin_src emacs-lisp :lexical yes :results verbatim + ;; lexical-binding + ;; #+end_src"))) + ;; + ;; However, the corresponding test in + ;; `ob-emacs-lisp/dynamic-lexical-edit' does work. + )) + +(ert-deftest ob-emacs-lisp/dynamic-lexical-edit () + (cl-flet ((execute (text) + (org-test-with-temp-text-in-file text + (org-babel-next-src-block) + (org-edit-src-code) + (goto-char (point-max)) + (prog1 (eval-last-sexp 0) + (org-edit-src-exit))))) + + (should (eq 'dynamic (execute " +#+begin_src emacs-lisp :lexical no :results verbatim +(let ((x 'dynamic)) (funcall (let ((x 'lexical)) (lambda () x)))) +#+end_src"))) + + (should (eq 'lexical (execute " +#+begin_src emacs-lisp :lexical yes :results verbatim +(let ((x 'dynamic)) (funcall (let ((x 'lexical)) (lambda () x)))) +#+end_src"))) + + (should (eq 'dynamic (let ((x 'dynamic)) (execute " +#+begin_src emacs-lisp :lexical no :results verbatim +x +#+end_src")))) + + (should (eq 'lexical (let ((x 'dynamic)) (execute " +#+begin_src emacs-lisp :lexical '((x . lexical)) :results verbatim +x +#+end_src")))) + + (should (equal nil (execute " +#+begin_src emacs-lisp :lexical no :results verbatim +lexical-binding +#+end_src"))) + + (should (equal t (execute " +#+begin_src emacs-lisp :lexical yes :results verbatim +lexical-binding +#+end_src"))) + + (should (equal '((x . 0)) (execute " +#+begin_src emacs-lisp :lexical '((x . 0)) :results verbatim +lexical-binding +#+end_src"))))) + (provide 'test-ob-emacs-lisp) ;;; test-ob-emacs-lisp.el ends here -- 2.21.0