* 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