test-org-list.el 43 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465
  1. ;;; test-org-list.el --- Tests for org-list.el
  2. ;; Copyright (C) 2012, 2013, 2014, 2018, 2019 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. ;; Error when not at an item.
  210. (org-test-with-temp-text "Paragraph."
  211. (should-error (org-indent-item)))
  212. ;; Error when trying to move first item of a list.
  213. (should-error
  214. (org-test-with-temp-text "
  215. - Item 1
  216. - Item 2"
  217. (forward-line)
  218. (org-indent-item)))
  219. (should-error
  220. (org-test-with-temp-text "
  221. - Item 1
  222. - Item 2"
  223. (forward-line)
  224. (let ((org-list-automatic-rules nil)) (org-indent-item))))
  225. ;; Indent a single item, not its children.
  226. (should
  227. (equal "
  228. - Item 1
  229. - Item 2
  230. - Item 2.1"
  231. (org-test-with-temp-text "
  232. - Item 1
  233. - Item 2<point>
  234. - Item 2.1"
  235. (let (org-list-demote-modify-bullet) (org-indent-item))
  236. (buffer-string))))
  237. ;; Follow `org-list-demote-modify-bullet' specifications.
  238. (should
  239. (equal "
  240. - Item 1
  241. + Item 2"
  242. (org-test-with-temp-text "
  243. - Item 1
  244. - Item 2<point>"
  245. (let ((org-list-demote-modify-bullet '(("-" . "+"))))
  246. (org-indent-item))
  247. (buffer-string))))
  248. (should
  249. (equal "
  250. 1. Item 1
  251. + Item 2"
  252. (org-test-with-temp-text "
  253. 1. Item 1
  254. 2. Item 2<point>"
  255. (let ((org-plain-list-ordered-item-terminator t)
  256. (org-list-demote-modify-bullet '(("1." . "+"))))
  257. (org-indent-item))
  258. (buffer-string))))
  259. (should
  260. (equal "
  261. a. Item 1
  262. - Item 2"
  263. (org-test-with-temp-text "
  264. a. Item 1
  265. b. Item 2<point>"
  266. (let ((org-plain-list-ordered-item-terminator t)
  267. (org-list-allow-alphabetical t)
  268. (org-list-demote-modify-bullet '(("A." . "a.") ("a." . "-"))))
  269. (org-indent-item))
  270. (buffer-string))))
  271. ;; When a region is selected, indent every item within.
  272. (should
  273. (equal "
  274. - Item 1
  275. - Item 2
  276. - Item 3
  277. "
  278. (org-test-with-temp-text "
  279. - Item 1
  280. <point>- Item 2
  281. - Item 3
  282. "
  283. (transient-mark-mode 1)
  284. (push-mark (point) t t)
  285. (goto-char (point-max))
  286. (let (org-list-demote-modify-bullet) (org-indent-item))
  287. (buffer-string)))))
  288. (ert-deftest test-org-list/indent-item-tree ()
  289. "Test `org-indent-item-tree' specifications."
  290. ;; 1. Error when not at an item.
  291. (org-test-with-temp-text "Paragraph."
  292. (should-error (org-indent-item-tree)))
  293. ;; 2. Indent item along with its children.
  294. (org-test-with-temp-text "
  295. - Item 1
  296. - Item 2
  297. - Item 2.1"
  298. (search-forward "- Item 2")
  299. (let (org-list-demote-modify-bullet) (org-indent-item-tree))
  300. (should (equal (buffer-string)
  301. "
  302. - Item 1
  303. - Item 2
  304. - Item 2.1")))
  305. ;; 3. Special case: When indenting top item, move the whole list.
  306. (org-test-with-temp-text "
  307. - Item 1
  308. - Item 2"
  309. (search-forward "- Item 1")
  310. (let (org-list-demote-modify-bullet org-odd-levels-only)
  311. (org-indent-item-tree))
  312. (should (equal (buffer-string)
  313. "
  314. - Item 1
  315. - Item 2")))
  316. ;; 4. Follow `org-list-demote-modify-bullet' specifications.
  317. ;;
  318. ;; 4.1. With unordered lists.
  319. (org-test-with-temp-text "
  320. - Item 1
  321. - Item 2
  322. + Item 2.1"
  323. (search-forward "- Item 2")
  324. (let ((org-list-demote-modify-bullet '(("-" . "+") ("+" . "-"))))
  325. (org-indent-item-tree))
  326. (should (equal (buffer-string)
  327. "
  328. - Item 1
  329. + Item 2
  330. - Item 2.1")))
  331. ;; 4.2. and ordered lists.
  332. (org-test-with-temp-text "
  333. 1. Item 1
  334. 2. Item 2
  335. + Item 2.1"
  336. (search-forward "2. Item 2")
  337. (let ((org-plain-list-ordered-item-terminator t)
  338. (org-list-demote-modify-bullet '(("1." . "+") ("+" . "1."))))
  339. (org-indent-item-tree))
  340. (should (equal (buffer-string)
  341. "
  342. 1. Item 1
  343. + Item 2
  344. 1. Item 2.1")))
  345. ;; 5. When a region is selected, indent every item within.
  346. (org-test-with-temp-text "
  347. - Item 1
  348. - Item 2
  349. - Item 2.1
  350. - Item 3
  351. - Item 3.1
  352. "
  353. (search-forward "- Item 2")
  354. (beginning-of-line)
  355. (transient-mark-mode 1)
  356. (push-mark (point) t t)
  357. (goto-char (point-max))
  358. (let (org-list-demote-modify-bullet) (org-indent-item-tree))
  359. (should (equal (buffer-string)
  360. "
  361. - Item 1
  362. - Item 2
  363. - Item 2.1
  364. - Item 3
  365. - Item 3.1
  366. "))))
  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
  396. "
  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)
  404. "
  405. - Item 1
  406. - Item 2
  407. - Item 3
  408. "))))
  409. (ert-deftest test-org-list/outdent-item-tree ()
  410. "Test `org-outdent-item-tree' specifications."
  411. ;; 1. Error when not at an item.
  412. (org-test-with-temp-text "Paragraph."
  413. (should-error (org-outdent-item-tree)))
  414. ;; 2. Error when trying to outdent before top item.
  415. (org-test-with-temp-text "
  416. - Item 1
  417. - Item 2"
  418. (search-forward "- Item 2")
  419. (should-error (org-outdent-item-tree)))
  420. ;; 3. Outdent item along with its children.
  421. (org-test-with-temp-text "
  422. - Item 1
  423. - Item 2
  424. - Item 2.1"
  425. (search-forward "- Item 2")
  426. (org-outdent-item-tree)
  427. (should (equal (buffer-string)
  428. "
  429. - Item 1
  430. - Item 2
  431. - Item 2.1")))
  432. ;; 3. Special case: When outdenting top item, move the whole list.
  433. (org-test-with-temp-text "
  434. - Item 1
  435. - Item 2"
  436. (search-forward "- Item 1")
  437. (let (org-odd-levels-only) (org-outdent-item-tree))
  438. (should (equal (buffer-string)
  439. "
  440. - Item 1
  441. - Item 2")))
  442. ;; 5. When a region is selected, outdent every item within.
  443. (org-test-with-temp-text "
  444. - Item 1
  445. - Item 2
  446. - Item 2.1
  447. - Item 3
  448. - Item 3.1
  449. "
  450. (search-forward "- Item 2")
  451. (beginning-of-line)
  452. (transient-mark-mode 1)
  453. (push-mark (point) t t)
  454. (goto-char (point-max))
  455. (org-outdent-item-tree)
  456. (should (equal (buffer-string)
  457. "
  458. - Item 1
  459. - Item 2
  460. - Item 2.1
  461. - Item 3
  462. - Item 3.1
  463. "))))
  464. (ert-deftest test-org-list/move-item-down ()
  465. "Test `org-move-item-down' specifications."
  466. ;; Standard test.
  467. (org-test-with-temp-text "- item 1\n- item 2"
  468. (org-move-item-down)
  469. (should (equal (buffer-string)
  470. "- item 2\n- item 1")))
  471. ;; Keep same column in item.
  472. (org-test-with-temp-text "- item 1\n- item 2"
  473. (forward-char 4)
  474. (org-move-item-down)
  475. (should (looking-at "em 1")))
  476. ;; Move sub-items.
  477. (org-test-with-temp-text "- item 1\n - sub-item 1\n- item 2"
  478. (org-move-item-down)
  479. (should (equal (buffer-string)
  480. "- item 2\n- item 1\n - sub-item 1")))
  481. ;; Preserve blank lines.
  482. (should
  483. (equal
  484. "- item 2\n\n- item 1"
  485. (org-test-with-temp-text "- item 1\n\n- item 2"
  486. (org-move-item-down)
  487. (buffer-string))))
  488. ;; Error when trying to move the last item...
  489. (org-test-with-temp-text "- item 1\n- item 2"
  490. (forward-line)
  491. (should-error (org-move-item-down)))
  492. ;; ... unless `org-list-use-circular-motion' is non-nil. In this
  493. ;; case, move to the first item.
  494. (org-test-with-temp-text "- item 1\n- item 2\n- item 3"
  495. (forward-line 2)
  496. (let ((org-list-use-circular-motion t)) (org-move-item-down))
  497. (should (equal (buffer-string) "- item 3\n- item 1\n- item 2\n")))
  498. ;; Preserve item visibility.
  499. (org-test-with-temp-text "* Headline\n- item 1\n body 1\n- item 2\n body 2"
  500. (let ((org-cycle-include-plain-lists t))
  501. (search-forward "- item 1")
  502. (org-cycle)
  503. (search-forward "- item 2")
  504. (org-cycle))
  505. (search-backward "- item 1")
  506. (org-move-item-down)
  507. (forward-line)
  508. (should (org-invisible-p2))
  509. (search-backward " body 2")
  510. (should (org-invisible-p2)))
  511. ;; Preserve children visibility.
  512. (org-test-with-temp-text "* Headline
  513. - item 1
  514. - sub-item 1
  515. sub-body 1
  516. - item 2
  517. - sub-item 2
  518. sub-body 2"
  519. (let ((org-cycle-include-plain-lists t))
  520. (search-forward "- sub-item 1")
  521. (org-cycle)
  522. (search-forward "- sub-item 2")
  523. (org-cycle))
  524. (search-backward "- item 1")
  525. (org-move-item-down)
  526. (search-forward "sub-body 1")
  527. (should (org-invisible-p2))
  528. (search-backward "sub-body 2")
  529. (should (org-invisible-p2))))
  530. (ert-deftest test-org-list/move-item-down-contents-visibility ()
  531. "Preserve contents visibility."
  532. (org-test-with-temp-text "
  533. - item 1
  534. #+BEGIN_CENTER
  535. Text1
  536. #+END_CENTER
  537. - item 2
  538. #+BEGIN_CENTER
  539. Text2
  540. #+END_CENTER"
  541. (org-hide-block-all)
  542. (let ((invisible-property-1
  543. (progn
  544. (search-forward "Text1")
  545. (get-char-property (point) 'invisible)))
  546. (invisible-property-2
  547. (progn
  548. (search-forward "Text2")
  549. (get-char-property (point) 'invisible))))
  550. (goto-char (point-min))
  551. (search-forward "- item 1")
  552. (org-move-item-down)
  553. (search-forward "Text1")
  554. (should (eq invisible-property-1 (get-char-property (point) 'invisible)))
  555. (search-backward "Text2")
  556. (should (eq invisible-property-2 (get-char-property (point) 'invisible))))))
  557. (ert-deftest test-org-list/move-item-up ()
  558. "Test `org-move-item-up' specifications."
  559. ;; Standard test.
  560. (org-test-with-temp-text "- item 1\n- item 2"
  561. (forward-line)
  562. (org-move-item-up)
  563. (should (equal (buffer-string)
  564. "- item 2\n- item 1")))
  565. ;; Keep same column in item.
  566. (org-test-with-temp-text "- item 1\n- item 2"
  567. (forward-line)
  568. (forward-char 4)
  569. (org-move-item-up)
  570. (should (looking-at "em 2")))
  571. ;; Move sub-items.
  572. (org-test-with-temp-text "- item 1\n- item 2\n - sub-item 2"
  573. (forward-line)
  574. (org-move-item-up)
  575. (should (equal (buffer-string)
  576. "- item 2\n - sub-item 2\n- item 1")))
  577. ;; Preserve blank lines.
  578. (should
  579. (equal
  580. "- item 2\n\n- item 1"
  581. (org-test-with-temp-text "- item 1\n\n- item 2"
  582. (search-forward "- item 2")
  583. (org-move-item-up)
  584. (buffer-string))))
  585. ;; Error when trying to move the first item...
  586. (org-test-with-temp-text "- item 1\n- item 2"
  587. (should-error (org-move-item-up)))
  588. ;; ... unless `org-list-use-circular-motion' is non-nil. In this
  589. ;; case, move to the first item.
  590. (should
  591. (equal "- item 2\n- item 3\n- item 1"
  592. (org-test-with-temp-text "- item 1\n- item 2\n- item 3"
  593. (let ((org-list-use-circular-motion t)) (org-move-item-up))
  594. (buffer-string))))
  595. ;; Preserve item visibility.
  596. (org-test-with-temp-text "* Headline\n- item 1\n body 1\n- item 2\n body 2"
  597. (let ((org-cycle-include-plain-lists t))
  598. (search-forward "- item 1")
  599. (org-cycle)
  600. (search-forward "- item 2")
  601. (org-cycle))
  602. (org-move-item-up)
  603. (forward-line)
  604. (should (org-invisible-p2))
  605. (search-forward " body 1")
  606. (should (org-invisible-p2)))
  607. ;; Preserve children visibility.
  608. (org-test-with-temp-text "* Headline
  609. - item 1
  610. - sub-item 1
  611. sub-body 1
  612. - item 2
  613. - sub-item 2
  614. sub-body 2"
  615. (let ((org-cycle-include-plain-lists t))
  616. (search-forward "- sub-item 1")
  617. (org-cycle)
  618. (search-forward "- sub-item 2")
  619. (org-cycle))
  620. (search-backward "- item 2")
  621. (org-move-item-up)
  622. (search-forward "sub-body 2")
  623. (should (org-invisible-p2))
  624. (search-forward "sub-body 1")
  625. (should (org-invisible-p2))))
  626. (ert-deftest test-org-list/move-item-up-contents-visibility ()
  627. (org-test-with-temp-text "
  628. - item 1
  629. #+BEGIN_CENTER
  630. Text1
  631. #+END_CENTER
  632. - item 2
  633. #+BEGIN_CENTER
  634. Text2
  635. #+END_CENTER"
  636. (org-hide-block-all)
  637. (let ((invisible-property-1
  638. (progn
  639. (search-forward "Text1")
  640. (get-char-property (point) 'invisible)))
  641. (invisible-property-2
  642. (progn
  643. (search-forward "Text2")
  644. (get-char-property (point) 'invisible))))
  645. (goto-char (point-min))
  646. (search-forward "- item 2")
  647. (org-move-item-up)
  648. (search-forward "Text2")
  649. (should (eq invisible-property-2 (get-char-property (point) 'invisible)))
  650. (search-forward "Text1")
  651. (should (eq invisible-property-1 (get-char-property (point) 'invisible))))))
  652. (ert-deftest test-org-list/insert-item ()
  653. "Test item insertion."
  654. ;; Blank lines specifications.
  655. ;;
  656. ;; Non-nil `org-blank-before-new-entry': insert a blank line.
  657. (should
  658. (org-test-with-temp-text "- a"
  659. (let ((org-blank-before-new-entry '((plain-list-item . t))))
  660. (end-of-line)
  661. (org-insert-item)
  662. (forward-line -1)
  663. (looking-at "$"))))
  664. ;; Nil `org-blank-before-new-entry': do not insert a blank line.
  665. (should-not
  666. (org-test-with-temp-text "- a"
  667. (let ((org-blank-before-new-entry '((plain-list-item . nil))))
  668. (end-of-line)
  669. (org-insert-item)
  670. (forward-line -1)
  671. (looking-at "$"))))
  672. ;; `org-blank-before-new-entry' set to auto: if there's no blank
  673. ;; line already in the sole item, do not insert one.
  674. (should-not
  675. (org-test-with-temp-text "- a"
  676. (let ((org-blank-before-new-entry '((plain-list-item . auto))))
  677. (end-of-line)
  678. (org-insert-item)
  679. (forward-line -1)
  680. (looking-at "$"))))
  681. ;; `org-blank-before-new-entry' set to `auto': if there's a blank
  682. ;; line in the sole item, insert another one.
  683. (should
  684. (org-test-with-temp-text "- a\n\n b<point>"
  685. (let ((org-blank-before-new-entry '((plain-list-item . auto))))
  686. (org-insert-item)
  687. (forward-line -1)
  688. (looking-at "$"))))
  689. ;; `org-blank-before-new-entry' set to `auto': if the user specified
  690. ;; a blank line, preserve it.
  691. (should
  692. (org-test-with-temp-text "- a\n\n<point>"
  693. (let ((org-blank-before-new-entry '((plain-list-item . auto))))
  694. (org-insert-item)
  695. (forward-line -1)
  696. (looking-at "$"))))
  697. ;; `org-blank-before-new-entry' set to `auto': if some items in list
  698. ;; are already separated by blank lines, insert one.
  699. (should
  700. (org-test-with-temp-text "- a\n\n- b<point>"
  701. (let ((org-blank-before-new-entry '((plain-list-item . auto))))
  702. (org-insert-item)
  703. (forward-line -1)
  704. (looking-at "$"))))
  705. (should
  706. (org-test-with-temp-text "- a\n\n- b"
  707. (let ((org-blank-before-new-entry '((plain-list-item . auto))))
  708. (org-insert-item)
  709. (forward-line)
  710. (looking-at "$"))))
  711. (should
  712. (org-test-with-temp-text
  713. "- a\n #+BEGIN_EXAMPLE\n\n x\n #+END_EXAMPLE<point>"
  714. (let ((org-blank-before-new-entry '((plain-list-item . auto))))
  715. (org-insert-item)
  716. (forward-line -1)
  717. (looking-at "$"))))
  718. ;; When called before or on the bullet, insert new item before
  719. ;; current one.
  720. (should
  721. (equal "- \n- item"
  722. (org-test-with-temp-text "- item"
  723. (org-insert-item)
  724. (buffer-string))))
  725. (should
  726. (equal "- \n- item"
  727. (org-test-with-temp-text "- <point>item"
  728. (org-insert-item)
  729. (buffer-string))))
  730. ;; When called at the very end of the list, insert new item as
  731. ;; a sibling of the very last one.
  732. (should
  733. (equal "- A\n\n - B\n\n - "
  734. (org-test-with-temp-text "- A\n\n - B\n\n<point>"
  735. (org-insert-item)
  736. (buffer-string))))
  737. (should
  738. (equal "- A\n\n - B\n\n - "
  739. (org-test-with-temp-text "- A\n\n - B\n\n <point>"
  740. (org-insert-item)
  741. (buffer-string))))
  742. ;; When called on tag in a descriptive list, insert new item before
  743. ;; current one too.
  744. (should
  745. (equal "- :: \n- tag :: item"
  746. (org-test-with-temp-text "- tag <point>:: item"
  747. (org-insert-item)
  748. (buffer-string))))
  749. (should
  750. (equal "- :: \n- tag :: item"
  751. (org-test-with-temp-text "- ta<point>g :: item"
  752. (org-insert-item)
  753. (buffer-string))))
  754. ;; Further, it splits the line or add a blank new item after it,
  755. ;; according to `org-M-RET-may-split-line'.
  756. (should
  757. (equal "- it\n- em"
  758. (org-test-with-temp-text "- it<point>em"
  759. (let ((org-M-RET-may-split-line '((default . t))))
  760. (org-insert-item))
  761. (buffer-string))))
  762. (should
  763. (equal "- item\n- "
  764. (org-test-with-temp-text "- it<point>em"
  765. (let ((org-M-RET-may-split-line '((default . nil))))
  766. (org-insert-item))
  767. (buffer-string))))
  768. ;; Re-order automatically.
  769. (should
  770. (equal "1. A\n\n2. \n\n3. \n\n4. B"
  771. (org-test-with-temp-text "1. A<point>\n\n2. \n\n3. B"
  772. (org-insert-item)
  773. (buffer-string))))
  774. ;; Preserve list visibility when inserting an item.
  775. (should
  776. (equal
  777. '(outline outline)
  778. (org-test-with-temp-text "- A\n - B\n- C\n - D"
  779. (let ((org-cycle-include-plain-lists t))
  780. (org-cycle)
  781. (forward-line 2)
  782. (org-cycle)
  783. (org-insert-item)
  784. (list (get-char-property (line-beginning-position 0) 'invisible)
  785. (get-char-property (line-end-position 2) 'invisible))))))
  786. ;; Test insertion in area after a sub-list. In particular, if point
  787. ;; is right at the end of the previous sub-list, still insert
  788. ;; a sub-item in that list.
  789. (should
  790. (= 2
  791. (org-test-with-temp-text "- item\n - sub-list\n<point> resume item"
  792. (org-insert-item)
  793. (current-indentation))))
  794. (should
  795. (= 0
  796. (org-test-with-temp-text "- item\n - sub-list\n resume item<point>"
  797. (org-insert-item)
  798. (current-indentation)))))
  799. (ert-deftest test-org-list/repair ()
  800. "Test `org-list-repair' specifications."
  801. ;; Repair indentation.
  802. (should
  803. (equal "- item\n - child"
  804. (org-test-with-temp-text "- item\n - child"
  805. (let ((org-list-indent-offset 0)) (org-list-repair))
  806. (buffer-string))))
  807. ;; Repair bullets and numbering.
  808. (should
  809. (equal "- a\n- b"
  810. (org-test-with-temp-text "- a\n+ b"
  811. (let ((org-list-indent-offset 0))
  812. (org-list-repair))
  813. (buffer-string))))
  814. (should
  815. (equal "1. a\n2. b"
  816. (org-test-with-temp-text "1. a\n1. b"
  817. (let ((org-list-indent-offset 0)
  818. (org-plain-list-ordered-item-terminator t))
  819. (org-list-repair))
  820. (buffer-string))))
  821. ;; Repair check-boxes.
  822. (should
  823. (equal "- [X] item\n - [X] child"
  824. (org-test-with-temp-text "- [ ] item\n - [X] child"
  825. (let ((org-list-indent-offset 0))
  826. (org-list-repair))
  827. (buffer-string))))
  828. ;; Special case: do not move contents of an item within its child.
  829. ;; Yet, preserve indentation differences within contents.
  830. (should
  831. (equal "- item\n - child\n within item"
  832. (org-test-with-temp-text "- item\n - child\n within item"
  833. (let ((org-list-indent-offset 0)) (org-list-repair))
  834. (buffer-string))))
  835. (should
  836. (equal
  837. "- item\n - child\n within item\n indented"
  838. (org-test-with-temp-text
  839. "- item\n - child\n within item\n indented"
  840. (let ((org-list-indent-offset 0)) (org-list-repair))
  841. (buffer-string)))))
  842. (ert-deftest test-org-list/update-checkbox-count ()
  843. "Test `org-update-checkbox-count' specifications."
  844. ;; From a headline.
  845. (should
  846. (string-match "\\[0/1\\]"
  847. (org-test-with-temp-text "* [/]\n- [ ] item"
  848. (org-update-checkbox-count)
  849. (buffer-string))))
  850. (should
  851. (string-match "\\[1/1\\]"
  852. (org-test-with-temp-text "* [/]\n- [X] item"
  853. (org-update-checkbox-count)
  854. (buffer-string))))
  855. (should
  856. (string-match "\\[100%\\]"
  857. (org-test-with-temp-text "* [%]\n- [X] item"
  858. (org-update-checkbox-count)
  859. (buffer-string))))
  860. ;; From a list or a sub-list.
  861. (should
  862. (string-match "\\[0/1\\]"
  863. (org-test-with-temp-text "- [/]\n - [ ] item"
  864. (org-update-checkbox-count)
  865. (buffer-string))))
  866. (should
  867. (string-match "\\[1/1\\]"
  868. (org-test-with-temp-text "- [/]\n - [X] item"
  869. (org-update-checkbox-count)
  870. (buffer-string))))
  871. (should
  872. (string-match "\\[100%\\]"
  873. (org-test-with-temp-text "- [%]\n - [X] item"
  874. (org-update-checkbox-count)
  875. (buffer-string))))
  876. (should
  877. (string-match
  878. "\\[1/1\\]"
  879. (org-test-with-temp-text "- [ ] item 1\n- [ ] item 2 [/]\n - [X] sub 1"
  880. (org-update-checkbox-count)
  881. (buffer-string))))
  882. ;; Count do not apply to sub-lists unless count is not hierarchical.
  883. ;; This state can be achieved with COOKIE_DATA node property set to
  884. ;; "recursive".
  885. (should
  886. (string-match "\\[1/1\\]"
  887. (org-test-with-temp-text "- [/]\n - item\n - [X] sub-item"
  888. (let ((org-checkbox-hierarchical-statistics nil))
  889. (org-update-checkbox-count))
  890. (buffer-string))))
  891. (should
  892. (string-match "\\[1/1\\]"
  893. (org-test-with-temp-text "
  894. <point>* H
  895. :PROPERTIES:
  896. :COOKIE_DATA: recursive
  897. :END:
  898. - [/]
  899. - item
  900. - [X] sub-item"
  901. (org-update-checkbox-count)
  902. (buffer-string))))
  903. (should
  904. (string-match "\\[0/0\\]"
  905. (org-test-with-temp-text "- [/]\n - item\n - [ ] sub-item"
  906. (org-update-checkbox-count)
  907. (buffer-string))))
  908. ;; With optional argument ALL, update all buffer.
  909. (should
  910. (= 2
  911. (org-test-with-temp-text "* [/]\n- [X] item\n* [/]\n- [X] item"
  912. (org-update-checkbox-count t)
  913. (count-matches "\\[1/1\\]"))))
  914. ;; Ignore boxes in drawers, blocks or inlinetasks when counting from
  915. ;; outside.
  916. (should
  917. (string-match "\\[2/2\\]"
  918. (org-test-with-temp-text "
  919. - [/]
  920. - [X] item1
  921. :DRAWER:
  922. - [X] item
  923. :END:
  924. - [X] item2"
  925. (let ((org-checkbox-hierarchical-statistics nil))
  926. (org-update-checkbox-count))
  927. (buffer-string)))))
  928. ;;; API
  929. (ert-deftest test-org-list/at-radio-list-p ()
  930. "Test `org-at-radio-list-p' specifications."
  931. (should
  932. (org-test-with-temp-text "#+attr_org: :radio t\n<point>- foo"
  933. (org-at-radio-list-p)))
  934. (should
  935. (org-test-with-temp-text "#+attr_org: :radio t\n- foo\n<point>- bar"
  936. (org-at-radio-list-p)))
  937. (should
  938. (org-test-with-temp-text "#+ATTR_ORG: :radio t\n<point>- foo"
  939. (org-at-radio-list-p)))
  940. (should
  941. (org-test-with-temp-text "#+attr_org: :radio bar\n<point>- foo"
  942. (org-at-radio-list-p)))
  943. (should-not
  944. (org-test-with-temp-text "#+attr_org: :radio nil\n<point>- foo"
  945. (org-at-radio-list-p)))
  946. (should-not
  947. (org-test-with-temp-text "<point>- foo"
  948. (org-at-radio-list-p)))
  949. (should-not
  950. (org-test-with-temp-text "#+attr_org: :radio t\n- foo\n <point>bar"
  951. (org-at-radio-list-p)))
  952. (should-not
  953. (org-test-with-temp-text
  954. "#+attr_org: :radio t\n#+begin_example\n<point>- foo\n#+end_example"
  955. (org-at-radio-list-p))))
  956. ;;; Miscellaneous
  957. (ert-deftest test-org-list/toggle-item ()
  958. "Test `org-toggle-item' specifications."
  959. ;; Convert normal lines to items.
  960. (should
  961. (equal "- line"
  962. (org-test-with-temp-text "line"
  963. (org-toggle-item nil)
  964. (buffer-string))))
  965. ;; Convert items to normal lines.
  966. (should
  967. (equal "line"
  968. (org-test-with-temp-text "- line"
  969. (org-toggle-item nil)
  970. (buffer-string))))
  971. ;; Convert headlines to items.
  972. (should
  973. (equal "- line"
  974. (org-test-with-temp-text "* line"
  975. (org-toggle-item nil)
  976. (buffer-string))))
  977. ;; When converting a headline to a list item, TODO keywords become
  978. ;; checkboxes.
  979. (should
  980. (equal "- [X] line"
  981. (org-test-with-temp-text "* DONE line"
  982. (org-toggle-item nil)
  983. (buffer-string))))
  984. (should
  985. (equal "- [ ] line"
  986. (org-test-with-temp-text "* TODO line"
  987. (org-toggle-item nil)
  988. (buffer-string))))
  989. ;; When turning headlines into items, make sure planning info line
  990. ;; and properties drawers are removed. This also includes empty
  991. ;; lines following them.
  992. (should
  993. (equal "- H\n"
  994. (org-test-with-temp-text "* H\nSCHEDULED: <2012-03-29 Thu>"
  995. (org-toggle-item nil)
  996. (buffer-string))))
  997. (should
  998. (equal "- H\n"
  999. (org-test-with-temp-text "* H\n:PROPERTIES:\n:A: 1\n:END:"
  1000. (org-toggle-item nil)
  1001. (buffer-string))))
  1002. (should
  1003. (equal "- H\nText"
  1004. (org-test-with-temp-text "* H\n:PROPERTIES:\n:A: 1\n:END:\n\n\nText"
  1005. (org-toggle-item nil)
  1006. (buffer-string))))
  1007. ;; When a region is marked and first line is a headline, all
  1008. ;; headlines are turned into items.
  1009. (should
  1010. (equal "- H1\n - H2"
  1011. (org-test-with-temp-text "* H1\n** H2"
  1012. (transient-mark-mode 1)
  1013. (push-mark (point) t t)
  1014. (goto-char (point-max))
  1015. (org-toggle-item nil)
  1016. (buffer-string))))
  1017. (should
  1018. (equal "- [ ] H1\n - [ ] H2"
  1019. (org-test-with-temp-text "* TODO H1\n** TODO H2"
  1020. (transient-mark-mode 1)
  1021. (push-mark (point) t t)
  1022. (goto-char (point-max))
  1023. (org-toggle-item nil)
  1024. (buffer-string))))
  1025. ;; When turning headlines into items, make sure headings contents
  1026. ;; are kept within items.
  1027. (should
  1028. (equal "- H1\n Text"
  1029. (org-test-with-temp-text "* H1\nText"
  1030. (transient-mark-mode 1)
  1031. (push-mark (point) t t)
  1032. (goto-char (point-max))
  1033. (org-toggle-item nil)
  1034. (buffer-string))))
  1035. ;; When a region is marked and first line is an item, all items are
  1036. ;; turned into normal lines.
  1037. (should
  1038. (equal "1\n 2"
  1039. (org-test-with-temp-text "- 1\n - 2"
  1040. (transient-mark-mode 1)
  1041. (push-mark (point) t t)
  1042. (goto-char (point-max))
  1043. (org-toggle-item nil)
  1044. (buffer-string))))
  1045. (should
  1046. (equal "1\n2"
  1047. (org-test-with-temp-text "- 1\n2"
  1048. (transient-mark-mode 1)
  1049. (push-mark (point) t t)
  1050. (goto-char (point-max))
  1051. (org-toggle-item nil)
  1052. (buffer-string))))
  1053. ;; When a region is marked and first line is an item, all normal
  1054. ;; lines are turned into items.
  1055. (should
  1056. (equal "- line 1\n- line 2"
  1057. (org-test-with-temp-text "line 1\nline 2"
  1058. (transient-mark-mode 1)
  1059. (push-mark (point) t t)
  1060. (goto-char (point-max))
  1061. (org-toggle-item nil)
  1062. (buffer-string))))
  1063. (should
  1064. (equal "- line 1\n- line 2"
  1065. (org-test-with-temp-text "line 1\n- line 2"
  1066. (transient-mark-mode 1)
  1067. (push-mark (point) t t)
  1068. (goto-char (point-max))
  1069. (org-toggle-item nil)
  1070. (buffer-string))))
  1071. ;; When argument ARG is non-nil, change the whole region into
  1072. ;; a single item.
  1073. (should
  1074. (equal "- line 1\n line 2"
  1075. (org-test-with-temp-text "line 1\nline 2"
  1076. (transient-mark-mode 1)
  1077. (push-mark (point) t t)
  1078. (goto-char (point-max))
  1079. (org-toggle-item t)
  1080. (buffer-string)))))
  1081. (ert-deftest test-org-list/sort ()
  1082. "Test `org-sort-list'."
  1083. ;; Sort alphabetically.
  1084. (let ((original-string-collate-lessp (symbol-function 'string-collate-lessp)))
  1085. (cl-letf (((symbol-function 'string-collate-lessp)
  1086. (lambda (s1 s2 &optional locale ignore-case)
  1087. (funcall original-string-collate-lessp
  1088. s1 s2 "C" ignore-case))))
  1089. (should
  1090. (equal "- abc\n- def\n- XYZ\n"
  1091. (org-test-with-temp-text "- def\n- XYZ\n- abc\n"
  1092. (org-sort-list nil ?a)
  1093. (buffer-string))))
  1094. (should
  1095. (equal "- XYZ\n- def\n- abc\n"
  1096. (org-test-with-temp-text "- def\n- XYZ\n- abc\n"
  1097. (org-sort-list nil ?A)
  1098. (buffer-string))))
  1099. ;; Sort alphabetically (with case).
  1100. (should
  1101. (equal "- C\n- a\n- b\n"
  1102. (org-test-with-temp-text "- b\n- C\n- a\n"
  1103. (org-sort-list t ?a)
  1104. (buffer-string))))
  1105. (should
  1106. (equal "- b\n- a\n- C\n"
  1107. (org-test-with-temp-text "- b\n- C\n- a\n"
  1108. (org-sort-list t ?A)
  1109. (buffer-string))))))
  1110. ;; Sort numerically.
  1111. (should
  1112. (equal "- 1\n- 2\n- 10\n"
  1113. (org-test-with-temp-text "- 10\n- 1\n- 2\n"
  1114. (org-sort-list nil ?n)
  1115. (buffer-string))))
  1116. (should
  1117. (equal "- 10\n- 2\n- 1\n"
  1118. (org-test-with-temp-text "- 10\n- 1\n- 2\n"
  1119. (org-sort-list nil ?N)
  1120. (buffer-string))))
  1121. ;; Sort by checked status.
  1122. (should
  1123. (equal "- [ ] xyz\n- [ ] def\n- [X] abc\n"
  1124. (org-test-with-temp-text "- [X] abc\n- [ ] xyz\n- [ ] def\n"
  1125. (org-sort-list nil ?x)
  1126. (buffer-string))))
  1127. (should
  1128. (equal "- [X] abc\n- [ ] xyz\n- [ ] def\n"
  1129. (org-test-with-temp-text "- [X] abc\n- [ ] xyz\n- [ ] def\n"
  1130. (org-sort-list nil ?X)
  1131. (buffer-string))))
  1132. ;; Sort by time stamp.
  1133. (should
  1134. (equal "- <2017-05-08 Mon>\n- <2017-05-09 Tue>\n- <2018-05-09 Wed>\n"
  1135. (org-test-with-temp-text
  1136. "- <2018-05-09 Wed>\n- <2017-05-09 Tue>\n- <2017-05-08 Mon>\n"
  1137. (org-sort-list nil ?t)
  1138. (buffer-string))))
  1139. (should
  1140. (equal "- <2018-05-09 Wed>\n- <2017-05-09 Tue>\n- <2017-05-08 Mon>\n"
  1141. (org-test-with-temp-text
  1142. "- <2018-05-09 Wed>\n- <2017-05-09 Tue>\n- <2017-05-08 Mon>\n"
  1143. (org-sort-list nil ?T)
  1144. (buffer-string))))
  1145. ;; Sort by custom function.
  1146. (should
  1147. (equal "- b\n- aa\n- ccc\n"
  1148. (org-test-with-temp-text "- ccc\n- b\n- aa\n"
  1149. (org-sort-list nil ?f
  1150. (lambda ()
  1151. (length (buffer-substring (point-at-bol)
  1152. (point-at-eol))))
  1153. #'<)
  1154. (buffer-string))))
  1155. (should
  1156. (equal "- ccc\n- aa\n- b\n"
  1157. (org-test-with-temp-text "- ccc\n- b\n- aa\n"
  1158. (org-sort-list nil ?F
  1159. (lambda ()
  1160. (length (buffer-substring (point-at-bol)
  1161. (point-at-eol))))
  1162. #'<)
  1163. (buffer-string)))))
  1164. ;;; List transformations
  1165. (ert-deftest test-org-list/to-generic ()
  1166. "Test `org-list-to-generic' specifications."
  1167. ;; Test `:ustart' and `:uend' parameters.
  1168. (should
  1169. (equal
  1170. "begin\na"
  1171. (org-test-with-temp-text "- a"
  1172. (org-list-to-generic (org-list-to-lisp) '(:ustart "begin")))))
  1173. (should-not
  1174. (equal
  1175. "begin\na"
  1176. (org-test-with-temp-text "1. a"
  1177. (org-list-to-generic (org-list-to-lisp) '(:ustart "begin")))))
  1178. (should
  1179. (equal
  1180. "a\nend"
  1181. (org-test-with-temp-text "- a"
  1182. (org-list-to-generic (org-list-to-lisp) '(:uend "end")))))
  1183. (should-not
  1184. (equal
  1185. "a\nend"
  1186. (org-test-with-temp-text "1. a"
  1187. (org-list-to-generic (org-list-to-lisp) '(:uend "end")))))
  1188. (should
  1189. (equal
  1190. "begin l1\na\nbegin l2\nb\nend l2\nend l1"
  1191. (org-test-with-temp-text "- a\n - b"
  1192. (org-list-to-generic
  1193. (org-list-to-lisp)
  1194. (list :ustart (lambda (l) (format "begin l%d" l))
  1195. :uend (lambda (l) (format "end l%d" l)))))))
  1196. ;; Test `:ostart' and `:oend' parameters.
  1197. (should
  1198. (equal
  1199. "begin\na"
  1200. (org-test-with-temp-text "1. a"
  1201. (org-list-to-generic (org-list-to-lisp) '(:ostart "begin")))))
  1202. (should-not
  1203. (equal
  1204. "begin\na"
  1205. (org-test-with-temp-text "- a"
  1206. (org-list-to-generic (org-list-to-lisp) '(:ostart "begin")))))
  1207. (should
  1208. (equal
  1209. "a\nend"
  1210. (org-test-with-temp-text "1. a"
  1211. (org-list-to-generic (org-list-to-lisp) '(:oend "end")))))
  1212. (should-not
  1213. (equal
  1214. "a\nend"
  1215. (org-test-with-temp-text "- a"
  1216. (org-list-to-generic (org-list-to-lisp) '(:oend "end")))))
  1217. (should
  1218. (equal
  1219. "begin l1\na\nbegin l2\nb\nend l2\nend l1"
  1220. (org-test-with-temp-text "1. a\n 1. b"
  1221. (org-list-to-generic
  1222. (org-list-to-lisp)
  1223. (list :ostart (lambda (l) (format "begin l%d" l))
  1224. :oend (lambda (l) (format "end l%d" l)))))))
  1225. ;; Test `:dstart' and `:dend' parameters.
  1226. (should
  1227. (equal
  1228. "begin\ntaga"
  1229. (org-test-with-temp-text "- tag :: a"
  1230. (org-list-to-generic (org-list-to-lisp) '(:dstart "begin")))))
  1231. (should-not
  1232. (equal
  1233. "begin\na"
  1234. (org-test-with-temp-text "- a"
  1235. (org-list-to-generic (org-list-to-lisp) '(:dstart "begin")))))
  1236. (should
  1237. (equal
  1238. "taga\nend"
  1239. (org-test-with-temp-text "- tag :: a"
  1240. (org-list-to-generic (org-list-to-lisp) '(:dend "end")))))
  1241. (should-not
  1242. (equal
  1243. "a\nend"
  1244. (org-test-with-temp-text "- a"
  1245. (org-list-to-generic (org-list-to-lisp) '(:dend "end")))))
  1246. (should
  1247. (equal
  1248. "begin l1\ntag1a\nbegin l2\ntag2b\nend l2\nend l1"
  1249. (org-test-with-temp-text "- tag1 :: a\n - tag2 :: b"
  1250. (org-list-to-generic
  1251. (org-list-to-lisp)
  1252. (list :dstart (lambda (l) (format "begin l%d" l))
  1253. :dend (lambda (l) (format "end l%d" l)))))))
  1254. ;; Test `:dtstart', `:dtend', `:ddstart' and `:ddend' parameters.
  1255. (should
  1256. (equal
  1257. ">tag<a"
  1258. (org-test-with-temp-text "- tag :: a"
  1259. (org-list-to-generic (org-list-to-lisp) '(:dtstart ">" :dtend "<")))))
  1260. (should
  1261. (equal
  1262. "tag>a<"
  1263. (org-test-with-temp-text "- tag :: a"
  1264. (org-list-to-generic (org-list-to-lisp) '(:ddstart ">" :ddend "<")))))
  1265. ;; Test `:istart' and `:iend' parameters.
  1266. (should
  1267. (equal
  1268. "starta"
  1269. (org-test-with-temp-text "- a"
  1270. (org-list-to-generic (org-list-to-lisp) '(:istart "start")))))
  1271. (should
  1272. (equal
  1273. "level1 a\nlevel2 b"
  1274. (org-test-with-temp-text "- a\n - b"
  1275. (org-list-to-generic (org-list-to-lisp)
  1276. '(:istart (lambda (type l) (format "level%d "l)))))))
  1277. (should
  1278. (equal
  1279. "a\nblevel2level1"
  1280. (org-test-with-temp-text "- a\n - b"
  1281. (org-list-to-generic (org-list-to-lisp)
  1282. '(:iend (lambda (type l) (format "level%d" l)))))))
  1283. ;; Test `:icount' parameter.
  1284. (should
  1285. (equal
  1286. "counta"
  1287. (org-test-with-temp-text "1. [@3] a"
  1288. (org-list-to-generic (org-list-to-lisp) '(:icount "count")))))
  1289. (should-not
  1290. (equal
  1291. "counta"
  1292. (org-test-with-temp-text "1. a"
  1293. (org-list-to-generic (org-list-to-lisp) '(:icount "count")))))
  1294. (should
  1295. (equal
  1296. "counta"
  1297. (org-test-with-temp-text "1. [@3] a"
  1298. (org-list-to-generic (org-list-to-lisp)
  1299. '(:icount "count" :istart "start")))))
  1300. (should
  1301. (equal
  1302. "level:1, counter:3 a"
  1303. (org-test-with-temp-text "1. [@3] a"
  1304. (org-list-to-generic
  1305. (org-list-to-lisp)
  1306. '(:icount (lambda (type l c) (format "level:%d, counter:%d " l c)))))))
  1307. ;; Test `:isep' parameter.
  1308. (should
  1309. (equal
  1310. "a\n--\nb"
  1311. (org-test-with-temp-text "- a\n- b"
  1312. (org-list-to-generic (org-list-to-lisp) '(:isep "--")))))
  1313. (should-not
  1314. (equal
  1315. "a\n--\nb"
  1316. (org-test-with-temp-text "- a\n - b"
  1317. (org-list-to-generic (org-list-to-lisp) '(:isep "--")))))
  1318. (should
  1319. (equal
  1320. "a\n- 1 -\nb"
  1321. (org-test-with-temp-text "- a\n- b"
  1322. (org-list-to-generic
  1323. (org-list-to-lisp)
  1324. '(:isep (lambda (type depth) (format "- %d -" depth)))))))
  1325. ;; Test `:ifmt' parameter.
  1326. (should
  1327. (equal
  1328. ">> a <<"
  1329. (org-test-with-temp-text "1. [@3] a"
  1330. (org-list-to-generic
  1331. (org-list-to-lisp)
  1332. '(:ifmt (lambda (type c) (format ">> %s <<" c)))))))
  1333. ;; Test `:cbon', `:cboff', `:cbtrans'
  1334. (should
  1335. (equal
  1336. "!a"
  1337. (org-test-with-temp-text "- [X] a"
  1338. (org-list-to-generic (org-list-to-lisp) '(:cbon "!")))))
  1339. (should-not
  1340. (equal
  1341. "!a"
  1342. (org-test-with-temp-text "- [X] a"
  1343. (org-list-to-generic (org-list-to-lisp) '(:cboff "!" :cbtrans "!")))))
  1344. (should
  1345. (equal
  1346. "!a"
  1347. (org-test-with-temp-text "- [ ] a"
  1348. (org-list-to-generic (org-list-to-lisp) '(:cboff "!")))))
  1349. (should-not
  1350. (equal
  1351. "!a"
  1352. (org-test-with-temp-text "- [ ] a"
  1353. (org-list-to-generic (org-list-to-lisp) '(:cbon "!" :cbtrans "!")))))
  1354. (should
  1355. (equal
  1356. "!a"
  1357. (org-test-with-temp-text "- [-] a"
  1358. (org-list-to-generic (org-list-to-lisp) '(:cbtrans "!")))))
  1359. (should-not
  1360. (equal
  1361. "!a"
  1362. (org-test-with-temp-text "- [-] a"
  1363. (org-list-to-generic (org-list-to-lisp) '(:cbon "!" :cboff "!")))))
  1364. ;; Test `:splice' parameter.
  1365. (should
  1366. (equal
  1367. "a"
  1368. (org-test-with-temp-text "- a"
  1369. (org-list-to-generic (org-list-to-lisp)
  1370. '(:ustart "begin" :uend "end" :splice t)))))
  1371. ;; No error on empty lists.
  1372. (should
  1373. (org-test-with-temp-text "-" (org-list-to-generic (org-list-to-lisp) nil))))
  1374. (ert-deftest test-org-list/to-html ()
  1375. "Test `org-list-to-html' specifications."
  1376. (should
  1377. (equal "<ul class=\"org-ul\">\n<li>a</li>\n</ul>"
  1378. (org-test-with-temp-text "- a"
  1379. (org-list-to-html (org-list-to-lisp) nil)))))
  1380. (ert-deftest test-org-list/to-latex ()
  1381. "Test `org-list-to-latex' specifications."
  1382. (should
  1383. (equal "\\begin{itemize}\n\\item a\n\\end{itemize}"
  1384. (org-test-with-temp-text "- a"
  1385. (org-list-to-latex (org-list-to-lisp) nil)))))
  1386. (ert-deftest test-org-list/to-texinfo ()
  1387. "Test `org-list-to-texinfo' specifications."
  1388. (should
  1389. (equal "@itemize\n@item\na\n@end itemize"
  1390. (org-test-with-temp-text "- a"
  1391. (org-list-to-texinfo (org-list-to-lisp) nil)))))
  1392. (ert-deftest test-org-list/to-org ()
  1393. "Test `org-list-to-org' specifications."
  1394. ;; Un-ordered list.
  1395. (should
  1396. (equal "- a"
  1397. (org-test-with-temp-text "- a"
  1398. (org-list-to-org (org-list-to-lisp) nil))))
  1399. ;; Ordered list.
  1400. (should
  1401. (equal "1. a"
  1402. (org-test-with-temp-text "1. a"
  1403. (org-list-to-org (org-list-to-lisp) nil))))
  1404. ;; Descriptive list.
  1405. (should
  1406. (equal "- a :: b"
  1407. (org-test-with-temp-text "- a :: b"
  1408. (org-list-to-org (org-list-to-lisp) nil))))
  1409. ;; Nested list.
  1410. (should
  1411. (equal "- a\n - b"
  1412. (org-test-with-temp-text "- a\n - b"
  1413. (org-list-to-org (org-list-to-lisp) nil))))
  1414. ;; Item spanning over multiple lines.
  1415. (should
  1416. (equal "- a\n b"
  1417. (org-test-with-temp-text "- a\n b"
  1418. (org-list-to-org (org-list-to-lisp) nil))))
  1419. ;; Item with continuation text after a sub-list.
  1420. (should
  1421. (equal "- a\n - b\n c"
  1422. (org-test-with-temp-text "- a\n - b\n c"
  1423. (org-list-to-org (org-list-to-lisp) nil)))))
  1424. (provide 'test-org-list)
  1425. ;;; test-org-list.el ends here