diff --git a/testing/lisp/test-ol.el b/testing/lisp/test-ol.el new file mode 100644 index 000000000..49a5bab0e --- /dev/null +++ b/testing/lisp/test-ol.el @@ -0,0 +1,253 @@ +;;; test-ol.el --- Tests for Org Links library -*- lexical-binding: t; -*- + +;; Copyright (C) 2019 Nicolas Goaziou + +;; Author: Nicolas Goaziou + +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . + +;;; Code: + + +;;; (Un)Escape links + +(ert-deftest test-ol/escape-ascii-character () + "Escape an ascii character." + (should + (string= + "%5B" + (org-link-escape "[")))) + +(ert-deftest test-ol/escape-ascii-ctrl-character () + "Escape an ascii control character." + (should + (string= + "%09" + (org-link-escape "\t")))) + +(ert-deftest test-ol/escape-multibyte-character () + "Escape an unicode multibyte character." + (should + (string= + "%E2%82%AC" + (org-link-escape "€")))) + +(ert-deftest test-ol/escape-custom-table () + "Escape string with custom character table." + (should + (string= + "Foo%3A%42ar%0A" + (org-link-escape "Foo:Bar\n" '(?\: ?\B))))) + +(ert-deftest test-ol/escape-custom-table-merge () + "Escape string with custom table merged with default table." + (should + (string= + "%5BF%6F%6F%3A%42ar%0A%5D" + (org-link-escape "[Foo:Bar\n]" '(?\: ?\B ?\o) t)))) + +(ert-deftest test-ol/unescape-ascii-character () + "Unescape an ascii character." + (should + (string= + "[" + (org-link-unescape "%5B")))) + +(ert-deftest test-ol/unescape-ascii-ctrl-character () + "Unescpae an ascii control character." + (should + (string= + "\n" + (org-link-unescape "%0A")))) + +(ert-deftest test-ol/unescape-multibyte-character () + "Unescape unicode multibyte character." + (should + (string= + "€" + (org-link-unescape "%E2%82%AC")))) + +(ert-deftest test-ol/unescape-ascii-extended-char () + "Unescape old style percent escaped character." + (should + (string= + "àâçèéêîôùû" + (decode-coding-string + (org-link-unescape "%E0%E2%E7%E8%E9%EA%EE%F4%F9%FB") 'latin-1)))) + +(ert-deftest test-ol/escape-url-with-escaped-char () + "Escape and unescape a URL that includes an escaped char. +http://article.gmane.org/gmane.emacs.orgmode/21459/" + (should + (string= + "http://some.host.com/form?&id=blah%2Bblah25" + (org-link-unescape + (org-link-escape "http://some.host.com/form?&id=blah%2Bblah25"))))) + + +;;; Store links + +(ert-deftest test-ol/store-link () + "Test `org-store-link' specifications." + ;; On a headline, link to that headline. Use heading as the + ;; description of the link. + (should + (let (org-store-link-props org-stored-links) + (org-test-with-temp-text-in-file "* H1" + (let ((file (buffer-file-name))) + (equal (format "[[file:%s::*H1][H1]]" file) + (org-store-link nil)))))) + ;; On a headline, remove any link from description. + (should + (let (org-store-link-props org-stored-links) + (org-test-with-temp-text-in-file "* [[#l][d]]" + (let ((file (buffer-file-name))) + (equal (format "[[file:%s::*%s][d]]" + file + (org-link-escape "[[#l][d]]")) + (org-store-link nil)))))) + (should + (let (org-store-link-props org-stored-links) + (org-test-with-temp-text-in-file "* [[l]]" + (let ((file (buffer-file-name))) + (equal (format "[[file:%s::*%s][l]]" file (org-link-escape "[[l]]")) + (org-store-link nil)))))) + (should + (let (org-store-link-props org-stored-links) + (org-test-with-temp-text-in-file "* [[l1][d1]] [[l2][d2]]" + (let ((file (buffer-file-name))) + (equal (format "[[file:%s::*%s][d1 d2]]" + file + (org-link-escape "[[l1][d1]] [[l2][d2]]")) + (org-store-link nil)))))) + ;; On a named element, link to that element. + (should + (let (org-store-link-props org-stored-links) + (org-test-with-temp-text-in-file "#+NAME: foo\nParagraph" + (let ((file (buffer-file-name))) + (equal (format "[[file:%s::foo][foo]]" file) + (org-store-link nil)))))) + ;; Store link to Org buffer, with context. + (should + (let ((org-stored-links nil) + (org-id-link-to-org-use-id nil) + (org-context-in-file-links t)) + (org-test-with-temp-text-in-file "* h1" + (let ((file (buffer-file-name))) + (equal (format "[[file:%s::*h1][h1]]" file) + (org-store-link nil)))))) + ;; Store link to Org buffer, without context. + (should + (let ((org-stored-links nil) + (org-id-link-to-org-use-id nil) + (org-context-in-file-links nil)) + (org-test-with-temp-text-in-file "* h1" + (let ((file (buffer-file-name))) + (equal (format "[[file:%s][file:%s]]" file file) + (org-store-link nil)))))) + ;; C-u prefix reverses `org-context-in-file-links' in Org buffer. + (should + (let ((org-stored-links nil) + (org-id-link-to-org-use-id nil) + (org-context-in-file-links nil)) + (org-test-with-temp-text-in-file "* h1" + (let ((file (buffer-file-name))) + (equal (format "[[file:%s::*h1][h1]]" file) + (org-store-link '(4))))))) + ;; A C-u C-u does *not* reverse `org-context-in-file-links' in Org + ;; buffer. + (should + (let ((org-stored-links nil) + (org-id-link-to-org-use-id nil) + (org-context-in-file-links nil)) + (org-test-with-temp-text-in-file "* h1" + (let ((file (buffer-file-name))) + (equal (format "[[file:%s][file:%s]]" file file) + (org-store-link '(16))))))) + ;; Store file link to non-Org buffer, with context. + (should + (let ((org-stored-links nil) + (org-context-in-file-links t)) + (org-test-with-temp-text-in-file "one\ntwo" + (fundamental-mode) + (let ((file (buffer-file-name))) + (equal (format "[[file:%s::one]]" file) + (org-store-link nil)))))) + ;; Store file link to non-Org buffer, without context. + (should + (let ((org-stored-links nil) + (org-context-in-file-links nil)) + (org-test-with-temp-text-in-file "one\ntwo" + (fundamental-mode) + (let ((file (buffer-file-name))) + (equal (format "[[file:%s][file:%s]]" file file) + (org-store-link nil)))))) + ;; C-u prefix reverses `org-context-in-file-links' in non-Org + ;; buffer. + (should + (let ((org-stored-links nil) + (org-context-in-file-links nil)) + (org-test-with-temp-text-in-file "one\ntwo" + (fundamental-mode) + (let ((file (buffer-file-name))) + (equal (format "[[file:%s::one]]" file) + (org-store-link '(4))))))) + ;; A C-u C-u does *not* reverse `org-context-in-file-links' in + ;; non-Org buffer. + (should + (let ((org-stored-links nil) + (org-context-in-file-links nil)) + (org-test-with-temp-text-in-file "one\ntwo" + (fundamental-mode) + (let ((file (buffer-file-name))) + (equal (format "[[file:%s][file:%s]]" file file) + (org-store-link '(16)))))))) + + +;;; Radio Targets + +(ert-deftest test-ol/update-radio-target-regexp () + "Test `org-update-radio-target-regexp' specifications." + ;; Properly update cache with no previous radio target regexp. + (should + (eq 'link + (org-test-with-temp-text "radio\n\nParagraph\n\nradio" + (save-excursion (goto-char (point-max)) (org-element-context)) + (insert "<<<") + (search-forward "o") + (insert ">>>") + (org-update-radio-target-regexp) + (goto-char (point-max)) + (org-element-type (org-element-context))))) + ;; Properly update cache with previous radio target regexp. + (should + (eq 'link + (org-test-with-temp-text "radio\n\nParagraph\n\nradio" + (save-excursion (goto-char (point-max)) (org-element-context)) + (insert "<<<") + (search-forward "o") + (insert ">>>") + (org-update-radio-target-regexp) + (search-backward "r") + (delete-char 5) + (insert "new") + (org-update-radio-target-regexp) + (goto-char (point-max)) + (delete-region (line-beginning-position) (point)) + (insert "new") + (org-element-type (org-element-context)))))) + + +(provide 'test-ol) +;;; test-ol.el ends here diff --git a/testing/lisp/test-org.el b/testing/lisp/test-org.el index 6315a8869..a70c18f86 100644 --- a/testing/lisp/test-org.el +++ b/testing/lisp/test-org.el @@ -2455,81 +2455,6 @@ Foo Bar (org-open-at-point 0)) (looking-at-p "line1"))))) -;;;; Link Escaping - -(ert-deftest test-org/org-link-escape-ascii-character () - "Escape an ascii character." - (should - (string= - "%5B" - (org-link-escape "[")))) - -(ert-deftest test-org/org-link-escape-ascii-ctrl-character () - "Escape an ascii control character." - (should - (string= - "%09" - (org-link-escape "\t")))) - -(ert-deftest test-org/org-link-escape-multibyte-character () - "Escape an unicode multibyte character." - (should - (string= - "%E2%82%AC" - (org-link-escape "€")))) - -(ert-deftest test-org/org-link-escape-custom-table () - "Escape string with custom character table." - (should - (string= - "Foo%3A%42ar%0A" - (org-link-escape "Foo:Bar\n" '(?\: ?\B))))) - -(ert-deftest test-org/org-link-escape-custom-table-merge () - "Escape string with custom table merged with default table." - (should - (string= - "%5BF%6F%6F%3A%42ar%0A%5D" - (org-link-escape "[Foo:Bar\n]" '(?\: ?\B ?\o) t)))) - -(ert-deftest test-org/org-link-unescape-ascii-character () - "Unescape an ascii character." - (should - (string= - "[" - (org-link-unescape "%5B")))) - -(ert-deftest test-org/org-link-unescape-ascii-ctrl-character () - "Unescpae an ascii control character." - (should - (string= - "\n" - (org-link-unescape "%0A")))) - -(ert-deftest test-org/org-link-unescape-multibyte-character () - "Unescape unicode multibyte character." - (should - (string= - "€" - (org-link-unescape "%E2%82%AC")))) - -(ert-deftest test-org/org-link-unescape-ascii-extended-char () - "Unescape old style percent escaped character." - (should - (string= - "àâçèéêîôùû" - (decode-coding-string - (org-link-unescape "%E0%E2%E7%E8%E9%EA%EE%F4%F9%FB") 'latin-1)))) - -(ert-deftest test-org/org-link-escape-url-with-escaped-char () - "Escape and unescape a URL that includes an escaped char. -http://article.gmane.org/gmane.emacs.orgmode/21459/" - (should - (string= - "http://some.host.com/form?&id=blah%2Bblah25" - (org-link-unescape - (org-link-escape "http://some.host.com/form?&id=blah%2Bblah25"))))) - ;;;; Open at point (ert-deftest test-org/open-at-point/keyword () @@ -2596,124 +2521,6 @@ http://article.gmane.org/gmane.emacs.orgmode/21459/" (org-open-at-point) nil))))) -;;;; Stored links - -(ert-deftest test-org/store-link () - "Test `org-store-link' specifications." - ;; On a headline, link to that headline. Use heading as the - ;; description of the link. - (should - (let (org-store-link-props org-stored-links) - (org-test-with-temp-text-in-file "* H1" - (let ((file (buffer-file-name))) - (equal (format "[[file:%s::*H1][H1]]" file) - (org-store-link nil)))))) - ;; On a headline, remove any link from description. - (should - (let (org-store-link-props org-stored-links) - (org-test-with-temp-text-in-file "* [[#l][d]]" - (let ((file (buffer-file-name))) - (equal (format "[[file:%s::*%s][d]]" - file - (org-link-escape "[[#l][d]]")) - (org-store-link nil)))))) - (should - (let (org-store-link-props org-stored-links) - (org-test-with-temp-text-in-file "* [[l]]" - (let ((file (buffer-file-name))) - (equal (format "[[file:%s::*%s][l]]" file (org-link-escape "[[l]]")) - (org-store-link nil)))))) - (should - (let (org-store-link-props org-stored-links) - (org-test-with-temp-text-in-file "* [[l1][d1]] [[l2][d2]]" - (let ((file (buffer-file-name))) - (equal (format "[[file:%s::*%s][d1 d2]]" - file - (org-link-escape "[[l1][d1]] [[l2][d2]]")) - (org-store-link nil)))))) - ;; On a named element, link to that element. - (should - (let (org-store-link-props org-stored-links) - (org-test-with-temp-text-in-file "#+NAME: foo\nParagraph" - (let ((file (buffer-file-name))) - (equal (format "[[file:%s::foo][foo]]" file) - (org-store-link nil)))))) - ;; Store link to Org buffer, with context. - (should - (let ((org-stored-links nil) - (org-id-link-to-org-use-id nil) - (org-context-in-file-links t)) - (org-test-with-temp-text-in-file "* h1" - (let ((file (buffer-file-name))) - (equal (format "[[file:%s::*h1][h1]]" file) - (org-store-link nil)))))) - ;; Store link to Org buffer, without context. - (should - (let ((org-stored-links nil) - (org-id-link-to-org-use-id nil) - (org-context-in-file-links nil)) - (org-test-with-temp-text-in-file "* h1" - (let ((file (buffer-file-name))) - (equal (format "[[file:%s][file:%s]]" file file) - (org-store-link nil)))))) - ;; C-u prefix reverses `org-context-in-file-links' in Org buffer. - (should - (let ((org-stored-links nil) - (org-id-link-to-org-use-id nil) - (org-context-in-file-links nil)) - (org-test-with-temp-text-in-file "* h1" - (let ((file (buffer-file-name))) - (equal (format "[[file:%s::*h1][h1]]" file) - (org-store-link '(4))))))) - ;; A C-u C-u does *not* reverse `org-context-in-file-links' in Org - ;; buffer. - (should - (let ((org-stored-links nil) - (org-id-link-to-org-use-id nil) - (org-context-in-file-links nil)) - (org-test-with-temp-text-in-file "* h1" - (let ((file (buffer-file-name))) - (equal (format "[[file:%s][file:%s]]" file file) - (org-store-link '(16))))))) - ;; Store file link to non-Org buffer, with context. - (should - (let ((org-stored-links nil) - (org-context-in-file-links t)) - (org-test-with-temp-text-in-file "one\ntwo" - (fundamental-mode) - (let ((file (buffer-file-name))) - (equal (format "[[file:%s::one]]" file) - (org-store-link nil)))))) - ;; Store file link to non-Org buffer, without context. - (should - (let ((org-stored-links nil) - (org-context-in-file-links nil)) - (org-test-with-temp-text-in-file "one\ntwo" - (fundamental-mode) - (let ((file (buffer-file-name))) - (equal (format "[[file:%s][file:%s]]" file file) - (org-store-link nil)))))) - ;; C-u prefix reverses `org-context-in-file-links' in non-Org - ;; buffer. - (should - (let ((org-stored-links nil) - (org-context-in-file-links nil)) - (org-test-with-temp-text-in-file "one\ntwo" - (fundamental-mode) - (let ((file (buffer-file-name))) - (equal (format "[[file:%s::one]]" file) - (org-store-link '(4))))))) - ;; A C-u C-u does *not* reverse `org-context-in-file-links' in - ;; non-Org buffer. - (should - (let ((org-stored-links nil) - (org-context-in-file-links nil)) - (org-test-with-temp-text-in-file "one\ntwo" - (fundamental-mode) - (let ((file (buffer-file-name))) - (equal (format "[[file:%s][file:%s]]" file file) - (org-store-link '(16)))))))) - ;;; Node Properties @@ -5634,40 +5441,6 @@ Paragraph" (org-refresh-properties "A" 'org-test)) (get-text-property (point) 'org-test))))) - -;;; Radio Targets - -(ert-deftest test-org/update-radio-target-regexp () - "Test `org-update-radio-target-regexp' specifications." - ;; Properly update cache with no previous radio target regexp. - (should - (eq 'link - (org-test-with-temp-text "radio\n\nParagraph\n\nradio" - (save-excursion (goto-char (point-max)) (org-element-context)) - (insert "<<<") - (search-forward "o") - (insert ">>>") - (org-update-radio-target-regexp) - (goto-char (point-max)) - (org-element-type (org-element-context))))) - ;; Properly update cache with previous radio target regexp. - (should - (eq 'link - (org-test-with-temp-text "radio\n\nParagraph\n\nradio" - (save-excursion (goto-char (point-max)) (org-element-context)) - (insert "<<<") - (search-forward "o") - (insert ">>>") - (org-update-radio-target-regexp) - (search-backward "r") - (delete-char 5) - (insert "new") - (org-update-radio-target-regexp) - (goto-char (point-max)) - (delete-region (line-beginning-position) (point)) - (insert "new") - (org-element-type (org-element-context)))))) - ;;; Refile