1 ;;; test-org-element.el --- Tests for org-element.el
3 ;; Copyright (C) 2012 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/>.
20 (unless (featurep 'org-element
)
21 (signal 'missing-test-dependency
"org-element"))
23 (defun org-test-parse-and-interpret (text)
24 "Parse TEXT as Org syntax and interpret it.
25 Return interpreted string."
29 (org-element-interpret-data (org-element-parse-buffer))))
33 ;;; Test `org-element-map'
35 (ert-deftest test-org-element
/map
()
36 "Test `org-element-map'."
37 ;; Can map to `plain-text' objects.
40 (org-test-with-temp-text "Some text \alpha
46 (org-element-parse-buffer) 'plain-text
47 (lambda (s) (when (string-match "text" s
) (incf count
))))
49 ;; Applies to secondary strings
51 (org-element-map '("some " (bold nil
"bold") "text") 'bold
'identity
))
52 ;; Enter secondary strings before entering contents.
58 (org-test-with-temp-text "* Some \\alpha headline\n\\beta entity."
59 (org-element-map (org-element-parse-buffer) 'entity
'identity nil t
)))))
60 ;; Apply NO-RECURSION argument.
62 (org-test-with-temp-text "#+BEGIN_CENTER\n\\alpha\n#+END_CENTER"
64 (org-element-parse-buffer) 'entity
'identity nil nil
'center-block
))))
70 (ert-deftest test-org-element
/put-property
()
71 "Test `org-element-put-property' specifications."
72 (org-test-with-temp-text "* Headline\n *a*"
73 (let ((tree (org-element-parse-buffer)))
74 (org-element-put-property
75 (org-element-map tree
'bold
'identity nil t
) :test
1)
76 (should (org-element-property
77 :test
(org-element-map tree
'bold
'identity nil t
))))))
79 (ert-deftest test-org-element
/set-contents
()
80 "Test `org-element-set-contents' specifications."
81 ;; Accept multiple entries.
83 (equal '("b" (italic nil
"a"))
84 (org-test-with-temp-text "* Headline\n *a*"
85 (let ((tree (org-element-parse-buffer)))
86 (org-element-set-contents
87 (org-element-map tree
'bold
'identity nil t
) "b" '(italic nil
"a"))
89 (org-element-map tree
'bold
'identity nil t
))))))
90 ;; Accept atoms and elements.
93 (org-test-with-temp-text "* Headline\n *a*"
94 (let ((tree (org-element-parse-buffer)))
95 (org-element-set-contents
96 (org-element-map tree
'bold
'identity nil t
) "b")
98 (org-element-map tree
'bold
'identity nil t
))))))
100 (equal '((italic nil
"b"))
101 (org-test-with-temp-text "* Headline\n *a*"
102 (let ((tree (org-element-parse-buffer)))
103 (org-element-set-contents
104 (org-element-map tree
'bold
'identity nil t
) '(italic nil
"b"))
105 (org-element-contents
106 (org-element-map tree
'bold
'identity nil t
))))))
107 ;; Allow nil contents.
109 (org-test-with-temp-text "* Headline\n *a*"
110 (let ((tree (org-element-parse-buffer)))
111 (org-element-set-contents (org-element-map tree
'bold
'identity nil t
))
112 (org-element-contents (org-element-map tree
'bold
'identity nil t
))))))
114 (ert-deftest test-org-element
/set-element
()
115 "Test `org-element-set-element' specifications."
116 (org-test-with-temp-text "* Headline\n*a*"
117 (let ((tree (org-element-parse-buffer)))
118 (org-element-set-element
119 (org-element-map tree
'bold
'identity nil t
)
121 ;; Check if object is correctly replaced.
122 (should (org-element-map tree
'italic
'identity
))
123 (should-not (org-element-map tree
'bold
'identity
))
124 ;; Check if new object's parent is correctly set.
127 (org-element-property :parent
128 (org-element-map tree
'italic
'identity nil t
))
129 (org-element-map tree
'paragraph
'identity nil t
))))))
131 (ert-deftest test-org-element
/adopt-elements
()
132 "Test `org-element-adopt-elements' specifications."
135 (equal '(plain-text italic
)
136 (org-test-with-temp-text "* Headline\n *a*"
137 (let ((tree (org-element-parse-buffer)))
138 (org-element-adopt-elements
139 (org-element-map tree
'bold
'identity nil t
) '(italic nil
"a"))
140 (mapcar (lambda (blob) (org-element-type blob
))
141 (org-element-contents
142 (org-element-map tree
'bold
'identity nil t
)))))))
146 (org-test-with-temp-text "* Headline\n *a*"
147 (let ((tree (org-element-parse-buffer)))
148 (org-element-adopt-elements
149 (org-element-map tree
'bold
'identity nil t
) "b")
150 (org-element-contents
151 (org-element-map tree
'bold
'identity nil t
)))))))
157 ;;;; Affiliated Keywords
159 (ert-deftest test-org-element
/affiliated-keywords-parser
()
160 "Test affiliated keywords parsing."
161 ;; Read simple keywords.
164 (org-element-property
166 (org-test-with-temp-text "#+NAME: para\nParagraph"
167 (org-element-at-point)))))
168 ;; Parse multiple keywords.
172 (org-element-property
174 (org-test-with-temp-text
175 "#+ATTR_ASCII: line1\n#+ATTR_ASCII: line2\nParagraph"
176 (org-element-at-point)))))
177 ;; Parse "parsed" keywords.
181 (org-test-with-temp-text "#+CAPTION: caption\nParagraph"
182 (car (org-element-property :caption
(org-element-at-point))))))
183 ;; Parse dual keywords.
187 (org-test-with-temp-text "#+CAPTION[short]: long\nParagraph"
188 (org-element-property :caption
(org-element-at-point))))))
193 (ert-deftest test-org-element
/babel-call-parser
()
194 "Test `babel-call' parsing."
197 (org-test-with-temp-text "#+CALL: test()"
198 (org-element-map (org-element-parse-buffer) 'babel-call
'identity
)))
201 (org-test-with-temp-text "#+call: test()"
202 (org-element-map (org-element-parse-buffer) 'babel-call
'identity
))))
207 (ert-deftest test-org-element
/bold-parser
()
208 "Test `bold' parser."
211 (let ((org-emph-re "\\([ ('\"{]\\|^\\)\\(\\([+*/_=~]\\)\\([^
\n,\"']\\|[^
\n,\"'].*?\\(?:\n.*?\\)\\{0,1\\}[^
\n,\"']\\)\\3\\)\\([- .,:!?;'\")}\\]\\|$\\)"))
212 (org-test-with-temp-text "*bold*"
213 (org-element-map (org-element-parse-buffer) 'bold
'identity nil t
))))
214 ;; Multi-line markup.
217 (org-element-contents
218 (let ((org-emph-re "\\([ ('\"{]\\|^\\)\\(\\([+*/_=~]\\)\\([^
\n,\"']\\|[^
\n,\"'].*?\\(?:\n.*?\\)\\{0,1\\}[^
\n,\"']\\)\\3\\)\\([- .,:!?;'\")}\\]\\|$\\)"))
219 (org-test-with-temp-text "*first line\nsecond line*"
220 (org-element-map (org-element-parse-buffer) 'bold
'identity nil t
))))
221 '("first line\nsecond line"))))
226 (ert-deftest test-org-element
/center-block-parser
()
227 "Test `center-block' parser."
230 (org-test-with-temp-text "#+BEGIN_CENTER\nText\n#+END_CENTER"
231 (org-element-map (org-element-parse-buffer) 'center-block
'identity
)))
234 (org-test-with-temp-text "#+begin_center\nText\n#+end_center"
235 (org-element-map (org-element-parse-buffer) 'center-block
'identity
)))
236 ;; Test folded block.
237 (org-test-with-temp-text "#+BEGIN_CENTER\nText\n#+END_CENTER"
240 (org-element-property
243 (org-element-parse-buffer) 'center-block
'identity nil t
))))
244 ;; Ignore incomplete block.
246 (org-test-with-temp-text "#+BEGIN_CENTER"
248 (org-element-parse-buffer) 'center-block
'identity nil t
))))
253 (ert-deftest test-org-element
/clock-parser
()
254 "Test `clock' parser."
256 (let* ((org-clock-string "CLOCK:")
257 (clock (org-test-with-temp-text "CLOCK: [2012-01-01 sun. 00:01]"
259 (org-element-parse-buffer) 'clock
'identity nil t
))))
260 (should (eq (org-element-property :status clock
) 'running
))
261 (should (equal (org-element-property :value clock
)
262 "[2012-01-01 sun. 00:01]"))
263 (should-not (org-element-property :time clock
)))
265 (let* ((org-clock-string "CLOCK:")
266 (clock (org-test-with-temp-text "
267 CLOCK: [2012-01-01 sun. 00:01]--[2012-01-01 sun. 00:02] => 0:01"
269 (org-element-parse-buffer) 'clock
'identity nil t
))))
270 (should (eq (org-element-property :status clock
) 'closed
))
271 (should (equal (org-element-property :value clock
)
272 "[2012-01-01 sun. 00:01]--[2012-01-01 sun. 00:02]"))
273 (should (equal (org-element-property :time clock
) "0:01"))))
278 (ert-deftest test-org-element
/code-parser
()
279 "Test `code' parser."
282 (let ((org-emph-re "\\([ ('\"{]\\|^\\)\\(\\([+*/_=~]\\)\\([^
\n,\"']\\|[^
\n,\"'].*?\\(?:\n.*?\\)\\{0,1\\}[^
\n,\"']\\)\\3\\)\\([- .,:!?;'\")}\\]\\|$\\)"))
283 (org-test-with-temp-text "~code~"
284 (org-element-map (org-element-parse-buffer) 'code
'identity
))))
285 ;; Multi-line markup.
288 (org-element-property
290 (let ((org-emph-re "\\([ ('\"{]\\|^\\)\\(\\([+*/_=~]\\)\\([^
\n,\"']\\|[^
\n,\"'].*?\\(?:\n.*?\\)\\{0,1\\}[^
\n,\"']\\)\\3\\)\\([- .,:!?;'\")}\\]\\|$\\)"))
291 (org-test-with-temp-text "~first line\nsecond line~"
293 (org-element-parse-buffer) 'code
'identity nil t
))))
294 "first line\nsecond line")))
299 (ert-deftest test-org-element
/comment-parser
()
300 "Test `comment' parser."
303 (org-test-with-temp-text "# Comment"
304 (org-element-map (org-element-parse-buffer) 'comment
'identity
)))
307 (org-test-with-temp-text " # Comment"
308 (org-element-map (org-element-parse-buffer) 'comment
'identity
)))
309 ;; Preserve indentation.
312 (org-element-property
314 (org-test-with-temp-text "# No blank\n# One blank"
315 (org-element-map (org-element-parse-buffer) 'comment
'identity nil t
)))
316 "No blank\n One blank"))
317 ;; Comment with blank lines.
320 (org-element-property
322 (org-test-with-temp-text "# First part\n# \n#\n# Second part"
323 (org-element-map (org-element-parse-buffer) 'comment
'identity nil t
)))
324 "First part\n\n\nSecond part"))
325 ;; Do not mix comments and keywords.
328 (org-test-with-temp-text "#+keyword: value\n# comment\n#+keyword: value"
329 (length (org-element-map
330 (org-element-parse-buffer) 'comment
'identity
)))))
333 (org-test-with-temp-text "#+keyword: value\n# comment\n#+keyword: value"
334 (org-element-property
337 (org-element-parse-buffer) 'comment
'identity nil t
))))))
342 (ert-deftest test-org-element
/comment-block-parser
()
343 "Test `comment-block' parser."
346 (org-test-with-temp-text "#+BEGIN_COMMENT\nText\n#+END_COMMENT"
348 (org-element-parse-buffer) 'comment-block
'identity
)))
351 (org-test-with-temp-text "#+begin_comment\nText\n#+end_comment"
353 (org-element-parse-buffer) 'comment-block
'identity
)))
354 ;; Test folded block.
355 (org-test-with-temp-text "#+BEGIN_COMMENT\nText\n#+END_COMMENT"
358 (org-element-property
361 (org-element-parse-buffer) 'comment-block
'identity nil t
))))
362 ;; Ignore incomplete block.
364 (org-test-with-temp-text "#+BEGIN_COMMENT"
366 (org-element-parse-buffer) 'comment-block
'identity nil t
))))
371 (ert-deftest test-org-element
/drawer-parser
()
372 "Test `drawer' parser."
375 (let ((org-drawers '("TEST")))
376 (org-test-with-temp-text ":TEST:\nText\n:END:"
377 (org-element-map (org-element-parse-buffer) 'drawer
'identity
))))
378 ;; Do not mix regular drawers and property drawers.
380 (let ((org-drawers '("PROPERTIES")))
381 (org-test-with-temp-text ":PROPERTIES:\n:prop: value\n:END:"
383 (org-element-parse-buffer) 'drawer
'identity nil t
))))
384 ;; Ignore incomplete drawer.
386 (let ((org-drawers '("TEST")))
387 (org-test-with-temp-text ":TEST:"
389 (org-element-parse-buffer) 'drawer
'identity nil t
)))))
394 (ert-deftest test-org-element
/dynamic-block-parser
()
395 "Test `dynamic-block' parser."
398 (org-test-with-temp-text
399 "#+BEGIN: myblock :param1 val1 :param2 val2\nText\n#+END:"
400 (org-element-map (org-element-parse-buffer) 'dynamic-block
'identity
)))
402 (org-test-with-temp-text
403 "#+BEGIN: myblock :param1 val1 :param2 val2\nText\n#+END:"
406 (org-element-property
409 (org-element-parse-buffer) 'dynamic-block
'identity nil t
))))
412 (org-test-with-temp-text
413 "#+begin: myblock :param1 val1 :param2 val2\nText\n#+end:"
414 (org-element-map (org-element-parse-buffer) 'dynamic-block
'identity
)))
415 ;; Ignore incomplete block.
417 (org-test-with-temp-text "#+BEGIN: myblock :param1 val1 :param2 val2"
419 (org-element-parse-buffer) 'dynamic-block
'identity nil t
))))
424 (ert-deftest test-org-element
/entity-parser
()
425 "Test `entity' parser."
428 (org-test-with-temp-text "\\sin"
429 (org-element-map (org-element-parse-buffer) 'entity
'identity
)))
432 (org-element-property
434 (org-test-with-temp-text "\\alpha{}text"
435 (org-element-map (org-element-parse-buffer) 'entity
'identity nil t
))))
436 ;; User-defined entity.
439 (org-element-property
441 (let ((org-entities-user
442 '(("test" "test" nil
"test" "test" "test" "test"))))
443 (org-test-with-temp-text "\\test"
444 (org-element-map (org-element-parse-buffer) 'entity
'identity nil t
))))
450 (ert-deftest test-org-element
/example-block-parser
()
451 "Test `example-block' parser."
454 (org-test-with-temp-text "#+BEGIN_EXAMPLE\nText\n#+END_EXAMPLE"
455 (org-element-map (org-element-parse-buffer) 'example-block
'identity
)))
456 ;; Test folded block.
457 (org-test-with-temp-text "#+BEGIN_EXAMPLE\nText\n#+END_EXAMPLE"
460 (org-element-property
463 (org-element-parse-buffer) 'example-block
'identity nil t
))))
464 ;; Ignore incomplete block.
466 (org-test-with-temp-text "#+BEGIN_EXAMPLE"
468 (org-element-parse-buffer) 'example-block
'identity nil t
)))
469 ;; Properly un-escape code.
471 (equal "* Headline\n #+keyword\nText\n"
472 (org-test-with-temp-text
473 "#+BEGIN_EXAMPLE\n,* Headline\n ,#+keyword\nText\n#+END_EXAMPLE"
474 (org-element-property :value
(org-element-at-point))))))
476 (ert-deftest test-org-element
/block-switches
()
477 "Test `example-block' and `src-block' switches parsing."
478 (let ((org-coderef-label-format "(ref:%s)"))
479 ;; 1. Test "-i" switch.
480 (org-test-with-temp-text "#+BEGIN_SRC emacs-lisp\n(+ 1 1)\n#+END_SRC"
482 (org-element-property :preserve-indent
(org-element-at-point))))
483 (org-test-with-temp-text "#+BEGIN_SRC emacs-lisp -i\n(+ 1 1)\n#+END_SRC"
484 (should (org-element-property :preserve-indent
(org-element-at-point))))
485 (org-test-with-temp-text "#+BEGIN_EXAMPLE\nText.\n#+END_EXAMPLE"
487 (org-element-property :preserve-indent
(org-element-at-point))))
488 (org-test-with-temp-text "#+BEGIN_EXAMPLE -i\nText.\n#+END_EXAMPLE"
489 (should (org-element-property :preserve-indent
(org-element-at-point))))
490 ;; 2. "-n -r -k" combination should number lines, retain labels but
491 ;; not use them in coderefs.
492 (org-test-with-temp-text "#+BEGIN_EXAMPLE -n -r -k\nText.\n#+END_EXAMPLE"
493 (let ((element (org-element-at-point)))
494 (should (and (org-element-property :number-lines element
)
495 (org-element-property :retain-labels element
)
496 (not (org-element-property :use-labels element
))))))
497 (org-test-with-temp-text
498 "#+BEGIN_SRC emacs-lisp -n -r -k\n(+ 1 1)\n#+END_SRC"
499 (let ((element (org-element-at-point)))
500 (should (and (org-element-property :number-lines element
)
501 (org-element-property :retain-labels element
)
502 (not (org-element-property :use-labels element
))))))
503 ;; 3. "-n -r" combination should number-lines remove labels and not
504 ;; use them in coderefs.
505 (org-test-with-temp-text "#+BEGIN_EXAMPLE -n -r\nText.\n#+END_EXAMPLE"
506 (let ((element (org-element-at-point)))
507 (should (and (org-element-property :number-lines element
)
508 (not (org-element-property :retain-labels element
))
509 (not (org-element-property :use-labels element
))))))
510 (org-test-with-temp-text "#+BEGIN_SRC emacs-lisp -n -r\n(+ 1 1)\n#+END_SRC"
511 (let ((element (org-element-at-point)))
512 (should (and (org-element-property :number-lines element
)
513 (not (org-element-property :retain-labels element
))
514 (not (org-element-property :use-labels element
))))))
515 ;; 4. "-n" or "+n" should number lines, retain labels and use them
517 (org-test-with-temp-text "#+BEGIN_EXAMPLE -n\nText.\n#+END_EXAMPLE"
518 (let ((element (org-element-at-point)))
519 (should (and (org-element-property :number-lines element
)
520 (org-element-property :retain-labels element
)
521 (org-element-property :use-labels element
)))))
522 (org-test-with-temp-text "#+BEGIN_SRC emacs-lisp -n\n(+ 1 1)\n#+END_SRC"
523 (let ((element (org-element-at-point)))
524 (should (and (org-element-property :number-lines element
)
525 (org-element-property :retain-labels element
)
526 (org-element-property :use-labels element
)))))
527 (org-test-with-temp-text "#+BEGIN_EXAMPLE +n\nText.\n#+END_EXAMPLE"
528 (let ((element (org-element-at-point)))
529 (should (and (org-element-property :number-lines element
)
530 (org-element-property :retain-labels element
)
531 (org-element-property :use-labels element
)))))
532 (org-test-with-temp-text "#+BEGIN_SRC emacs-lisp +n\n(+ 1 1)\n#+END_SRC"
533 (let ((element (org-element-at-point)))
534 (should (and (org-element-property :number-lines element
)
535 (org-element-property :retain-labels element
)
536 (org-element-property :use-labels element
)))))
537 ;; 5. No switch should not number lines, but retain labels and use
539 (org-test-with-temp-text "#+BEGIN_EXAMPLE\nText.\n#+END_EXAMPLE"
540 (let ((element (org-element-at-point)))
541 (should (and (not (org-element-property :number-lines element
))
542 (org-element-property :retain-labels element
)
543 (org-element-property :use-labels element
)))))
544 (org-test-with-temp-text "#+BEGIN_SRC emacs-lisp\n(+ 1 1)\n#+END_SRC"
545 (let ((element (org-element-at-point)))
546 (should (and (not (org-element-property :number-lines element
))
547 (org-element-property :retain-labels element
)
548 (org-element-property :use-labels element
)))))
549 ;; 6. "-r" switch only: do not number lines, remove labels, and
550 ;; don't use labels in coderefs.
551 (org-test-with-temp-text "#+BEGIN_EXAMPLE -r\nText.\n#+END_EXAMPLE"
552 (let ((element (org-element-at-point)))
553 (should (and (not (org-element-property :number-lines element
))
554 (not (org-element-property :retain-labels element
))
555 (not (org-element-property :use-labels element
))))))
556 (org-test-with-temp-text "#+BEGIN_SRC emacs-lisp -r\n(+ 1 1)\n#+END_SRC"
557 (let ((element (org-element-at-point)))
558 (should (and (not (org-element-property :number-lines element
))
559 (not (org-element-property :retain-labels element
))
560 (not (org-element-property :use-labels element
))))))
561 ;; 7. Recognize coderefs with user-defined syntax.
562 (org-test-with-temp-text
563 "#+BEGIN_EXAMPLE -l \"[ref:%s]\"\nText [ref:text]\n#+END_EXAMPLE"
564 (let ((element (org-element-at-point)))
566 (equal (org-element-property :label-fmt element
) "[ref:%s]"))))
567 (org-test-with-temp-text
568 "#+BEGIN_SRC emacs-lisp -l \"[ref:%s]\"\n(+ 1 1) [ref:text]\n#+END_SRC"
569 (let ((element (org-element-at-point)))
571 (equal (org-element-property :label-fmt element
) "[ref:%s]"))))))
576 (ert-deftest test-org-element
/export-block-parser
()
577 "Test `export-block' parser."
580 (org-test-with-temp-text "#+BEGIN_LATEX\nText\n#+END_LATEX"
582 (let ((org-element-block-name-alist
583 '(("LATEX" . org-element-export-block-parser
))))
584 (org-element-parse-buffer))
585 'export-block
'identity
)))
586 ;; Test folded block.
587 (org-test-with-temp-text "#+BEGIN_LATEX\nText\n#+END_LATEX"
590 (org-element-property
593 (let ((org-element-block-name-alist
594 '(("LATEX" . org-element-export-block-parser
))))
595 (org-element-parse-buffer))
596 'export-block
'identity nil t
))))
599 (org-test-with-temp-text "#+begin_latex\nText\n#+end_latex"
601 (let ((org-element-block-name-alist
602 '(("LATEX" . org-element-export-block-parser
))))
603 (org-element-parse-buffer))
604 'export-block
'identity
)))
605 ;; Ignore incomplete block.
607 (org-test-with-temp-text "#+BEGIN_LATEX"
609 (let ((org-element-block-name-alist
610 '(("LATEX" . org-element-export-block-parser
))))
611 (org-element-parse-buffer))
612 'export-block
'identity nil t
))))
617 (ert-deftest test-org-element
/export-snippet-parser
()
618 "Test `export-snippet' parser."
621 '("back-end" .
"contents")
622 (org-test-with-temp-text "@@back-end:contents@@"
624 (org-element-parse-buffer) 'export-snippet
625 (lambda (snippet) (cons (org-element-property :back-end snippet
)
626 (org-element-property :value snippet
)))
632 (ert-deftest test-org-element
/fixed-width
()
633 "Test fixed-width area parsing."
634 ;; Preserve indentation.
636 (org-test-with-temp-text ": no blank\n: one blank"
637 (org-element-map (org-element-parse-buffer) 'fixed-width
'identity
)))
638 ;; Fixed-width with empty lines.
640 (org-test-with-temp-text ": first part\n:\n: \n: second part"
641 (org-element-map (org-element-parse-buffer) 'fixed-width
'identity
)))
642 ;; Parse indented fixed-width markers.
644 (org-test-with-temp-text "Text\n : no blank\n : one blank"
645 (org-element-map (org-element-parse-buffer) 'fixed-width
'identity
)))
646 ;; Distinguish fixed-width areas within a list and outside of it.
650 (org-test-with-temp-text "
653 : fixed-width outside"
655 (org-element-parse-buffer) 'fixed-width
'identity
))))))
658 ;;;; Footnote Definition
660 (ert-deftest test-org-element
/footnote-definition-parser
()
661 "Test `footnote-definition' parser."
663 (org-test-with-temp-text "[fn:1] Definition"
665 (org-element-parse-buffer) 'footnote-definition
'identity nil t
)))
666 ;; Footnote with more contents
669 (org-element-property
671 (org-test-with-temp-text "[fn:1] Definition\n| a | b |"
673 (org-element-parse-buffer)
674 'footnote-definition
'identity nil t
)))))
675 ;; Footnote starting with special syntax.
677 (org-test-with-temp-text "[fn:1] - no item"
678 (org-element-map (org-element-parse-buffer) 'item
'identity
))))
681 ;;;; Footnotes Reference.
683 (ert-deftest test-org-element
/footnote-reference-parser
()
684 "Test `footnote-reference' parser."
685 ;; 1. Parse a standard reference.
686 (org-test-with-temp-text "Text[fn:label]"
689 (org-element-parse-buffer) 'footnote-reference
'identity
)))
690 ;; 2. Parse a normalized reference.
691 (org-test-with-temp-text "Text[1]"
694 (org-element-parse-buffer) 'footnote-reference
'identity
)))
695 ;; 3. Parse an inline reference.
696 (org-test-with-temp-text "Text[fn:test:def]"
699 (org-element-parse-buffer) 'footnote-reference
'identity
)))
700 ;; 4. Parse an anonymous reference.
701 (org-test-with-temp-text "Text[fn::def]"
704 (org-element-parse-buffer) 'footnote-reference
'identity
)))
705 ;; 5. Parse nested footnotes.
706 (org-test-with-temp-text "Text[fn::def [fn:label]]"
711 (org-element-parse-buffer) 'footnote-reference
'identity
)))))
712 ;; 6. Parse adjacent footnotes.
713 (org-test-with-temp-text "Text[fn:label1][fn:label2]"
718 (org-element-parse-buffer) 'footnote-reference
'identity
)))))
719 ;; 7. Only properly closed footnotes are recognized as such.
720 (org-test-with-temp-text "Text[fn:label"
723 (org-element-parse-buffer) 'footnote-reference
'identity
))))
728 (ert-deftest test-org-element
/headline-quote-keyword
()
729 "Test QUOTE keyword recognition."
731 (org-test-with-temp-text "* Headline"
732 (let ((org-quote-string "QUOTE"))
733 (should-not (org-element-property :quotedp
(org-element-at-point)))))
734 ;; Standard position.
735 (org-test-with-temp-text "* QUOTE Headline"
736 (let* ((org-quote-string "QUOTE")
737 (headline (org-element-at-point)))
738 (should (org-element-property :quotedp headline
))
739 ;; Test removal from raw value.
740 (should (equal (org-element-property :raw-value headline
) "Headline"))))
742 (org-test-with-temp-text "* QUOTE Headline"
743 (let* ((org-quote-string "Quote")
744 (headline (org-element-at-point)))
745 (should-not (org-element-property :quotedp headline
))
746 (should (equal (org-element-property :raw-value headline
)
748 ;; With another keyword.
749 (org-test-with-temp-text "* TODO QUOTE Headline"
750 (let* ((org-quote-string "QUOTE")
751 (org-todo-keywords '((sequence "TODO" "DONE")))
752 (headline (org-element-at-point)))
753 (should (org-element-property :quotedp headline
))
754 (should (equal (org-element-property :raw-value headline
) "Headline"))))
755 ;; With the keyword only.
756 (org-test-with-temp-text "* QUOTE"
757 (let* ((org-quote-string "QUOTE")
758 (headline (org-element-at-point)))
759 (should (org-element-property :quotedp headline
))
760 (should (equal (org-element-property :raw-value headline
) "")))))
762 (ert-deftest test-org-element
/headline-comment-keyword
()
763 "Test COMMENT keyword recognition."
765 (org-test-with-temp-text "* Headline"
766 (let ((org-comment-string "COMMENT"))
767 (should-not (org-element-property :commentedp
(org-element-at-point)))))
768 ;; Standard position.
769 (org-test-with-temp-text "* COMMENT Headline"
770 (let ((org-comment-string "COMMENT")
771 (headline (org-element-at-point)))
772 (should (org-element-property :commentedp headline
))
773 (should (equal (org-element-property :raw-value headline
) "Headline"))))
775 (org-test-with-temp-text "* COMMENT Headline"
776 (let* ((org-comment-string "Comment")
777 (headline (org-element-at-point)))
778 (should-not (org-element-property :commentedp headline
))
779 (should (equal (org-element-property :raw-value headline
)
780 "COMMENT Headline"))))
781 ;; With another keyword.
782 (org-test-with-temp-text "* TODO COMMENT Headline"
783 (let* ((org-comment-string "COMMENT")
784 (org-todo-keywords '((sequence "TODO" "DONE")))
785 (headline (org-element-at-point)))
786 (should (org-element-property :commentedp headline
))
787 (should (equal (org-element-property :raw-value headline
) "Headline"))))
788 ;; With the keyword only.
789 (org-test-with-temp-text "* COMMENT"
790 (let* ((org-comment-string "COMMENT")
791 (headline (org-element-at-point)))
792 (should (org-element-property :commentedp headline
))
793 (should (equal (org-element-property :raw-value headline
) "")))))
795 (ert-deftest test-org-element
/headline-archive-tag
()
796 "Test ARCHIVE tag recognition."
798 (org-test-with-temp-text "* Headline"
799 (let ((org-archive-tag "ARCHIVE"))
800 (should-not (org-element-property :archivedp
(org-element-at-point)))))
802 (org-test-with-temp-text "* Headline :ARCHIVE:"
803 (let ((org-archive-tag "ARCHIVE"))
804 (let ((headline (org-element-at-point)))
805 (should (org-element-property :archivedp headline
))
807 (should-not (org-element-property :tags headline
))))
808 (let ((org-archive-tag "Archive"))
809 (should-not (org-element-property :archivedp
(org-element-at-point)))))
811 (org-test-with-temp-text "* Headline :test:ARCHIVE:"
812 (let ((org-archive-tag "ARCHIVE"))
813 (let ((headline (org-element-at-point)))
814 (should (org-element-property :archivedp headline
))
816 (should (equal (org-element-property :tags headline
) '("test")))))))
821 (ert-deftest test-org-element
/horizontal-rule-parser
()
822 "Test `horizontal-rule' parser."
825 (org-test-with-temp-text "-----"
826 (org-element-map (org-element-parse-buffer) 'horizontal-rule
'identity
)))
829 (org-test-with-temp-text " -----"
830 (org-element-map (org-element-parse-buffer) 'horizontal-rule
'identity
)))
831 ;; Hyphen must be alone on the line.
833 (org-test-with-temp-text "-----wrong"
834 (org-element-map (org-element-parse-buffer) 'horizontal-rule
'identity
)))
835 ;; 4 hyphens is too small.
837 (org-test-with-temp-text "----"
838 (org-element-map (org-element-parse-buffer) 'horizontal-rule
'identity
))))
841 ;;;; Inline Babel Call
843 (ert-deftest test-org-element
/inline-babel-call-parser
()
844 "Test `inline-babel-call' parser."
846 (org-test-with-temp-text "call_test()"
848 (org-element-parse-buffer) 'inline-babel-call
'identity
))))
851 ;;;; Inline Src Block
853 (ert-deftest test-org-element
/inline-src-block-parser
()
854 "Test `inline-src-block' parser."
856 (org-test-with-temp-text "src_emacs-lisp{(+ 1 1)}"
857 (org-element-map (org-element-parse-buffer) 'inline-src-block
'identity
)))
858 ;; Test parsing at the beginning of an item.
860 (org-test-with-temp-text "- src_emacs-lisp{(+ 1 1)}"
861 (org-element-map (org-element-parse-buffer) 'inline-src-block
'identity
))))
866 (ert-deftest test-org-element
/inlinetask-parser
()
867 "Test `inlinetask' parser."
868 (when (featurep 'org-inlinetask
)
869 (let ((org-inlinetask-min-level 15))
870 ;; 1. Regular inlinetask.
872 (org-test-with-temp-text
873 "*************** Task\nTest\n*************** END"
874 (org-element-map (org-element-parse-buffer) 'inlinetask
'identity
)))
875 ;; 2. Degenerate inlinetask.
877 (org-test-with-temp-text "*************** Task"
878 (org-element-map (org-element-parse-buffer) 'inlinetask
'identity
)))
883 (let ((org-todo-keywords '((sequence "TODO" "DONE"))))
884 (org-test-with-temp-text "*************** TODO Task"
885 (org-element-property
888 (org-element-parse-buffer) 'inlinetask
'identity nil t
))))))
893 (org-test-with-temp-text "
895 DEADLINE: <2012-03-29 thu.>"
896 (org-element-property
899 (org-element-parse-buffer) 'inlinetask
'identity nil t
)))))
904 (org-test-with-temp-text "
905 *************** [#A] Task"
906 (org-element-property
909 (org-element-parse-buffer) 'inlinetask
'identity nil t
)))))
914 (org-test-with-temp-text "
915 *************** Task :test:"
916 (org-element-property
919 (org-element-parse-buffer) 'inlinetask
'identity nil t
))))))))
924 (ert-deftest test-org-element
/italic-parser
()
925 "Test `italic' parser."
928 (let ((org-emph-re "\\([ ('\"{]\\|^\\)\\(\\([+*/_=~]\\)\\([^
\n,\"']\\|[^
\n,\"'].*?\\(?:\n.*?\\)\\{0,1\\}[^
\n,\"']\\)\\3\\)\\([- .,:!?;'\")}\\]\\|$\\)"))
929 (org-test-with-temp-text "/italic/"
930 (org-element-map (org-element-parse-buffer) 'italic
'identity nil t
))))
931 ;; Multi-line markup.
934 (org-element-contents
935 (let ((org-emph-re "\\([ ('\"{]\\|^\\)\\(\\([+*/_=~]\\)\\([^
\n,\"']\\|[^
\n,\"'].*?\\(?:\n.*?\\)\\{0,1\\}[^
\n,\"']\\)\\3\\)\\([- .,:!?;'\")}\\]\\|$\\)"))
936 (org-test-with-temp-text "/first line\nsecond line/"
937 (org-element-map (org-element-parse-buffer) 'italic
'identity nil t
))))
938 '("first line\nsecond line"))))
943 (ert-deftest test-org-element
/item-parser
()
944 "Test `item' parser."
947 (org-test-with-temp-text "- item"
948 (org-element-map (org-element-parse-buffer) 'item
'identity
)))
952 (org-element-property
954 (org-test-with-temp-text "6. [@6] item"
955 (org-element-map (org-element-parse-buffer) 'item
'identity nil t
)))))
960 (org-element-property
962 (org-test-with-temp-text "- tag :: description"
963 (org-element-map (org-element-parse-buffer) 'item
'identity nil t
)))))
964 ;; No tags in ordered lists.
966 (org-element-property
968 (org-test-with-temp-text "1. tag :: description"
969 (org-element-map (org-element-parse-buffer) 'item
'identity nil t
))))
974 (org-test-with-temp-text "
979 (org-element-parse-buffer) 'item
980 (lambda (item) (org-element-property :checkbox item
))))))
982 (org-test-with-temp-text "* Headline
987 (let ((org-cycle-include-plain-lists t
)) (org-cycle))
989 (org-element-property
991 (org-element-map (org-element-parse-buffer) 'item
'identity nil t
))))
992 ;; Item starting with special syntax.
995 (org-test-with-temp-text "- - item"
997 (org-element-parse-buffer) 'paragraph
'org-element-contents
)))))
1002 (ert-deftest test-org-element
/keyword-parser
()
1003 "Test `keyword' parser."
1006 (org-test-with-temp-text "#+KEYWORD: value"
1007 (org-element-map (org-element-parse-buffer) 'keyword
'identity
)))
1008 ;; Keywords are case-insensitive.
1010 (org-test-with-temp-text "#+keyword: value"
1011 (org-element-map (org-element-parse-buffer) 'keyword
'identity
)))
1012 ;; Affiliated keywords are not keywords.
1014 (org-test-with-temp-text "#+NAME: value
1016 (org-element-map (org-element-parse-buffer) 'keyword
'identity
)))
1017 ;; Do not mix keywords with Babel calls and dynamic blocks.
1019 (org-test-with-temp-text "#+CALL: fun()"
1020 (org-element-map (org-element-parse-buffer) 'keyword
'identity
)))
1022 (org-test-with-temp-text "#+BEGIN: my-fun\nBody\n#+END:"
1023 (org-element-map (org-element-parse-buffer) 'keyword
'identity
))))
1026 ;;;; Latex Environment
1028 (ert-deftest test-org-element
/latex-environment-parser
()
1029 "Test `latex-environment' parser."
1031 (org-test-with-temp-text "\\begin{equation}\ne^{i\\pi}+1=0\n\\end{equation}"
1033 (org-element-parse-buffer) 'latex-environment
'identity
)))
1034 ;; Allow nested environments.
1042 (org-test-with-temp-text "
1048 (org-element-property
1051 (org-element-parse-buffer) 'latex-environment
'identity nil t
))))))
1056 (ert-deftest test-org-element
/latex-fragment-parser
()
1057 "Test `latex-fragment' parser."
1058 (let ((org-latex-regexps
1059 '(("begin" "^[ ]*\\(\\\\begin{\\([a-zA-Z0-9\\*]+\\)[^