diff --git a/testing/lisp/test-org-element.el b/testing/lisp/test-org-element.el index 367cddf7d..feb75d279 100644 --- a/testing/lisp/test-org-element.el +++ b/testing/lisp/test-org-element.el @@ -24,11 +24,18 @@ (unless (featurep 'org-element) (signal 'missing-test-dependency "org-element")) +(defun org-test-parse-and-interpret (text) + "Parse TEXT as Org syntax and interpret it. +Return interpreted string." + (with-temp-buffer + (org-mode) + (insert text) + (org-element-interpret-data (org-element-parse-buffer)))) + ;;; Tests: - ;;;; Headlines @@ -405,20 +412,383 @@ Paragraph \\alpha." '(org-data nil (paragraph (:caption (("long") "short")) "Paragraph"))) "#+CAPTION[short]: long\nParagraph\n"))) -(ert-deftest test-org-element/interpret-elements () - "Test interpretation of elements and objects." - (let ((parse-and-interpret - (function - ;; Parse TEXT string in an Org buffer and transcode it back - ;; to Org syntax. - (lambda (text) - (with-temp-buffer - (org-mode) - (insert text) - (org-element-interpret-data (org-element-parse-buffer))))))) - ;; Verse blocks. - (equal (funcall parse-and-interpret "#+BEGIN_VERSE\nTest\n#+END_VERSE") - "#+BEGIN_VERSE\nTest\n#+END_VERSE\n"))) +(ert-deftest test-org-element/center-block-interpreter () + "Test center block interpreter." + (should + (equal (org-test-parse-and-interpret "#+BEGIN_CENTER\nTest\n#+END_CENTER") + "#+BEGIN_CENTER\nTest\n#+END_CENTER\n"))) + +(ert-deftest test-org-element/drawer-interpreter () + "Test drawer interpreter." + (should + (equal (let ((org-drawers '("TEST"))) + (org-test-parse-and-interpret ":TEST:\nTest\n:END:")) + ":TEST:\nTest\n:END:\n"))) + +(ert-deftest test-org-element/dynamic-block-interpreter () + "Test dynamic block interpreter." + (should + (equal (org-test-parse-and-interpret + "#+BEGIN: myblock :parameter value1\nTest\n#+END:") + "#+BEGIN: myblock :parameter value1\nTest\n#+END:\n"))) + +(ert-deftest test-org-element/footnote-definition-interpreter () + "Test footnote definition interpreter." + (should (equal (org-test-parse-and-interpret "[fn:1] Test") "[fn:1] Test\n"))) + +(ert-deftest test-org-element/headline-interpreter () + "Test headline and section interpreters." + ;; 1. Standard test. + (should (equal (org-test-parse-and-interpret "* Headline") "* Headline\n")) + ;; 2. With TODO keywords. + (should + (equal (let ((org-todo-keywords '((sequence "TODO" "DONE")))) + (org-test-parse-and-interpret "* TODO Headline")) + "* TODO Headline\n")) + ;; 3. With tags... + ;; + ;; 3.1. ... and a positive `org-tags-column' value. + (should + (equal (let ((org-tags-column 20)) + (org-test-parse-and-interpret "* Headline :tag:")) + "* Headline :tag:\n")) + ;; 3.2. ... and a negative `org-tags-column' value. + (should + (equal (let ((org-tags-column -20)) + (org-test-parse-and-interpret "* Headline :tag:")) + "* Headline :tag:\n")) + ;; 3.3. ... and a null `org-tags-column' value. + (should + (equal (let ((org-tags-column 0)) + (org-test-parse-and-interpret "* Headline :tag:")) + "* Headline :tag:\n")) + ;; 4. With priority cookie. + (should + (equal (org-test-parse-and-interpret "* [#B] Headline") + "* [#B] Headline\n")) + ;; 5. With comment keyword. + (should + (equal (let ((org-comment-string "COMMENT")) + (org-test-parse-and-interpret "* COMMENT Headline")) + "* COMMENT Headline\n")) + ;; 6. With quote section. + (should + (equal (let ((org-quote-string "QUOTE")) + (org-test-parse-and-interpret "* QUOTE Headline")) + "* QUOTE Headline\n")) + ;; 7. Keep same number of blank lines before body. + (should + (equal (org-test-parse-and-interpret + "* Headline\n\n\nText after two blank lines.") + "* Headline\n\n\nText after two blank lines.\n"))) + +(ert-deftest test-org-element/inlinetask-interpreter () + "Test inlinetask interpretation." + (when (featurep 'org-inlinetask) + (let ((org-inlinetask-min-level 15)) + ;; 1. Regular inlinetask. + (should (equal (org-test-parse-and-interpret + "*************** Task\nTest\n*************** END") + "*************** Task\nTest\n*************** END\n")) + ;; 2. Degenerate inlinetask. + (should (equal (org-test-parse-and-interpret "*************** Task") + "*************** Task\n")) + ;; 3. Prefer degenerate form when there are no contents. + (should (equal (org-test-parse-and-interpret + "*************** Task\n*************** END") + "*************** Task\n")) + ;; 4. With TODO keywords. + (should + (equal (let ((org-todo-keywords '((sequence "TODO" "DONE")))) + (org-test-parse-and-interpret "*************** TODO Task")) + "*************** TODO Task\n")) + ;; 5. With tags... + ;; + ;; 5.1. ... and a positive `org-tags-column' value. + (should + (equal (let ((org-tags-column 30)) + (org-test-parse-and-interpret "*************** Task :tag:")) + "*************** Task :tag:\n")) + ;; 5.2. ... and a negative `org-tags-column' value. + (should + (equal (let ((org-tags-column -30)) + (org-test-parse-and-interpret "*************** Task :tag:")) + "*************** Task :tag:\n")) + ;; 5.3. ... and a null `org-tags-column' value. + (should + (equal (let ((org-tags-column 0)) + (org-test-parse-and-interpret "*************** Task :tag:")) + "*************** Task :tag:\n")) + ;; 6. With priority cookie. + (should + (equal (org-test-parse-and-interpret "*************** [#B] Task") + "*************** [#B] Task\n"))))) + +(ert-deftest test-org-element/plain-list-interpreter () + "Test plain-list and item interpreters." + ;; 1. Unordered list. + (should (equal (org-test-parse-and-interpret "- item 1") "- item 1\n")) + ;; 2. Description list. + (should + (equal (org-test-parse-and-interpret "- tag :: desc") "- tag :: desc\n")) + ;; 3. Ordered list. + (should + (equal (let ((org-plain-list-ordered-item-terminator t)) + (org-test-parse-and-interpret "1. Item")) + "1. Item\n")) + ;; 4. Ordered list with counter. + (should + (equal (let ((org-plain-list-ordered-item-terminator t)) + (org-test-parse-and-interpret "1. [@5] Item")) + "5. [@5] Item\n")) + ;; 5. List with check-boxes. + (should + (equal (org-test-parse-and-interpret + "- [-] Item 1\n - [X] Item 2\n - [ ] Item 3") + "- [-] Item 1\n - [X] Item 2\n - [ ] Item 3\n"))) + +(ert-deftest test-org-element/quote-block-interpreter () + "Test quote block interpreter." + (should (equal (org-test-parse-and-interpret + "#+BEGIN_QUOTE\nTest\n#+END_QUOTE") + "#+BEGIN_QUOTE\nTest\n#+END_QUOTE\n"))) + +(ert-deftest test-org-element/special-block-interpreter () + "Test special block interpreter." + (should (equal (org-test-parse-and-interpret + "#+BEGIN_SPECIAL\nTest\n#+END_SPECIAL") + "#+BEGIN_SPECIAL\nTest\n#+END_SPECIAL\n"))) + +(ert-deftest test-org-element/babel-call-interpreter () + "Test babel call interpreter." + ;; 1. Without argument. + (should (equal (org-test-parse-and-interpret "#+CALL: test()") + "#+CALL: test()\n")) + ;; 2. With argument. + (should (equal (org-test-parse-and-interpret "#+CALL: test(x=2)") + "#+CALL: test(x=2)\n")) + ;; 3. With header arguments. + (should (equal (org-test-parse-and-interpret + "#+CALL: test[:results output]()[:results html]") + "#+CALL: test[:results output]()[:results html]\n"))) + +(ert-deftest test-org-element/comment-interpreter () + "Test comment interpreter." + ;; Regular comment. + (should (equal (org-test-parse-and-interpret "#Comment") "#Comment\n")) + ;; Inline comment. + (should (equal (org-test-parse-and-interpret " #+ Comment") + " #+ Comment\n"))) + +(ert-deftest test-org-element/comment-block-interpreter () + "Test comment block interpreter." + (should (equal (org-test-parse-and-interpret + "#+BEGIN_COMMENT\nTest\n#+END_COMMENT") + "#+BEGIN_COMMENT\nTest\n#+END_COMMENT\n"))) + +(ert-deftest test-org-element/example-block-interpreter () + "Test example block interpreter." + (should (equal (org-test-parse-and-interpret + "#+BEGIN_EXAMPLE\nTest\n#+END_EXAMPLE") + "#+BEGIN_EXAMPLE\nTest\n#+END_EXAMPLE\n"))) + +(ert-deftest test-org-element/export-block-interpreter () + "Test export block interpreter." + (should (equal (org-test-parse-and-interpret + "#+BEGIN_HTML\nTest\n#+END_HTML") + "#+BEGIN_HTML\nTest\n#+END_HTML\n"))) + +(ert-deftest test-org-element/fixed-width-interpreter () + "Test fixed width interpreter." + (should (equal (org-test-parse-and-interpret ": Test") ": Test\n"))) + +(ert-deftest test-org-element/horizontal-rule-interpreter () + "Test horizontal rule interpreter." + (should (equal (org-test-parse-and-interpret "-------") "-----\n"))) + +(ert-deftest test-org-element/keyword-interpreter () + "Test keyword interpreter." + (should (equal (org-test-parse-and-interpret "#+KEYWORD: value") + "#+KEYWORD: value\n"))) + +(ert-deftest test-org-element/latex-environment-interpreter () + "Test latex environment interpreter." + (should (equal (org-test-parse-and-interpret + "\begin{equation}\n1+1=2\n\end{equation}") + "\begin{equation}\n1+1=2\n\end{equation}\n"))) + +(ert-deftest test-org-element/property-drawer-interpreter () + "Test property drawer interpreter." + (should (equal (let ((org-property-format "%-10s %s")) + (org-test-parse-and-interpret + ":PROPERTIES:\n:prop: value\n:END:")) + ":PROPERTIES:\n:prop: value\n:END:\n"))) + +(ert-deftest test-org-element/src-block-interpreter () + "Test src block interpreter." + (should + (equal (org-test-parse-and-interpret + "#+BEGIN_SRC emacs-lisp :results silent\n(+ 1 1)\n#+END_SRC") + "#+BEGIN_SRC emacs-lisp :results silent\n(+ 1 1)\n#+END_SRC\n"))) + +(ert-deftest test-org-element/table-interpreter () + "Test table, table-row and table-cell interpreters." + ;; 1. Simple table. + (should (equal (org-test-parse-and-interpret "| a | b |\n| c | d |") + "| a | b |\n| c | d |\n")) + ;; 2. Table with horizontal rules. + (should (equal (org-test-parse-and-interpret + "| a | b |\n|---+---|\n| c | d |") + "| a | b |\n|---+---|\n| c | d |\n")) + ;; 3. Table with meta-data. + (should (equal (org-test-parse-and-interpret "| / | < | > |\n| * | 1 | 2 |") + "| / | < | > |\n| * | 1 | 2 |\n"))) + +(ert-deftest test-org-element/verse-block-interpreter () + "Test verse block interpretation." + (should + (equal (org-test-parse-and-interpret "#+BEGIN_VERSE\nTest\n#+END_VERSE") + "#+BEGIN_VERSE\nTest\n#+END_VERSE\n"))) + +(ert-deftest test-org-element/entity-interpreter () + "Test entity interpreter." + ;; 1. Without brackets. + (should + (equal (org-test-parse-and-interpret "\\alpha text") "\\alpha text\n")) + ;; 2. With brackets. + (should + (equal (org-test-parse-and-interpret "\\alpha{}text") "\\alpha{}text\n"))) + +(ert-deftest test-org-element/export-snippet-interpreter () + "Test export snippet interpreter." + (should (equal (org-test-parse-and-interpret "@back-end{test}") + "@back-end{test}\n"))) + +(ert-deftest test-org-element/footnote-reference-interpreter () + "Test footnote reference interpreter." + ;; 1. Regular reference. + (should (equal (org-test-parse-and-interpret "Text[fn:1]") "Text[fn:1]\n")) + ;; 2. Normalized reference. + (should (equal (org-test-parse-and-interpret "Text[1]") "Text[1]\n")) + ;; 3. Named reference. + (should (equal (org-test-parse-and-interpret "Text[fn:label]") + "Text[fn:label]\n")) + ;; 4. Inline reference. + (should (equal (org-test-parse-and-interpret "Text[fn:label:def]") + "Text[fn:label:def]\n")) + ;; 5. Anonymous reference. + (should (equal (org-test-parse-and-interpret "Text[fn::def]") + "Text[fn::def]\n"))) + +(ert-deftest test-org-element/inline-babel-call-interpreter () + "Test inline babel call interpreter." + ;; 1. Without arguments. + (should (equal (org-test-parse-and-interpret "call_test()") "call_test()\n")) + ;; 2. With arguments. + (should (equal (org-test-parse-and-interpret "call_test(x=2)") + "call_test(x=2)\n")) + ;; 3. With header arguments. + (should (equal (org-test-parse-and-interpret + "call_test[:results output]()[:results html]") + "call_test[:results output]()[:results html]\n"))) + +(ert-deftest test-org-element/inline-src-block-interpreter () + "Test inline src block interpreter." + ;; 1. Without header argument. + (should (equal (org-test-parse-and-interpret "src_emacs-lisp{(+ 1 1)}") + "src_emacs-lisp{(+ 1 1)}\n")) + ;; 2. With header arguments. + (should (equal (org-test-parse-and-interpret + "src_emacs-lisp[:results silent]{(+ 1 1)}") + "src_emacs-lisp[:results silent]{(+ 1 1)}\n"))) + +(ert-deftest test-org-element/latex-fragment-interpreter () + "Test latex fragment interpreter." + (let ((org-latex-regexps + '(("begin" "^[ ]*\\(\\\\begin{\\([a-zA-Z0-9\\*]+\\)[^]+?\\\\end{\\2}\\)" 1 t) + ("$1" "\\([^$]\\|^\\)\\(\\$[^ \n,;.$]\\$\\)\\([- .,?;:'\")]\\|$\\)" 2 nil) + ("$" "\\([^$]\\|^\\)\\(\\(\\$\\([^ \n,;.$][^$\n ]*?\\(\n[^$\n ]*?\\)\\{0,2\\}[^ \n,.$]\\)\\$\\)\\)\\([- .,?;:'\")]\\|$\\)" 2 nil) + ("\\(" "\\\\([^]*?\\\\)" 0 nil) + ("\\[" "\\\\\\[[^]*?\\\\\\]" 0 nil) + ("$$" "\\$\\$[^]*?\\$\\$" 0 nil)))) + (should (equal (org-test-parse-and-interpret "\\command{}") + "\\command{}\n")) + (should (equal (org-test-parse-and-interpret "$x$") "$x$\n")) + (should (equal (org-test-parse-and-interpret "$x+y$") "$x+y$\n")) + (should (equal (org-test-parse-and-interpret "$$x+y$$") "$$x+y$$\n")) + (should (equal (org-test-parse-and-interpret "\\(x+y\\)") "\\(x+y\\)\n")) + (should (equal (org-test-parse-and-interpret "\\[x+y\\]") "\\[x+y\\]\n")))) + +(ert-deftest test-org-element/line-break-interpreter () + "Test line break interpreter." + (should (equal (org-test-parse-and-interpret "First line \\\\ \nSecond line") + "First line \\\\\nSecond line\n"))) + +(ert-deftest test-org-element/link-interpreter () + "Test link interpreter." + ;; 1. Links targeted from a radio target. + (should (equal (let ((org-target-link-regexp "radio-target")) + (org-test-parse-and-interpret "a radio-target")) + "a radio-target\n")) + ;; 2. Regular links. + ;; + ;; 2.1. Without description. + (should (equal (org-test-parse-and-interpret "[[http://orgmode.org]]") + "[[http://orgmode.org]]\n")) + ;; 2.2. With a description. + (should (equal (org-test-parse-and-interpret + "[[http://orgmode.org][Org mode]]") + "[[http://orgmode.org][Org mode]]\n")) + ;; 2.3. Id links. + (should (equal (org-test-parse-and-interpret "[[id:aaaa]]") "[[id:aaaa]]\n")) + ;; 2.4. Custom-id links. + (should (equal (org-test-parse-and-interpret "[[#id]]") "[[#id]]\n")) + ;; 2.5 Code-ref links. + (should (equal (org-test-parse-and-interpret "[[(ref)]]") "[[(ref)]]\n")) + ;; 3. Normalize plain links. + (should (equal (org-test-parse-and-interpret "http://orgmode.org") + "[[http://orgmode.org]]\n")) + ;; 4. Normalize angular links. + (should (equal (org-test-parse-and-interpret "") + "[[http://orgmode.org]]\n"))) + +(ert-deftest test-org-element/macro-interpreter () + "Test macro interpreter." + ;; 1. Without argument. + (should (equal (org-test-parse-and-interpret "{{{test}}}") "{{{test}}}\n")) + ;; 2. With arguments. + (should (equal (org-test-parse-and-interpret "{{{test(arg1,arg2)}}}") + "{{{test(arg1,arg2)}}}\n"))) + +(ert-deftest test-org-element/radio-target-interpreter () + "Test radio target interpreter." + (should (equal (org-test-parse-and-interpret "<<>>") + "<<>>\n"))) + +(ert-deftest test-org-element/statistics-cookie-interpreter () + "Test statistics cookie interpreter." + ;; 1. Without percent + (should (equal (org-test-parse-and-interpret "[0/1]") "[0/1]\n")) + ;; 2. With percent. + (should (equal (org-test-parse-and-interpret "[66%]") "[66%]\n"))) + +(ert-deftest test-org-element/subscript-interpreter () + "Test subscript interpreter." + ;; 1. Without brackets. + (should (equal (org-test-parse-and-interpret "a_b") "a_b\n")) + ;; 2. With brackets. + (should (equal (org-test-parse-and-interpret "a_{b}") "a_{b}\n"))) + +(ert-deftest test-org-element/superscript-interpreter () + "Test superscript interpreter." + ;; 1. Without brackets. + (should (equal (org-test-parse-and-interpret "a^b") "a^b\n")) + ;; 2. With brackets. + (should (equal (org-test-parse-and-interpret "a^{b}") "a^{b}\n"))) + +(ert-deftest test-org-element/target-interpreter () + "Test target interpreter." + (should (equal (org-test-parse-and-interpret "<>") "<>\n")))