From mboxrd@z Thu Jan 1 00:00:00 1970 From: Sebastian Miele Subject: [PATCH 2/2] test-ob-emacs-lisp: Test :lexical src block header argument Date: Thu, 14 Mar 2019 10:25:45 +0000 Message-ID: <87sgvpg3bq.fsf@gmail.com> 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]:46852) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h4Njs-0000d4-S0 for emacs-orgmode@gnu.org; Thu, 14 Mar 2019 06:37:30 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1h4NYa-00034t-RT for emacs-orgmode@gnu.org; Thu, 14 Mar 2019 06:25:49 -0400 Received: from mail-wr1-x435.google.com ([2a00:1450:4864:20::435]:38726) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1h4NYa-00034a-IP for emacs-orgmode@gnu.org; Thu, 14 Mar 2019 06:25:48 -0400 Received: by mail-wr1-x435.google.com with SMTP id g12so5220882wrm.5 for ; Thu, 14 Mar 2019 03:25:48 -0700 (PDT) Received: from tisch ([2a02:908:1794:9440:7e75:7051:75d8:5a6f]) by smtp.gmail.com with ESMTPSA id j128sm1307053wmb.43.2019.03.14.03.25.46 for (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Thu, 14 Mar 2019 03:25:46 -0700 (PDT) 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: emacs-orgmode@gnu.org * testing/lisp/test-ob-emacs-lisp.el (test-ob-emacs-lisp-dynamic-lexical-text, test-ob-emacs-lisp-dynamic-lexical-expr, 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 | 86 ++++++++++++++++++++++++++++++ 1 file changed, 86 insertions(+) diff --git a/testing/lisp/test-ob-emacs-lisp.el b/testing/lisp/test-ob-emacs-lisp.el index 078cad988..a48f0c7dd 100644 --- a/testing/lisp/test-ob-emacs-lisp.el +++ b/testing/lisp/test-ob-emacs-lisp.el @@ -76,6 +76,92 @@ (buffer-substring-no-properties (line-beginning-position 2) (line-end-position 2)))))) +(defun test-ob-emacs-lisp-dynamic-lexical-text (expr lexical) + (concat "\n" + "#+begin_src emacs-lisp :lexical " lexical " :results verbatim\n" + (format "%S" expr) "\n" + "#+end_src")) + +(defvar test-ob-emacs-lisp-dynamic-lexical-expr + '(let ((x 'dynamic)) + (funcall + (let ((x 'lexical)) + (lambda () x))))) + +(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))))) + ;; + (cl-flet ((text (lexical) + (test-ob-emacs-lisp-dynamic-lexical-text + test-ob-emacs-lisp-dynamic-lexical-expr + lexical))) + (should (string= "dynamic" (execute (text "no" )))) + (should (string= "lexical" (execute (text "yes"))))) + ;; + (cl-flet ((text (lexical) + (test-ob-emacs-lisp-dynamic-lexical-text + 'x + lexical))) + (should (string= "dynamic" (let ((x 'dynamic)) + (execute (text "no"))))) + (should (string= "lexical" (execute (text "'((x . lexical))"))))) + ;; + ;; Src block execution uses `eval'. `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, no + ;; matter what is given as the LEXICAL parameter to eval. So the + ;; following does not work as intended: + ;; + ;;(cl-flet ((text (lexical) + ;; (test-ob-emacs-lisp-dynamic-lexical-text + ;; 'lexical-binding + ;; lexical))) + ;; (should (string= "nil" (execute (text "no" )))) + ;; (should (string= "t" (execute (text "yes" )))) + ;; (should (string= "((x . 0))" (execute (text "'((x . 0))"))))) + )) + +(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))))) + ;; + (cl-flet ((text (lexical) + (test-ob-emacs-lisp-dynamic-lexical-text + test-ob-emacs-lisp-dynamic-lexical-expr + lexical))) + (should (eq 'dynamic (execute (text "no" )))) + (should (eq 'lexical (execute (text "yes"))))) + ;; + (cl-flet ((text (lexical) + (test-ob-emacs-lisp-dynamic-lexical-text + 'x + lexical))) + (should (eq 'dynamic (let ((x 'dynamic)) + (execute (text "no"))))) + (should (eq 'lexical (execute (text "'((x . lexical))"))))) + ;; + (cl-flet ((text (lexical) + (test-ob-emacs-lisp-dynamic-lexical-text + 'lexical-binding + lexical))) + (should (equal nil (execute (text "no" )))) + (should (equal t (execute (text "yes" )))) + (should (equal '((x . 0)) (execute (text "'((x . 0))"))))) + )) + + (provide 'test-ob-emacs-lisp) ;;; test-ob-emacs-lisp.el ends here -- 2.21.0