1 ;;; test-org-list.el --- Tests for org-list.el
3 ;; Copyright (C) 2012, 2013, 2014 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 (ert-deftest test-org-list
/list-ending
()
23 "Test if lists end at the right place."
24 ;; With two blank lines.
25 (org-test-with-temp-text "- item\n\n\n Text"
27 (should-not (org-in-item-p)))
28 ;; With text less indented than top items.
29 (org-test-with-temp-text "- item\nText"
31 (should-not (org-in-item-p)))
32 ;; Though, blank lines and text indentation is ignored in blocks.
33 (org-test-with-temp-text
34 "- item\n #+begin_quote\n\n\nText at column 0\n #+end_quote\n Text"
36 (should (org-in-item-p))))
38 (ert-deftest test-org-list
/list-navigation
()
39 "Test list navigation specifications."
40 (org-test-with-temp-text "
54 (let ((org-list-use-circular-motion nil
))
55 ;; 1. Test `org-next-item'.
57 ;; 1.1. Should return an error if at last item in
58 ;; a list/sub-list, unless `org-list-use-circular-motion'
61 (should-error (org-next-item))
62 (let ((org-list-use-circular-motion t
))
63 (should (progn (org-next-item) t
)))
65 (should-error (org-next-item))
66 (let ((org-list-use-circular-motion t
))
67 (should (progn (org-next-item) t
)))
68 ;; 1.2. Should jump over sub-lists.
71 (should (looking-at "- item 2"))
72 ;; 1.3. Shouldn't move to another list.
74 (should-error (org-next-item))
75 (should-not (looking-at "- item 1"))
76 ;; 1.4. Should move to the list/sub-list first item when
77 ;; `org-list-use-circular-motion' is non-nil.
78 (let ((org-list-use-circular-motion t
))
81 (should (looking-at "- item 1"))
84 (should (looking-at " - item 1.1")))
85 ;; 2. Test `org-previous-item'.
87 ;; 2.1. Should return an error if at first item in
88 ;; a list/sub-list, unless `org-list-use-circular-motion is
91 (should-error (org-previous-item))
92 (let ((org-list-use-circular-motion t
))
93 (should (progn (org-previous-item) t
)))
95 (should-error (org-previous-item))
96 (let ((org-list-use-circular-motion t
))
97 (should (progn (org-previous-item) t
)))
98 ;; 2.2. Should ignore sub-lists.
101 (should (looking-at "- item 1"))
102 ;; 2.3. Shouldn't move to another list.
104 (should-error (org-previous-item))
105 (should-not (looking-at "- item B"))
106 ;; 2.4. Should move to the list/sub-list last item when
107 ;; `org-list-use-circular-motion' is non-nil.
108 (let ((org-list-use-circular-motion t
))
111 (should (looking-at "- item 2"))
114 (should (looking-at " - item 1.3"))))))
116 (ert-deftest test-org-list
/cycle-bullet
()
117 "Test `org-cycle-list-bullet' specifications."
118 ;; Error when not at an item.
120 (org-test-with-temp-text "Paragraph"
121 (org-cycle-list-bullet)))
122 ;; Cycle through "-", "+", "*", "1.", "1)".
123 (org-test-with-temp-text " - item"
124 (org-cycle-list-bullet)
125 (should (looking-at "[ \t]+\\+"))
126 (org-cycle-list-bullet)
127 (should (looking-at "[ \t]+\\*"))
128 (let ((org-plain-list-ordered-item-terminator t
))
129 (org-cycle-list-bullet))
130 (should (looking-at "[ \t]+1\\."))
131 (let ((org-plain-list-ordered-item-terminator t
))
132 (org-cycle-list-bullet))
133 (should (looking-at "[ \t]+1)")))
134 ;; Argument is a valid bullet: cycle to that bullet directly.
137 (org-test-with-temp-text "- item"
138 (let ((org-plain-list-ordered-item-terminator t
))
139 (org-cycle-list-bullet "1.")
141 ;; Argument is an integer N: cycle to the Nth allowed bullet.
144 (org-test-with-temp-text "1. item"
145 (let ((org-plain-list-ordered-item-terminator t
))
146 (org-cycle-list-bullet 1)
148 ;; Argument is `previous': cycle backwards.
151 (org-test-with-temp-text "+ item"
152 (let ((org-plain-list-ordered-item-terminator t
))
153 (org-cycle-list-bullet 'previous
)
155 ;; Do not cycle to "*" bullets when item is at column 0.
158 (org-test-with-temp-text "+ item"
159 (let ((org-plain-list-ordered-item-terminator t
))
160 (org-cycle-list-bullet)
162 ;; Do not cycle to numbered bullets in a description list.
164 (equal "1. tag :: item"
165 (org-test-with-temp-text "+ tag :: item"
166 (let ((org-plain-list-ordered-item-terminator t
))
167 (org-cycle-list-bullet)
169 ;; Do not cycle to ordered item terminators if they are not allowed
170 ;; in `org-plain-list-ordered-item-terminator'.
173 (org-test-with-temp-text " * item"
174 (let ((org-plain-list-ordered-item-terminator 41))
175 (org-cycle-list-bullet)
177 ;; When `org-list-allow-alphabetical' is non-nil, cycle to alpha bullets.
180 (org-test-with-temp-text "1) item"
181 (let ((org-plain-list-ordered-item-terminator t
)
182 (org-list-allow-alphabetical t
))
183 (org-cycle-list-bullet)
185 ;; Do not cycle to alpha bullets when list has more than 26
189 (org-test-with-temp-text "1) item 1
216 (let ((org-plain-list-ordered-item-terminator t
)
217 (org-list-allow-alphabetical t
))
218 (org-cycle-list-bullet)
219 (buffer-substring (point) (line-end-position)))))))
221 (ert-deftest test-org-list
/indent-item
()
222 "Test `org-indent-item' specifications."
223 ;; 1. Error when not at an item.
224 (org-test-with-temp-text "Paragraph."
225 (should-error (org-indent-item)))
226 ;; 2. Error when trying to move first item of a list.
227 (org-test-with-temp-text "
231 (should-error (org-indent-item)))
232 ;; 3. Indent a single item, not its children.
233 (org-test-with-temp-text "
237 (search-forward "- Item 2")
238 (let (org-list-demote-modify-bullet) (org-indent-item))
239 (should (equal (buffer-string)
244 ;; 4. Follow `org-list-demote-modify-bullet' specifications.
246 ;; 4.1. With unordered lists.
247 (org-test-with-temp-text "
250 (search-forward "- Item 2")
251 (let ((org-list-demote-modify-bullet '(("-" .
"+")))) (org-indent-item))
252 (should (equal (buffer-string)
256 ;; 4.2. and ordered lists.
257 (org-test-with-temp-text "
260 (search-forward "2. Item 2")
261 (let ((org-plain-list-ordered-item-terminator t
)
262 (org-list-demote-modify-bullet '(("1." .
"+"))))
264 (should (equal (buffer-string)
268 ;; 5. When a region is selected, indent every item within.
269 (org-test-with-temp-text "
274 (search-forward "- Item 2")
276 (transient-mark-mode 1)
277 (push-mark (point) t t
)
278 (goto-char (point-max))
279 (let (org-list-demote-modify-bullet) (org-indent-item))
280 (should (equal (buffer-string)
287 (ert-deftest test-org-list
/indent-item-tree
()
288 "Test `org-indent-item-tree' specifications."
289 ;; 1. Error when not at an item.
290 (org-test-with-temp-text "Paragraph."
291 (should-error (org-indent-item-tree)))
292 ;; 2. Indent item along with its children.
293 (org-test-with-temp-text "
297 (search-forward "- Item 2")
298 (let (org-list-demote-modify-bullet) (org-indent-item-tree))
299 (should (equal (buffer-string)
304 ;; 3. Special case: When indenting top item, move the whole list.
305 (org-test-with-temp-text "
308 (search-forward "- Item 1")
309 (let (org-list-demote-modify-bullet org-odd-levels-only
)
310 (org-indent-item-tree))
311 (should (equal (buffer-string)
315 ;; 4. Follow `org-list-demote-modify-bullet' specifications.
317 ;; 4.1. With unordered lists.
318 (org-test-with-temp-text "
322 (search-forward "- Item 2")
323 (let ((org-list-demote-modify-bullet '(("-" .
"+") ("+" .
"-"))))
324 (org-indent-item-tree))
325 (should (equal (buffer-string)
330 ;; 4.2. and ordered lists.
331 (org-test-with-temp-text "
335 (search-forward "2. Item 2")
336 (let ((org-plain-list-ordered-item-terminator t
)
337 (org-list-demote-modify-bullet '(("1." .
"+") ("+" .
"1."))))
338 (org-indent-item-tree))
339 (should (equal (buffer-string)
344 ;; 5. When a region is selected, indent every item within.
345 (org-test-with-temp-text "
352 (search-forward "- Item 2")
354 (transient-mark-mode 1)
355 (push-mark (point) t t
)
356 (goto-char (point-max))
357 (let (org-list-demote-modify-bullet) (org-indent-item-tree))
358 (should (equal (buffer-string)
367 (ert-deftest test-org-list
/outdent-item
()
368 "Test `org-outdent-item' specifications."
369 ;; 1. Error when not at an item.
370 (org-test-with-temp-text "Paragraph."
371 (should-error (org-outdent-item)))
372 ;; 2. Error when trying to move first item of a list.
373 (org-test-with-temp-text "
377 (should-error (org-outdent-item)))
378 ;; 3. Error when trying to outdent an item without its children.
379 (org-test-with-temp-text "
383 (search-forward "- Item 1.1")
384 (should-error (org-outdent-item)))
385 ;; 4. Error when trying to outdent before top item.
386 (org-test-with-temp-text "
389 (search-forward "- Item 2")
390 (should-error (org-outdent-item)))
391 ;; 5. When a region is selected, outdent every item within.
392 (org-test-with-temp-text "
397 (search-forward "- Item 2")
399 (transient-mark-mode 1)
400 (push-mark (point) t t
)
401 (goto-char (point-max))
402 (let (org-list-demote-modify-bullet) (org-outdent-item))
403 (should (equal (buffer-string)
410 (ert-deftest test-org-list
/outdent-item-tree
()
411 "Test `org-outdent-item-tree' specifications."
412 ;; 1. Error when not at an item.
413 (org-test-with-temp-text "Paragraph."
414 (should-error (org-outdent-item-tree)))
415 ;; 2. Error when trying to outdent before top item.
416 (org-test-with-temp-text "
419 (search-forward "- Item 2")
420 (should-error (org-outdent-item-tree)))
421 ;; 3. Outdent item along with its children.
422 (org-test-with-temp-text "
426 (search-forward "- Item 2")
427 (org-outdent-item-tree)
428 (should (equal (buffer-string)
433 ;; 3. Special case: When outdenting top item, move the whole list.
434 (org-test-with-temp-text "
437 (search-forward "- Item 1")
438 (let (org-odd-levels-only) (org-outdent-item-tree))
439 (should (equal (buffer-string)
443 ;; 5. When a region is selected, outdent every item within.
444 (org-test-with-temp-text "
451 (search-forward "- Item 2")
453 (transient-mark-mode 1)
454 (push-mark (point) t t
)
455 (goto-char (point-max))
456 (org-outdent-item-tree)
457 (should (equal (buffer-string)
466 (ert-deftest test-org-list
/move-item-down
()
467 "Test `org-move-item-down' specifications."
469 (org-test-with-temp-text "- item 1\n- item 2"
471 (should (equal (buffer-string)
472 "- item 2\n- item 1")))
473 ;; Keep same column in item.
474 (org-test-with-temp-text "- item 1\n- item 2"
477 (should (looking-at "em 1")))
479 (org-test-with-temp-text "- item 1\n - sub-item 1\n- item 2"
481 (should (equal (buffer-string)
482 "- item 2\n- item 1\n - sub-item 1")))
483 ;; Preserve blank lines.
486 "- item 2\n\n- item 1"
487 (org-test-with-temp-text "- item 1\n\n- item 2"
490 ;; Error when trying to move the last item...
491 (org-test-with-temp-text "- item 1\n- item 2"
493 (should-error (org-move-item-down)))
494 ;; ... unless `org-list-use-circular-motion' is non-nil. In this
495 ;; case, move to the first item.
496 (org-test-with-temp-text "- item 1\n- item 2\n- item 3"
498 (let ((org-list-use-circular-motion t
)) (org-move-item-down))
499 (should (equal (buffer-string) "- item 3\n- item 1\n- item 2\n")))
500 ;; Preserve item visibility.
501 (org-test-with-temp-text "* Headline\n- item 1\n body 1\n- item 2\n body 2"
502 (let ((org-cycle-include-plain-lists t
))
503 (search-forward "- item 1")
505 (search-forward "- item 2")
507 (search-backward "- item 1")
510 (should (org-invisible-p2))
511 (search-backward " body 2")
512 (should (org-invisible-p2)))
513 ;; Preserve children visibility.
514 (org-test-with-temp-text "* Headline
521 (let ((org-cycle-include-plain-lists t
))
522 (search-forward "- sub-item 1")
524 (search-forward "- sub-item 2")
526 (search-backward "- item 1")
528 (search-forward "sub-body 1")
529 (should (org-invisible-p2))
530 (search-backward "sub-body 2")
531 (should (org-invisible-p2)))
532 ;; Preserve contents visibility.
533 (org-test-with-temp-text "
543 (search-forward "- item 1")
545 (search-forward "Text1")
546 (should (org-invisible-p2))
547 (search-backward "Text2")
548 (should (org-invisible-p2))))
550 (ert-deftest test-org-list
/move-item-up
()
551 "Test `org-move-item-up' specifications."
553 (org-test-with-temp-text "- item 1\n- item 2"
556 (should (equal (buffer-string)
557 "- item 2\n- item 1")))
558 ;; Keep same column in item.
559 (org-test-with-temp-text "- item 1\n- item 2"
563 (should (looking-at "em 2")))
565 (org-test-with-temp-text "- item 1\n- item 2\n - sub-item 2"
568 (should (equal (buffer-string)
569 "- item 2\n - sub-item 2\n- item 1")))
570 ;; Preserve blank lines.
573 "- item 2\n\n- item 1"
574 (org-test-with-temp-text "- item 1\n\n- item 2"
575 (search-forward "- item 2")
578 ;; Error when trying to move the first item...
579 (org-test-with-temp-text "- item 1\n- item 2"
580 (should-error (org-move-item-up)))
581 ;; ... unless `org-list-use-circular-motion' is non-nil. In this
582 ;; case, move to the first item.
583 (org-test-with-temp-text "- item 1\n- item 2\n- item 3"
584 (let ((org-list-use-circular-motion t
)) (org-move-item-up))
585 (should (equal (buffer-string) "- item 2\n- item 3\n- item 1")))
586 ;; Preserve item visibility.
587 (org-test-with-temp-text "* Headline\n- item 1\n body 1\n- item 2\n body 2"
588 (let ((org-cycle-include-plain-lists t
))
589 (search-forward "- item 1")
591 (search-forward "- item 2")
595 (should (org-invisible-p2))
596 (search-forward " body 1")
597 (should (org-invisible-p2)))
598 ;; Preserve children visibility.
599 (org-test-with-temp-text "* Headline
606 (let ((org-cycle-include-plain-lists t
))
607 (search-forward "- sub-item 1")
609 (search-forward "- sub-item 2")
611 (search-backward "- item 2")
613 (search-forward "sub-body 2")
614 (should (org-invisible-p2))
615 (search-forward "sub-body 1")
616 (should (org-invisible-p2)))
617 ;; Preserve contents visibility.
618 (org-test-with-temp-text "
628 (search-forward "- item 2")
630 (search-forward "Text2")
631 (should (org-invisible-p2))
632 (search-forward "Text1")
633 (should (org-invisible-p2))))
635 (ert-deftest test-org-list
/insert-item
()
636 "Test item insertion."
637 ;; Blank lines specifications.
639 ;; Non-nil `org-blank-before-new-entry': insert a blank line.
641 (org-test-with-temp-text "- a"
642 (let ((org-blank-before-new-entry '((plain-list-item . t
))))
647 ;; Nil `org-blank-before-new-entry': do not insert a blank line.
649 (org-test-with-temp-text "- a"
650 (let ((org-blank-before-new-entry '((plain-list-item . nil
))))
655 ;; `org-blank-before-new-entry' set to auto: if there's no blank
656 ;; line already in the sole item, do not insert one.
658 (org-test-with-temp-text "- a"
659 (let ((org-blank-before-new-entry '((plain-list-item . auto
))))
664 ;; `org-blank-before-new-entry' set to `auto': if there's a blank
665 ;; line in the sole item, insert another one.
667 (org-test-with-temp-text "- a\n\n b<point>"
668 (let ((org-blank-before-new-entry '((plain-list-item . auto
))))
672 ;; `org-blank-before-new-entry' set to `auto': if the user specified
673 ;; a blank line, preserve it.
675 (org-test-with-temp-text "- a\n\n<point>"
676 (let ((org-blank-before-new-entry '((plain-list-item . auto
))))
680 ;; `org-blank-before-new-entry' set to `auto': if some items in list
681 ;; are already separated by blank lines, insert one.
683 (org-test-with-temp-text "- a\n\n- b<point>"
684 (let ((org-blank-before-new-entry '((plain-list-item . auto
))))
689 (org-test-with-temp-text "- a\n\n- b"
690 (let ((org-blank-before-new-entry '((plain-list-item . auto
))))
695 (org-test-with-temp-text
696 "- a\n #+BEGIN_EXAMPLE\n\n x\n #+END_EXAMPLE<point>"
697 (let ((org-blank-before-new-entry '((plain-list-item . auto
))))
701 ;; When called before or on the bullet, insert new item before
705 (org-test-with-temp-text "- item"
710 (org-test-with-temp-text "- <point>item"
713 ;; When called on tag in a descriptive list, insert new item before
716 (equal "- :: \n- tag :: item"
717 (org-test-with-temp-text "- tag <point>:: item"
721 (equal "- :: \n- tag :: item"
722 (org-test-with-temp-text "- ta<point>g :: item"
725 ;; Further, it splits the line or add a blank new item after it,
726 ;; according to `org-M-RET-may-split-line'.
729 (org-test-with-temp-text "- it<point>em"
730 (let ((org-M-RET-may-split-line '((default . t
))))
735 (org-test-with-temp-text "- it<point>em"
736 (let ((org-M-RET-may-split-line '((default . nil
))))
740 (ert-deftest test-org-list
/repair
()
741 "Test `org-list-repair' specifications."
742 ;; Repair indentation.
744 (equal "- item\n - child"
745 (org-test-with-temp-text "- item\n - child"
746 (let ((org-list-indent-offset 0)) (org-list-repair))
748 ;; Repair bullets and numbering.
751 (org-test-with-temp-text "- a\n+ b"
752 (let ((org-list-indent-offset 0))
757 (org-test-with-temp-text "1. a\n1. b"
758 (let ((org-list-indent-offset 0)
759 (org-plain-list-ordered-item-terminator t
))
762 ;; Repair check-boxes.
764 (equal "- [X] item\n - [X] child"
765 (org-test-with-temp-text "- [ ] item\n - [X] child"
766 (let ((org-list-indent-offset 0))
769 ;; Special case: do not move contents of an item within its child.
770 ;; Yet, preserve indentation differences within contents.
772 (equal "- item\n - child\n within item"
773 (org-test-with-temp-text "- item\n - child\n within item"
774 (let ((org-list-indent-offset 0)) (org-list-repair))
778 "- item\n - child\n within item\n indented"
779 (org-test-with-temp-text
780 "- item\n - child\n within item\n indented"
781 (let ((org-list-indent-offset 0)) (org-list-repair))
784 (ert-deftest test-org-list
/update-checkbox-count
()
785 "Test `org-update-checkbox-count' specifications."
788 (string-match "\\[0/1\\]"
789 (org-test-with-temp-text "* [/]\n- [ ] item"
790 (org-update-checkbox-count)
793 (string-match "\\[1/1\\]"
794 (org-test-with-temp-text "* [/]\n- [X] item"
795 (org-update-checkbox-count)
798 (string-match "\\[100%\\]"
799 (org-test-with-temp-text "* [%]\n- [X] item"
800 (org-update-checkbox-count)
802 ;; From a list or a sub-list.
804 (string-match "\\[0/1\\]"
805 (org-test-with-temp-text "- [/]\n - [ ] item"
806 (org-update-checkbox-count)
809 (string-match "\\[1/1\\]"
810 (org-test-with-temp-text "- [/]\n - [X] item"
811 (org-update-checkbox-count)
814 (string-match "\\[100%\\]"
815 (org-test-with-temp-text "- [%]\n - [X] item"
816 (org-update-checkbox-count)
821 (org-test-with-temp-text "- [ ] item 1\n- [ ] item 2 [/]\n - [X] sub 1"
822 (org-update-checkbox-count)
824 ;; Count do not apply to sub-lists unless count is not hierarchical.
825 ;; This state can be achieved with COOKIE_DATA node property set to
828 (string-match "\\[1/1\\]"
829 (org-test-with-temp-text "- [/]\n - item\n - [X] sub-item"
830 (let ((org-checkbox-hierarchical-statistics nil
))
831 (org-update-checkbox-count))
834 (string-match "\\[1/1\\]"
835 (org-test-with-temp-text "
838 :COOKIE_DATA: recursive
843 (org-update-checkbox-count)
846 (string-match "\\[0/0\\]"
847 (org-test-with-temp-text "- [/]\n - item\n - [ ] sub-item"
848 (org-update-checkbox-count)
850 ;; With optional argument ALL, update all buffer.
853 (org-test-with-temp-text "* [/]\n- [X] item\n* [/]\n- [X] item"
854 (org-update-checkbox-count t
)
855 (count-matches "\\[1/1\\]"))))
856 ;; Ignore boxes in drawers, blocks or inlinetasks when counting from
859 (string-match "\\[2/2\\]"
860 (org-test-with-temp-text "
867 (let ((org-checkbox-hierarchical-statistics nil
))
868 (org-update-checkbox-count))
875 (ert-deftest test-org-list
/toggle-item
()
876 "Test `org-toggle-item' specifications."
877 ;; Convert normal lines to items.
880 (org-test-with-temp-text "line"
881 (org-toggle-item nil
)
883 ;; Convert items to normal lines.
886 (org-test-with-temp-text "- line"
887 (org-toggle-item nil
)
889 ;; Convert headlines to items.
892 (org-test-with-temp-text "* line"
893 (org-toggle-item nil
)
895 ;; When converting a headline to a list item, TODO keywords become
899 (org-test-with-temp-text "* DONE line"
900 (org-toggle-item nil
)
904 (org-test-with-temp-text "* TODO line"
905 (org-toggle-item nil
)
907 ;; When a region is marked and first line is a headline, all
908 ;; headlines are turned into items.
911 (org-test-with-temp-text "* H1\n** H2"
912 (transient-mark-mode 1)
913 (push-mark (point) t t
)
914 (goto-char (point-max))
915 (org-toggle-item nil
)
918 (equal "- [ ] H1\n - [ ] H2"
919 (org-test-with-temp-text "* TODO H1\n** TODO H2"
920 (transient-mark-mode 1)
921 (push-mark (point) t t
)
922 (goto-char (point-max))
923 (org-toggle-item nil
)
925 ;; When turning headlines into items, make sure headings contents
926 ;; are kept within items.
929 (org-test-with-temp-text "* H1\nText"
930 (transient-mark-mode 1)
931 (push-mark (point) t t
)
932 (goto-char (point-max))
933 (org-toggle-item nil
)
935 ;; When a region is marked and first line is an item, all items are
936 ;; turned into normal lines.
939 (org-test-with-temp-text "- 1\n - 2"
940 (transient-mark-mode 1)
941 (push-mark (point) t t
)
942 (goto-char (point-max))
943 (org-toggle-item nil
)
947 (org-test-with-temp-text "- 1\n2"
948 (transient-mark-mode 1)
949 (push-mark (point) t t
)
950 (goto-char (point-max))
951 (org-toggle-item nil
)
953 ;; When a region is marked and first line is an item, all normal
954 ;; lines are turned into items.
956 (equal "- line 1\n- line 2"
957 (org-test-with-temp-text "line 1\nline 2"
958 (transient-mark-mode 1)
959 (push-mark (point) t t
)
960 (goto-char (point-max))
961 (org-toggle-item nil
)
964 (equal "- line 1\n- line 2"
965 (org-test-with-temp-text "line 1\n- line 2"
966 (transient-mark-mode 1)
967 (push-mark (point) t t
)
968 (goto-char (point-max))
969 (org-toggle-item nil
)
971 ;; When argument ARG is non-nil, change the whole region into
974 (equal "- line 1\n line 2"
975 (org-test-with-temp-text "line 1\nline 2"
976 (transient-mark-mode 1)
977 (push-mark (point) t t
)
978 (goto-char (point-max))
985 (ert-deftest test-org-list
/send-list
()
986 "Test various checks for `org-list-send-list'."
987 ;; Error when not at a list item.
989 (org-test-with-temp-text "Not a list item"
990 (org-list-send-list)))
991 ;; Error when ORGLST line is not provided.
993 (org-test-with-temp-text "- item"
994 (org-list-send-list)))
995 ;; Error when transformation function is unknown.
997 (org-test-with-temp-text "@ignore
998 #+ORGLST: SEND list unknown-function
1002 (org-list-send-list)))
1003 ;; Error when receiving location is not defined.
1005 (org-test-with-temp-text "@ignore
1006 #+ORGLST: SEND list org-list-to-texinfo
1010 (org-list-send-list)))
1011 ;; Error when insertion region is ill-formed.
1013 (org-test-with-temp-text "@c BEGIN RECEIVE ORGLST list
1015 #+ORGLST: SEND list org-list-to-texinfo
1019 (org-list-send-list)))
1020 ;; Allow multiple receiver locations.
1022 (org-test-with-temp-text "
1023 @c BEGIN RECEIVE ORGLST list
1024 @c END RECEIVE ORGLST list
1027 #+ORGLST: SEND list org-list-to-texinfo
1028 <point>- item contents
1031 @c BEGIN RECEIVE ORGLST list
1032 @c END RECEIVE ORGLST list"
1033 (org-list-send-list)
1034 (goto-char (point-min))
1035 (search-forward "item contents" nil t
3))))
1037 (ert-deftest test-org-list
/to-generic
()
1038 "Test `org-list-to-generic' specifications."
1039 ;; Test `:ustart' and `:uend' parameters.
1043 (org-test-with-temp-text "- a"
1044 (org-list-to-generic (org-list-to-lisp) '(:ustart
"begin")))))
1048 (org-test-with-temp-text "1. a"
1049 (org-list-to-generic (org-list-to-lisp) '(:ustart
"begin")))))
1053 (org-test-with-temp-text "- a"
1054 (org-list-to-generic (org-list-to-lisp) '(:uend
"end")))))
1058 (org-test-with-temp-text "1. a"
1059 (org-list-to-generic (org-list-to-lisp) '(:uend
"end")))))
1062 "begin l1\na\nbegin l2\nb\nend l2\nend l1"
1063 (org-test-with-temp-text "- a\n - b"
1064 (org-list-to-generic
1066 (list :ustart
(lambda (l) (format "begin l%d" l
))
1067 :uend
(lambda (l) (format "end l%d" l
)))))))
1068 ;; Test `:ostart' and `:oend' parameters.
1072 (org-test-with-temp-text "1. a"
1073 (org-list-to-generic (org-list-to-lisp) '(:ostart
"begin")))))
1077 (org-test-with-temp-text "- a"
1078 (org-list-to-generic (org-list-to-lisp) '(:ostart
"begin")))))
1082 (org-test-with-temp-text "1. a"
1083 (org-list-to-generic (org-list-to-lisp) '(:oend
"end")))))
1087 (org-test-with-temp-text "- a"
1088 (org-list-to-generic (org-list-to-lisp) '(:oend
"end")))))
1091 "begin l1\na\nbegin l2\nb\nend l2\nend l1"
1092 (org-test-with-temp-text "1. a\n 1. b"
1093 (org-list-to-generic
1095 (list :ostart
(lambda (l) (format "begin l%d" l
))
1096 :oend
(lambda (l) (format "end l%d" l
)))))))
1097 ;; Test `:dstart' and `:dend' parameters.
1101 (org-test-with-temp-text "- tag :: a"
1102 (org-list-to-generic (org-list-to-lisp) '(:dstart
"begin")))))
1106 (org-test-with-temp-text "- a"
1107 (org-list-to-generic (org-list-to-lisp) '(:dstart
"begin")))))
1111 (org-test-with-temp-text "- tag :: a"
1112 (org-list-to-generic (org-list-to-lisp) '(:dend
"end")))))
1116 (org-test-with-temp-text "- a"
1117 (org-list-to-generic (org-list-to-lisp) '(:dend
"end")))))
1120 "begin l1\ntag1a\nbegin l2\ntag2b\nend l2\nend l1"
1121 (org-test-with-temp-text "- tag1 :: a\n - tag2 :: b"
1122 (org-list-to-generic
1124 (list :dstart
(lambda (l) (format "begin l%d" l
))
1125 :dend
(lambda (l) (format "end l%d" l
)))))))
1126 ;; Test `:dtstart', `:dtend', `:ddstart' and `:ddend' parameters.
1130 (org-test-with-temp-text "- tag :: a"
1131 (org-list-to-generic (org-list-to-lisp) '(:dtstart
">" :dtend
"<")))))
1135 (org-test-with-temp-text "- tag :: a"
1136 (org-list-to-generic (org-list-to-lisp) '(:ddstart
">" :ddend
"<")))))
1137 ;; Test `:istart' and `:iend' parameters.
1141 (org-test-with-temp-text "- a"
1142 (org-list-to-generic (org-list-to-lisp) '(:istart
"start")))))
1145 "level1 a\nlevel2 b"
1146 (org-test-with-temp-text "- a\n - b"
1147 (org-list-to-generic (org-list-to-lisp)
1148 '(:istart
(lambda (l) (format "level%d "l
)))))))
1152 (org-test-with-temp-text "- a\n - b"
1153 (org-list-to-generic (org-list-to-lisp)
1154 '(:iend
(lambda (l) (format "level%d" l
)))))))
1155 ;; Test `:icount' parameter.
1159 (org-test-with-temp-text "1. [@3] a"
1160 (org-list-to-generic (org-list-to-lisp) '(:icount
"count")))))
1164 (org-test-with-temp-text "1. a"
1165 (org-list-to-generic (org-list-to-lisp) '(:icount
"count")))))
1169 (org-test-with-temp-text "1. [@3] a"
1170 (org-list-to-generic (org-list-to-lisp)
1171 '(:icount
"count" :istart
"start")))))
1174 "level:1, counter:3 a"
1175 (org-test-with-temp-text "1. [@3] a"
1176 (org-list-to-generic
1178 '(:icount
(lambda (l c
) (format "level:%d, counter:%d " l c
)))))))
1179 ;; Test `:isep' parameter.
1183 (org-test-with-temp-text "- a\n- b"
1184 (org-list-to-generic (org-list-to-lisp) '(:isep
"--")))))
1188 (org-test-with-temp-text "- a\n - b"
1189 (org-list-to-generic (org-list-to-lisp) '(:isep
"--")))))
1193 (org-test-with-temp-text "- a\n- b"
1194 (org-list-to-generic (org-list-to-lisp)
1195 '(:isep
(lambda (l) (format "- %d -" l
)))))))
1196 ;; Test `:cbon', `:cboff', `:cbtrans'
1200 (org-test-with-temp-text "- [X] a"
1201 (org-list-to-generic (org-list-to-lisp) '(:cbon
"!")))))
1205 (org-test-with-temp-text "- [X] a"
1206 (org-list-to-generic (org-list-to-lisp) '(:cboff
"!" :cbtrans
"!")))))
1210 (org-test-with-temp-text "- [ ] a"
1211 (org-list-to-generic (org-list-to-lisp) '(:cboff
"!")))))
1215 (org-test-with-temp-text "- [ ] a"
1216 (org-list-to-generic (org-list-to-lisp) '(:cbon
"!" :cbtrans
"!")))))
1220 (org-test-with-temp-text "- [-] a"
1221 (org-list-to-generic (org-list-to-lisp) '(:cbtrans
"!")))))
1225 (org-test-with-temp-text "- [-] a"
1226 (org-list-to-generic (org-list-to-lisp) '(:cbon
"!" :cboff
"!")))))
1227 ;; Test `:splice' parameter.
1231 (org-test-with-temp-text "- a"
1232 (org-list-to-generic (org-list-to-lisp)
1233 '(:ustart
"begin" :uend
"end" :splice t
)))))
1234 ;; No error on empty lists.
1236 (org-test-with-temp-text "-" (org-list-to-generic (org-list-to-lisp) nil
))))
1238 (ert-deftest test-org-list
/to-html
()
1239 "Test `org-list-to-html' specifications."
1241 (equal "<ul class=\"org-ul\">\n<li>a</li>\n</ul>"
1242 (let (org-html-indent)
1244 (insert "<!-- BEGIN RECEIVE ORGLST name -->
1245 <!-- END RECEIVE ORGLST name -->
1247 #+ORGLST: SEND name org-list-to-html
1250 (goto-char (point-min))
1251 (re-search-forward "^- a" nil t
)
1253 (org-list-send-list)
1255 (buffer-substring-no-properties
1257 (progn (re-search-forward "^<!-- END" nil t
)
1259 (skip-chars-backward " \r\t\n")
1262 (ert-deftest test-org-list
/to-latex
()
1263 "Test `org-list-to-latex' specifications."
1265 (equal "\\begin{itemize}\n\\item a\n\\end{itemize}"
1267 (insert "% BEGIN RECEIVE ORGLST name
1268 % END RECEIVE ORGLST name
1270 #+ORGLST: SEND name org-list-to-latex
1273 (goto-char (point-min))
1274 (re-search-forward "^- a" nil t
)
1276 (org-list-send-list)
1278 (buffer-substring-no-properties
1280 (progn (re-search-forward "^% END" nil t
)
1282 (skip-chars-backward " \r\t\n")
1285 (ert-deftest test-org-list
/to-texinfo
()
1286 "Test `org-list-to-texinfo' specifications."
1288 (equal "@itemize\n@item\na\n@end itemize"
1290 (insert "@c BEGIN RECEIVE ORGLST name
1291 @c END RECEIVE ORGLST name
1293 #+ORGLST: SEND name org-list-to-texinfo
1296 (goto-char (point-min))
1297 (re-search-forward "^- a" nil t
)
1299 (org-list-send-list)
1301 (buffer-substring-no-properties
1303 (progn (re-search-forward "^@c END" nil t
)
1305 (skip-chars-backward " \r\t\n")
1309 (provide 'test-org-list
)
1310 ;;; test-org-list.el ends here