ox-org: Fix footnotes export, part 2
[org-mode.git] / testing / lisp / test-org-list.el
blob882c167fe5c64334d89467d8211a0733dbf51cda
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/>.
20 ;;; Code:
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"
26 (goto-line 4)
27 (should-not (org-in-item-p)))
28 ;; With text less indented than top items.
29 (org-test-with-temp-text "- item\nText"
30 (goto-line 2)
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"
35 (goto-line 7)
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 "
41 - item A
42 - item B
45 - item 1
46 - item 1.1
47 - item 1.2
48 - item 1.3
49 - item 2
52 - item X
53 - item Y"
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'
59 ;; is non-nil.
60 (goto-line 9)
61 (should-error (org-next-item))
62 (let ((org-list-use-circular-motion t))
63 (should (progn (org-next-item) t)))
64 (goto-line 14)
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.
69 (goto-line 6)
70 (org-next-item)
71 (should (looking-at "- item 2"))
72 ;; 1.3. Shouldn't move to another list.
73 (goto-line 3)
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))
79 (goto-line 10)
80 (org-next-item)
81 (should (looking-at "- item 1"))
82 (goto-line 9)
83 (org-next-item)
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
89 ;; non-nil.
90 (goto-line 7)
91 (should-error (org-previous-item))
92 (let ((org-list-use-circular-motion t))
93 (should (progn (org-previous-item) t)))
94 (goto-line 13)
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.
99 (goto-line 10)
100 (org-previous-item)
101 (should (looking-at "- item 1"))
102 ;; 2.3. Shouldn't move to another list.
103 (goto-line 6)
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))
109 (goto-line 6)
110 (org-previous-item)
111 (should (looking-at "- item 2"))
112 (goto-line 7)
113 (org-previous-item)
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.
119 (should-error
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.
135 (should
136 (equal "1. item"
137 (org-test-with-temp-text "- item"
138 (let ((org-plain-list-ordered-item-terminator t))
139 (org-cycle-list-bullet "1.")
140 (buffer-string)))))
141 ;; Argument is an integer N: cycle to the Nth allowed bullet.
142 (should
143 (equal "+ item"
144 (org-test-with-temp-text "1. item"
145 (let ((org-plain-list-ordered-item-terminator t))
146 (org-cycle-list-bullet 1)
147 (buffer-string)))))
148 ;; Argument is `previous': cycle backwards.
149 (should
150 (equal "- item"
151 (org-test-with-temp-text "+ item"
152 (let ((org-plain-list-ordered-item-terminator t))
153 (org-cycle-list-bullet 'previous)
154 (buffer-string)))))
155 ;; Do not cycle to "*" bullets when item is at column 0.
156 (should
157 (equal "1. item"
158 (org-test-with-temp-text "+ item"
159 (let ((org-plain-list-ordered-item-terminator t))
160 (org-cycle-list-bullet)
161 (buffer-string)))))
162 ;; Do not cycle to numbered bullets in a description list.
163 (should-not
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)
168 (buffer-string)))))
169 ;; Do not cycle to ordered item terminators if they are not allowed
170 ;; in `org-plain-list-ordered-item-terminator'.
171 (should
172 (equal " 1) item"
173 (org-test-with-temp-text " * item"
174 (let ((org-plain-list-ordered-item-terminator 41))
175 (org-cycle-list-bullet)
176 (buffer-string)))))
177 ;; When `org-list-allow-alphabetical' is non-nil, cycle to alpha bullets.
178 (should
179 (equal "a. item"
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)
184 (buffer-string)))))
185 ;; Do not cycle to alpha bullets when list has more than 26
186 ;; elements.
187 (should-not
188 (equal "a. item 1"
189 (org-test-with-temp-text "1) item 1
190 2) item 2
191 3) item 3
192 4) item 4
193 5) item 5
194 6) item 6
195 7) item 7
196 8) item 8
197 9) item 9
198 10) item 10
199 11) item 11
200 12) item 12
201 13) item 13
202 14) item 14
203 15) item 15
204 16) item 16
205 17) item 17
206 18) item 18
207 19) item 19
208 20) item 20
209 21) item 21
210 22) item 22
211 23) item 23
212 24) item 24
213 25) item 25
214 26) item 26
215 27) item 27"
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 "
228 - Item 1
229 - Item 2"
230 (forward-line)
231 (should-error (org-indent-item)))
232 ;; 3. Indent a single item, not its children.
233 (org-test-with-temp-text "
234 - Item 1
235 - Item 2
236 - Item 2.1"
237 (search-forward "- Item 2")
238 (let (org-list-demote-modify-bullet) (org-indent-item))
239 (should (equal (buffer-string)
241 - Item 1
242 - Item 2
243 - Item 2.1")))
244 ;; 4. Follow `org-list-demote-modify-bullet' specifications.
246 ;; 4.1. With unordered lists.
247 (org-test-with-temp-text "
248 - Item 1
249 - Item 2"
250 (search-forward "- Item 2")
251 (let ((org-list-demote-modify-bullet '(("-" . "+")))) (org-indent-item))
252 (should (equal (buffer-string)
254 - Item 1
255 + Item 2")))
256 ;; 4.2. and ordered lists.
257 (org-test-with-temp-text "
258 1. Item 1
259 2. Item 2"
260 (search-forward "2. Item 2")
261 (let ((org-plain-list-ordered-item-terminator t)
262 (org-list-demote-modify-bullet '(("1." . "+"))))
263 (org-indent-item))
264 (should (equal (buffer-string)
266 1. Item 1
267 + Item 2")))
268 ;; 5. When a region is selected, indent every item within.
269 (org-test-with-temp-text "
270 - Item 1
271 - Item 2
272 - Item 3
274 (search-forward "- Item 2")
275 (beginning-of-line)
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)
282 - Item 1
283 - Item 2
284 - Item 3
285 "))))
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 "
294 - Item 1
295 - Item 2
296 - Item 2.1"
297 (search-forward "- Item 2")
298 (let (org-list-demote-modify-bullet) (org-indent-item-tree))
299 (should (equal (buffer-string)
301 - Item 1
302 - Item 2
303 - Item 2.1")))
304 ;; 3. Special case: When indenting top item, move the whole list.
305 (org-test-with-temp-text "
306 - Item 1
307 - Item 2"
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)
313 - Item 1
314 - Item 2")))
315 ;; 4. Follow `org-list-demote-modify-bullet' specifications.
317 ;; 4.1. With unordered lists.
318 (org-test-with-temp-text "
319 - Item 1
320 - Item 2
321 + Item 2.1"
322 (search-forward "- Item 2")
323 (let ((org-list-demote-modify-bullet '(("-" . "+") ("+" . "-"))))
324 (org-indent-item-tree))
325 (should (equal (buffer-string)
327 - Item 1
328 + Item 2
329 - Item 2.1")))
330 ;; 4.2. and ordered lists.
331 (org-test-with-temp-text "
332 1. Item 1
333 2. Item 2
334 + Item 2.1"
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)
341 1. Item 1
342 + Item 2
343 1. Item 2.1")))
344 ;; 5. When a region is selected, indent every item within.
345 (org-test-with-temp-text "
346 - Item 1
347 - Item 2
348 - Item 2.1
349 - Item 3
350 - Item 3.1
352 (search-forward "- Item 2")
353 (beginning-of-line)
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)
360 - Item 1
361 - Item 2
362 - Item 2.1
363 - Item 3
364 - Item 3.1
365 "))))
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 "
374 - Item 1
375 - Item 2"
376 (forward-line)
377 (should-error (org-outdent-item)))
378 ;; 3. Error when trying to outdent an item without its children.
379 (org-test-with-temp-text "
380 - Item 1
381 - Item 1.1
382 - Item 1.1.1"
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 "
387 - Item 1
388 - Item 2"
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 "
393 - Item 1
394 - Item 2
395 - Item 3
397 (search-forward "- Item 2")
398 (beginning-of-line)
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)
405 - Item 1
406 - Item 2
407 - Item 3
408 "))))
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 "
417 - Item 1
418 - Item 2"
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 "
423 - Item 1
424 - Item 2
425 - Item 2.1"
426 (search-forward "- Item 2")
427 (org-outdent-item-tree)
428 (should (equal (buffer-string)
430 - Item 1
431 - Item 2
432 - Item 2.1")))
433 ;; 3. Special case: When outdenting top item, move the whole list.
434 (org-test-with-temp-text "
435 - Item 1
436 - Item 2"
437 (search-forward "- Item 1")
438 (let (org-odd-levels-only) (org-outdent-item-tree))
439 (should (equal (buffer-string)
441 - Item 1
442 - Item 2")))
443 ;; 5. When a region is selected, outdent every item within.
444 (org-test-with-temp-text "
445 - Item 1
446 - Item 2
447 - Item 2.1
448 - Item 3
449 - Item 3.1
451 (search-forward "- Item 2")
452 (beginning-of-line)
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)
459 - Item 1
460 - Item 2
461 - Item 2.1
462 - Item 3
463 - Item 3.1
464 "))))
466 (ert-deftest test-org-list/move-item-down ()
467 "Test `org-move-item-down' specifications."
468 ;; Standard test.
469 (org-test-with-temp-text "- item 1\n- item 2"
470 (org-move-item-down)
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"
475 (forward-char 4)
476 (org-move-item-down)
477 (should (looking-at "em 1")))
478 ;; Move sub-items.
479 (org-test-with-temp-text "- item 1\n - sub-item 1\n- item 2"
480 (org-move-item-down)
481 (should (equal (buffer-string)
482 "- item 2\n- item 1\n - sub-item 1")))
483 ;; Preserve blank lines.
484 (should
485 (equal
486 "- item 2\n\n- item 1"
487 (org-test-with-temp-text "- item 1\n\n- item 2"
488 (org-move-item-down)
489 (buffer-string))))
490 ;; Error when trying to move the last item...
491 (org-test-with-temp-text "- item 1\n- item 2"
492 (forward-line)
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"
497 (forward-line 2)
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")
504 (org-cycle)
505 (search-forward "- item 2")
506 (org-cycle))
507 (search-backward "- item 1")
508 (org-move-item-down)
509 (forward-line)
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
515 - item 1
516 - sub-item 1
517 sub-body 1
518 - item 2
519 - sub-item 2
520 sub-body 2"
521 (let ((org-cycle-include-plain-lists t))
522 (search-forward "- sub-item 1")
523 (org-cycle)
524 (search-forward "- sub-item 2")
525 (org-cycle))
526 (search-backward "- item 1")
527 (org-move-item-down)
528 (search-forward "sub-body 1")
529 (should (org-invisible-p2))
530 (search-backward "sub-body 2")
531 (should (org-invisible-p2))))
533 (ert-deftest test-org-list/move-item-down-contents-visibility ()
534 "Preserve contents visibility."
535 (org-test-with-temp-text "
536 - item 1
537 #+BEGIN_CENTER
538 Text1
539 #+END_CENTER
540 - item 2
541 #+BEGIN_CENTER
542 Text2
543 #+END_CENTER"
544 (org-hide-block-all)
545 (let ((invisible-property-1
546 (progn
547 (search-forward "Text1")
548 (get-char-property (point) 'invisible)))
549 (invisible-property-2
550 (progn
551 (search-forward "Text2")
552 (get-char-property (point) 'invisible))))
553 (goto-char (point-min))
554 (search-forward "- item 1")
555 (org-move-item-down)
556 (search-forward "Text1")
557 (should (eq invisible-property-1 (get-char-property (point) 'invisible)))
558 (search-backward "Text2")
559 (should (eq invisible-property-2 (get-char-property (point) 'invisible))))))
561 (ert-deftest test-org-list/move-item-up ()
562 "Test `org-move-item-up' specifications."
563 ;; Standard test.
564 (org-test-with-temp-text "- item 1\n- item 2"
565 (forward-line)
566 (org-move-item-up)
567 (should (equal (buffer-string)
568 "- item 2\n- item 1")))
569 ;; Keep same column in item.
570 (org-test-with-temp-text "- item 1\n- item 2"
571 (forward-line)
572 (forward-char 4)
573 (org-move-item-up)
574 (should (looking-at "em 2")))
575 ;; Move sub-items.
576 (org-test-with-temp-text "- item 1\n- item 2\n - sub-item 2"
577 (forward-line)
578 (org-move-item-up)
579 (should (equal (buffer-string)
580 "- item 2\n - sub-item 2\n- item 1")))
581 ;; Preserve blank lines.
582 (should
583 (equal
584 "- item 2\n\n- item 1"
585 (org-test-with-temp-text "- item 1\n\n- item 2"
586 (search-forward "- item 2")
587 (org-move-item-up)
588 (buffer-string))))
589 ;; Error when trying to move the first item...
590 (org-test-with-temp-text "- item 1\n- item 2"
591 (should-error (org-move-item-up)))
592 ;; ... unless `org-list-use-circular-motion' is non-nil. In this
593 ;; case, move to the first item.
594 (org-test-with-temp-text "- item 1\n- item 2\n- item 3"
595 (let ((org-list-use-circular-motion t)) (org-move-item-up))
596 (should (equal (buffer-string) "- item 2\n- item 3\n- item 1")))
597 ;; Preserve item visibility.
598 (org-test-with-temp-text "* Headline\n- item 1\n body 1\n- item 2\n body 2"
599 (let ((org-cycle-include-plain-lists t))
600 (search-forward "- item 1")
601 (org-cycle)
602 (search-forward "- item 2")
603 (org-cycle))
604 (org-move-item-up)
605 (forward-line)
606 (should (org-invisible-p2))
607 (search-forward " body 1")
608 (should (org-invisible-p2)))
609 ;; Preserve children visibility.
610 (org-test-with-temp-text "* Headline
611 - item 1
612 - sub-item 1
613 sub-body 1
614 - item 2
615 - sub-item 2
616 sub-body 2"
617 (let ((org-cycle-include-plain-lists t))
618 (search-forward "- sub-item 1")
619 (org-cycle)
620 (search-forward "- sub-item 2")
621 (org-cycle))
622 (search-backward "- item 2")
623 (org-move-item-up)
624 (search-forward "sub-body 2")
625 (should (org-invisible-p2))
626 (search-forward "sub-body 1")
627 (should (org-invisible-p2))))
629 (ert-deftest test-org-list/move-item-up-contents-visibility ()
630 (org-test-with-temp-text "
631 - item 1
632 #+BEGIN_CENTER
633 Text1
634 #+END_CENTER
635 - item 2
636 #+BEGIN_CENTER
637 Text2
638 #+END_CENTER"
639 (org-hide-block-all)
640 (let ((invisible-property-1
641 (progn
642 (search-forward "Text1")
643 (get-char-property (point) 'invisible)))
644 (invisible-property-2
645 (progn
646 (search-forward "Text2")
647 (get-char-property (point) 'invisible))))
648 (goto-char (point-min))
649 (search-forward "- item 2")
650 (org-move-item-up)
651 (search-forward "Text2")
652 (should (eq invisible-property-2 (get-char-property (point) 'invisible)))
653 (search-forward "Text1")
654 (should (eq invisible-property-1 (get-char-property (point) 'invisible))))))
656 (ert-deftest test-org-list/insert-item ()
657 "Test item insertion."
658 ;; Blank lines specifications.
660 ;; Non-nil `org-blank-before-new-entry': insert a blank line.
661 (should
662 (org-test-with-temp-text "- a"
663 (let ((org-blank-before-new-entry '((plain-list-item . t))))
664 (end-of-line)
665 (org-insert-item)
666 (forward-line -1)
667 (looking-at "$"))))
668 ;; Nil `org-blank-before-new-entry': do not insert a blank line.
669 (should-not
670 (org-test-with-temp-text "- a"
671 (let ((org-blank-before-new-entry '((plain-list-item . nil))))
672 (end-of-line)
673 (org-insert-item)
674 (forward-line -1)
675 (looking-at "$"))))
676 ;; `org-blank-before-new-entry' set to auto: if there's no blank
677 ;; line already in the sole item, do not insert one.
678 (should-not
679 (org-test-with-temp-text "- a"
680 (let ((org-blank-before-new-entry '((plain-list-item . auto))))
681 (end-of-line)
682 (org-insert-item)
683 (forward-line -1)
684 (looking-at "$"))))
685 ;; `org-blank-before-new-entry' set to `auto': if there's a blank
686 ;; line in the sole item, insert another one.
687 (should
688 (org-test-with-temp-text "- a\n\n b<point>"
689 (let ((org-blank-before-new-entry '((plain-list-item . auto))))
690 (org-insert-item)
691 (forward-line -1)
692 (looking-at "$"))))
693 ;; `org-blank-before-new-entry' set to `auto': if the user specified
694 ;; a blank line, preserve it.
695 (should
696 (org-test-with-temp-text "- a\n\n<point>"
697 (let ((org-blank-before-new-entry '((plain-list-item . auto))))
698 (org-insert-item)
699 (forward-line -1)
700 (looking-at "$"))))
701 ;; `org-blank-before-new-entry' set to `auto': if some items in list
702 ;; are already separated by blank lines, insert one.
703 (should
704 (org-test-with-temp-text "- a\n\n- b<point>"
705 (let ((org-blank-before-new-entry '((plain-list-item . auto))))
706 (org-insert-item)
707 (forward-line -1)
708 (looking-at "$"))))
709 (should
710 (org-test-with-temp-text "- a\n\n- b"
711 (let ((org-blank-before-new-entry '((plain-list-item . auto))))
712 (org-insert-item)
713 (forward-line)
714 (looking-at "$"))))
715 (should
716 (org-test-with-temp-text
717 "- a\n #+BEGIN_EXAMPLE\n\n x\n #+END_EXAMPLE<point>"
718 (let ((org-blank-before-new-entry '((plain-list-item . auto))))
719 (org-insert-item)
720 (forward-line -1)
721 (looking-at "$"))))
722 ;; When called before or on the bullet, insert new item before
723 ;; current one.
724 (should
725 (equal "- \n- item"
726 (org-test-with-temp-text "- item"
727 (org-insert-item)
728 (buffer-string))))
729 (should
730 (equal "- \n- item"
731 (org-test-with-temp-text "- <point>item"
732 (org-insert-item)
733 (buffer-string))))
734 ;; When called on tag in a descriptive list, insert new item before
735 ;; current one too.
736 (should
737 (equal "- :: \n- tag :: item"
738 (org-test-with-temp-text "- tag <point>:: item"
739 (org-insert-item)
740 (buffer-string))))
741 (should
742 (equal "- :: \n- tag :: item"
743 (org-test-with-temp-text "- ta<point>g :: item"
744 (org-insert-item)
745 (buffer-string))))
746 ;; Further, it splits the line or add a blank new item after it,
747 ;; according to `org-M-RET-may-split-line'.
748 (should
749 (equal "- it\n- em"
750 (org-test-with-temp-text "- it<point>em"
751 (let ((org-M-RET-may-split-line '((default . t))))
752 (org-insert-item))
753 (buffer-string))))
754 (should
755 (equal "- item\n- "
756 (org-test-with-temp-text "- it<point>em"
757 (let ((org-M-RET-may-split-line '((default . nil))))
758 (org-insert-item))
759 (buffer-string)))))
761 (ert-deftest test-org-list/repair ()
762 "Test `org-list-repair' specifications."
763 ;; Repair indentation.
764 (should
765 (equal "- item\n - child"
766 (org-test-with-temp-text "- item\n - child"
767 (let ((org-list-indent-offset 0)) (org-list-repair))
768 (buffer-string))))
769 ;; Repair bullets and numbering.
770 (should
771 (equal "- a\n- b"
772 (org-test-with-temp-text "- a\n+ b"
773 (let ((org-list-indent-offset 0))
774 (org-list-repair))
775 (buffer-string))))
776 (should
777 (equal "1. a\n2. b"
778 (org-test-with-temp-text "1. a\n1. b"
779 (let ((org-list-indent-offset 0)
780 (org-plain-list-ordered-item-terminator t))
781 (org-list-repair))
782 (buffer-string))))
783 ;; Repair check-boxes.
784 (should
785 (equal "- [X] item\n - [X] child"
786 (org-test-with-temp-text "- [ ] item\n - [X] child"
787 (let ((org-list-indent-offset 0))
788 (org-list-repair))
789 (buffer-string))))
790 ;; Special case: do not move contents of an item within its child.
791 ;; Yet, preserve indentation differences within contents.
792 (should
793 (equal "- item\n - child\n within item"
794 (org-test-with-temp-text "- item\n - child\n within item"
795 (let ((org-list-indent-offset 0)) (org-list-repair))
796 (buffer-string))))
797 (should
798 (equal
799 "- item\n - child\n within item\n indented"
800 (org-test-with-temp-text
801 "- item\n - child\n within item\n indented"
802 (let ((org-list-indent-offset 0)) (org-list-repair))
803 (buffer-string)))))
805 (ert-deftest test-org-list/update-checkbox-count ()
806 "Test `org-update-checkbox-count' specifications."
807 ;; From a headline.
808 (should
809 (string-match "\\[0/1\\]"
810 (org-test-with-temp-text "* [/]\n- [ ] item"
811 (org-update-checkbox-count)
812 (buffer-string))))
813 (should
814 (string-match "\\[1/1\\]"
815 (org-test-with-temp-text "* [/]\n- [X] item"
816 (org-update-checkbox-count)
817 (buffer-string))))
818 (should
819 (string-match "\\[100%\\]"
820 (org-test-with-temp-text "* [%]\n- [X] item"
821 (org-update-checkbox-count)
822 (buffer-string))))
823 ;; From a list or a sub-list.
824 (should
825 (string-match "\\[0/1\\]"
826 (org-test-with-temp-text "- [/]\n - [ ] item"
827 (org-update-checkbox-count)
828 (buffer-string))))
829 (should
830 (string-match "\\[1/1\\]"
831 (org-test-with-temp-text "- [/]\n - [X] item"
832 (org-update-checkbox-count)
833 (buffer-string))))
834 (should
835 (string-match "\\[100%\\]"
836 (org-test-with-temp-text "- [%]\n - [X] item"
837 (org-update-checkbox-count)
838 (buffer-string))))
839 (should
840 (string-match
841 "\\[1/1\\]"
842 (org-test-with-temp-text "- [ ] item 1\n- [ ] item 2 [/]\n - [X] sub 1"
843 (org-update-checkbox-count)
844 (buffer-string))))
845 ;; Count do not apply to sub-lists unless count is not hierarchical.
846 ;; This state can be achieved with COOKIE_DATA node property set to
847 ;; "recursive".
848 (should
849 (string-match "\\[1/1\\]"
850 (org-test-with-temp-text "- [/]\n - item\n - [X] sub-item"
851 (let ((org-checkbox-hierarchical-statistics nil))
852 (org-update-checkbox-count))
853 (buffer-string))))
854 (should
855 (string-match "\\[1/1\\]"
856 (org-test-with-temp-text "
857 <point>* H
858 :PROPERTIES:
859 :COOKIE_DATA: recursive
860 :END:
861 - [/]
862 - item
863 - [X] sub-item"
864 (org-update-checkbox-count)
865 (buffer-string))))
866 (should
867 (string-match "\\[0/0\\]"
868 (org-test-with-temp-text "- [/]\n - item\n - [ ] sub-item"
869 (org-update-checkbox-count)
870 (buffer-string))))
871 ;; With optional argument ALL, update all buffer.
872 (should
873 (= 2
874 (org-test-with-temp-text "* [/]\n- [X] item\n* [/]\n- [X] item"
875 (org-update-checkbox-count t)
876 (count-matches "\\[1/1\\]"))))
877 ;; Ignore boxes in drawers, blocks or inlinetasks when counting from
878 ;; outside.
879 (should
880 (string-match "\\[2/2\\]"
881 (org-test-with-temp-text "
882 - [/]
883 - [X] item1
884 :DRAWER:
885 - [X] item
886 :END:
887 - [X] item2"
888 (let ((org-checkbox-hierarchical-statistics nil))
889 (org-update-checkbox-count))
890 (buffer-string)))))
894 ;;; Miscellaneous
896 (ert-deftest test-org-list/toggle-item ()
897 "Test `org-toggle-item' specifications."
898 ;; Convert normal lines to items.
899 (should
900 (equal "- line"
901 (org-test-with-temp-text "line"
902 (org-toggle-item nil)
903 (buffer-string))))
904 ;; Convert items to normal lines.
905 (should
906 (equal "line"
907 (org-test-with-temp-text "- line"
908 (org-toggle-item nil)
909 (buffer-string))))
910 ;; Convert headlines to items.
911 (should
912 (equal "- line"
913 (org-test-with-temp-text "* line"
914 (org-toggle-item nil)
915 (buffer-string))))
916 ;; When converting a headline to a list item, TODO keywords become
917 ;; checkboxes.
918 (should
919 (equal "- [X] line"
920 (org-test-with-temp-text "* DONE line"
921 (org-toggle-item nil)
922 (buffer-string))))
923 (should
924 (equal "- [ ] line"
925 (org-test-with-temp-text "* TODO line"
926 (org-toggle-item nil)
927 (buffer-string))))
928 ;; When a region is marked and first line is a headline, all
929 ;; headlines are turned into items.
930 (should
931 (equal "- H1\n - H2"
932 (org-test-with-temp-text "* H1\n** H2"
933 (transient-mark-mode 1)
934 (push-mark (point) t t)
935 (goto-char (point-max))
936 (org-toggle-item nil)
937 (buffer-string))))
938 (should
939 (equal "- [ ] H1\n - [ ] H2"
940 (org-test-with-temp-text "* TODO H1\n** TODO H2"
941 (transient-mark-mode 1)
942 (push-mark (point) t t)
943 (goto-char (point-max))
944 (org-toggle-item nil)
945 (buffer-string))))
946 ;; When turning headlines into items, make sure headings contents
947 ;; are kept within items.
948 (should
949 (equal "- H1\n Text"
950 (org-test-with-temp-text "* H1\nText"
951 (transient-mark-mode 1)
952 (push-mark (point) t t)
953 (goto-char (point-max))
954 (org-toggle-item nil)
955 (buffer-string))))
956 ;; When a region is marked and first line is an item, all items are
957 ;; turned into normal lines.
958 (should
959 (equal "1\n 2"
960 (org-test-with-temp-text "- 1\n - 2"
961 (transient-mark-mode 1)
962 (push-mark (point) t t)
963 (goto-char (point-max))
964 (org-toggle-item nil)
965 (buffer-string))))
966 (should
967 (equal "1\n2"
968 (org-test-with-temp-text "- 1\n2"
969 (transient-mark-mode 1)
970 (push-mark (point) t t)
971 (goto-char (point-max))
972 (org-toggle-item nil)
973 (buffer-string))))
974 ;; When a region is marked and first line is an item, all normal
975 ;; lines are turned into items.
976 (should
977 (equal "- line 1\n- line 2"
978 (org-test-with-temp-text "line 1\nline 2"
979 (transient-mark-mode 1)
980 (push-mark (point) t t)
981 (goto-char (point-max))
982 (org-toggle-item nil)
983 (buffer-string))))
984 (should
985 (equal "- line 1\n- line 2"
986 (org-test-with-temp-text "line 1\n- line 2"
987 (transient-mark-mode 1)
988 (push-mark (point) t t)
989 (goto-char (point-max))
990 (org-toggle-item nil)
991 (buffer-string))))
992 ;; When argument ARG is non-nil, change the whole region into
993 ;; a single item.
994 (should
995 (equal "- line 1\n line 2"
996 (org-test-with-temp-text "line 1\nline 2"
997 (transient-mark-mode 1)
998 (push-mark (point) t t)
999 (goto-char (point-max))
1000 (org-toggle-item t)
1001 (buffer-string)))))
1004 ;;; Radio Lists
1006 (ert-deftest test-org-list/send-list ()
1007 "Test various checks for `org-list-send-list'."
1008 ;; Error when not at a list item.
1009 (should-error
1010 (org-test-with-temp-text "Not a list item"
1011 (org-list-send-list)))
1012 ;; Error when ORGLST line is not provided.
1013 (should-error
1014 (org-test-with-temp-text "- item"
1015 (org-list-send-list)))
1016 ;; Error when transformation function is unknown.
1017 (should-error
1018 (org-test-with-temp-text "@ignore
1019 #+ORGLST: SEND list unknown-function
1020 - item
1021 @end ignore"
1022 (forward-line 2)
1023 (org-list-send-list)))
1024 ;; Error when receiving location is not defined.
1025 (should-error
1026 (org-test-with-temp-text "@ignore
1027 #+ORGLST: SEND list org-list-to-texinfo
1028 - item
1029 @end ignore"
1030 (forward-line 2)
1031 (org-list-send-list)))
1032 ;; Error when insertion region is ill-formed.
1033 (should-error
1034 (org-test-with-temp-text "@c BEGIN RECEIVE ORGLST list
1035 @ignore
1036 #+ORGLST: SEND list org-list-to-texinfo
1037 - item
1038 @end ignore"
1039 (forward-line 3)
1040 (org-list-send-list)))
1041 ;; Allow multiple receiver locations.
1042 (should
1043 (org-test-with-temp-text "
1044 @c BEGIN RECEIVE ORGLST list
1045 @c END RECEIVE ORGLST list
1047 @ignore
1048 #+ORGLST: SEND list org-list-to-texinfo
1049 <point>- item contents
1050 @end ignore
1052 @c BEGIN RECEIVE ORGLST list
1053 @c END RECEIVE ORGLST list"
1054 (org-list-send-list)
1055 (goto-char (point-min))
1056 (search-forward "item contents" nil t 3))))
1058 (ert-deftest test-org-list/to-generic ()
1059 "Test `org-list-to-generic' specifications."
1060 ;; Test `:ustart' and `:uend' parameters.
1061 (should
1062 (equal
1063 "begin\na"
1064 (org-test-with-temp-text "- a"
1065 (org-list-to-generic (org-list-to-lisp) '(:ustart "begin")))))
1066 (should-not
1067 (equal
1068 "begin\na"
1069 (org-test-with-temp-text "1. a"
1070 (org-list-to-generic (org-list-to-lisp) '(:ustart "begin")))))
1071 (should
1072 (equal
1073 "a\nend"
1074 (org-test-with-temp-text "- a"
1075 (org-list-to-generic (org-list-to-lisp) '(:uend "end")))))
1076 (should-not
1077 (equal
1078 "a\nend"
1079 (org-test-with-temp-text "1. a"
1080 (org-list-to-generic (org-list-to-lisp) '(:uend "end")))))
1081 (should
1082 (equal
1083 "begin l1\na\nbegin l2\nb\nend l2\nend l1"
1084 (org-test-with-temp-text "- a\n - b"
1085 (org-list-to-generic
1086 (org-list-to-lisp)
1087 (list :ustart (lambda (l) (format "begin l%d" l))
1088 :uend (lambda (l) (format "end l%d" l)))))))
1089 ;; Test `:ostart' and `:oend' parameters.
1090 (should
1091 (equal
1092 "begin\na"
1093 (org-test-with-temp-text "1. a"
1094 (org-list-to-generic (org-list-to-lisp) '(:ostart "begin")))))
1095 (should-not
1096 (equal
1097 "begin\na"
1098 (org-test-with-temp-text "- a"
1099 (org-list-to-generic (org-list-to-lisp) '(:ostart "begin")))))
1100 (should
1101 (equal
1102 "a\nend"
1103 (org-test-with-temp-text "1. a"
1104 (org-list-to-generic (org-list-to-lisp) '(:oend "end")))))
1105 (should-not
1106 (equal
1107 "a\nend"
1108 (org-test-with-temp-text "- a"
1109 (org-list-to-generic (org-list-to-lisp) '(:oend "end")))))
1110 (should
1111 (equal
1112 "begin l1\na\nbegin l2\nb\nend l2\nend l1"
1113 (org-test-with-temp-text "1. a\n 1. b"
1114 (org-list-to-generic
1115 (org-list-to-lisp)
1116 (list :ostart (lambda (l) (format "begin l%d" l))
1117 :oend (lambda (l) (format "end l%d" l)))))))
1118 ;; Test `:dstart' and `:dend' parameters.
1119 (should
1120 (equal
1121 "begin\ntaga"
1122 (org-test-with-temp-text "- tag :: a"
1123 (org-list-to-generic (org-list-to-lisp) '(:dstart "begin")))))
1124 (should-not
1125 (equal
1126 "begin\na"
1127 (org-test-with-temp-text "- a"
1128 (org-list-to-generic (org-list-to-lisp) '(:dstart "begin")))))
1129 (should
1130 (equal
1131 "taga\nend"
1132 (org-test-with-temp-text "- tag :: a"
1133 (org-list-to-generic (org-list-to-lisp) '(:dend "end")))))
1134 (should-not
1135 (equal
1136 "a\nend"
1137 (org-test-with-temp-text "- a"
1138 (org-list-to-generic (org-list-to-lisp) '(:dend "end")))))
1139 (should
1140 (equal
1141 "begin l1\ntag1a\nbegin l2\ntag2b\nend l2\nend l1"
1142 (org-test-with-temp-text "- tag1 :: a\n - tag2 :: b"
1143 (org-list-to-generic
1144 (org-list-to-lisp)
1145 (list :dstart (lambda (l) (format "begin l%d" l))
1146 :dend (lambda (l) (format "end l%d" l)))))))
1147 ;; Test `:dtstart', `:dtend', `:ddstart' and `:ddend' parameters.
1148 (should
1149 (equal
1150 ">tag<a"
1151 (org-test-with-temp-text "- tag :: a"
1152 (org-list-to-generic (org-list-to-lisp) '(:dtstart ">" :dtend "<")))))
1153 (should
1154 (equal
1155 "tag>a<"
1156 (org-test-with-temp-text "- tag :: a"
1157 (org-list-to-generic (org-list-to-lisp) '(:ddstart ">" :ddend "<")))))
1158 ;; Test `:istart' and `:iend' parameters.
1159 (should
1160 (equal
1161 "starta"
1162 (org-test-with-temp-text "- a"
1163 (org-list-to-generic (org-list-to-lisp) '(:istart "start")))))
1164 (should
1165 (equal
1166 "level1 a\nlevel2 b"
1167 (org-test-with-temp-text "- a\n - b"
1168 (org-list-to-generic (org-list-to-lisp)
1169 '(:istart (lambda (l) (format "level%d "l)))))))
1170 (should
1171 (equal
1172 "a\nblevel2level1"
1173 (org-test-with-temp-text "- a\n - b"
1174 (org-list-to-generic (org-list-to-lisp)
1175 '(:iend (lambda (l) (format "level%d" l)))))))
1176 ;; Test `:icount' parameter.
1177 (should
1178 (equal
1179 "counta"
1180 (org-test-with-temp-text "1. [@3] a"
1181 (org-list-to-generic (org-list-to-lisp) '(:icount "count")))))
1182 (should-not
1183 (equal
1184 "counta"
1185 (org-test-with-temp-text "1. a"
1186 (org-list-to-generic (org-list-to-lisp) '(:icount "count")))))
1187 (should
1188 (equal
1189 "counta"
1190 (org-test-with-temp-text "1. [@3] a"
1191 (org-list-to-generic (org-list-to-lisp)
1192 '(:icount "count" :istart "start")))))
1193 (should
1194 (equal
1195 "level:1, counter:3 a"
1196 (org-test-with-temp-text "1. [@3] a"
1197 (org-list-to-generic
1198 (org-list-to-lisp)
1199 '(:icount (lambda (l c) (format "level:%d, counter:%d " l c)))))))
1200 ;; Test `:isep' parameter.
1201 (should
1202 (equal
1203 "a\n--\nb"
1204 (org-test-with-temp-text "- a\n- b"
1205 (org-list-to-generic (org-list-to-lisp) '(:isep "--")))))
1206 (should-not
1207 (equal
1208 "a\n--\nb"
1209 (org-test-with-temp-text "- a\n - b"
1210 (org-list-to-generic (org-list-to-lisp) '(:isep "--")))))
1211 (should
1212 (equal
1213 "a\n- 1 -\nb"
1214 (org-test-with-temp-text "- a\n- b"
1215 (org-list-to-generic (org-list-to-lisp)
1216 '(:isep (lambda (l) (format "- %d -" l)))))))
1217 ;; Test `:cbon', `:cboff', `:cbtrans'
1218 (should
1219 (equal
1220 "!a"
1221 (org-test-with-temp-text "- [X] a"
1222 (org-list-to-generic (org-list-to-lisp) '(:cbon "!")))))
1223 (should-not
1224 (equal
1225 "!a"
1226 (org-test-with-temp-text "- [X] a"
1227 (org-list-to-generic (org-list-to-lisp) '(:cboff "!" :cbtrans "!")))))
1228 (should
1229 (equal
1230 "!a"
1231 (org-test-with-temp-text "- [ ] a"
1232 (org-list-to-generic (org-list-to-lisp) '(:cboff "!")))))
1233 (should-not
1234 (equal
1235 "!a"
1236 (org-test-with-temp-text "- [ ] a"
1237 (org-list-to-generic (org-list-to-lisp) '(:cbon "!" :cbtrans "!")))))
1238 (should
1239 (equal
1240 "!a"
1241 (org-test-with-temp-text "- [-] a"
1242 (org-list-to-generic (org-list-to-lisp) '(:cbtrans "!")))))
1243 (should-not
1244 (equal
1245 "!a"
1246 (org-test-with-temp-text "- [-] a"
1247 (org-list-to-generic (org-list-to-lisp) '(:cbon "!" :cboff "!")))))
1248 ;; Test `:splice' parameter.
1249 (should
1250 (equal
1252 (org-test-with-temp-text "- a"
1253 (org-list-to-generic (org-list-to-lisp)
1254 '(:ustart "begin" :uend "end" :splice t)))))
1255 ;; No error on empty lists.
1256 (should
1257 (org-test-with-temp-text "-" (org-list-to-generic (org-list-to-lisp) nil))))
1259 (ert-deftest test-org-list/to-html ()
1260 "Test `org-list-to-html' specifications."
1261 (should
1262 (equal "<ul class=\"org-ul\">\n<li>a</li>\n</ul>"
1263 (let (org-html-indent)
1264 (with-temp-buffer
1265 (insert "<!-- BEGIN RECEIVE ORGLST name -->
1266 <!-- END RECEIVE ORGLST name -->
1267 <!--
1268 #+ORGLST: SEND name org-list-to-html
1270 -->")
1271 (goto-char (point-min))
1272 (re-search-forward "^- a" nil t)
1273 (beginning-of-line)
1274 (org-list-send-list)
1275 (goto-line 2)
1276 (buffer-substring-no-properties
1277 (point)
1278 (progn (re-search-forward "^<!-- END" nil t)
1279 (beginning-of-line)
1280 (skip-chars-backward " \r\t\n")
1281 (point))))))))
1283 (ert-deftest test-org-list/to-latex ()
1284 "Test `org-list-to-latex' specifications."
1285 (should
1286 (equal "\\begin{itemize}\n\\item a\n\\end{itemize}"
1287 (with-temp-buffer
1288 (insert "% BEGIN RECEIVE ORGLST name
1289 % END RECEIVE ORGLST name
1290 \\begin{comment}
1291 #+ORGLST: SEND name org-list-to-latex
1293 \\end{comment}")
1294 (goto-char (point-min))
1295 (re-search-forward "^- a" nil t)
1296 (beginning-of-line)
1297 (org-list-send-list)
1298 (goto-line 2)
1299 (buffer-substring-no-properties
1300 (point)
1301 (progn (re-search-forward "^% END" nil t)
1302 (beginning-of-line)
1303 (skip-chars-backward " \r\t\n")
1304 (point)))))))
1306 (ert-deftest test-org-list/to-texinfo ()
1307 "Test `org-list-to-texinfo' specifications."
1308 (should
1309 (equal "@itemize\n@item\na\n@end itemize"
1310 (with-temp-buffer
1311 (insert "@c BEGIN RECEIVE ORGLST name
1312 @c END RECEIVE ORGLST name
1313 @ignore
1314 #+ORGLST: SEND name org-list-to-texinfo
1316 @end ignore")
1317 (goto-char (point-min))
1318 (re-search-forward "^- a" nil t)
1319 (beginning-of-line)
1320 (org-list-send-list)
1321 (goto-line 2)
1322 (buffer-substring-no-properties
1323 (point)
1324 (progn (re-search-forward "^@c END" nil t)
1325 (beginning-of-line)
1326 (skip-chars-backward " \r\t\n")
1327 (point)))))))
1330 (provide 'test-org-list)
1331 ;;; test-org-list.el ends here