test-org-list.el 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997
  1. ;;; test-org-list.el --- Tests for org-list.el
  2. ;; Copyright (C) 2012, 2013, 2014 Nicolas Goaziou
  3. ;; Author: Nicolas Goaziou <n.goaziou at gmail dot com>
  4. ;; This program is free software; you can redistribute it and/or modify
  5. ;; it under the terms of the GNU General Public License as published by
  6. ;; the Free Software Foundation, either version 3 of the License, or
  7. ;; (at your option) any later version.
  8. ;; This program is distributed in the hope that it will be useful,
  9. ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  11. ;; GNU General Public License for more details.
  12. ;; You should have received a copy of the GNU General Public License
  13. ;; along with this program. If not, see <http://www.gnu.org/licenses/>.
  14. ;;; Code:
  15. (ert-deftest test-org-list/list-ending ()
  16. "Test if lists end at the right place."
  17. ;; With two blank lines.
  18. (org-test-with-temp-text "- item\n\n\n Text"
  19. (goto-line 4)
  20. (should-not (org-in-item-p)))
  21. ;; With text less indented than top items.
  22. (org-test-with-temp-text "- item\nText"
  23. (goto-line 2)
  24. (should-not (org-in-item-p)))
  25. ;; Though, blank lines and text indentation is ignored in blocks.
  26. (org-test-with-temp-text
  27. "- item\n #+begin_quote\n\n\nText at column 0\n #+end_quote\n Text"
  28. (goto-line 7)
  29. (should (org-in-item-p))))
  30. (ert-deftest test-org-list/list-navigation ()
  31. "Test list navigation specifications."
  32. (org-test-with-temp-text "
  33. - item A
  34. - item B
  35. - item 1
  36. - item 1.1
  37. - item 1.2
  38. - item 1.3
  39. - item 2
  40. - item X
  41. - item Y"
  42. (let ((org-list-use-circular-motion nil))
  43. ;; 1. Test `org-next-item'.
  44. ;;
  45. ;; 1.1. Should return an error if at last item in
  46. ;; a list/sub-list, unless `org-list-use-circular-motion'
  47. ;; is non-nil.
  48. (goto-line 9)
  49. (should-error (org-next-item))
  50. (let ((org-list-use-circular-motion t))
  51. (should (progn (org-next-item) t)))
  52. (goto-line 14)
  53. (should-error (org-next-item))
  54. (let ((org-list-use-circular-motion t))
  55. (should (progn (org-next-item) t)))
  56. ;; 1.2. Should jump over sub-lists.
  57. (goto-line 6)
  58. (org-next-item)
  59. (should (looking-at "- item 2"))
  60. ;; 1.3. Shouldn't move to another list.
  61. (goto-line 3)
  62. (should-error (org-next-item))
  63. (should-not (looking-at "- item 1"))
  64. ;; 1.4. Should move to the list/sub-list first item when
  65. ;; `org-list-use-circular-motion' is non-nil.
  66. (let ((org-list-use-circular-motion t))
  67. (goto-line 10)
  68. (org-next-item)
  69. (should (looking-at "- item 1"))
  70. (goto-line 9)
  71. (org-next-item)
  72. (should (looking-at " - item 1.1")))
  73. ;; 2. Test `org-previous-item'.
  74. ;;
  75. ;; 2.1. Should return an error if at first item in
  76. ;; a list/sub-list, unless `org-list-use-circular-motion is
  77. ;; non-nil.
  78. (goto-line 7)
  79. (should-error (org-previous-item))
  80. (let ((org-list-use-circular-motion t))
  81. (should (progn (org-previous-item) t)))
  82. (goto-line 13)
  83. (should-error (org-previous-item))
  84. (let ((org-list-use-circular-motion t))
  85. (should (progn (org-previous-item) t)))
  86. ;; 2.2. Should ignore sub-lists.
  87. (goto-line 10)
  88. (org-previous-item)
  89. (should (looking-at "- item 1"))
  90. ;; 2.3. Shouldn't move to another list.
  91. (goto-line 6)
  92. (should-error (org-previous-item))
  93. (should-not (looking-at "- item B"))
  94. ;; 2.4. Should move to the list/sub-list last item when
  95. ;; `org-list-use-circular-motion' is non-nil.
  96. (let ((org-list-use-circular-motion t))
  97. (goto-line 6)
  98. (org-previous-item)
  99. (should (looking-at "- item 2"))
  100. (goto-line 7)
  101. (org-previous-item)
  102. (should (looking-at " - item 1.3"))))))
  103. (ert-deftest test-org-list/cycle-bullet ()
  104. "Test `org-cycle-list-bullet' specifications."
  105. ;; Error when not at an item.
  106. (should-error
  107. (org-test-with-temp-text "Paragraph"
  108. (org-cycle-list-bullet)))
  109. ;; Cycle through "-", "+", "*", "1.", "1)".
  110. (org-test-with-temp-text " - item"
  111. (org-cycle-list-bullet)
  112. (should (looking-at "[ \t]+\\+"))
  113. (org-cycle-list-bullet)
  114. (should (looking-at "[ \t]+\\*"))
  115. (let ((org-plain-list-ordered-item-terminator t))
  116. (org-cycle-list-bullet))
  117. (should (looking-at "[ \t]+1\\."))
  118. (let ((org-plain-list-ordered-item-terminator t))
  119. (org-cycle-list-bullet))
  120. (should (looking-at "[ \t]+1)")))
  121. ;; Argument is a valid bullet: cycle to that bullet directly.
  122. (should
  123. (equal "1. item"
  124. (org-test-with-temp-text "- item"
  125. (let ((org-plain-list-ordered-item-terminator t))
  126. (org-cycle-list-bullet "1.")
  127. (buffer-string)))))
  128. ;; Argument is an integer N: cycle to the Nth allowed bullet.
  129. (should
  130. (equal "+ item"
  131. (org-test-with-temp-text "1. item"
  132. (let ((org-plain-list-ordered-item-terminator t))
  133. (org-cycle-list-bullet 1)
  134. (buffer-string)))))
  135. ;; Argument is `previous': cycle backwards.
  136. (should
  137. (equal "- item"
  138. (org-test-with-temp-text "+ item"
  139. (let ((org-plain-list-ordered-item-terminator t))
  140. (org-cycle-list-bullet 'previous)
  141. (buffer-string)))))
  142. ;; Do not cycle to "*" bullets when item is at column 0.
  143. (should
  144. (equal "1. item"
  145. (org-test-with-temp-text "+ item"
  146. (let ((org-plain-list-ordered-item-terminator t))
  147. (org-cycle-list-bullet)
  148. (buffer-string)))))
  149. ;; Do not cycle to numbered bullets in a description list.
  150. (should-not
  151. (equal "1. tag :: item"
  152. (org-test-with-temp-text "+ tag :: item"
  153. (let ((org-plain-list-ordered-item-terminator t))
  154. (org-cycle-list-bullet)
  155. (buffer-string)))))
  156. ;; Do not cycle to ordered item terminators if they are not allowed
  157. ;; in `org-plain-list-ordered-item-terminator'.
  158. (should
  159. (equal " 1) item"
  160. (org-test-with-temp-text " * item"
  161. (let ((org-plain-list-ordered-item-terminator 41))
  162. (org-cycle-list-bullet)
  163. (buffer-string)))))
  164. ;; When `org-list-allow-alphabetical' is non-nil, cycle to alpha bullets.
  165. (should
  166. (equal "a. item"
  167. (org-test-with-temp-text "1) item"
  168. (let ((org-plain-list-ordered-item-terminator t)
  169. (org-list-allow-alphabetical t))
  170. (org-cycle-list-bullet)
  171. (buffer-string)))))
  172. ;; Do not cycle to alpha bullets when list has more than 26
  173. ;; elements.
  174. (should-not
  175. (equal "a. item 1"
  176. (org-test-with-temp-text "1) item 1
  177. 2) item 2
  178. 3) item 3
  179. 4) item 4
  180. 5) item 5
  181. 6) item 6
  182. 7) item 7
  183. 8) item 8
  184. 9) item 9
  185. 10) item 10
  186. 11) item 11
  187. 12) item 12
  188. 13) item 13
  189. 14) item 14
  190. 15) item 15
  191. 16) item 16
  192. 17) item 17
  193. 18) item 18
  194. 19) item 19
  195. 20) item 20
  196. 21) item 21
  197. 22) item 22
  198. 23) item 23
  199. 24) item 24
  200. 25) item 25
  201. 26) item 26
  202. 27) item 27"
  203. (let ((org-plain-list-ordered-item-terminator t)
  204. (org-list-allow-alphabetical t))
  205. (org-cycle-list-bullet)
  206. (buffer-substring (point) (line-end-position)))))))
  207. (ert-deftest test-org-list/indent-item ()
  208. "Test `org-indent-item' specifications."
  209. ;; 1. Error when not at an item.
  210. (org-test-with-temp-text "Paragraph."
  211. (should-error (org-indent-item)))
  212. ;; 2. Error when trying to move first item of a list.
  213. (org-test-with-temp-text "
  214. - Item 1
  215. - Item 2"
  216. (forward-line)
  217. (should-error (org-indent-item)))
  218. ;; 3. Indent a single item, not its children.
  219. (org-test-with-temp-text "
  220. - Item 1
  221. - Item 2
  222. - Item 2.1"
  223. (search-forward "- Item 2")
  224. (let (org-list-demote-modify-bullet) (org-indent-item))
  225. (should (equal (buffer-string)
  226. "
  227. - Item 1
  228. - Item 2
  229. - Item 2.1")))
  230. ;; 4. Follow `org-list-demote-modify-bullet' specifications.
  231. ;;
  232. ;; 4.1. With unordered lists.
  233. (org-test-with-temp-text "
  234. - Item 1
  235. - Item 2"
  236. (search-forward "- Item 2")
  237. (let ((org-list-demote-modify-bullet '(("-" . "+")))) (org-indent-item))
  238. (should (equal (buffer-string)
  239. "
  240. - Item 1
  241. + Item 2")))
  242. ;; 4.2. and ordered lists.
  243. (org-test-with-temp-text "
  244. 1. Item 1
  245. 2. Item 2"
  246. (search-forward "2. Item 2")
  247. (let ((org-plain-list-ordered-item-terminator t)
  248. (org-list-demote-modify-bullet '(("1." . "+"))))
  249. (org-indent-item))
  250. (should (equal (buffer-string)
  251. "
  252. 1. Item 1
  253. + Item 2")))
  254. ;; 5. When a region is selected, indent every item within.
  255. (org-test-with-temp-text "
  256. - Item 1
  257. - Item 2
  258. - Item 3
  259. "
  260. (search-forward "- Item 2")
  261. (beginning-of-line)
  262. (transient-mark-mode 1)
  263. (push-mark (point) t t)
  264. (goto-char (point-max))
  265. (let (org-list-demote-modify-bullet) (org-indent-item))
  266. (should (equal (buffer-string)
  267. "
  268. - Item 1
  269. - Item 2
  270. - Item 3
  271. "))))
  272. (ert-deftest test-org-list/indent-item-tree ()
  273. "Test `org-indent-item-tree' specifications."
  274. ;; 1. Error when not at an item.
  275. (org-test-with-temp-text "Paragraph."
  276. (should-error (org-indent-item-tree)))
  277. ;; 2. Indent item along with its children.
  278. (org-test-with-temp-text "
  279. - Item 1
  280. - Item 2
  281. - Item 2.1"
  282. (search-forward "- Item 2")
  283. (let (org-list-demote-modify-bullet) (org-indent-item-tree))
  284. (should (equal (buffer-string)
  285. "
  286. - Item 1
  287. - Item 2
  288. - Item 2.1")))
  289. ;; 3. Special case: When indenting top item, move the whole list.
  290. (org-test-with-temp-text "
  291. - Item 1
  292. - Item 2"
  293. (search-forward "- Item 1")
  294. (let (org-list-demote-modify-bullet org-odd-levels-only)
  295. (org-indent-item-tree))
  296. (should (equal (buffer-string)
  297. "
  298. - Item 1
  299. - Item 2")))
  300. ;; 4. Follow `org-list-demote-modify-bullet' specifications.
  301. ;;
  302. ;; 4.1. With unordered lists.
  303. (org-test-with-temp-text "
  304. - Item 1
  305. - Item 2
  306. + Item 2.1"
  307. (search-forward "- Item 2")
  308. (let ((org-list-demote-modify-bullet '(("-" . "+") ("+" . "-"))))
  309. (org-indent-item-tree))
  310. (should (equal (buffer-string)
  311. "
  312. - Item 1
  313. + Item 2
  314. - Item 2.1")))
  315. ;; 4.2. and ordered lists.
  316. (org-test-with-temp-text "
  317. 1. Item 1
  318. 2. Item 2
  319. + Item 2.1"
  320. (search-forward "2. Item 2")
  321. (let ((org-plain-list-ordered-item-terminator t)
  322. (org-list-demote-modify-bullet '(("1." . "+") ("+" . "1."))))
  323. (org-indent-item-tree))
  324. (should (equal (buffer-string)
  325. "
  326. 1. Item 1
  327. + Item 2
  328. 1. Item 2.1")))
  329. ;; 5. When a region is selected, indent every item within.
  330. (org-test-with-temp-text "
  331. - Item 1
  332. - Item 2
  333. - Item 2.1
  334. - Item 3
  335. - Item 3.1
  336. "
  337. (search-forward "- Item 2")
  338. (beginning-of-line)
  339. (transient-mark-mode 1)
  340. (push-mark (point) t t)
  341. (goto-char (point-max))
  342. (let (org-list-demote-modify-bullet) (org-indent-item-tree))
  343. (should (equal (buffer-string)
  344. "
  345. - Item 1
  346. - Item 2
  347. - Item 2.1
  348. - Item 3
  349. - Item 3.1
  350. "))))
  351. (ert-deftest test-org-list/outdent-item ()
  352. "Test `org-outdent-item' specifications."
  353. ;; 1. Error when not at an item.
  354. (org-test-with-temp-text "Paragraph."
  355. (should-error (org-outdent-item)))
  356. ;; 2. Error when trying to move first item of a list.
  357. (org-test-with-temp-text "
  358. - Item 1
  359. - Item 2"
  360. (forward-line)
  361. (should-error (org-outdent-item)))
  362. ;; 3. Error when trying to outdent an item without its children.
  363. (org-test-with-temp-text "
  364. - Item 1
  365. - Item 1.1
  366. - Item 1.1.1"
  367. (search-forward "- Item 1.1")
  368. (should-error (org-outdent-item)))
  369. ;; 4. Error when trying to outdent before top item.
  370. (org-test-with-temp-text "
  371. - Item 1
  372. - Item 2"
  373. (search-forward "- Item 2")
  374. (should-error (org-outdent-item)))
  375. ;; 5. When a region is selected, outdent every item within.
  376. (org-test-with-temp-text "
  377. - Item 1
  378. - Item 2
  379. - Item 3
  380. "
  381. (search-forward "- Item 2")
  382. (beginning-of-line)
  383. (transient-mark-mode 1)
  384. (push-mark (point) t t)
  385. (goto-char (point-max))
  386. (let (org-list-demote-modify-bullet) (org-outdent-item))
  387. (should (equal (buffer-string)
  388. "
  389. - Item 1
  390. - Item 2
  391. - Item 3
  392. "))))
  393. (ert-deftest test-org-list/outdent-item-tree ()
  394. "Test `org-outdent-item-tree' specifications."
  395. ;; 1. Error when not at an item.
  396. (org-test-with-temp-text "Paragraph."
  397. (should-error (org-outdent-item-tree)))
  398. ;; 2. Error when trying to outdent before top item.
  399. (org-test-with-temp-text "
  400. - Item 1
  401. - Item 2"
  402. (search-forward "- Item 2")
  403. (should-error (org-outdent-item-tree)))
  404. ;; 3. Outdent item along with its children.
  405. (org-test-with-temp-text "
  406. - Item 1
  407. - Item 2
  408. - Item 2.1"
  409. (search-forward "- Item 2")
  410. (org-outdent-item-tree)
  411. (should (equal (buffer-string)
  412. "
  413. - Item 1
  414. - Item 2
  415. - Item 2.1")))
  416. ;; 3. Special case: When outdenting top item, move the whole list.
  417. (org-test-with-temp-text "
  418. - Item 1
  419. - Item 2"
  420. (search-forward "- Item 1")
  421. (let (org-odd-levels-only) (org-outdent-item-tree))
  422. (should (equal (buffer-string)
  423. "
  424. - Item 1
  425. - Item 2")))
  426. ;; 5. When a region is selected, outdent every item within.
  427. (org-test-with-temp-text "
  428. - Item 1
  429. - Item 2
  430. - Item 2.1
  431. - Item 3
  432. - Item 3.1
  433. "
  434. (search-forward "- Item 2")
  435. (beginning-of-line)
  436. (transient-mark-mode 1)
  437. (push-mark (point) t t)
  438. (goto-char (point-max))
  439. (org-outdent-item-tree)
  440. (should (equal (buffer-string)
  441. "
  442. - Item 1
  443. - Item 2
  444. - Item 2.1
  445. - Item 3
  446. - Item 3.1
  447. "))))
  448. (ert-deftest test-org-list/move-item-down ()
  449. "Test `org-move-item-down' specifications."
  450. ;; Standard test.
  451. (org-test-with-temp-text "- item 1\n- item 2"
  452. (org-move-item-down)
  453. (should (equal (buffer-string)
  454. "- item 2\n- item 1")))
  455. ;; Keep same column in item.
  456. (org-test-with-temp-text "- item 1\n- item 2"
  457. (forward-char 4)
  458. (org-move-item-down)
  459. (should (looking-at "em 1")))
  460. ;; Move sub-items.
  461. (org-test-with-temp-text "- item 1\n - sub-item 1\n- item 2"
  462. (org-move-item-down)
  463. (should (equal (buffer-string)
  464. "- item 2\n- item 1\n - sub-item 1")))
  465. ;; Preserve blank lines.
  466. (org-test-with-temp-text "- item 1\n\n- item 2"
  467. (let ((org-list-empty-line-terminates-plain-lists nil)) (org-move-item-down))
  468. (should (equal (buffer-string) "- item 2\n\n- item 1")))
  469. ;; Error when trying to move the last item...
  470. (org-test-with-temp-text "- item 1\n- item 2"
  471. (forward-line)
  472. (should-error (org-move-item-down)))
  473. ;; ... unless `org-list-use-circular-motion' is non-nil. In this
  474. ;; case, move to the first item.
  475. (org-test-with-temp-text "- item 1\n- item 2\n- item 3"
  476. (forward-line 2)
  477. (let ((org-list-use-circular-motion t)) (org-move-item-down))
  478. (should (equal (buffer-string) "- item 3\n- item 1\n- item 2\n")))
  479. ;; Preserve item visibility.
  480. (org-test-with-temp-text "* Headline\n- item 1\n body 1\n- item 2\n body 2"
  481. (let ((org-cycle-include-plain-lists t))
  482. (search-forward "- item 1")
  483. (org-cycle)
  484. (search-forward "- item 2")
  485. (org-cycle))
  486. (search-backward "- item 1")
  487. (org-move-item-down)
  488. (forward-line)
  489. (should (org-invisible-p2))
  490. (search-backward " body 2")
  491. (should (org-invisible-p2)))
  492. ;; Preserve children visibility.
  493. (org-test-with-temp-text "* Headline
  494. - item 1
  495. - sub-item 1
  496. sub-body 1
  497. - item 2
  498. - sub-item 2
  499. sub-body 2"
  500. (let ((org-cycle-include-plain-lists t))
  501. (search-forward "- sub-item 1")
  502. (org-cycle)
  503. (search-forward "- sub-item 2")
  504. (org-cycle))
  505. (search-backward "- item 1")
  506. (org-move-item-down)
  507. (search-forward "sub-body 1")
  508. (should (org-invisible-p2))
  509. (search-backward "sub-body 2")
  510. (should (org-invisible-p2)))
  511. ;; Preserve contents visibility.
  512. (org-test-with-temp-text "
  513. - item 1
  514. #+BEGIN_CENTER
  515. Text1
  516. #+END_CENTER
  517. - item 2
  518. #+BEGIN_CENTER
  519. Text2
  520. #+END_CENTER"
  521. (org-hide-block-all)
  522. (search-forward "- item 1")
  523. (org-move-item-down)
  524. (search-forward "Text1")
  525. (should (org-invisible-p2))
  526. (search-backward "Text2")
  527. (should (org-invisible-p2))))
  528. (ert-deftest test-org-list/move-item-up ()
  529. "Test `org-move-item-up' specifications."
  530. ;; Standard test.
  531. (org-test-with-temp-text "- item 1\n- item 2"
  532. (forward-line)
  533. (org-move-item-up)
  534. (should (equal (buffer-string)
  535. "- item 2\n- item 1")))
  536. ;; Keep same column in item.
  537. (org-test-with-temp-text "- item 1\n- item 2"
  538. (forward-line)
  539. (forward-char 4)
  540. (org-move-item-up)
  541. (should (looking-at "em 2")))
  542. ;; Move sub-items.
  543. (org-test-with-temp-text "- item 1\n- item 2\n - sub-item 2"
  544. (forward-line)
  545. (org-move-item-up)
  546. (should (equal (buffer-string)
  547. "- item 2\n - sub-item 2\n- item 1")))
  548. ;; Preserve blank lines.
  549. (org-test-with-temp-text "- item 1\n\n- item 2"
  550. (search-forward "- item 2")
  551. (let ((org-list-empty-line-terminates-plain-lists nil)) (org-move-item-up))
  552. (should (equal (buffer-string) "- item 2\n\n- item 1")))
  553. ;; Error when trying to move the first item...
  554. (org-test-with-temp-text "- item 1\n- item 2"
  555. (should-error (org-move-item-up)))
  556. ;; ... unless `org-list-use-circular-motion' is non-nil. In this
  557. ;; case, move to the first item.
  558. (org-test-with-temp-text "- item 1\n- item 2\n- item 3"
  559. (let ((org-list-use-circular-motion t)) (org-move-item-up))
  560. (should (equal (buffer-string) "- item 2\n- item 3\n- item 1")))
  561. ;; Preserve item visibility.
  562. (org-test-with-temp-text "* Headline\n- item 1\n body 1\n- item 2\n body 2"
  563. (let ((org-cycle-include-plain-lists t))
  564. (search-forward "- item 1")
  565. (org-cycle)
  566. (search-forward "- item 2")
  567. (org-cycle))
  568. (org-move-item-up)
  569. (forward-line)
  570. (should (org-invisible-p2))
  571. (search-forward " body 1")
  572. (should (org-invisible-p2)))
  573. ;; Preserve children visibility.
  574. (org-test-with-temp-text "* Headline
  575. - item 1
  576. - sub-item 1
  577. sub-body 1
  578. - item 2
  579. - sub-item 2
  580. sub-body 2"
  581. (let ((org-cycle-include-plain-lists t))
  582. (search-forward "- sub-item 1")
  583. (org-cycle)
  584. (search-forward "- sub-item 2")
  585. (org-cycle))
  586. (search-backward "- item 2")
  587. (org-move-item-up)
  588. (search-forward "sub-body 2")
  589. (should (org-invisible-p2))
  590. (search-forward "sub-body 1")
  591. (should (org-invisible-p2)))
  592. ;; Preserve contents visibility.
  593. (org-test-with-temp-text "
  594. - item 1
  595. #+BEGIN_CENTER
  596. Text1
  597. #+END_CENTER
  598. - item 2
  599. #+BEGIN_CENTER
  600. Text2
  601. #+END_CENTER"
  602. (org-hide-block-all)
  603. (search-forward "- item 2")
  604. (org-move-item-up)
  605. (search-forward "Text2")
  606. (should (org-invisible-p2))
  607. (search-forward "Text1")
  608. (should (org-invisible-p2))))
  609. (ert-deftest test-org-list/insert-item ()
  610. "Test item insertion."
  611. ;; Blank lines specifications.
  612. ;;
  613. ;; Non-nil `org-blank-before-new-entry': insert a blank line, unless
  614. ;; `org-list-empty-line-terminates-plain-lists' is non-nil.
  615. (should
  616. (org-test-with-temp-text "- a"
  617. (let ((org-list-empty-line-terminates-plain-lists nil)
  618. (org-blank-before-new-entry '((plain-list-item . t))))
  619. (end-of-line)
  620. (org-insert-item)
  621. (forward-line -1)
  622. (looking-at "$"))))
  623. (should-not
  624. (org-test-with-temp-text "- a"
  625. (let ((org-list-empty-line-terminates-plain-lists t)
  626. (org-blank-before-new-entry '((plain-list-item . t))))
  627. (end-of-line)
  628. (org-insert-item)
  629. (forward-line -1)
  630. (looking-at "$"))))
  631. ;; Nil `org-blank-before-new-entry': do not insert a blank line.
  632. (should-not
  633. (org-test-with-temp-text "- a"
  634. (let ((org-list-empty-line-terminates-plain-lists nil)
  635. (org-blank-before-new-entry '((plain-list-item . nil))))
  636. (end-of-line)
  637. (org-insert-item)
  638. (forward-line -1)
  639. (looking-at "$"))))
  640. ;; `org-blank-before-new-entry' set to auto: if there's no blank
  641. ;; line already in the sole item, do not insert one.
  642. (should-not
  643. (org-test-with-temp-text "- a"
  644. (let ((org-list-empty-line-terminates-plain-lists nil)
  645. (org-blank-before-new-entry '((plain-list-item . auto))))
  646. (end-of-line)
  647. (org-insert-item)
  648. (forward-line -1)
  649. (looking-at "$"))))
  650. ;; `org-blank-before-new-entry' set to `auto': if there's a blank
  651. ;; line in the sole item, insert another one.
  652. (should
  653. (org-test-with-temp-text "- a\n\n b"
  654. (let ((org-list-empty-line-terminates-plain-lists nil)
  655. (org-blank-before-new-entry '((plain-list-item . auto))))
  656. (goto-char (point-max))
  657. (org-insert-item)
  658. (forward-line -1)
  659. (looking-at "$"))))
  660. ;; `org-blank-before-new-entry' set to `auto': if the user specified
  661. ;; a blank line, preserve it.
  662. (should
  663. (org-test-with-temp-text "- a\n\n"
  664. (let ((org-list-empty-line-terminates-plain-lists nil)
  665. (org-blank-before-new-entry '((plain-list-item . auto))))
  666. (goto-char (point-max))
  667. (org-insert-item)
  668. (forward-line -1)
  669. (looking-at "$"))))
  670. ;; `org-blank-before-new-entry' set to `auto': if some items in list
  671. ;; are already separated by blank lines, insert one.
  672. (should
  673. (org-test-with-temp-text "- a\n\n- b"
  674. (let ((org-list-empty-line-terminates-plain-lists nil)
  675. (org-blank-before-new-entry '((plain-list-item . auto))))
  676. (goto-char (point-max))
  677. (org-insert-item)
  678. (forward-line -1)
  679. (looking-at "$"))))
  680. (should
  681. (org-test-with-temp-text "- a\n\n- b"
  682. (let ((org-list-empty-line-terminates-plain-lists nil)
  683. (org-blank-before-new-entry '((plain-list-item . auto))))
  684. (org-insert-item)
  685. (forward-line)
  686. (looking-at "$"))))
  687. (should
  688. (org-test-with-temp-text "- a\n #+BEGIN_EXAMPLE\n\n x\n #+END_EXAMPLE"
  689. (let ((org-list-empty-line-terminates-plain-lists nil)
  690. (org-blank-before-new-entry '((plain-list-item . auto))))
  691. (goto-char (point-max))
  692. (org-insert-item)
  693. (forward-line -1)
  694. (looking-at "$"))))
  695. ;; When called before or on the bullet, insert new item before
  696. ;; current one.
  697. (should
  698. (equal "- \n- item"
  699. (org-test-with-temp-text "- item"
  700. (org-insert-item)
  701. (buffer-string))))
  702. (should
  703. (equal "- \n- item"
  704. (org-test-with-temp-text "- <point>item"
  705. (org-insert-item)
  706. (buffer-string))))
  707. ;; When called on tag in a descriptive list, insert new item before
  708. ;; current one too.
  709. (should
  710. (equal "- :: \n- tag :: item"
  711. (org-test-with-temp-text "- tag <point>:: item"
  712. (org-insert-item)
  713. (buffer-string))))
  714. (should
  715. (equal "- :: \n- tag :: item"
  716. (org-test-with-temp-text "- ta<point>g :: item"
  717. (org-insert-item)
  718. (buffer-string))))
  719. ;; Further, it splits the line or add a blank new item after it,
  720. ;; according to `org-M-RET-may-split-line'.
  721. (should
  722. (equal "- it\n- em"
  723. (org-test-with-temp-text "- it<point>em"
  724. (let ((org-M-RET-may-split-line '((default . t))))
  725. (org-insert-item))
  726. (buffer-string))))
  727. (should
  728. (equal "- item\n- "
  729. (org-test-with-temp-text "- it<point>em"
  730. (let ((org-M-RET-may-split-line '((default . nil))))
  731. (org-insert-item))
  732. (buffer-string)))))
  733. (ert-deftest test-org-list/repair ()
  734. "Test `org-list-repair' specifications."
  735. ;; Repair indentation.
  736. (should
  737. (equal "- item\n - child"
  738. (org-test-with-temp-text "- item\n - child"
  739. (let ((org-list-indent-offset 0)) (org-list-repair))
  740. (buffer-string))))
  741. ;; Repair bullets and numbering.
  742. (should
  743. (equal "- a\n- b"
  744. (org-test-with-temp-text "- a\n+ b"
  745. (let ((org-list-indent-offset 0))
  746. (org-list-repair))
  747. (buffer-string))))
  748. (should
  749. (equal "1. a\n2. b"
  750. (org-test-with-temp-text "1. a\n1. b"
  751. (let ((org-list-indent-offset 0)
  752. (org-plain-list-ordered-item-terminator t))
  753. (org-list-repair))
  754. (buffer-string))))
  755. ;; Repair check-boxes.
  756. (should
  757. (equal "- [X] item\n - [X] child"
  758. (org-test-with-temp-text "- [ ] item\n - [X] child"
  759. (let ((org-list-indent-offset 0))
  760. (org-list-repair))
  761. (buffer-string))))
  762. ;; Special case: do not move contents of an item within its child.
  763. ;; Yet, preserve indentation differences within contents.
  764. (should
  765. (equal "- item\n - child\n within item"
  766. (org-test-with-temp-text "- item\n - child\n within item"
  767. (let ((org-list-indent-offset 0)) (org-list-repair))
  768. (buffer-string))))
  769. (should
  770. (equal
  771. "- item\n - child\n within item\n indented"
  772. (org-test-with-temp-text
  773. "- item\n - child\n within item\n indented"
  774. (let ((org-list-indent-offset 0)) (org-list-repair))
  775. (buffer-string)))))
  776. (ert-deftest test-org-list/update-checkbox-count ()
  777. "Test `org-update-checkbox-count' specifications."
  778. ;; From a headline.
  779. (should
  780. (string-match "\\[0/1\\]"
  781. (org-test-with-temp-text "* [/]\n- [ ] item"
  782. (org-update-checkbox-count)
  783. (buffer-string))))
  784. (should
  785. (string-match "\\[1/1\\]"
  786. (org-test-with-temp-text "* [/]\n- [X] item"
  787. (org-update-checkbox-count)
  788. (buffer-string))))
  789. (should
  790. (string-match "\\[100%\\]"
  791. (org-test-with-temp-text "* [%]\n- [X] item"
  792. (org-update-checkbox-count)
  793. (buffer-string))))
  794. ;; From a list or a sub-list.
  795. (should
  796. (string-match "\\[0/1\\]"
  797. (org-test-with-temp-text "- [/]\n - [ ] item"
  798. (org-update-checkbox-count)
  799. (buffer-string))))
  800. (should
  801. (string-match "\\[1/1\\]"
  802. (org-test-with-temp-text "- [/]\n - [X] item"
  803. (org-update-checkbox-count)
  804. (buffer-string))))
  805. (should
  806. (string-match "\\[100%\\]"
  807. (org-test-with-temp-text "- [%]\n - [X] item"
  808. (org-update-checkbox-count)
  809. (buffer-string))))
  810. (should
  811. (string-match
  812. "\\[1/1\\]"
  813. (org-test-with-temp-text "- [ ] item 1\n- [ ] item 2 [/]\n - [X] sub 1"
  814. (org-update-checkbox-count)
  815. (buffer-string))))
  816. ;; Count do not apply to sub-lists unless count is not hierarchical.
  817. ;; This state can be achieved with COOKIE_DATA node property set to
  818. ;; "recursive".
  819. (should
  820. (string-match "\\[1/1\\]"
  821. (org-test-with-temp-text "- [/]\n - item\n - [X] sub-item"
  822. (let ((org-checkbox-hierarchical-statistics nil))
  823. (org-update-checkbox-count))
  824. (buffer-string))))
  825. (should
  826. (string-match "\\[1/1\\]"
  827. (org-test-with-temp-text "
  828. <point>* H
  829. :PROPERTIES:
  830. :COOKIE_DATA: recursive
  831. :END:
  832. - [/]
  833. - item
  834. - [X] sub-item"
  835. (org-update-checkbox-count)
  836. (buffer-string))))
  837. (should
  838. (string-match "\\[0/0\\]"
  839. (org-test-with-temp-text "- [/]\n - item\n - [ ] sub-item"
  840. (org-update-checkbox-count)
  841. (buffer-string))))
  842. ;; With optional argument ALL, update all buffer.
  843. (should
  844. (= 2
  845. (org-test-with-temp-text "* [/]\n- [X] item\n* [/]\n- [X] item"
  846. (org-update-checkbox-count t)
  847. (count-matches "\\[1/1\\]"))))
  848. ;; Ignore boxes in drawers, blocks or inlinetasks when counting from
  849. ;; outside.
  850. (should
  851. (string-match "\\[2/2\\]"
  852. (org-test-with-temp-text "
  853. - [/]
  854. - [X] item1
  855. :DRAWER:
  856. - [X] item
  857. :END:
  858. - [X] item2"
  859. (let ((org-checkbox-hierarchical-statistics nil))
  860. (org-update-checkbox-count))
  861. (buffer-string)))))
  862. ;;; Radio Lists
  863. (ert-deftest test-org-list/send-list ()
  864. "Test various checks for `org-list-send-list'."
  865. ;; Error when not at a list item.
  866. (should-error
  867. (org-test-with-temp-text "Not a list item"
  868. (org-list-send-list)))
  869. ;; Error when ORGLST line is not provided.
  870. (should-error
  871. (org-test-with-temp-text "- item"
  872. (org-list-send-list)))
  873. ;; Error when transformation function is unknown.
  874. (should-error
  875. (org-test-with-temp-text "@ignore
  876. #+ORGLST: SEND list unknown-function
  877. - item
  878. @end ignore"
  879. (forward-line 2)
  880. (org-list-send-list)))
  881. ;; Error when receiving location is not defined.
  882. (should-error
  883. (org-test-with-temp-text "@ignore
  884. #+ORGLST: SEND list org-list-to-texinfo
  885. - item
  886. @end ignore"
  887. (forward-line 2)
  888. (org-list-send-list)))
  889. ;; Error when insertion region is ill-formed.
  890. (should-error
  891. (org-test-with-temp-text "@c BEGIN RECEIVE ORGLST list
  892. @ignore
  893. #+ORGLST: SEND list org-list-to-texinfo
  894. - item
  895. @end ignore"
  896. (forward-line 3)
  897. (org-list-send-list))))
  898. (ert-deftest test-org-list/to-html ()
  899. "Test `org-list-to-html' specifications."
  900. (should
  901. (equal "<ul class=\"org-ul\">\n<li>a</li>\n</ul>"
  902. (let (org-html-indent)
  903. (with-temp-buffer
  904. (insert "<!-- BEGIN RECEIVE ORGLST name -->
  905. <!-- END RECEIVE ORGLST name -->
  906. <!--
  907. #+ORGLST: SEND name org-list-to-html
  908. - a
  909. -->")
  910. (goto-char (point-min))
  911. (re-search-forward "^- a" nil t)
  912. (beginning-of-line)
  913. (org-list-send-list)
  914. (goto-line 2)
  915. (buffer-substring-no-properties
  916. (point)
  917. (progn (re-search-forward "^<!-- END" nil t)
  918. (beginning-of-line)
  919. (skip-chars-backward " \r\t\n")
  920. (point))))))))
  921. (ert-deftest test-org-list/to-latex ()
  922. "Test `org-list-to-latex' specifications."
  923. (should
  924. (equal "\\begin{itemize}\n\\item a\n\\end{itemize}"
  925. (with-temp-buffer
  926. (insert "% BEGIN RECEIVE ORGLST name
  927. % END RECEIVE ORGLST name
  928. \\begin{comment}
  929. #+ORGLST: SEND name org-list-to-latex
  930. - a
  931. \\end{comment}")
  932. (goto-char (point-min))
  933. (re-search-forward "^- a" nil t)
  934. (beginning-of-line)
  935. (org-list-send-list)
  936. (goto-line 2)
  937. (buffer-substring-no-properties
  938. (point)
  939. (progn (re-search-forward "^% END" nil t)
  940. (beginning-of-line)
  941. (skip-chars-backward " \r\t\n")
  942. (point)))))))
  943. (ert-deftest test-org-list/to-texinfo ()
  944. "Test `org-list-to-texinfo' specifications."
  945. (should
  946. (equal "@itemize\n@item\na\n@end itemize"
  947. (with-temp-buffer
  948. (insert "@c BEGIN RECEIVE ORGLST name
  949. @c END RECEIVE ORGLST name
  950. @ignore
  951. #+ORGLST: SEND name org-list-to-texinfo
  952. - a
  953. @end ignore")
  954. (goto-char (point-min))
  955. (re-search-forward "^- a" nil t)
  956. (beginning-of-line)
  957. (org-list-send-list)
  958. (goto-line 2)
  959. (buffer-substring-no-properties
  960. (point)
  961. (progn (re-search-forward "^@c END" nil t)
  962. (beginning-of-line)
  963. (skip-chars-backward " \r\t\n")
  964. (point)))))))
  965. (provide 'test-org-list)
  966. ;;; test-org-list.el ends here