From b8be9031c58a88e7d3294d587847b3edbbb43d36 Mon Sep 17 00:00:00 2001 From: Hugo Heagren Date: Sat, 16 Jul 2022 19:50:15 +0100 Subject: [PATCH] test-ol: tests for insert-description param when inserting links * test-ol (test-ol-with-link-parameters-as): Convenience macro for testing. (test-ol-insert-link-get-desc): Convenience macro for testing. (test-ol/return-foobar): Convenience function for testing. (test-ol/insert-link-insert-description): Test for various values of `:insert-description' in `org-link-parameters' (including `test-ol/return-foobar'). --- testing/lisp/test-ol.el | 88 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 88 insertions(+) diff --git a/testing/lisp/test-ol.el b/testing/lisp/test-ol.el index 429bb52ee..d2af972bd 100644 --- a/testing/lisp/test-ol.el +++ b/testing/lisp/test-ol.el @@ -19,6 +19,8 @@ ;;; Code: +(require 'cl-lib) + ;;; Decode and Encode Links @@ -625,5 +627,91 @@ See https://github.com/yantar92/org/issues/4." (test-ol-parse-link-in-text "The http://foo.com/(something)?after=parens link")))) +;;; Insert Links + +(defmacro test-ol-with-link-parameters-as (type parameters &rest body) + "Pass TYPE/PARAMETERS to `org-link-parameters' and execute BODY. + +Save the original value of `org-link-parameters', execute +`org-link-set-parameters' with the relevant args, execute BODY +and restore `org-link-parameters'. + +TYPE is as in `org-link-set-parameters'. PARAMETERS is a plist to +be passed to `org-link-set-parameters'." + (let (orig-parameters) + ;; Copy all keys in `parameters' and their original values to + ;; `orig-parameters'. + (map-do + (lambda (key _) (setq orig-parameters + (plist-put + orig-parameters key + (org-link-get-parameter type key)))) + parameters) + `(unwind-protect + ;; Set `parameters' values and execute body. + (progn (org-link-set-parameters ,type ,@parameters) ,@body) + ;; Restore original values. + (apply 'org-link-set-parameters ,type ',orig-parameters)))) + +(defun test-ol-insert-link-get-desc (&optional link-location description) + "Insert link in temp buffer, return description. + +LINK-LOCATION and DESCRIPTION are passed to +`org-insert-link' (COMPLETE-FILE is always nil)." + (org-test-with-temp-text "" + (org-insert-link nil link-location description) + (save-match-data + (when (and + (org-in-regexp org-link-bracket-re 1) + (match-end 2)) + (match-string-no-properties 2))))) + +(defun test-ol/return-foobar (_link-test _desc) + "Return string \"foobar\". + +Take (and ignore) arguments conforming to `:insert-description' +API in `org-link-parameters'. Used in test +`test-ol/insert-link-insert-description', for the case where +`:insert-description' is a function symbol." + "foobar") + +(ert-deftest test-ol/insert-link-insert-description () + "Test `:insert-description' parameter handling." + ;; String case. + (should + (string= + "foobar" + (test-ol-with-link-parameters-as + "id" (:insert-description "foobar") + (test-ol-insert-link-get-desc "id:foo-bar")))) + ;; Lambda case. + (should + (string= + "foobar" + (test-ol-with-link-parameters-as + "id" (:insert-description (lambda (_link-test _desc) "foobar")) + (test-ol-insert-link-get-desc "id:foo-bar")))) + ;; Function symbol case. + (should + (string= + "foobar" + (test-ol-with-link-parameters-as + "id" (:insert-description #'test-ol/return-foobar) + (test-ol-insert-link-get-desc "id:foo-bar")))) + ;; `:insert-description' parameter is defined, but doesn't return a + ;; string. + (should + (null + (test-ol-with-link-parameters-as + "id" (:insert-description #'ignore) + (test-ol-insert-link-get-desc "id:foo-bar")))) + ;; Description argument should override `:insert-description'. + (should + (string= + "notfoobar" + (test-ol-with-link-parameters-as + "id" (:insert-description "foobar") + (test-ol-insert-link-get-desc "id:foo-bar" "notfoobar"))))) + (provide 'test-ol) ;;; test-ol.el ends here -- 2.20.1