| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369 | ;;; test-org-src.el --- tests for org-src.el;; Copyright (C) 2012-2015  Le Wang;; Author: Le Wang <l26wang at gmail dot com>;; This file is not part of GNU Emacs.;; This program is free software; you can redistribute it and/or modify;; it under the terms of the GNU General Public License as published by;; the Free Software Foundation, either version 3 of the License, or;; (at your option) any later version.;; This program is distributed in the hope that it will be useful,;; but WITHOUT ANY WARRANTY; without even the implied warranty of;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the;; GNU General Public License for more details.;; You should have received a copy of the GNU General Public License;; along with this program.  If not, see <http://www.gnu.org/licenses/>.;;; Code:(require 'org-test)(ert-deftest test-org-src/basic ()  "Editing regular block works, with point on source block."  (org-test-with-temp-text      "<point>#+begin_src emacs-lisp  (message hello)#+end_src"    (let ((org-edit-src-content-indentation 2)          (org-src-preserve-indentation nil))      (org-edit-special)      (insert "blah")      (org-edit-src-exit)      (should (equal (buffer-string) "#+begin_src emacs-lisp  blah(message hello)#+end_src"))      (should (looking-at-p "(message hello)")))))(ert-deftest test-org-src/point-outside-block ()  "Editing with point before/after block signals expected error."  (org-test-with-temp-text      "#+begin_src emacs-lisp  (message hello)#+end_src"    (goto-line 1)    (should-error (org-edit-special))    (goto-char (point-max))    (should-error (org-edit-special))))(ert-deftest test-org-src/empty-block ()  "Editing empty block."  (org-test-with-temp-text      "<point>#+begin_src emacs-lisp#+end_src"    (let ((org-edit-src-content-indentation 0)          (org-src-preserve-indentation nil))      (org-edit-special)      (insert "blah")      (org-edit-src-exit)      (should (equal (buffer-string) "#+begin_src emacs-lispblah#+end_src"))      (should       (equal (buffer-substring (line-beginning-position) (point)) "blah")))))(ert-deftest test-org-src/blank-line-block ()  "Editing block with just a blank line."  (org-test-with-temp-text-in-file      "#+begin_src emacs-lisp#+end_src"    (let ((org-edit-src-content-indentation 2)          (org-src-preserve-indentation nil))      (goto-line 2)      (org-edit-special)      (insert "blah")      (org-edit-src-exit)      (should (equal (buffer-string) "#+begin_src emacs-lisp  blah#+end_src")))))(ert-deftest test-org-src/preserve-tabs ()  "Editing block preserve tab characters."  ;; With `org-src-preserve-indentation' set to nil.  (should   (equal "#+begin_src emacs-lisp  This is a tab:\t.#+end_src"          (org-test-with-temp-text              "#+begin_src emacs-lisp<point>This is a tab:\t.#+end_src"            (let ((org-edit-src-content-indentation 2)                  (org-src-preserve-indentation nil))              (org-edit-special)              (org-edit-src-exit)              (buffer-string)))))  ;; With `org-src-preserve-indentation' set to t.  (should   (equal "#+begin_src emacs-lispThis is a tab:\t.#+end_src"          (org-test-with-temp-text              "#+begin_src emacs-lisp<point>This is a tab:\t.#+end_src"            (let ((org-edit-src-content-indentation 2)                  (org-src-preserve-indentation t))              (org-edit-special)              (org-edit-src-exit)              (buffer-string))))))(ert-deftest test-org-src/coderef-format ()  "Test `org-src-coderef-format' specifications."  ;; Regular tests in a src block, an example block and an edit  ;; buffer.  (should   (equal "foo"          (let ((org-coderef-label-format "foo"))            (org-test-with-temp-text "#+BEGIN_SRC emacs-lisp\n0\n#+END_SRC"              (org-src-coderef-format)))))  (should   (equal "foo"          (let ((org-coderef-label-format "foo"))            (org-test-with-temp-text "#+BEGIN_EXAMPLE\n0\n#+END_EXAMPLE"              (org-src-coderef-format)))))  (should   (equal "foo"          (let ((org-coderef-label-format "foo") result)            (org-test-with-temp-text "#+BEGIN_SRC emacs-lisp\n0\n#+END_SRC"              (org-edit-special)              (setq result (org-src-coderef-format))              (org-edit-src-exit)              result))))  ;; When a local variable in the source buffer is available, use it.  (should   (equal "bar"          (let ((org-coderef-label-format "foo"))            (org-test-with-temp-text "#+BEGIN_SRC emacs-lisp\n0\n#+END_SRC"              (setq-local org-coderef-label-format "bar")              (org-src-coderef-format)))))  (should   (equal "bar"          (let ((org-coderef-label-format "foo") result)            (org-test-with-temp-text "#+BEGIN_SRC emacs-lisp\n0\n#+END_SRC"              (setq-local org-coderef-label-format "bar")              (org-edit-special)              (setq result (org-src-coderef-format))              (org-edit-src-exit)              result))))  ;; Use provided local format even if in an edit buffer.  (should   (equal "bar"          (let ((org-coderef-label-format "foo"))            (org-test-with-temp-text		"#+BEGIN_SRC emacs-lisp -l \"bar\"\n0\n#+END_SRC"              (org-src-coderef-format)))))  (should   (equal "bar"          (let ((org-coderef-label-format "foo") result)            (org-test-with-temp-text                "#+BEGIN_SRC emacs-lisp -l \"bar\"\n0\n#+END_SRC"              (org-edit-special)              (setq result (org-src-coderef-format))              (org-edit-src-exit)              result))))  ;; Local format has precedence over local variables.  (should   (equal "bar"          (let ((org-coderef-label-format "foo"))            (org-test-with-temp-text		"#+BEGIN_SRC emacs-lisp -l \"bar\"\n0\n#+END_SRC"	      (setq-local org-coderef-label-format "foo")              (org-src-coderef-format)))))  (should   (equal "bar"          (let ((org-coderef-label-format "foo") result)            (org-test-with-temp-text                "#+BEGIN_SRC emacs-lisp -l \"bar\"\n0\n#+END_SRC"	      (setq-local org-coderef-label-format "foo")              (org-edit-special)              (setq result (org-src-coderef-format))              (org-edit-src-exit)              result))))  ;; When optional argument provides a coderef format string, use it.  (should   (equal "bar"	  (let ((org-coderef-label-format "foo")		(element (org-element-create 'src-block '(:label-fmt "bar"))))	    (org-test-with-temp-text "#+BEGIN_SRC emacs-lisp\n0\n#+END_SRC"	      (org-src-coderef-format element)))))  (should   (equal "baz"          (let ((org-coderef-label-format "foo")		(element (org-element-create 'src-block '(:label-fmt "baz"))))            (org-test-with-temp-text		"#+BEGIN_SRC emacs-lisp -l \"bar\"\n0\n#+END_SRC"	      (setq-local org-coderef-label-format "foo")              (org-src-coderef-format element)))))  ;; If it doesn't provide any label format string, fall back to  ;; regular checks.  (should   (equal "foo"	  (let ((org-coderef-label-format "foo")		(element (org-element-create 'src-block)))	    (org-test-with-temp-text "#+BEGIN_SRC emacs-lisp\n0\n#+END_SRC"	      (org-src-coderef-format element)))))  (should   (equal "bar"          (let ((org-coderef-label-format "foo")		(element (org-element-create 'src-block)))            (org-test-with-temp-text		"#+BEGIN_SRC emacs-lisp -l \"bar\"\n0\n#+END_SRC"	      (setq-local org-coderef-label-format "foo")              (org-src-coderef-format element))))))(ert-deftest test-org-src/coderef-regexp ()  "Test `org-src-coderef-regexp' specifications."  ;; Regular test.  (should   (string-match-p (org-src-coderef-regexp "; ref:%s")		   "#+BEGIN_SRC emacs-lisp\n0; ref:label\n#+END_SRC"))  ;; Ignore white space around the coderef.  (should   (string-match-p (org-src-coderef-regexp "; ref:%s")		   "#+BEGIN_SRC emacs-lisp\n0 ; ref:label\n#+END_SRC"))  (should   (string-match-p (org-src-coderef-regexp "; ref:%s")		   "#+BEGIN_SRC emacs-lisp\n0 ; ref:label  \n#+END_SRC"))  ;; Only match regexp at the end of the line.  (should-not   (string-match-p (org-src-coderef-regexp "; ref:%s")		   "#+BEGIN_SRC emacs-lisp\n0; ref:label (+ 1 2)\n#+END_SRC"))  ;; Do not match an empty label.  (should-not   (string-match-p (org-src-coderef-regexp "; ref:%s")		   "#+BEGIN_SRC emacs-lisp\n0; ref:\n#+END_SRC"))  ;; When optional argument LABEL is provided, match given label only.  (should   (string-match-p (org-src-coderef-regexp "; ref:%s" "label")		   "#+BEGIN_SRC emacs-lisp\n0; ref:label\n#+END_SRC"))  (should-not   (string-match-p (org-src-coderef-regexp "; ref:%s" "label2")		   "#+BEGIN_SRC emacs-lisp\n0; ref:label\n#+END_SRC")))(ert-deftest test-org-src/indented-blocks ()  "Test editing indented blocks."  ;; Editing a block should preserve its global indentation, unless  ;; `org-src-preserve-indentation' is non-nil.  (should   (equal    "- Item\n  #+BEGIN_SRC emacs-lisp\n    Foo\n  #+END_SRC"    (org-test-with-temp-text	"- Item\n<point>  #+BEGIN_SRC emacs-lisp\n    (+ 1 1)\n  #+END_SRC"      (let ((org-edit-src-content-indentation 2)	    (org-src-preserve-indentation nil))	(org-edit-special)	(erase-buffer)	(insert "Foo")	(org-edit-src-exit)	(buffer-string)))))  (should   (equal    "- Item\n  #+BEGIN_SRC emacs-lisp\n Foo\n  #+END_SRC"    (org-test-with-temp-text	"- Item\n<point>  #+BEGIN_SRC emacs-lisp\n    (+ 1 1)\n  #+END_SRC"      (let ((org-src-preserve-indentation t))	(org-edit-special)	(erase-buffer)	(insert " Foo")	(org-edit-src-exit)	(buffer-string)))))  ;; Global indentation obeys `indent-tabs-mode' from the original  ;; buffer.  (should   (string-match-p    "^\t+\s*argument2"    (org-test-with-temp-text	"- Item  #+BEGIN_SRC emacs-lisp<point>  (progn    (function argument1              argument2))  #+END_SRC"      (setq-local indent-tabs-mode t)      (let ((org-edit-src-content-indentation 2)	    (org-src-preserve-indentation nil))	(org-edit-special)	(org-edit-src-exit)	(buffer-string)))))  (should   (string-match-p    "^\s+argument2"    (org-test-with-temp-text	"- Item  #+BEGIN_SRC emacs-lisp<point>    (progn\n      (function argument1\n\t\targument2))  #+END_SRC"      (setq-local indent-tabs-mode nil)      (let ((org-edit-src-content-indentation 2)	    (org-src-preserve-indentation nil))	(org-edit-special)	(org-edit-src-exit)	(buffer-string)))))  ;; Global indentation also obeys `tab-width' from original buffer.  (should   (string-match-p    "^\t\\{3\\}\s\\{2\\}argument2"    (org-test-with-temp-text	"- Item  #+BEGIN_SRC emacs-lisp<point>  (progn    (function argument1              argument2))  #+END_SRC"      (setq-local indent-tabs-mode t)      (setq-local tab-width 4)      (let ((org-edit-src-content-indentation 0)	    (org-src-preserve-indentation nil))	(org-edit-special)	(org-edit-src-exit)	(buffer-string)))))  (should   (string-match-p    "^\t\s\\{6\\}argument2"    (org-test-with-temp-text	"- Item  #+BEGIN_SRC emacs-lisp<point>  (progn    (function argument1              argument2))  #+END_SRC"      (setq-local indent-tabs-mode t)      (setq-local tab-width 8)      (let ((org-edit-src-content-indentation 0)	    (org-src-preserve-indentation nil))	(org-edit-special)	(org-edit-src-exit)	(buffer-string))))))(provide 'test-org-src);;; test-org-src.el ends here
 |