1 ;;; test-org-element.el --- Tests for org-element.el
3 ;; Copyright (C) 2012, 2013 Nicolas Goaziou
5 ;; Author: Nicolas Goaziou <n.goaziou at gmail dot com>
7 ;; This program is free software; you can redistribute it and/or modify
8 ;; it under the terms of the GNU General Public License as published by
9 ;; the Free Software Foundation, either version 3 of the License, or
10 ;; (at your option) any later version.
12 ;; This program is distributed in the hope that it will be useful,
13 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
14 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 ;; GNU General Public License for more details.
17 ;; You should have received a copy of the GNU General Public License
18 ;; along with this program. If not, see <http://www.gnu.org/licenses/>.
22 (unless (featurep 'org-element
)
23 (signal 'missing-test-dependency
"org-element"))
25 (defun org-test-parse-and-interpret (text)
26 "Parse TEXT as Org syntax and interpret it.
27 Return interpreted string."
31 (org-element-interpret-data (org-element-parse-buffer))))
35 ;;; Test `org-element-map'
37 (ert-deftest test-org-element
/map
()
38 "Test `org-element-map'."
39 ;; Can map to `plain-text' objects.
42 (org-test-with-temp-text "Some text \alpha
48 (org-element-parse-buffer) 'plain-text
49 (lambda (s) (when (string-match "text" s
) (incf count
))))
51 ;; Applies to secondary strings
53 (org-element-map '("some " (bold nil
"bold") "text") 'bold
'identity
))
54 ;; Enter secondary strings before entering contents.
60 (org-test-with-temp-text "* Some \\alpha headline\n\\beta entity."
61 (org-element-map (org-element-parse-buffer) 'entity
'identity nil t
)))))
62 ;; Apply NO-RECURSION argument.
64 (org-test-with-temp-text "#+BEGIN_CENTER\n\\alpha\n#+END_CENTER"
66 (org-element-parse-buffer) 'entity
'identity nil nil
'center-block
))))
72 (ert-deftest test-org-element
/put-property
()
73 "Test `org-element-put-property' specifications."
74 (org-test-with-temp-text "* Headline\n *a*"
75 (let ((tree (org-element-parse-buffer)))
76 (org-element-put-property
77 (org-element-map tree
'bold
'identity nil t
) :test
1)
78 (should (org-element-property
79 :test
(org-element-map tree
'bold
'identity nil t
))))))
81 (ert-deftest test-org-element
/set-contents
()
82 "Test `org-element-set-contents' specifications."
83 ;; Accept multiple entries.
85 (equal '("b" (italic nil
"a"))
86 (org-test-with-temp-text "* Headline\n *a*"
87 (let ((tree (org-element-parse-buffer)))
88 (org-element-set-contents
89 (org-element-map tree
'bold
'identity nil t
) "b" '(italic nil
"a"))
91 (org-element-map tree
'bold
'identity nil t
))))))
92 ;; Accept atoms and elements.
95 (org-test-with-temp-text "* Headline\n *a*"
96 (let ((tree (org-element-parse-buffer)))
97 (org-element-set-contents
98 (org-element-map tree
'bold
'identity nil t
) "b")
100 (org-element-map tree
'bold
'identity nil t
))))))
102 (equal '((italic nil
"b"))
103 (org-test-with-temp-text "* Headline\n *a*"
104 (let ((tree (org-element-parse-buffer)))
105 (org-element-set-contents
106 (org-element-map tree
'bold
'identity nil t
) '(italic nil
"b"))
107 (org-element-contents
108 (org-element-map tree
'bold
'identity nil t
))))))
109 ;; Allow nil contents.
111 (org-test-with-temp-text "* Headline\n *a*"
112 (let ((tree (org-element-parse-buffer)))
113 (org-element-set-contents (org-element-map tree
'bold
'identity nil t
))
114 (org-element-contents (org-element-map tree
'bold
'identity nil t
))))))
116 (ert-deftest test-org-element
/set-element
()
117 "Test `org-element-set-element' specifications."
118 (org-test-with-temp-text "* Headline\n*a*"
119 (let ((tree (org-element-parse-buffer)))
120 (org-element-set-element
121 (org-element-map tree
'bold
'identity nil t
)
123 ;; Check if object is correctly replaced.
124 (should (org-element-map tree
'italic
'identity
))
125 (should-not (org-element-map tree
'bold
'identity
))
126 ;; Check if new object's parent is correctly set.
129 (org-element-property :parent
130 (org-element-map tree
'italic
'identity nil t
))
131 (org-element-map tree
'paragraph
'identity nil t
))))))
133 (ert-deftest test-org-element
/adopt-elements
()
134 "Test `org-element-adopt-elements' specifications."
137 (equal '(plain-text italic
)
138 (org-test-with-temp-text "* Headline\n *a*"
139 (let ((tree (org-element-parse-buffer)))
140 (org-element-adopt-elements
141 (org-element-map tree
'bold
'identity nil t
) '(italic nil
"a"))
142 (mapcar (lambda (blob) (org-element-type blob
))
143 (org-element-contents
144 (org-element-map tree
'bold
'identity nil t
)))))))
148 (org-test-with-temp-text "* Headline\n *a*"
149 (let ((tree (org-element-parse-buffer)))
150 (org-element-adopt-elements
151 (org-element-map tree
'bold
'identity nil t
) "b")
152 (org-element-contents
153 (org-element-map tree
'bold
'identity nil t
)))))))
159 ;;;; Affiliated Keywords
161 (ert-deftest test-org-element
/affiliated-keywords-parser
()
162 "Test affiliated keywords parsing."
163 ;; Read simple keywords.
166 (org-element-property
168 (org-test-with-temp-text "#+NAME: para\nParagraph"
169 (org-element-at-point)))))
170 ;; Parse multiple keywords.
174 (org-element-property
176 (org-test-with-temp-text
177 "#+ATTR_ASCII: line1\n#+ATTR_ASCII: line2\nParagraph"
178 (org-element-at-point)))))
179 ;; Parse "parsed" keywords.
183 (org-test-with-temp-text "#+CAPTION: caption\nParagraph"
184 (car (org-element-property :caption
(org-element-at-point))))))
185 ;; Parse dual keywords.
189 (org-test-with-temp-text "#+CAPTION[short]: long\nParagraph"
190 (org-element-property :caption
(org-element-at-point))))))
195 (ert-deftest test-org-element
/babel-call-parser
()
196 "Test `babel-call' parsing."
199 (org-test-with-temp-text "#+CALL: test()"
200 (org-element-map (org-element-parse-buffer) 'babel-call
'identity
)))
203 (org-test-with-temp-text "#+call: test()"
204 (org-element-map (org-element-parse-buffer) 'babel-call
'identity
))))
209 (ert-deftest test-org-element
/bold-parser
()
210 "Test `bold' parser."
213 (let ((org-emph-re "\\([ ('\"{]\\|^\\)\\(\\([+*/_=~]\\)\\([^
\n,\"']\\|[^
\n,\"'].*?\\(?:\n.*?\\)\\{0,1\\}[^
\n,\"']\\)\\3\\)\\([- .,:!?;'\")}\\]\\|$\\)"))
214 (org-test-with-temp-text "*bold*"
215 (org-element-map (org-element-parse-buffer) 'bold
'identity nil t
))))
216 ;; Multi-line markup.
219 (org-element-contents
220 (let ((org-emph-re "\\([ ('\"{]\\|^\\)\\(\\([+*/_=~]\\)\\([^
\n,\"']\\|[^
\n,\"'].*?\\(?:\n.*?\\)\\{0,1\\}[^
\n,\"']\\)\\3\\)\\([- .,:!?;'\")}\\]\\|$\\)"))
221 (org-test-with-temp-text "*first line\nsecond line*"
222 (org-element-map (org-element-parse-buffer) 'bold
'identity nil t
))))
223 '("first line\nsecond line"))))
228 (ert-deftest test-org-element
/center-block-parser
()
229 "Test `center-block' parser."
232 (org-test-with-temp-text "#+BEGIN_CENTER\nText\n#+END_CENTER"
233 (org-element-map (org-element-parse-buffer) 'center-block
'identity
)))
236 (org-test-with-temp-text "#+begin_center\nText\n#+end_center"
237 (org-element-map (org-element-parse-buffer) 'center-block
'identity
)))
238 ;; Test folded block.
239 (org-test-with-temp-text "#+BEGIN_CENTER\nText\n#+END_CENTER"
242 (org-element-property
245 (org-element-parse-buffer) 'center-block
'identity nil t
))))
246 ;; Ignore incomplete block.
248 (org-test-with-temp-text "#+BEGIN_CENTER"
250 (org-element-parse-buffer) 'center-block
'identity nil t
))))
255 (ert-deftest test-org-element
/clock-parser
()
256 "Test `clock' parser."
258 (let* ((org-clock-string "CLOCK:")
259 (clock (org-test-with-temp-text "CLOCK: [2012-01-01 sun. 00:01]"
261 (org-element-parse-buffer) 'clock
'identity nil t
))))
262 (should (eq (org-element-property :status clock
) 'running
))
263 (should (equal (org-element-property :value clock
)
264 "[2012-01-01 sun. 00:01]"))
265 (should-not (org-element-property :time clock
)))
267 (let* ((org-clock-string "CLOCK:")
268 (clock (org-test-with-temp-text "
269 CLOCK: [2012-01-01 sun. 00:01]--[2012-01-01 sun. 00:02] => 0:01"
271 (org-element-parse-buffer) 'clock
'identity nil t
))))
272 (should (eq (org-element-property :status clock
) 'closed
))
273 (should (equal (org-element-property :value clock
)
274 "[2012-01-01 sun. 00:01]--[2012-01-01 sun. 00:02]"))
275 (should (equal (org-element-property :time clock
) "0:01"))))
280 (ert-deftest test-org-element
/code-parser
()
281 "Test `code' parser."
284 (let ((org-emph-re "\\([ ('\"{]\\|^\\)\\(\\([+*/_=~]\\)\\([^
\n,\"']\\|[^
\n,\"'].*?\\(?:\n.*?\\)\\{0,1\\}[^
\n,\"']\\)\\3\\)\\([- .,:!?;'\")}\\]\\|$\\)"))
285 (org-test-with-temp-text "~code~"
286 (org-element-map (org-element-parse-buffer) 'code
'identity
))))
287 ;; Multi-line markup.
290 (org-element-property
292 (let ((org-emph-re "\\([ ('\"{]\\|^\\)\\(\\([+*/_=~]\\)\\([^
\n,\"']\\|[^
\n,\"'].*?\\(?:\n.*?\\)\\{0,1\\}[^
\n,\"']\\)\\3\\)\\([- .,:!?;'\")}\\]\\|$\\)"))
293 (org-test-with-temp-text "~first line\nsecond line~"
295 (org-element-parse-buffer) 'code
'identity nil t
))))
296 "first line\nsecond line")))
301 (ert-deftest test-org-element
/comment-parser
()
302 "Test `comment' parser."
305 (org-test-with-temp-text "# Comment"
306 (org-element-map (org-element-parse-buffer) 'comment
'identity
)))
309 (org-test-with-temp-text " # Comment"
310 (org-element-map (org-element-parse-buffer) 'comment
'identity
)))
311 ;; Preserve indentation.
314 (org-element-property
316 (org-test-with-temp-text "# No blank\n# One blank"
317 (org-element-map (org-element-parse-buffer) 'comment
'identity nil t
)))
318 "No blank\n One blank"))
319 ;; Comment with blank lines.
322 (org-element-property
324 (org-test-with-temp-text "# First part\n# \n#\n# Second part"
325 (org-element-map (org-element-parse-buffer) 'comment
'identity nil t
)))
326 "First part\n\n\nSecond part"))
327 ;; Do not mix comments and keywords.
330 (org-test-with-temp-text "#+keyword: value\n# comment\n#+keyword: value"
331 (length (org-element-map
332 (org-element-parse-buffer) 'comment
'identity
)))))
335 (org-test-with-temp-text "#+keyword: value\n# comment\n#+keyword: value"
336 (org-element-property
339 (org-element-parse-buffer) 'comment
'identity nil t
))))))
344 (ert-deftest test-org-element
/comment-block-parser
()
345 "Test `comment-block' parser."
348 (org-test-with-temp-text "#+BEGIN_COMMENT\nText\n#+END_COMMENT"
350 (org-element-parse-buffer) 'comment-block
'identity
)))
353 (org-test-with-temp-text "#+begin_comment\nText\n#+end_comment"
355 (org-element-parse-buffer) 'comment-block
'identity
)))
356 ;; Test folded block.
357 (org-test-with-temp-text "#+BEGIN_COMMENT\nText\n#+END_COMMENT"
360 (org-element-property
363 (org-element-parse-buffer) 'comment-block
'identity nil t
))))
364 ;; Ignore incomplete block.
366 (org-test-with-temp-text "#+BEGIN_COMMENT"
368 (org-element-parse-buffer) 'comment-block
'identity nil t
))))
373 (ert-deftest test-org-element
/drawer-parser
()
374 "Test `drawer' parser."
377 (let ((org-drawers '("TEST")))
378 (org-test-with-temp-text ":TEST:\nText\n:END:"
379 (org-element-map (org-element-parse-buffer) 'drawer
'identity
))))
380 ;; Do not mix regular drawers and property drawers.
382 (let ((org-drawers '("PROPERTIES")))
383 (org-test-with-temp-text ":PROPERTIES:\n:prop: value\n:END:"
385 (org-element-parse-buffer) 'drawer
'identity nil t
))))
386 ;; Ignore incomplete drawer.
388 (let ((org-drawers '("TEST")))
389 (org-test-with-temp-text ":TEST:"
391 (org-element-parse-buffer) 'drawer
'identity nil t
)))))
396 (ert-deftest test-org-element
/dynamic-block-parser
()
397 "Test `dynamic-block' parser."
400 (org-test-with-temp-text
401 "#+BEGIN: myblock :param1 val1 :param2 val2\nText\n#+END:"
402 (org-element-map (org-element-parse-buffer) 'dynamic-block
'identity
)))
404 (org-test-with-temp-text
405 "#+BEGIN: myblock :param1 val1 :param2 val2\nText\n#+END:"
408 (org-element-property
411 (org-element-parse-buffer) 'dynamic-block
'identity nil t
))))
414 (org-test-with-temp-text
415 "#+begin: myblock :param1 val1 :param2 val2\nText\n#+end:"
416 (org-element-map (org-element-parse-buffer) 'dynamic-block
'identity
)))
417 ;; Ignore incomplete block.
419 (org-test-with-temp-text "#+BEGIN: myblock :param1 val1 :param2 val2"
421 (org-element-parse-buffer) 'dynamic-block
'identity nil t
))))
426 (ert-deftest test-org-element
/entity-parser
()
427 "Test `entity' parser."
430 (org-test-with-temp-text "\\sin"
431 (org-element-map (org-element-parse-buffer) 'entity
'identity
)))
434 (org-element-property
436 (org-test-with-temp-text "\\alpha{}text"
437 (org-element-map (org-element-parse-buffer) 'entity
'identity nil t
))))
438 ;; User-defined entity.
441 (org-element-property
443 (let ((org-entities-user
444 '(("test" "test" nil
"test" "test" "test" "test"))))
445 (org-test-with-temp-text "\\test"
446 (org-element-map (org-element-parse-buffer) 'entity
'identity nil t
))))
452 (ert-deftest test-org-element
/example-block-parser
()
453 "Test `example-block' parser."
456 (org-test-with-temp-text "#+BEGIN_EXAMPLE\nText\n#+END_EXAMPLE"
457 (org-element-map (org-element-parse-buffer) 'example-block
'identity
)))
458 ;; Test folded block.
459 (org-test-with-temp-text "#+BEGIN_EXAMPLE\nText\n#+END_EXAMPLE"
462 (org-element-property
465 (org-element-parse-buffer) 'example-block
'identity nil t
))))
466 ;; Ignore incomplete block.
468 (org-test-with-temp-text "#+BEGIN_EXAMPLE"
470 (org-element-parse-buffer) 'example-block
'identity nil t
)))
471 ;; Properly un-escape code.
473 (equal "* Headline\n #+keyword\nText\n"
474 (org-test-with-temp-text
475 "#+BEGIN_EXAMPLE\n,* Headline\n ,#+keyword\nText\n#+END_EXAMPLE"
476 (org-element-property :value
(org-element-at-point))))))
478 (ert-deftest test-org-element
/block-switches
()
479 "Test `example-block' and `src-block' switches parsing."
480 (let ((org-coderef-label-format "(ref:%s)"))
481 ;; 1. Test "-i" switch.
482 (org-test-with-temp-text "#+BEGIN_SRC emacs-lisp\n(+ 1 1)\n#+END_SRC"
484 (org-element-property :preserve-indent
(org-element-at-point))))
485 (org-test-with-temp-text "#+BEGIN_SRC emacs-lisp -i\n(+ 1 1)\n#+END_SRC"
486 (should (org-element-property :preserve-indent
(org-element-at-point))))
487 (org-test-with-temp-text "#+BEGIN_EXAMPLE\nText.\n#+END_EXAMPLE"
489 (org-element-property :preserve-indent
(org-element-at-point))))
490 (org-test-with-temp-text "#+BEGIN_EXAMPLE -i\nText.\n#+END_EXAMPLE"
491 (should (org-element-property :preserve-indent
(org-element-at-point))))
492 ;; 2. "-n -r -k" combination should number lines, retain labels but
493 ;; not use them in coderefs.
494 (org-test-with-temp-text "#+BEGIN_EXAMPLE -n -r -k\nText.\n#+END_EXAMPLE"
495 (let ((element (org-element-at-point)))
496 (should (and (org-element-property :number-lines element
)
497 (org-element-property :retain-labels element
)
498 (not (org-element-property :use-labels element
))))))
499 (org-test-with-temp-text
500 "#+BEGIN_SRC emacs-lisp -n -r -k\n(+ 1 1)\n#+END_SRC"
501 (let ((element (org-element-at-point)))
502 (should (and (org-element-property :number-lines element
)
503 (org-element-property :retain-labels element
)
504 (not (org-element-property :use-labels element
))))))
505 ;; 3. "-n -r" combination should number-lines remove labels and not
506 ;; use them in coderefs.
507 (org-test-with-temp-text "#+BEGIN_EXAMPLE -n -r\nText.\n#+END_EXAMPLE"
508 (let ((element (org-element-at-point)))
509 (should (and (org-element-property :number-lines element
)
510 (not (org-element-property :retain-labels element
))
511 (not (org-element-property :use-labels element
))))))
512 (org-test-with-temp-text "#+BEGIN_SRC emacs-lisp -n -r\n(+ 1 1)\n#+END_SRC"
513 (let ((element (org-element-at-point)))
514 (should (and (org-element-property :number-lines element
)
515 (not (org-element-property :retain-labels element
))
516 (not (org-element-property :use-labels element
))))))
517 ;; 4. "-n" or "+n" should number lines, retain labels and use them
519 (org-test-with-temp-text "#+BEGIN_EXAMPLE -n\nText.\n#+END_EXAMPLE"
520 (let ((element (org-element-at-point)))
521 (should (and (org-element-property :number-lines element
)
522 (org-element-property :retain-labels element
)
523 (org-element-property :use-labels element
)))))
524 (org-test-with-temp-text "#+BEGIN_SRC emacs-lisp -n\n(+ 1 1)\n#+END_SRC"
525 (let ((element (org-element-at-point)))
526 (should (and (org-element-property :number-lines element
)
527 (org-element-property :retain-labels element
)
528 (org-element-property :use-labels element
)))))
529 (org-test-with-temp-text "#+BEGIN_EXAMPLE +n\nText.\n#+END_EXAMPLE"
530 (let ((element (org-element-at-point)))
531 (should (and (org-element-property :number-lines element
)
532 (org-element-property :retain-labels element
)
533 (org-element-property :use-labels element
)))))
534 (org-test-with-temp-text "#+BEGIN_SRC emacs-lisp +n\n(+ 1 1)\n#+END_SRC"
535 (let ((element (org-element-at-point)))
536 (should (and (org-element-property :number-lines element
)
537 (org-element-property :retain-labels element
)
538 (org-element-property :use-labels element
)))))
539 ;; 5. No switch should not number lines, but retain labels and use
541 (org-test-with-temp-text "#+BEGIN_EXAMPLE\nText.\n#+END_EXAMPLE"
542 (let ((element (org-element-at-point)))
543 (should (and (not (org-element-property :number-lines element
))
544 (org-element-property :retain-labels element
)
545 (org-element-property :use-labels element
)))))
546 (org-test-with-temp-text "#+BEGIN_SRC emacs-lisp\n(+ 1 1)\n#+END_SRC"
547 (let ((element (org-element-at-point)))
548 (should (and (not (org-element-property :number-lines element
))
549 (org-element-property :retain-labels element
)
550 (org-element-property :use-labels element
)))))
551 ;; 6. "-r" switch only: do not number lines, remove labels, and
552 ;; don't use labels in coderefs.
553 (org-test-with-temp-text "#+BEGIN_EXAMPLE -r\nText.\n#+END_EXAMPLE"
554 (let ((element (org-element-at-point)))
555 (should (and (not (org-element-property :number-lines element
))
556 (not (org-element-property :retain-labels element
))
557 (not (org-element-property :use-labels element
))))))
558 (org-test-with-temp-text "#+BEGIN_SRC emacs-lisp -r\n(+ 1 1)\n#+END_SRC"
559 (let ((element (org-element-at-point)))
560 (should (and (not (org-element-property :number-lines element
))
561 (not (org-element-property :retain-labels element
))
562 (not (org-element-property :use-labels element
))))))
563 ;; 7. Recognize coderefs with user-defined syntax.
564 (org-test-with-temp-text
565 "#+BEGIN_EXAMPLE -l \"[ref:%s]\"\nText [ref:text]\n#+END_EXAMPLE"
566 (let ((element (org-element-at-point)))
568 (equal (org-element-property :label-fmt element
) "[ref:%s]"))))
569 (org-test-with-temp-text
570 "#+BEGIN_SRC emacs-lisp -l \"[ref:%s]\"\n(+ 1 1) [ref:text]\n#+END_SRC"
571 (let ((element (org-element-at-point)))
573 (equal (org-element-property :label-fmt element
) "[ref:%s]"))))))
578 (ert-deftest test-org-element
/export-block-parser
()
579 "Test `export-block' parser."
582 (org-test-with-temp-text "#+BEGIN_LATEX\nText\n#+END_LATEX"
584 (let ((org-element-block-name-alist
585 '(("LATEX" . org-element-export-block-parser
))))
586 (org-element-parse-buffer))
587 'export-block
'identity
)))
588 ;; Test folded block.
589 (org-test-with-temp-text "#+BEGIN_LATEX\nText\n#+END_LATEX"
592 (org-element-property
595 (let ((org-element-block-name-alist
596 '(("LATEX" . org-element-export-block-parser
))))
597 (org-element-parse-buffer))
598 'export-block
'identity nil t
))))
601 (org-test-with-temp-text "#+begin_latex\nText\n#+end_latex"
603 (let ((org-element-block-name-alist
604 '(("LATEX" . org-element-export-block-parser
))))
605 (org-element-parse-buffer))
606 'export-block
'identity
)))
607 ;; Ignore incomplete block.
609 (org-test-with-temp-text "#+BEGIN_LATEX"
611 (let ((org-element-block-name-alist
612 '(("LATEX" . org-element-export-block-parser
))))
613 (org-element-parse-buffer))
614 'export-block
'identity nil t
))))
619 (ert-deftest test-org-element
/export-snippet-parser
()
620 "Test `export-snippet' parser."
623 '("back-end" .
"contents")
624 (org-test-with-temp-text "@@back-end:contents@@"
626 (org-element-parse-buffer) 'export-snippet
627 (lambda (snippet) (cons (org-element-property :back-end snippet
)
628 (org-element-property :value snippet
)))
634 (ert-deftest test-org-element
/fixed-width
()
635 "Test fixed-width area parsing."
636 ;; Preserve indentation.
638 (org-test-with-temp-text ": no blank\n: one blank"
639 (org-element-map (org-element-parse-buffer) 'fixed-width
'identity
)))
640 ;; Fixed-width with empty lines.
642 (org-test-with-temp-text ": first part\n:\n: \n: second part"
643 (org-element-map (org-element-parse-buffer) 'fixed-width
'identity
)))
644 ;; Parse indented fixed-width markers.
646 (org-test-with-temp-text "Text\n : no blank\n : one blank"
647 (org-element-map (org-element-parse-buffer) 'fixed-width
'identity
)))
648 ;; Distinguish fixed-width areas within a list and outside of it.
652 (org-test-with-temp-text "
655 : fixed-width outside"
657 (org-element-parse-buffer) 'fixed-width
'identity
))))))
660 ;;;; Footnote Definition
662 (ert-deftest test-org-element
/footnote-definition-parser
()
663 "Test `footnote-definition' parser."
665 (org-test-with-temp-text "[fn:1] Definition"
667 (org-element-parse-buffer) 'footnote-definition
'identity nil t
)))
668 ;; Footnote with more contents
671 (org-element-property
673 (org-test-with-temp-text "[fn:1] Definition\n| a | b |"
675 (org-element-parse-buffer)
676 'footnote-definition
'identity nil t
)))))
677 ;; Footnote starting with special syntax.
679 (org-test-with-temp-text "[fn:1] - no item"
680 (org-element-map (org-element-parse-buffer) 'item
'identity
))))
683 ;;;; Footnotes Reference.
685 (ert-deftest test-org-element
/footnote-reference-parser
()
686 "Test `footnote-reference' parser."
687 ;; 1. Parse a standard reference.
688 (org-test-with-temp-text "Text[fn:label]"
691 (org-element-parse-buffer) 'footnote-reference
'identity
)))
692 ;; 2. Parse a normalized reference.
693 (org-test-with-temp-text "Text[1]"
696 (org-element-parse-buffer) 'footnote-reference
'identity
)))
697 ;; 3. Parse an inline reference.
698 (org-test-with-temp-text "Text[fn:test:def]"
701 (org-element-parse-buffer) 'footnote-reference
'identity
)))
702 ;; 4. Parse an anonymous reference.
703 (org-test-with-temp-text "Text[fn::def]"
706 (org-element-parse-buffer) 'footnote-reference
'identity
)))
707 ;; 5. Parse nested footnotes.
708 (org-test-with-temp-text "Text[fn::def [fn:label]]"
713 (org-element-parse-buffer) 'footnote-reference
'identity
)))))
714 ;; 6. Parse adjacent footnotes.
715 (org-test-with-temp-text "Text[fn:label1][fn:label2]"
720 (org-element-parse-buffer) 'footnote-reference
'identity
)))))
721 ;; 7. Only properly closed footnotes are recognized as such.
722 (org-test-with-temp-text "Text[fn:label"
725 (org-element-parse-buffer) 'footnote-reference
'identity
))))
730 (ert-deftest test-org-element
/headline-quote-keyword
()
731 "Test QUOTE keyword recognition."
733 (org-test-with-temp-text "* Headline"
734 (let ((org-quote-string "QUOTE"))
735 (should-not (org-element-property :quotedp
(org-element-at-point)))))
736 ;; Standard position.
737 (org-test-with-temp-text "* QUOTE Headline"
738 (let* ((org-quote-string "QUOTE")
739 (headline (org-element-at-point)))
740 (should (org-element-property :quotedp headline
))
741 ;; Test removal from raw value.
742 (should (equal (org-element-property :raw-value headline
) "Headline"))))
744 (org-test-with-temp-text "* QUOTE Headline"
745 (let* ((org-quote-string "Quote")
746 (headline (org-element-at-point)))
747 (should-not (org-element-property :quotedp headline
))
748 (should (equal (org-element-property :raw-value headline
)
750 ;; With another keyword.
751 (org-test-with-temp-text "* TODO QUOTE Headline"
752 (let* ((org-quote-string "QUOTE")
753 (org-todo-keywords '((sequence "TODO" "DONE")))
754 (headline (org-element-at-point)))
755 (should (org-element-property :quotedp headline
))
756 (should (equal (org-element-property :raw-value headline
) "Headline"))))
757 ;; With the keyword only.
758 (org-test-with-temp-text "* QUOTE"
759 (let* ((org-quote-string "QUOTE")
760 (headline (org-element-at-point)))
761 (should (org-element-property :quotedp headline
))
762 (should (equal (org-element-property :raw-value headline
) "")))))
764 (ert-deftest test-org-element
/headline-comment-keyword
()
765 "Test COMMENT keyword recognition."
767 (org-test-with-temp-text "* Headline"
768 (let ((org-comment-string "COMMENT"))
769 (should-not (org-element-property :commentedp
(org-element-at-point)))))
770 ;; Standard position.
771 (org-test-with-temp-text "* COMMENT Headline"
772 (let ((org-comment-string "COMMENT")
773 (headline (org-element-at-point)))
774 (should (org-element-property :commentedp headline
))
775 (should (equal (org-element-property :raw-value headline
) "Headline"))))
777 (org-test-with-temp-text "* COMMENT Headline"
778 (let* ((org-comment-string "Comment")
779 (headline (org-element-at-point)))
780 (should-not (org-element-property :commentedp headline
))
781 (should (equal (org-element-property :raw-value headline
)
782 "COMMENT Headline"))))
783 ;; With another keyword.
784 (org-test-with-temp-text "* TODO COMMENT Headline"
785 (let* ((org-comment-string "COMMENT")
786 (org-todo-keywords '((sequence "TODO" "DONE")))
787 (headline (org-element-at-point)))
788 (should (org-element-property :commentedp headline
))
789 (should (equal (org-element-property :raw-value headline
) "Headline"))))
790 ;; With the keyword only.
791 (org-test-with-temp-text "* COMMENT"
792 (let* ((org-comment-string "COMMENT")
793 (headline (org-element-at-point)))
794 (should (org-element-property :commentedp headline
))
795 (should (equal (org-element-property :raw-value headline
) "")))))
797 (ert-deftest test-org-element
/headline-archive-tag
()
798 "Test ARCHIVE tag recognition."
800 (org-test-with-temp-text "* Headline"
801 (let ((org-archive-tag "ARCHIVE"))
802 (should-not (org-element-property :archivedp
(org-element-at-point)))))
804 (org-test-with-temp-text "* Headline :ARCHIVE:"
805 (let ((org-archive-tag "ARCHIVE"))
806 (let ((headline (org-element-at-point)))
807 (should (org-element-property :archivedp headline
))
809 (should-not (org-element-property :tags headline
))))
810 (let ((org-archive-tag "Archive"))
811 (should-not (org-element-property :archivedp
(org-element-at-point)))))
813 (org-test-with-temp-text "* Headline :test:ARCHIVE:"
814 (let ((org-archive-tag "ARCHIVE"))
815 (let ((headline (org-element-at-point)))
816 (should (org-element-property :archivedp headline
))
818 (should (equal (org-element-property :tags headline
) '("test")))))))
823 (ert-deftest test-org-element
/horizontal-rule-parser
()
824 "Test `horizontal-rule' parser."
827 (org-test-with-temp-text "-----"
828 (org-element-map (org-element-parse-buffer) 'horizontal-rule
'identity
)))
831 (org-test-with-temp-text " -----"
832 (org-element-map (org-element-parse-buffer) 'horizontal-rule
'identity
)))
833 ;; Hyphen must be alone on the line.
835 (org-test-with-temp-text "-----wrong"
836 (org-element-map (org-element-parse-buffer) 'horizontal-rule
'identity
)))
837 ;; 4 hyphens is too small.
839 (org-test-with-temp-text "----"
840 (org-element-map (org-element-parse-buffer) 'horizontal-rule
'identity
))))
843 ;;;; Inline Babel Call
845 (ert-deftest test-org-element
/inline-babel-call-parser
()
846 "Test `inline-babel-call' parser."
848 (org-test-with-temp-text "call_test()"
850 (org-element-parse-buffer) 'inline-babel-call
'identity
))))
853 ;;;; Inline Src Block
855 (ert-deftest test-org-element
/inline-src-block-parser
()
856 "Test `inline-src-block' parser."
858 (org-test-with-temp-text "src_emacs-lisp{(+ 1 1)}"
859 (org-element-map (org-element-parse-buffer) 'inline-src-block
'identity
)))
860 ;; Test parsing at the beginning of an item.
862 (org-test-with-temp-text "- src_emacs-lisp{(+ 1 1)}"
863 (org-element-map (org-element-parse-buffer) 'inline-src-block
'identity
))))
868 (ert-deftest test-org-element
/inlinetask-parser
()
869 "Test `inlinetask' parser."
870 (when (featurep 'org-inlinetask
)
871 (let ((org-inlinetask-min-level 15))
872 ;; 1. Regular inlinetask.
874 (org-test-with-temp-text
875 "*************** Task\nTest\n*************** END"
876 (org-element-map (org-element-parse-buffer) 'inlinetask
'identity
)))
877 ;; 2. Degenerate inlinetask.
879 (org-test-with-temp-text "*************** Task"
880 (org-element-map (org-element-parse-buffer) 'inlinetask
'identity
)))
885 (let ((org-todo-keywords '((sequence "TODO" "DONE"))))
886 (org-test-with-temp-text "*************** TODO Task"
887 (org-element-property
890 (org-element-parse-buffer) 'inlinetask
'identity nil t
))))))
895 (org-test-with-temp-text "
897 DEADLINE: <2012-03-29 thu.>"
898 (org-element-property
901 (org-element-parse-buffer) 'inlinetask
'identity nil t
)))))
906 (org-test-with-temp-text "
907 *************** [#A] Task"
908 (org-element-property
911 (org-element-parse-buffer) 'inlinetask
'identity nil t
)))))
916 (org-test-with-temp-text "
917 *************** Task :test:"
918 (org-element-property
921 (org-element-parse-buffer) 'inlinetask
'identity nil t
))))))))
926 (ert-deftest test-org-element
/italic-parser
()
927 "Test `italic' parser."
930 (let ((org-emph-re "\\([ ('\"{]\\|^\\)\\(\\([+*/_=~]\\)\\([^
\n,\"']\\|[^
\n,\"'].*?\\(?:\n.*?\\)\\{0,1\\}[^
\n,\"']\\)\\3\\)\\([- .,:!?;'\")}\\]\\|$\\)"))
931 (org-test-with-temp-text "/italic/"
932 (org-element-map (org-element-parse-buffer) 'italic
'identity nil t
))))
933 ;; Multi-line markup.
936 (org-element-contents
937 (let ((org-emph-re "\\([ ('\"{]\\|^\\)\\(\\([+*/_=~]\\)\\([^
\n,\"']\\|[^
\n,\"'].*?\\(?:\n.*?\\)\\{0,1\\}[^
\n,\"']\\)\\3\\)\\([- .,:!?;'\")}\\]\\|$\\)"))
938 (org-test-with-temp-text "/first line\nsecond line/"
939 (org-element-map (org-element-parse-buffer) 'italic
'identity nil t
))))
940 '("first line\nsecond line"))))
945 (ert-deftest test-org-element
/item-parser
()
946 "Test `item' parser."
949 (org-test-with-temp-text "- item"
950 (org-element-map (org-element-parse-buffer) 'item
'identity
)))
954 (org-element-property
956 (org-test-with-temp-text "6. [@6] item"
957 (org-element-map (org-element-parse-buffer) 'item
'identity nil t
)))))
962 (org-element-property
964 (org-test-with-temp-text "- tag :: description"
965 (org-element-map (org-element-parse-buffer) 'item
'identity nil t
)))))
966 ;; No tags in ordered lists.
968 (org-element-property
970 (org-test-with-temp-text "1. tag :: description"
971 (org-element-map (org-element-parse-buffer) 'item
'identity nil t
))))
976 (org-test-with-temp-text "
981 (org-element-parse-buffer) 'item
982 (lambda (item) (org-element-property :checkbox item
))))))
984 (org-test-with-temp-text "* Headline
989 (let ((org-cycle-include-plain-lists t
)) (org-cycle))
991 (org-element-property
993 (org-element-map (org-element-parse-buffer) 'item
'identity nil t
))))
994 ;; Item starting with special syntax.
997 (org-test-with-temp-text "- - item"
999 (org-element-parse-buffer) 'paragraph
'org-element-contents
)))))
1004 (ert-deftest test-org-element
/keyword-parser
()
1005 "Test `keyword' parser."
1008 (org-test-with-temp-text "#+KEYWORD: value"
1009 (org-element-map (org-element-parse-buffer) 'keyword
'identity
)))
1010 ;; Keywords are case-insensitive.
1012 (org-test-with-temp-text "#+keyword: value"
1013 (org-element-map (org-element-parse-buffer) 'keyword
'identity
)))
1014 ;; Affiliated keywords are not keywords.
1016 (org-test-with-temp-text "#+NAME: value
1018 (org-element-map (org-element-parse-buffer) 'keyword
'identity
)))
1019 ;; Do not mix keywords with Babel calls and dynamic blocks.
1021 (org-test-with-temp-text "#+CALL: fun()"
1022 (org-element-map (org-element-parse-buffer) 'keyword
'identity
)))
1024 (org-test-with-temp-text "#+BEGIN: my-fun\nBody\n#+END:"
1025 (org-element-map (org-element-parse-buffer) 'keyword
'identity
))))
1028 ;;;; Latex Environment
1030 (ert-deftest test-org-element
/latex-environment-parser
()
1031 "Test `latex-environment' parser."
1033 (org-test-with-temp-text "\\begin{equation}\ne^{i\\pi}+1=0\n\\end{equation}"
1035 (org-element-parse-buffer) 'latex-environment
'identity
)))
1036 ;; Allow nested environments.
1044 (org-test-with-temp-text "
1050 (org-element-property
1053 (org-element-parse-buffer) 'latex-environment
'identity nil t
))))))
1058 (ert-deftest test-org-element
/latex-fragment-parser
()
1059 "Test `latex-fragment' parser."
1060 (let ((org-latex-regexps
1061 '(("begin" "^[ ]*\\(\\\\begin{\\([a-zA-Z0-9\\*]+\\)[^