test-ob.el 33 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114
  1. ;;; test-ob.el --- tests for ob.el
  2. ;; Copyright (c) 2010-2012 Eric Schulte
  3. ;; Authors: Eric Schulte, Martyn Jago
  4. ;; Released under the GNU General Public License version 3
  5. ;; see: http://www.gnu.org/licenses/gpl-3.0.html
  6. (ert-deftest test-org-babel/multi-line-header-regexp ()
  7. (should(equal "^[ \t]*#\\+headers?:[ \t]*\\([^\n]*\\)$"
  8. org-babel-multi-line-header-regexp))
  9. ;;TODO can be optimised - and what about blah4 blah5 blah6?
  10. (should (string-match
  11. org-babel-multi-line-header-regexp
  12. " \t #+headers: blah1 blah2 blah3 \t\n\t\n blah4 blah5 blah6 \n"))
  13. (should
  14. (equal
  15. "blah1 blah2 blah3 \t"
  16. (match-string
  17. 1
  18. " \t #+headers: blah1 blah2 blah3 \t\n\t\n blah4 blah5 blah6 \n")))
  19. ;;TODO Check - should this fail?
  20. (should
  21. (not (org-test-string-exact-match
  22. org-babel-multi-line-header-regexp
  23. " \t #+headers : blah1 blah2 blah3 \t\n\t\n blah4 blah5 blah6 \n"))))
  24. (ert-deftest test-org-babel/src-block-regexp ()
  25. (let ((test-block
  26. (concat
  27. "#+begin_src language -n-r-a-b -c :argument-1 yes :argument-2 no\n"
  28. "echo this is a test\n"
  29. "echo Currently in ' $PWD\n"
  30. "#+end_src"))
  31. (language "language")
  32. (flags "-n-r-a-b -c ")
  33. (arguments ":argument-1 yes :argument-2 no")
  34. (body "echo this is a test\necho Currently in ' $PWD\n"))
  35. (should (string-match org-babel-src-block-regexp test-block))
  36. (should (string-match org-babel-src-block-regexp (upcase test-block)))
  37. (should (equal language (match-string 2 test-block)))
  38. ;;TODO Consider refactoring
  39. (should (equal flags (match-string 3 test-block)))
  40. (should (equal arguments (match-string 4 test-block)))
  41. (should (equal body (match-string 5 test-block)))
  42. ;;no switches
  43. (should (org-test-string-exact-match
  44. org-babel-src-block-regexp
  45. (replace-regexp-in-string flags "" test-block)))
  46. ;;no header arguments
  47. (should (org-test-string-exact-match
  48. org-babel-src-block-regexp
  49. (replace-regexp-in-string arguments "" test-block)))
  50. ;; should be valid with no body
  51. (should (org-test-string-exact-match
  52. org-babel-src-block-regexp
  53. (replace-regexp-in-string body "" test-block)))))
  54. (ert-deftest test-org-babel/get-header ()
  55. (should (not (org-babel-get-header
  56. org-babel-default-header-args :doesnt-exist)))
  57. (should(equal '((:session . "none"))
  58. (org-babel-get-header
  59. org-babel-default-header-args :session)))
  60. (should(equal '((:session . "none"))
  61. (org-babel-get-header
  62. org-babel-default-header-args :session nil)))
  63. (should (not (org-babel-get-header
  64. org-babel-default-header-args :SESSION)))
  65. (should (equal '((:tangle . "no"))
  66. (org-babel-get-header
  67. org-babel-default-header-args :tangle)))
  68. ;; with OTHERS option
  69. (should (equal org-babel-default-header-args
  70. (org-babel-get-header
  71. org-babel-default-header-args :doesnt-exist 'others)))
  72. (should (equal org-babel-default-header-args
  73. (org-babel-get-header
  74. org-babel-default-header-args nil 'others)))
  75. (should (null
  76. (assoc :noweb
  77. (org-babel-get-header
  78. org-babel-default-header-args :noweb 'others)))))
  79. (ert-deftest test-org-babel/default-inline-header-args ()
  80. (should(equal
  81. '((:session . "none") (:results . "replace") (:exports . "results"))
  82. org-babel-default-inline-header-args)))
  83. (ert-deftest ob-test/org-babel-combine-header-arg-lists ()
  84. (let ((results (org-babel-combine-header-arg-lists
  85. '((foo . :any)
  86. (bar)
  87. (baz . ((foo bar) (baz)))
  88. (qux . ((foo bar baz qux)))
  89. (quux . ((foo bar))))
  90. '((bar)
  91. (baz . ((baz)))
  92. (quux . :any)))))
  93. (dolist (pair '((foo . :any)
  94. (bar)
  95. (baz . ((baz)))
  96. (quux . :any)
  97. (qux . ((foo bar baz qux)))))
  98. (should (equal (cdr pair)
  99. (cdr (assoc (car pair) results)))))))
  100. ;;; ob-get-src-block-info
  101. (ert-deftest test-org-babel/get-src-block-info-language ()
  102. (org-test-at-marker nil org-test-file-ob-anchor
  103. (let ((info (org-babel-get-src-block-info)))
  104. (should (string= "emacs-lisp" (nth 0 info))))))
  105. (ert-deftest test-org-babel/get-src-block-info-body ()
  106. (org-test-at-marker nil org-test-file-ob-anchor
  107. (let ((info (org-babel-get-src-block-info)))
  108. (should (string-match (regexp-quote org-test-file-ob-anchor)
  109. (nth 1 info))))))
  110. (ert-deftest test-org-babel/get-src-block-info-tangle ()
  111. (org-test-at-marker nil org-test-file-ob-anchor
  112. (let ((info (org-babel-get-src-block-info)))
  113. (should (string= "no" (cdr (assoc :tangle (nth 2 info))))))))
  114. (ert-deftest test-org-babel/elisp-in-header-arguments ()
  115. "Test execution of elisp forms in header arguments."
  116. (org-test-with-temp-text-in-file "
  117. * elisp forms in header arguments
  118. :PROPERTIES:
  119. :var: prop = (* 7 6)
  120. :END:
  121. #+begin_src emacs-lisp
  122. prop
  123. #+end_src"
  124. (progn
  125. (goto-char (point-min))
  126. (org-babel-next-src-block)
  127. (let ((info (org-babel-get-src-block-info)))
  128. (should (= 42 (org-babel-execute-src-block)))))))
  129. (ert-deftest test-org-babel/simple-named-code-block ()
  130. "Test that simple named code blocks can be evaluated."
  131. (org-test-with-temp-text-in-file "
  132. #+name: i-have-a-name
  133. #+begin_src emacs-lisp
  134. 42
  135. #+end_src"
  136. (progn
  137. (org-babel-next-src-block 1)
  138. (should (= 42 (org-babel-execute-src-block))))))
  139. (ert-deftest test-org-babel/simple-variable-resolution ()
  140. "Test that simple variable resolution is working."
  141. (org-test-with-temp-text-in-file "
  142. #+name: four
  143. #+begin_src emacs-lisp
  144. (list 1 2 3 4)
  145. #+end_src
  146. #+begin_src emacs-lisp :var four=four
  147. (length four)
  148. #+end_src"
  149. (progn
  150. (org-babel-next-src-block 2)
  151. (should (= 4 (org-babel-execute-src-block)))
  152. (forward-line 5)
  153. (should (string= ": 4" (buffer-substring
  154. (point-at-bol)
  155. (point-at-eol)))))))
  156. (ert-deftest test-org-babel/multi-line-header-arguments ()
  157. "Test that multi-line header arguments and can be read."
  158. (org-test-with-temp-text-in-file "
  159. #+headers: :var letters='(a b c d e f g)
  160. #+begin_src emacs-lisp :var numbers='(1 2 3 4 5 6 7)
  161. (map 'list #'list numbers letters)
  162. #+end_src"
  163. (progn
  164. (org-babel-next-src-block)
  165. (let ((results (org-babel-execute-src-block)))
  166. (should(equal 'a (cadr (assoc 1 results))))
  167. (should(equal 'd (cadr (assoc 4 results))))))))
  168. (ert-deftest test-org-babel/parse-header-args ()
  169. (org-test-with-temp-text-in-file "
  170. #+begin_src example-lang :session :results output :var num=9
  171. the body
  172. #+end_src"
  173. (progn
  174. (org-babel-next-src-block)
  175. (let* ((info (org-babel-get-src-block-info))
  176. (params (nth 2 info)))
  177. (message "%S" params)
  178. (should(equal "example-lang" (nth 0 info)))
  179. (should(string= "the body" (org-babel-trim (nth 1 info))))
  180. (should-not (member '(:session\ \ \ \ ) params))
  181. (should(equal '(:session) (assoc :session params)))
  182. (should(equal '(:result-type . output) (assoc :result-type params)))
  183. (should(equal '(num . 9) (cdr (assoc :var params))))))))
  184. (ert-deftest test-org-babel/parse-header-args2 ()
  185. (org-test-with-temp-text-in-file "
  186. * resolving sub-trees as references
  187. #+begin_src emacs-lisp :var text=d4faa7b3-072b-4dcf-813c-dd7141c633f3
  188. (length text)
  189. #+end_src
  190. #+begin_src org :noweb yes
  191. <<simple-subtree>>
  192. <<d4faa7b3-072b-4dcf-813c-dd7141c633f3>>
  193. #+end_src
  194. ** simple subtree with custom ID
  195. :PROPERTIES:
  196. :CUSTOM_ID: simple-subtree
  197. :END:
  198. this is simple"
  199. (progn
  200. (should (string-match (regexp-quote "this is simple")
  201. (org-babel-ref-resolve "simple-subtree")))
  202. (org-babel-next-src-block)
  203. (should (= 14 (org-babel-execute-src-block))))))
  204. (ert-deftest test-org-babel/inline-src-blocks ()
  205. (org-test-at-id "54cb8dc3-298c-4883-a933-029b3c9d4b18"
  206. (macrolet ((at-next (&rest body)
  207. `(progn
  208. (move-end-of-line 1)
  209. (re-search-forward org-babel-inline-src-block-regexp nil t)
  210. (goto-char (match-beginning 1))
  211. (save-match-data ,@body))))
  212. (at-next (should (equal 1 (org-babel-execute-src-block))))
  213. (at-next (should (equal 2 (org-babel-execute-src-block))))
  214. (at-next (should (equal 3 (org-babel-execute-src-block)))))))
  215. (ert-deftest test-org-babel/org-babel-get-inline-src-block-matches ()
  216. (org-test-at-id "0D0983D4-DE33-400A-8A05-A225A567BC74"
  217. (let ((test-point (point)))
  218. (should (fboundp 'org-babel-get-inline-src-block-matches))
  219. (should (re-search-forward "src_" nil t)) ;; 1
  220. (should (org-babel-get-inline-src-block-matches))
  221. (should (re-search-forward "}" nil (point-at-bol))) ;; 1
  222. (should-not (org-babel-get-inline-src-block-matches))
  223. (should (re-search-forward "in" nil t)) ;; 2
  224. (should-not (org-babel-get-inline-src-block-matches))
  225. (should (re-search-forward "echo" nil t)) ;; 2
  226. (should (org-babel-get-inline-src-block-matches))
  227. (should (re-search-forward "blocks" nil t)) ;; 3
  228. (backward-char 8) ;; 3
  229. (should (org-babel-get-inline-src-block-matches))
  230. (forward-char 1) ;;3
  231. (should-not (org-babel-get-inline-src-block-matches))
  232. (should (re-search-forward ":results" nil t)) ;; 4
  233. (should (org-babel-get-inline-src-block-matches))
  234. (end-of-line)
  235. (should-not (org-babel-get-inline-src-block-matches)))))
  236. (ert-deftest test-org-babel/inline-src_blk-default-results-replace-line-1 ()
  237. (let ((test-line "src_sh{echo 1}"))
  238. ;; src_ at bol line 1...
  239. (org-test-with-temp-text
  240. test-line
  241. (goto-char (point-min)) (org-ctrl-c-ctrl-c)
  242. (should (string=
  243. (concat test-line " =1=")
  244. (buffer-substring-no-properties (point-at-bol) (point-at-eol))))
  245. (forward-char) (org-ctrl-c-ctrl-c)
  246. (should (string=
  247. (concat test-line " =1= =1=")
  248. (buffer-substring-no-properties (point-at-bol) (point-at-eol))))
  249. (re-search-forward "1}")
  250. (should-error (org-ctrl-c-ctrl-c))
  251. (backward-char) ;; last char of block body
  252. (org-ctrl-c-ctrl-c)
  253. (should (string=
  254. (concat test-line " =1= =1= =1=")
  255. (buffer-substring-no-properties (point-at-bol) (point-at-eol)))))
  256. ;; src_ follows space line 1...
  257. (let ((test-line " src_emacs-lisp{ 1 }"))
  258. (org-test-with-temp-text
  259. test-line
  260. (should-error (org-ctrl-c-ctrl-c))
  261. (forward-char) (org-ctrl-c-ctrl-c)
  262. (should (string=
  263. (concat test-line " =1=")
  264. (buffer-substring-no-properties (point-at-bol) (point-at-eol))))
  265. (re-search-forward "{ 1 ") (org-ctrl-c-ctrl-c)
  266. (should (string=
  267. (concat test-line " =1= =1=")
  268. (buffer-substring-no-properties (point-at-bol) (point-at-eol))))
  269. (forward-char)
  270. (should-error (org-ctrl-c-ctrl-c)))))
  271. (ert-deftest test-org-babel/inline-src_blk-default-results-replace-line-2 ()
  272. ;; src_ at bol line 2...
  273. (let ((test-line " src_emacs-lisp{ \"x\" }"))
  274. (org-test-with-temp-text
  275. (concat "\n" test-line)
  276. (should-error (org-ctrl-c-ctrl-c))
  277. (goto-char (point-min))
  278. (should-error (org-ctrl-c-ctrl-c))
  279. (forward-line)
  280. (should-error (org-ctrl-c-ctrl-c))
  281. (forward-char) (org-ctrl-c-ctrl-c)
  282. (should (string=
  283. (concat test-line " =x=")
  284. (buffer-substring-no-properties
  285. (point-at-bol) (point-at-eol))))))
  286. (let ((test-line "Some text prior to block src_emacs-lisp{ \"y\" }"))
  287. (org-test-with-temp-text
  288. test-line
  289. (goto-char (point-max))
  290. (insert (concat "\n" test-line " end"))
  291. (re-search-backward "src") (org-ctrl-c-ctrl-c)
  292. (should (string=
  293. (concat test-line " =y= end")
  294. (buffer-substring-no-properties (point-at-bol) (point-at-eol))))
  295. (re-search-forward "\" ") (org-ctrl-c-ctrl-c)
  296. (should (string=
  297. (concat test-line " =y= =y= end")
  298. (buffer-substring-no-properties (point-at-bol) (point-at-eol))))
  299. (forward-char)
  300. (should-error (org-ctrl-c-ctrl-c))))))
  301. (ert-deftest test-org-babel/inline-src_blk-manual-results-replace ()
  302. (let ((test-line " src_emacs-lisp[:results replace]{ \"x\" }"))
  303. (org-test-with-temp-text
  304. (concat "\n" test-line)
  305. (should-error (org-ctrl-c-ctrl-c))
  306. (goto-char (point-max))
  307. (should-error (org-ctrl-c-ctrl-c))
  308. (beginning-of-line)
  309. (should-error (org-ctrl-c-ctrl-c))
  310. (forward-char) (org-ctrl-c-ctrl-c)
  311. (should (string=
  312. (concat test-line " =x=")
  313. (buffer-substring-no-properties
  314. (point-at-bol) (point-at-eol))))))
  315. (let ((test-line (concat " Some text prior to block "
  316. "src_emacs-lisp[:results replace]{ \"y\" }")))
  317. (org-test-with-temp-text test-line
  318. (goto-char (point-max))
  319. (insert (concat "\n" test-line " end"))
  320. (re-search-backward "src") (org-ctrl-c-ctrl-c)
  321. (should (string=
  322. (concat test-line " =y= end")
  323. (buffer-substring-no-properties (point-at-bol) (point-at-eol))))
  324. (re-search-forward "\" ") (org-ctrl-c-ctrl-c)
  325. (should (string=
  326. (concat test-line " =y= =y= end")
  327. (buffer-substring-no-properties (point-at-bol) (point-at-eol))))
  328. (forward-char)
  329. (should-error (org-ctrl-c-ctrl-c)))))
  330. (ert-deftest test-org-babel/inline-src_blk-results-silent ()
  331. (let ((test-line "src_emacs-lisp[ :results silent ]{ \"x\" }"))
  332. (org-test-with-temp-text test-line
  333. (org-ctrl-c-ctrl-c)
  334. (should (string= test-line
  335. (buffer-substring-no-properties
  336. (point-at-bol) (point-at-eol))))
  337. (end-of-buffer)
  338. (should-error (org-ctrl-c-ctrl-c))))
  339. (let ((test-line (concat " Some text prior to block src_emacs-lisp"
  340. "[ :results silent ]{ \"y\" }")))
  341. (org-test-with-temp-text
  342. test-line
  343. (goto-char (point-max))
  344. (insert (concat "\n" test-line " end"))
  345. (re-search-backward "src_") (org-ctrl-c-ctrl-c)
  346. (should (string= (concat test-line " end")
  347. (buffer-substring-no-properties
  348. (point-at-bol) (point-at-eol))))
  349. (re-search-forward "\" ") (org-ctrl-c-ctrl-c)
  350. (should (string= (concat test-line " end")
  351. (buffer-substring-no-properties
  352. (point-at-bol) (point-at-eol))))
  353. (forward-char)
  354. (should-error (org-ctrl-c-ctrl-c)))))
  355. (ert-deftest test-org-babel/inline-src_blk-results-raw ()
  356. (let ((test-line "src_emacs-lisp[ :results raw ]{ \"x\" }"))
  357. (org-test-with-temp-text test-line
  358. (org-ctrl-c-ctrl-c)
  359. (should (string= (concat test-line " x")
  360. (buffer-string)))))
  361. (let ((test-line (concat " Some text prior to block "
  362. "src_emacs-lisp[ :results raw ]{ \"the\" }")))
  363. (org-test-with-temp-text (concat test-line " end")
  364. (re-search-forward "src_") (org-ctrl-c-ctrl-c)
  365. (should (string= (concat test-line " the end")
  366. (buffer-substring-no-properties
  367. (point-at-bol) (point-at-eol))))
  368. (re-search-forward "\" ") (org-ctrl-c-ctrl-c)
  369. (should (string= (concat test-line " the the end")
  370. (buffer-substring-no-properties
  371. (point-at-bol) (point-at-eol))))
  372. (forward-char)
  373. (should-error (org-ctrl-c-ctrl-c)))))
  374. (ert-deftest test-org-babel/inline-src_blk-results-file ()
  375. (let ((test-line "src_emacs-lisp[ :results file ]{ \"~/test-file\" }"))
  376. (org-test-with-temp-text
  377. test-line
  378. (org-ctrl-c-ctrl-c)
  379. (should (string= (concat test-line " [[file:~/test-file]]")
  380. (buffer-substring-no-properties
  381. (point-min) (point-max)))))))
  382. (ert-deftest test-org-babel/inline-src_blk-results-scalar ()
  383. (let ((test-line "src_emacs-lisp[ :results scalar ]{ \"x\" }"))
  384. (org-test-with-temp-text
  385. test-line
  386. (org-ctrl-c-ctrl-c)
  387. (should (string= (concat test-line " =\"x\"=")
  388. (buffer-substring-no-properties
  389. (point-min) (point-max)))))))
  390. (ert-deftest test-org-babel/inline-src_blk-results-verbatim ()
  391. (let ((test-line "src_emacs-lisp[ :results verbatim ]{ \"x\" }"))
  392. (org-test-with-temp-text
  393. test-line
  394. (org-ctrl-c-ctrl-c)
  395. (should (string= (concat test-line " =\"x\"=")
  396. (buffer-substring-no-properties
  397. (point-min) (point-max)))))))
  398. (ert-deftest test-org-babel/combining-scalar-and-raw-result-types ()
  399. (org-test-with-temp-text-in-file "
  400. #+begin_src sh :results scalar
  401. echo \"[[file:./cv.cls]]\"
  402. #+end_src
  403. #+name:
  404. : [[file:./cv.cls]]
  405. #+begin_src sh :results raw scalar
  406. echo \"[[file:./cv.cls]]\"
  407. #+end_src
  408. "
  409. (flet ((next-result ()
  410. (org-babel-next-src-block)
  411. (org-babel-execute-src-block)
  412. (goto-char (org-babel-where-is-src-block-result))
  413. (forward-line 1)))
  414. (goto-char (point-min))
  415. (next-result)
  416. (should (org-babel-in-example-or-verbatim))
  417. (next-result)
  418. (should (not (org-babel-in-example-or-verbatim))))))
  419. (ert-deftest test-org-babel/no-defaut-value-for-var ()
  420. "Test that the absence of a default value for a variable DOES THROW
  421. a proper error."
  422. (org-test-at-id "f2df5ba6-75fa-4e6b-8441-65ed84963627"
  423. (org-babel-next-src-block)
  424. (let ((err
  425. (should-error (org-babel-execute-src-block) :type 'error)))
  426. (should
  427. (equal
  428. '(error
  429. "variable \"x\" in block \"carre\" must be assigned a default value")
  430. err)))))
  431. (ert-deftest test-org-babel/just-one-results-block ()
  432. "Test that evaluating two times the same code block does not result in a
  433. duplicate results block."
  434. (org-test-with-temp-text "#+begin_src sh\necho Hello\n#+end_src\n"
  435. (org-babel-execute-src-block)
  436. (org-babel-execute-src-block) ; second code block execution
  437. (should (search-forward "Hello")) ; the string inside the source code block
  438. (should (search-forward "Hello")) ; the same string in the results block
  439. (should-error (search-forward "Hello"))))
  440. (ert-deftest test-org-babel/nested-code-block ()
  441. "Test nested code blocks inside code blocks don't cause problems."
  442. (org-test-with-temp-text "#+begin_src org :results silent
  443. ,#+begin_src emacs-lisp
  444. , 'foo
  445. ,#+end_src
  446. #+end_src"
  447. (should (string= (org-babel-execute-src-block)
  448. "#+begin_src emacs-lisp\n 'foo\n#+end_src"))))
  449. (ert-deftest test-org-babel/partial-nested-code-block ()
  450. "Test nested code blocks inside code blocks don't cause problems."
  451. (org-test-with-temp-text "#+begin_src org :results silent
  452. ,#+begin_src emacs-lisp
  453. #+end_src"
  454. (should (string= "#+begin_src emacs-lisp" (org-babel-execute-src-block)))))
  455. (ert-deftest test-ob/does-not-replace-a-block-with-the-results ()
  456. (org-test-with-temp-text "#+NAME: foo
  457. #+BEGIN_SRC emacs-lisp
  458. 'foo
  459. #+END_SRC\n"
  460. (org-babel-next-src-block 1)
  461. (should (eq 'foo (org-babel-execute-src-block)))
  462. (goto-char (point-min))
  463. (org-babel-next-src-block 1)
  464. (should (looking-at org-babel-src-block-regexp))))
  465. (ert-deftest test-ob/catches-all-references ()
  466. (org-test-with-temp-text "
  467. #+NAME: literal-example
  468. #+BEGIN_EXAMPLE
  469. A literal example
  470. on two lines
  471. #+END_EXAMPLE
  472. #+NAME: read-literal-example
  473. #+BEGIN_SRC emacs-lisp :var x=literal-example
  474. (concatenate 'string x \" for me.\")
  475. #+END_SRC"
  476. (org-babel-next-src-block 1)
  477. (should (string= (org-babel-execute-src-block)
  478. "A literal example\non two lines for me."))))
  479. (ert-deftest test-ob/resolve-code-blocks-before-data-blocks ()
  480. (org-test-with-temp-text "
  481. #+name: foo
  482. : bar
  483. #+name: foo
  484. #+begin_src emacs-lisp
  485. \"baz\"
  486. #+end_src
  487. #+begin_src emacs-lisp :var foo=foo
  488. foo
  489. #+end_src"
  490. (org-babel-next-src-block 2)
  491. (should (string= (org-babel-execute-src-block) "baz"))))
  492. (ert-deftest test-ob/do-not-resolve-to-partial-names-data ()
  493. (org-test-with-temp-text "
  494. #+tblname: base_plus
  495. | 1 |
  496. | 2 |
  497. #+tblname: base
  498. | 3 |
  499. | 4 |
  500. #+begin_src emacs-lisp :var x=base
  501. x
  502. #+end_src"
  503. (org-babel-next-src-block 1)
  504. (should (equal (org-babel-execute-src-block) '((3) (4))))))
  505. (ert-deftest test-ob/do-not-resolve-to-partial-names-code ()
  506. (org-test-with-temp-text "
  507. #+name: base_plus
  508. #+begin_src emacs-lisp
  509. 'bar
  510. #+end_src
  511. #+name: base
  512. #+begin_src emacs-lisp
  513. 'foo
  514. #+end_src
  515. #+begin_src emacs-lisp :var x=base
  516. x
  517. #+end_src"
  518. (org-babel-next-src-block 3)
  519. (should (equal (org-babel-execute-src-block) "foo"))))
  520. (ert-deftest test-ob/allow-spaces-around-=-in-var-specs ()
  521. (org-test-with-temp-text "#+begin_src emacs-lisp :var a = 1 b = 2 c= 3 d =4
  522. (+ a b c d)
  523. #+end_src
  524. "
  525. (should (= 10 (org-babel-execute-src-block)))))
  526. (ert-deftest test-ob/org-babel-update-intermediate ()
  527. (org-test-with-temp-text "#+name: foo
  528. #+begin_src emacs-lisp
  529. 2
  530. #+end_src
  531. #+results: foo
  532. : 4
  533. #+begin_src emacs-lisp :var it=foo
  534. (+ it 1)
  535. #+end_src"
  536. (let ((org-babel-update-intermediate nil))
  537. (goto-char (point-min))
  538. (org-babel-next-src-block 2)
  539. (should (= 3 (org-babel-execute-src-block)))
  540. (goto-char (point-min))
  541. (forward-line 6)
  542. (should (looking-at ": 4")))
  543. (let ((org-babel-update-intermediate t))
  544. (goto-char (point-min))
  545. (org-babel-next-src-block 2)
  546. (should (= 3 (org-babel-execute-src-block)))
  547. (goto-char (point-min))
  548. (forward-line 6)
  549. (should (looking-at ": 2")))))
  550. (ert-deftest test-ob/eval-header-argument ()
  551. (flet ((check-eval (eval runp)
  552. (org-test-with-temp-text (format "#+begin_src emacs-lisp :eval %s
  553. (setq foo :evald)
  554. #+end_src" eval)
  555. (let ((foo :not-run))
  556. (if runp
  557. (progn (should (org-babel-execute-src-block))
  558. (should (eq foo :evald)))
  559. (progn (should-not (org-babel-execute-src-block))
  560. (should-not (eq foo :evald))))))))
  561. (check-eval "never" nil)
  562. (check-eval "no" nil)
  563. (check-eval "never-export" t)
  564. (check-eval "no-export" t)
  565. (let ((org-current-export-file "something"))
  566. (check-eval "never" nil)
  567. (check-eval "no" nil)
  568. (check-eval "never-export" nil)
  569. (check-eval "no-export" nil))))
  570. (ert-deftest test-ob/noweb-expansion-1 ()
  571. (org-test-with-temp-text "#+begin_src sh :results output :tangle yes
  572. <<foo>>
  573. #+end_src
  574. #+name: foo
  575. #+begin_src sh
  576. bar
  577. #+end_src"
  578. (should (string= (org-babel-expand-noweb-references) "bar"))))
  579. (ert-deftest test-ob/noweb-expansion-2 ()
  580. (org-test-with-temp-text "#+begin_src sh :results output :tangle yes
  581. <<foo>>
  582. #+end_src
  583. #+name: foo
  584. #+begin_src sh :noweb-sep \"\"
  585. bar
  586. #+end_src
  587. #+begin_src sh :noweb-ref foo :noweb-sep \"\"
  588. baz
  589. #+end_src"
  590. (should (string= (org-babel-expand-noweb-references) "barbaz"))))
  591. (ert-deftest test-ob/splitting-variable-lists-in-references ()
  592. (org-test-with-temp-text ""
  593. (should (= 1 (length (org-babel-ref-split-args
  594. "a=\"this, no work\""))))
  595. (should (= 2 (length (org-babel-ref-split-args
  596. "a=\"this, no work\", b=1"))))))
  597. (ert-deftest test-ob/org-babel-balanced-split ()
  598. (should (equal
  599. '(":a 1" "b [2 3]" "c (4 :d (5 6))")
  600. (org-babel-balanced-split ":a 1 :b [2 3] :c (4 :d (5 6))"
  601. '((32 9) . 58)))))
  602. (ert-deftest test-ob/commented-last-block-line-no-var ()
  603. (org-test-with-temp-text-in-file "
  604. #+begin_src emacs-lisp
  605. ;;
  606. #+end_src"
  607. (progn
  608. (org-babel-next-src-block)
  609. (org-ctrl-c-ctrl-c)
  610. (should (re-search-forward "\\#\\+results:" nil t))
  611. (forward-line)
  612. (should
  613. (string=
  614. ""
  615. (buffer-substring-no-properties (point-at-bol) (point-at-eol))))))
  616. (org-test-with-temp-text-in-file "
  617. #+begin_src emacs-lisp
  618. \"some text\";;
  619. #+end_src"
  620. (progn
  621. (org-babel-next-src-block)
  622. (org-ctrl-c-ctrl-c)
  623. (should (re-search-forward "\\#\\+results:" nil t))
  624. (forward-line)
  625. (should
  626. (string=
  627. ": some text"
  628. (buffer-substring-no-properties (point-at-bol) (point-at-eol)))))))
  629. (ert-deftest test-ob/commented-last-block-line-with-var ()
  630. (org-test-with-temp-text-in-file "
  631. #+begin_src emacs-lisp :var a=1
  632. ;;
  633. #+end_src"
  634. (progn
  635. (org-babel-next-src-block)
  636. (org-ctrl-c-ctrl-c)
  637. (re-search-forward "\\#\\+results:" nil t)
  638. (forward-line)
  639. (should (string=
  640. ""
  641. (buffer-substring-no-properties (point-at-bol) (point-at-eol))))))
  642. (org-test-with-temp-text-in-file "
  643. #+begin_src emacs-lisp :var a=2
  644. 2;;
  645. #+end_src"
  646. (progn
  647. (org-babel-next-src-block)
  648. (org-ctrl-c-ctrl-c)
  649. (re-search-forward "\\#\\+results:" nil t)
  650. (forward-line)
  651. (should (string=
  652. ": 2"
  653. (buffer-substring-no-properties (point-at-bol) (point-at-eol)))))))
  654. (defun test-ob-verify-result-and-removed-result (result buffer-text)
  655. "Test helper function to test `org-babel-remove-result'.
  656. A temp buffer is populated with BUFFER-TEXT, the first block is executed,
  657. and the result of execution is verified against RESULT.
  658. The block is actually executed /twice/ to ensure result
  659. replacement happens correctly."
  660. (org-test-with-temp-text
  661. buffer-text
  662. (progn
  663. (org-babel-next-src-block) (org-ctrl-c-ctrl-c) (org-ctrl-c-ctrl-c)
  664. (should (re-search-forward "\\#\\+results:" nil t))
  665. (forward-line)
  666. (should (string= result
  667. (buffer-substring-no-properties
  668. (point-at-bol)
  669. (- (point-max) 16))))
  670. (org-babel-previous-src-block) (org-babel-remove-result)
  671. (should (string= buffer-text
  672. (buffer-substring-no-properties
  673. (point-min) (point-max)))))))
  674. (ert-deftest test-ob/org-babel-remove-result--results-default ()
  675. "Test `org-babel-remove-result' with default :results."
  676. (mapcar (lambda (language)
  677. (test-ob-verify-result-and-removed-result
  678. "\n"
  679. (concat
  680. "* org-babel-remove-result
  681. #+begin_src " language "
  682. #+end_src
  683. * next heading")))
  684. '("sh" "emacs-lisp")))
  685. (ert-deftest test-ob/org-babel-remove-result--results-list ()
  686. "Test `org-babel-remove-result' with :results list."
  687. (test-ob-verify-result-and-removed-result
  688. "- 1
  689. - 2
  690. - 3
  691. - (quote (4 5))"
  692. "* org-babel-remove-result
  693. #+begin_src emacs-lisp :results list
  694. '(1 2 3 '(4 5))
  695. #+end_src
  696. * next heading"))
  697. (ert-deftest test-ob/org-babel-results-indented-wrap ()
  698. "Ensure that wrapped results are inserted correction when indented.
  699. If not inserted correctly then the second evaluation will fail
  700. trying to find the :END: marker."
  701. (org-test-with-temp-text
  702. "- indented
  703. #+begin_src sh :results file wrap
  704. echo test.txt
  705. #+end_src"
  706. (org-babel-next-src-block 1)
  707. (org-babel-execute-src-block)
  708. (org-babel-execute-src-block)))
  709. (ert-deftest test-ob/file-desc-header-argument ()
  710. "Test that the :file-desc header argument is used."
  711. (org-test-with-temp-text "#+begin_src emacs-lisp :results file :file-desc bar
  712. \"foo\"
  713. #+end_src
  714. #+begin_src emacs-lisp :results file :file-desc
  715. \"foo\"
  716. #+end_src"
  717. (org-babel-execute-src-block)
  718. (org-babel-next-src-block 1)
  719. (org-babel-execute-src-block)
  720. (goto-char (point-min))
  721. (should (search-forward "[[file:foo][bar]]" nil t))
  722. (should (search-forward "[[file:foo][foo]]" nil t))))
  723. (ert-deftest test-ob/org-babel-remove-result--results-wrap ()
  724. "Test `org-babel-remove-result' with :results wrap."
  725. (test-ob-verify-result-and-removed-result
  726. ":RESULTS:
  727. hello there
  728. :END:"
  729. "* org-babel-remove-result
  730. #+begin_src emacs-lisp :results wrap
  731. \"hello there\"
  732. #+end_src
  733. * next heading"))
  734. (ert-deftest test-ob/org-babel-remove-result--results-org ()
  735. "Test `org-babel-remove-result' with :results org."
  736. (test-ob-verify-result-and-removed-result
  737. "#+BEGIN_ORG
  738. * heading
  739. ** subheading
  740. content
  741. #+END_ORG"
  742. "* org-babel-remove-result
  743. #+begin_src emacs-lisp :results org
  744. \"* heading
  745. ** subheading
  746. content\"
  747. #+end_src
  748. * next heading"))
  749. (ert-deftest test-ob/org-babel-remove-result--results-html ()
  750. "Test `org-babel-remove-result' with :results html."
  751. (test-ob-verify-result-and-removed-result
  752. "#+BEGIN_HTML
  753. <head><body></body></head>
  754. #+END_HTML"
  755. "* org-babel-remove-result
  756. #+begin_src emacs-lisp :results html
  757. \"<head><body></body></head>\"
  758. #+end_src
  759. * next heading"))
  760. (ert-deftest test-ob/org-babel-remove-result--results-latex ()
  761. "Test `org-babel-remove-result' with :results latex."
  762. (test-ob-verify-result-and-removed-result
  763. "#+BEGIN_LaTeX
  764. Line 1
  765. Line 2
  766. Line 3
  767. #+END_LaTeX"
  768. "* org-babel-remove-result
  769. #+begin_src emacs-lisp :results latex
  770. \"Line 1
  771. Line 2
  772. Line 3\"
  773. #+end_src
  774. * next heading"))
  775. (ert-deftest test-ob/org-babel-remove-result--results-code ()
  776. "Test `org-babel-remove-result' with :results code."
  777. (test-ob-verify-result-and-removed-result
  778. "#+BEGIN_SRC emacs-lisp
  779. \"I am working!\"
  780. #+END_SRC"
  781. "* org-babel-remove-result
  782. #+begin_src emacs-lisp :results code
  783. (message \"I am working!\")
  784. #+end_src
  785. * next heading"))
  786. (ert-deftest test-ob/org-babel-remove-result--results-pp ()
  787. "Test `org-babel-remove-result' with :results pp."
  788. (test-ob-verify-result-and-removed-result
  789. ": \"I /am/ working!\""
  790. "* org-babel-remove-result
  791. #+begin_src emacs-lisp :results pp
  792. \"I /am/ working!\")
  793. #+end_src
  794. * next heading"))
  795. (ert-deftest test-org-babel/inline-src_blk-preceded-punct-preceded-by-point ()
  796. (let ((test-line ".src_emacs-lisp[ :results verbatim ]{ \"x\" }"))
  797. (org-test-with-temp-text
  798. test-line
  799. (forward-char 1)
  800. (org-ctrl-c-ctrl-c)
  801. (should (re-search-forward "=\"x\"=" nil t))
  802. (forward-line))))
  803. (ert-deftest test-ob/commented-last-block-line-with-var ()
  804. (org-test-with-temp-text-in-file "
  805. #+begin_src emacs-lisp :var a=1
  806. ;;
  807. #+end_src"
  808. (progn
  809. (org-babel-next-src-block)
  810. (org-ctrl-c-ctrl-c)
  811. (re-search-forward "\\#\\+results:" nil t)
  812. (forward-line)
  813. (should (string=
  814. ""
  815. (buffer-substring-no-properties (point-at-bol) (point-at-eol))))))
  816. (org-test-with-temp-text-in-file "
  817. #+begin_src emacs-lisp :var a=2
  818. 2;;
  819. #+end_src"
  820. (progn
  821. (org-babel-next-src-block)
  822. (org-ctrl-c-ctrl-c)
  823. (re-search-forward "\\#\\+results:" nil t)
  824. (forward-line)
  825. (should (string=
  826. ": 2"
  827. (buffer-substring-no-properties (point-at-bol) (point-at-eol)))))))
  828. (defun test-ob-verify-result-and-removed-result (result buffer-text)
  829. "Test helper function to test `org-babel-remove-result'.
  830. A temp buffer is populated with BUFFER-TEXT, the first block is executed,
  831. and the result of execution is verified against RESULT.
  832. The block is actually executed /twice/ to ensure result
  833. replacement happens correctly."
  834. (org-test-with-temp-text
  835. buffer-text
  836. (progn
  837. (org-babel-next-src-block) (org-ctrl-c-ctrl-c) (org-ctrl-c-ctrl-c)
  838. (should (re-search-forward "\\#\\+results:" nil t))
  839. (forward-line)
  840. (should (string= result
  841. (buffer-substring-no-properties
  842. (point-at-bol)
  843. (- (point-max) 16))))
  844. (org-babel-previous-src-block) (org-babel-remove-result)
  845. (should (string= buffer-text
  846. (buffer-substring-no-properties
  847. (point-min) (point-max)))))))
  848. (ert-deftest test-ob/org-babel-remove-result--results-default ()
  849. "Test `org-babel-remove-result' with default :results."
  850. (mapcar (lambda (language)
  851. (test-ob-verify-result-and-removed-result
  852. "\n"
  853. (concat
  854. "* org-babel-remove-result
  855. #+begin_src " language "
  856. #+end_src
  857. * next heading")))
  858. '("sh" "emacs-lisp")))
  859. (ert-deftest test-ob/org-babel-remove-result--results-list ()
  860. "Test `org-babel-remove-result' with :results list."
  861. (test-ob-verify-result-and-removed-result
  862. "- 1
  863. - 2
  864. - 3
  865. - (quote (4 5))"
  866. "* org-babel-remove-result
  867. #+begin_src emacs-lisp :results list
  868. '(1 2 3 '(4 5))
  869. #+end_src
  870. * next heading"))
  871. (ert-deftest test-ob/org-babel-remove-result--results-wrap ()
  872. "Test `org-babel-remove-result' with :results wrap."
  873. (test-ob-verify-result-and-removed-result
  874. ":RESULTS:
  875. hello there
  876. :END:"
  877. "* org-babel-remove-result
  878. #+begin_src emacs-lisp :results wrap
  879. \"hello there\"
  880. #+end_src
  881. * next heading"))
  882. (ert-deftest test-ob/org-babel-remove-result--results-org ()
  883. "Test `org-babel-remove-result' with :results org."
  884. (test-ob-verify-result-and-removed-result
  885. "#+BEGIN_ORG
  886. * heading
  887. ** subheading
  888. content
  889. #+END_ORG"
  890. "* org-babel-remove-result
  891. #+begin_src emacs-lisp :results org
  892. \"* heading
  893. ** subheading
  894. content\"
  895. #+end_src
  896. * next heading"))
  897. (ert-deftest test-ob/org-babel-remove-result--results-html ()
  898. "Test `org-babel-remove-result' with :results html."
  899. (test-ob-verify-result-and-removed-result
  900. "#+BEGIN_HTML
  901. <head><body></body></head>
  902. #+END_HTML"
  903. "* org-babel-remove-result
  904. #+begin_src emacs-lisp :results html
  905. \"<head><body></body></head>\"
  906. #+end_src
  907. * next heading"))
  908. (ert-deftest test-ob/org-babel-remove-result--results-latex ()
  909. "Test `org-babel-remove-result' with :results latex."
  910. (test-ob-verify-result-and-removed-result
  911. "#+BEGIN_LaTeX
  912. Line 1
  913. Line 2
  914. Line 3
  915. #+END_LaTeX"
  916. "* org-babel-remove-result
  917. #+begin_src emacs-lisp :results latex
  918. \"Line 1
  919. Line 2
  920. Line 3\"
  921. #+end_src
  922. * next heading"))
  923. (ert-deftest test-ob/org-babel-remove-result--results-code ()
  924. "Test `org-babel-remove-result' with :results code."
  925. (test-ob-verify-result-and-removed-result
  926. "#+BEGIN_SRC emacs-lisp
  927. \"I am working!\"
  928. #+END_SRC"
  929. "* org-babel-remove-result
  930. #+begin_src emacs-lisp :results code
  931. (message \"I am working!\")
  932. #+end_src
  933. * next heading"))
  934. (ert-deftest test-ob/org-babel-remove-result--results-pp ()
  935. "Test `org-babel-remove-result' with :results pp."
  936. (test-ob-verify-result-and-removed-result
  937. ": \"I /am/ working!\""
  938. "* org-babel-remove-result
  939. #+begin_src emacs-lisp :results pp
  940. \"I /am/ working!\")
  941. #+end_src
  942. * next heading"))
  943. (ert-deftest test-ob/results-do-not-replace-code-blocks ()
  944. (org-test-with-temp-text "Block two has a space after the name.
  945. #+name: foo
  946. #+begin_src emacs-lisp
  947. 1
  948. #+end_src emacs-lisp
  949. #+name: foo
  950. #+begin_src emacs-lisp
  951. 2
  952. #+end_src
  953. #+name: foo
  954. #+begin_src emacs-lisp
  955. 3
  956. #+end_src
  957. #+RESULTS: foo
  958. : foo
  959. "
  960. (dolist (num '(1 2 3))
  961. ;; execute the block
  962. (goto-char (point-min))
  963. (org-babel-next-src-block num) (org-babel-execute-src-block)
  964. ;; check the results
  965. (goto-char (point-max))
  966. (move-beginning-of-line 0)
  967. (should (looking-at (format ": %d" num))))))
  968. (provide 'test-ob)
  969. ;;; test-ob ends here