test_sort.vim 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551
  1. " Tests for the "sort()" function and for the ":sort" command.
  2. source check.vim
  3. func Compare1(a, b) abort
  4. call sort(range(3), 'Compare2')
  5. return a:a - a:b
  6. endfunc
  7. func Compare2(a, b) abort
  8. return a:a - a:b
  9. endfunc
  10. func Test_sort_strings()
  11. " numbers compared as strings
  12. call assert_equal([1, 2, 3], sort([3, 2, 1]))
  13. call assert_equal([13, 28, 3], sort([3, 28, 13]))
  14. call assert_equal(['A', 'O', 'P', 'a', 'o', 'p', 'Ä', 'Ô', 'ä', 'ô', 'Œ', 'œ'],
  15. \ sort(['A', 'O', 'P', 'a', 'o', 'p', 'Ä', 'Ô', 'ä', 'ô', 'œ', 'Œ']))
  16. call assert_equal(['A', 'a', 'o', 'O', 'p', 'P', 'Ä', 'Ô', 'ä', 'ô', 'Œ', 'œ'],
  17. \ sort(['A', 'a', 'o', 'O', 'œ', 'Œ', 'p', 'P', 'Ä', 'ä', 'ô', 'Ô'], 'i'))
  18. " This does not appear to work correctly on Mac.
  19. if !has('mac')
  20. if v:collate =~? '^\(en\|fr\)_ca.utf-\?8$'
  21. " with Canadian English capitals come before lower case.
  22. " 'Œ' is omitted because it can sort before or after 'œ'
  23. call assert_equal(['A', 'a', 'Ä', 'ä', 'O', 'o', 'Ô', 'ô', 'œ', 'P', 'p'],
  24. \ sort(['A', 'a', 'o', 'O', 'œ', 'p', 'P', 'Ä', 'ä', 'ô', 'Ô'], 'l'))
  25. elseif v:collate =~? '^\(en\|es\|de\|fr\|it\|nl\).*\.utf-\?8$'
  26. " With the following locales, the accentuated letters are ordered
  27. " similarly to the non-accentuated letters...
  28. call assert_equal(['a', 'A', 'ä', 'Ä', 'o', 'O', 'ô', 'Ô', 'œ', 'Œ', 'p', 'P'],
  29. \ sort(['A', 'a', 'o', 'O', 'œ', 'Œ', 'p', 'P', 'Ä', 'ä', 'ô', 'Ô'], 'l'))
  30. elseif v:collate =~? '^sv.*utf-\?8$'
  31. " ... whereas with a Swedish locale, the accentuated letters are ordered
  32. " after Z.
  33. call assert_equal(['a', 'A', 'o', 'O', 'p', 'P', 'ä', 'Ä', 'œ', 'œ', 'ô', 'Ô'],
  34. \ sort(['A', 'a', 'o', 'O', 'œ', 'œ', 'p', 'P', 'Ä', 'ä', 'ô', 'Ô'], 'l'))
  35. endif
  36. endif
  37. endfunc
  38. func Test_sort_null_string()
  39. " null strings are sorted as empty strings.
  40. call assert_equal(['', 'a', 'b'], sort(['b', v:_null_string, 'a']))
  41. endfunc
  42. func Test_sort_numeric()
  43. call assert_equal([1, 2, 3], sort([3, 2, 1], 'n'))
  44. call assert_equal([3, 13, 28], sort([13, 28, 3], 'n'))
  45. " strings are not sorted
  46. call assert_equal(['13', '28', '3'], sort(['13', '28', '3'], 'n'))
  47. endfunc
  48. func Test_sort_numbers()
  49. call assert_equal([3, 13, 28], sort([13, 28, 3], 'N'))
  50. call assert_equal(['3', '13', '28'], sort(['13', '28', '3'], 'N'))
  51. call assert_equal([3997, 4996], sort([4996, 3997], 'Compare1'))
  52. endfunc
  53. func Test_sort_float()
  54. CheckFeature float
  55. call assert_equal([0.28, 3, 13.5], sort([13.5, 0.28, 3], 'f'))
  56. endfunc
  57. func Test_sort_nested()
  58. " test ability to call sort() from a compare function
  59. call assert_equal([1, 3, 5], sort([3, 1, 5], 'Compare1'))
  60. endfunc
  61. func Test_sort_default()
  62. CheckFeature float
  63. " docs say omitted, empty or zero argument sorts on string representation.
  64. call assert_equal(['2', 'A', 'AA', 'a', 1, 3.3], sort([3.3, 1, "2", "A", "a", "AA"]))
  65. call assert_equal(['2', 'A', 'AA', 'a', 1, 3.3], sort([3.3, 1, "2", "A", "a", "AA"], ''))
  66. call assert_equal(['2', 'A', 'AA', 'a', 1, 3.3], sort([3.3, 1, "2", "A", "a", "AA"], 0))
  67. call assert_equal(['2', 'A', 'a', 'AA', 1, 3.3], sort([3.3, 1, "2", "A", "a", "AA"], 1))
  68. call assert_fails('call sort([3.3, 1, "2"], 3)', "E474:")
  69. endfunc
  70. " Tests for the ":sort" command.
  71. func Test_sort_cmd()
  72. let tests = [
  73. \ {
  74. \ 'name' : 'Alphabetical sort',
  75. \ 'cmd' : '%sort',
  76. \ 'input' : [
  77. \ 'abc',
  78. \ 'ab',
  79. \ 'a',
  80. \ 'a321',
  81. \ 'a123',
  82. \ 'a122',
  83. \ 'b321',
  84. \ 'b123',
  85. \ 'c123d',
  86. \ ' 123b',
  87. \ 'c321d',
  88. \ 'b322b',
  89. \ 'b321',
  90. \ 'b321b'
  91. \ ],
  92. \ 'expected' : [
  93. \ ' 123b',
  94. \ 'a',
  95. \ 'a122',
  96. \ 'a123',
  97. \ 'a321',
  98. \ 'ab',
  99. \ 'abc',
  100. \ 'b123',
  101. \ 'b321',
  102. \ 'b321',
  103. \ 'b321b',
  104. \ 'b322b',
  105. \ 'c123d',
  106. \ 'c321d'
  107. \ ]
  108. \ },
  109. \ {
  110. \ 'name' : 'Numeric sort',
  111. \ 'cmd' : '%sort n',
  112. \ 'input' : [
  113. \ 'abc',
  114. \ 'ab',
  115. \ 'a321',
  116. \ 'a123',
  117. \ 'a122',
  118. \ 'a',
  119. \ 'x-22',
  120. \ 'b321',
  121. \ 'b123',
  122. \ '',
  123. \ 'c123d',
  124. \ '-24',
  125. \ ' 123b',
  126. \ 'c321d',
  127. \ '0',
  128. \ 'b322b',
  129. \ 'b321',
  130. \ 'b321b'
  131. \ ],
  132. \ 'expected' : [
  133. \ 'abc',
  134. \ 'ab',
  135. \ 'a',
  136. \ '',
  137. \ '-24',
  138. \ 'x-22',
  139. \ '0',
  140. \ 'a122',
  141. \ 'a123',
  142. \ 'b123',
  143. \ 'c123d',
  144. \ ' 123b',
  145. \ 'a321',
  146. \ 'b321',
  147. \ 'c321d',
  148. \ 'b321',
  149. \ 'b321b',
  150. \ 'b322b'
  151. \ ]
  152. \ },
  153. \ {
  154. \ 'name' : 'Hexadecimal sort',
  155. \ 'cmd' : '%sort x',
  156. \ 'input' : [
  157. \ 'abc',
  158. \ 'ab',
  159. \ 'a',
  160. \ 'a321',
  161. \ 'a123',
  162. \ 'a122',
  163. \ 'b321',
  164. \ 'b123',
  165. \ 'c123d',
  166. \ ' 123b',
  167. \ 'c321d',
  168. \ 'b322b',
  169. \ 'b321',
  170. \ 'b321b'
  171. \ ],
  172. \ 'expected' : [
  173. \ 'a',
  174. \ 'ab',
  175. \ 'abc',
  176. \ ' 123b',
  177. \ 'a122',
  178. \ 'a123',
  179. \ 'a321',
  180. \ 'b123',
  181. \ 'b321',
  182. \ 'b321',
  183. \ 'b321b',
  184. \ 'b322b',
  185. \ 'c123d',
  186. \ 'c321d'
  187. \ ]
  188. \ },
  189. \ {
  190. \ 'name' : 'Alphabetical unique sort',
  191. \ 'cmd' : '%sort u',
  192. \ 'input' : [
  193. \ 'abc',
  194. \ 'ab',
  195. \ 'a',
  196. \ 'a321',
  197. \ 'a123',
  198. \ 'a122',
  199. \ 'b321',
  200. \ 'b123',
  201. \ 'c123d',
  202. \ ' 123b',
  203. \ 'c321d',
  204. \ 'b322b',
  205. \ 'b321',
  206. \ 'b321b'
  207. \ ],
  208. \ 'expected' : [
  209. \ ' 123b',
  210. \ 'a',
  211. \ 'a122',
  212. \ 'a123',
  213. \ 'a321',
  214. \ 'ab',
  215. \ 'abc',
  216. \ 'b123',
  217. \ 'b321',
  218. \ 'b321b',
  219. \ 'b322b',
  220. \ 'c123d',
  221. \ 'c321d'
  222. \ ]
  223. \ },
  224. \ {
  225. \ 'name' : 'Alphabetical reverse sort',
  226. \ 'cmd' : '%sort!',
  227. \ 'input' : [
  228. \ 'abc',
  229. \ 'ab',
  230. \ 'a',
  231. \ 'a321',
  232. \ 'a123',
  233. \ 'a122',
  234. \ 'b321',
  235. \ 'b123',
  236. \ 'c123d',
  237. \ ' 123b',
  238. \ 'c321d',
  239. \ 'b322b',
  240. \ 'b321',
  241. \ 'b321b'
  242. \ ],
  243. \ 'expected' : [
  244. \ 'c321d',
  245. \ 'c123d',
  246. \ 'b322b',
  247. \ 'b321b',
  248. \ 'b321',
  249. \ 'b321',
  250. \ 'b123',
  251. \ 'abc',
  252. \ 'ab',
  253. \ 'a321',
  254. \ 'a123',
  255. \ 'a122',
  256. \ 'a',
  257. \ ' 123b',
  258. \ ]
  259. \ },
  260. \ {
  261. \ 'name' : 'Numeric reverse sort',
  262. \ 'cmd' : '%sort! n',
  263. \ 'input' : [
  264. \ 'abc',
  265. \ 'ab',
  266. \ 'a',
  267. \ 'a321',
  268. \ 'a123',
  269. \ 'a122',
  270. \ 'b321',
  271. \ 'b123',
  272. \ 'c123d',
  273. \ ' 123b',
  274. \ 'c321d',
  275. \ 'b322b',
  276. \ 'b321',
  277. \ 'b321b'
  278. \ ],
  279. \ 'expected' : [
  280. \ 'b322b',
  281. \ 'b321b',
  282. \ 'b321',
  283. \ 'c321d',
  284. \ 'b321',
  285. \ 'a321',
  286. \ ' 123b',
  287. \ 'c123d',
  288. \ 'b123',
  289. \ 'a123',
  290. \ 'a122',
  291. \ 'a',
  292. \ 'ab',
  293. \ 'abc'
  294. \ ]
  295. \ },
  296. \ {
  297. \ 'name' : 'Unique reverse sort',
  298. \ 'cmd' : 'sort! u',
  299. \ 'input' : [
  300. \ 'abc',
  301. \ 'ab',
  302. \ 'a',
  303. \ 'a321',
  304. \ 'a123',
  305. \ 'a122',
  306. \ 'b321',
  307. \ 'b123',
  308. \ 'c123d',
  309. \ ' 123b',
  310. \ 'c321d',
  311. \ 'b322b',
  312. \ 'b321',
  313. \ 'b321b'
  314. \ ],
  315. \ 'expected' : [
  316. \ 'c321d',
  317. \ 'c123d',
  318. \ 'b322b',
  319. \ 'b321b',
  320. \ 'b321',
  321. \ 'b123',
  322. \ 'abc',
  323. \ 'ab',
  324. \ 'a321',
  325. \ 'a123',
  326. \ 'a122',
  327. \ 'a',
  328. \ ' 123b',
  329. \ ]
  330. \ },
  331. \ {
  332. \ 'name' : 'Octal sort',
  333. \ 'cmd' : 'sort o',
  334. \ 'input' : [
  335. \ 'abc',
  336. \ 'ab',
  337. \ 'a',
  338. \ 'a321',
  339. \ 'a123',
  340. \ 'a122',
  341. \ 'b321',
  342. \ 'b123',
  343. \ 'c123d',
  344. \ ' 123b',
  345. \ 'c321d',
  346. \ 'b322b',
  347. \ 'b321',
  348. \ 'b321b',
  349. \ '',
  350. \ ''
  351. \ ],
  352. \ 'expected' : [
  353. \ 'abc',
  354. \ 'ab',
  355. \ 'a',
  356. \ '',
  357. \ '',
  358. \ 'a122',
  359. \ 'a123',
  360. \ 'b123',
  361. \ 'c123d',
  362. \ ' 123b',
  363. \ 'a321',
  364. \ 'b321',
  365. \ 'c321d',
  366. \ 'b321',
  367. \ 'b321b',
  368. \ 'b322b'
  369. \ ]
  370. \ },
  371. \ {
  372. \ 'name' : 'Reverse hexadecimal sort',
  373. \ 'cmd' : 'sort! x',
  374. \ 'input' : [
  375. \ 'abc',
  376. \ 'ab',
  377. \ 'a',
  378. \ 'a321',
  379. \ 'a123',
  380. \ 'a122',
  381. \ 'b321',
  382. \ 'b123',
  383. \ 'c123d',
  384. \ ' 123b',
  385. \ 'c321d',
  386. \ 'b322b',
  387. \ 'b321',
  388. \ 'b321b',
  389. \ '',
  390. \ ''
  391. \ ],
  392. \ 'expected' : [
  393. \ 'c321d',
  394. \ 'c123d',
  395. \ 'b322b',
  396. \ 'b321b',
  397. \ 'b321',
  398. \ 'b321',
  399. \ 'b123',
  400. \ 'a321',
  401. \ 'a123',
  402. \ 'a122',
  403. \ ' 123b',
  404. \ 'abc',
  405. \ 'ab',
  406. \ 'a',
  407. \ '',
  408. \ ''
  409. \ ]
  410. \ },
  411. \ {
  412. \ 'name' : 'Alpha (skip first character) sort',
  413. \ 'cmd' : 'sort/./',
  414. \ 'input' : [
  415. \ 'abc',
  416. \ 'ab',
  417. \ 'a',
  418. \ 'a321',
  419. \ 'a123',
  420. \ 'a122',
  421. \ 'b321',
  422. \ 'b123',
  423. \ 'c123d',
  424. \ ' 123b',
  425. \ 'c321d',
  426. \ 'b322b',
  427. \ 'b321',
  428. \ 'b321b',
  429. \ '',
  430. \ ''
  431. \ ],
  432. \ 'expected' : [
  433. \ 'a',
  434. \ '',
  435. \ '',
  436. \ 'a122',
  437. \ 'a123',
  438. \ 'b123',
  439. \ ' 123b',
  440. \ 'c123d',
  441. \ 'a321',
  442. \ 'b321',
  443. \ 'b321',
  444. \ 'b321b',
  445. \ 'c321d',
  446. \ 'b322b',
  447. \ 'ab',
  448. \ 'abc'
  449. \ ]
  450. \ },
  451. \ {
  452. \ 'name' : 'Alpha (skip first 2 characters) sort',
  453. \ 'cmd' : 'sort/../',
  454. \ 'input' : [
  455. \ 'abc',
  456. \ 'ab',
  457. \ 'a',
  458. \ 'a321',
  459. \ 'a123',
  460. \ 'a122',
  461. \ 'b321',
  462. \ 'b123',
  463. \ 'c123d',
  464. \ ' 123b',
  465. \ 'c321d',
  466. \ 'b322b',
  467. \ 'b321',
  468. \ 'b321b',
  469. \ '',
  470. \ ''
  471. \ ],
  472. \ 'expected' : [
  473. \ 'ab',
  474. \ 'a',
  475. \ '',
  476. \ '',
  477. \ 'a321',
  478. \ 'b321',
  479. \ 'b321',
  480. \ 'b321b',
  481. \ 'c321d',
  482. \ 'a122',
  483. \ 'b322b',
  484. \ 'a123',
  485. \ 'b123',
  486. \ ' 123b',
  487. \ 'c123d',
  488. \ 'abc'
  489. \ ]
  490. \ },
  491. \ {
  492. \ 'name' : 'alpha, unique, skip first 2 characters',
  493. \ 'cmd' : 'sort/../u',
  494. \ 'input' : [
  495. \ 'abc',
  496. \ 'ab',
  497. \ 'a',
  498. \ 'a321',
  499. \ 'a123',
  500. \ 'a122',
  501. \ 'b321',
  502. \ 'b123',
  503. \ 'c123d',
  504. \ ' 123b',
  505. \ 'c321d',
  506. \ 'b322b',
  507. \ 'b321',
  508. \ 'b321b',
  509. \ '',
  510. \ ''
  511. \ ],
  512. \ 'expected' : [
  513. \ 'ab',
  514. \ 'a',
  515. \ '',
  516. \ 'a321',
  517. \ 'b321',
  518. \ 'b321b',
  519. \ 'c321d',
  520. \ 'a122',
  521. \ 'b322b',
  522. \ 'a123',
  523. \ 'b123',
  524. \ ' 123b',
  525. \ 'c123d',
  526. \ 'abc'
  527. \ ]
  528. \ },
  529. \ {
  530. \ 'name' : 'numeric, skip first character',
  531. \ 'cmd' : 'sort/./n',
  532. \ 'input' : [
  533. \ 'abc',
  534. \ 'ab',
  535. \ 'a',
  536. \ 'a321',
  537. \ 'a123',
  538. \ 'a122',
  539. \ 'b321',
  540. \ 'b123',
  541. \ 'c123d',
  542. \ ' 123b',
  543. \ 'c321d',
  544. \ 'b322b',
  545. \ 'b321',
  546. \ 'b321b',
  547. \ '',
  548. \ ''
  549. \ ],
  550. \ 'expected' : [
  551. \ 'abc',
  552. \ 'ab',
  553. \ 'a',
  554. \ '',
  555. \ '',
  556. \ 'a122',
  557. \ 'a123',
  558. \ 'b123',
  559. \ 'c123d',
  560. \ ' 123b',
  561. \ 'a321',
  562. \ 'b321',
  563. \ 'c321d',
  564. \ 'b321',
  565. \ 'b321b',
  566. \ 'b322b'
  567. \ ]
  568. \ },
  569. \ {
  570. \ 'name' : 'alpha, sort on first character',
  571. \ 'cmd' : 'sort/./r',
  572. \ 'input' : [
  573. \ 'abc',
  574. \ 'ab',
  575. \ 'a',
  576. \ 'a321',
  577. \ 'a123',
  578. \ 'a122',
  579. \ 'b321',
  580. \ 'b123',
  581. \ 'c123d',
  582. \ ' 123b',
  583. \ 'c321d',
  584. \ 'b322b',
  585. \ 'b321',
  586. \ 'b321b',
  587. \ '',
  588. \ ''
  589. \ ],
  590. \ 'expected' : [
  591. \ '',
  592. \ '',
  593. \ ' 123b',
  594. \ 'abc',
  595. \ 'ab',
  596. \ 'a',
  597. \ 'a321',
  598. \ 'a123',
  599. \ 'a122',
  600. \ 'b321',
  601. \ 'b123',
  602. \ 'b322b',
  603. \ 'b321',
  604. \ 'b321b',
  605. \ 'c123d',
  606. \ 'c321d'
  607. \ ]
  608. \ },
  609. \ {
  610. \ 'name' : 'alpha, sort on first 2 characters',
  611. \ 'cmd' : 'sort/../r',
  612. \ 'input' : [
  613. \ 'abc',
  614. \ 'ab',
  615. \ 'a',
  616. \ 'a321',
  617. \ 'a123',
  618. \ 'a122',
  619. \ 'b321',
  620. \ 'b123',
  621. \ 'c123d',
  622. \ ' 123b',
  623. \ 'c321d',
  624. \ 'b322b',
  625. \ 'b321',
  626. \ 'b321b',
  627. \ '',
  628. \ ''
  629. \ ],
  630. \ 'expected' : [
  631. \ 'a',
  632. \ '',
  633. \ '',
  634. \ ' 123b',
  635. \ 'a123',
  636. \ 'a122',
  637. \ 'a321',
  638. \ 'abc',
  639. \ 'ab',
  640. \ 'b123',
  641. \ 'b321',
  642. \ 'b322b',
  643. \ 'b321',
  644. \ 'b321b',
  645. \ 'c123d',
  646. \ 'c321d'
  647. \ ]
  648. \ },
  649. \ {
  650. \ 'name' : 'numeric, sort on first character',
  651. \ 'cmd' : 'sort/./rn',
  652. \ 'input' : [
  653. \ 'abc',
  654. \ 'ab',
  655. \ 'a',
  656. \ 'a321',
  657. \ 'a123',
  658. \ 'a122',
  659. \ 'b321',
  660. \ 'b123',
  661. \ 'c123d',
  662. \ ' 123b',
  663. \ 'c321d',
  664. \ 'b322b',
  665. \ 'b321',
  666. \ 'b321b',
  667. \ '',
  668. \ ''
  669. \ ],
  670. \ 'expected' : [
  671. \ 'abc',
  672. \ 'ab',
  673. \ 'a',
  674. \ 'a321',
  675. \ 'a123',
  676. \ 'a122',
  677. \ 'b321',
  678. \ 'b123',
  679. \ 'c123d',
  680. \ ' 123b',
  681. \ 'c321d',
  682. \ 'b322b',
  683. \ 'b321',
  684. \ 'b321b',
  685. \ '',
  686. \ ''
  687. \ ]
  688. \ },
  689. \ {
  690. \ 'name' : 'alpha, skip past first digit',
  691. \ 'cmd' : 'sort/\d/',
  692. \ 'input' : [
  693. \ 'abc',
  694. \ 'ab',
  695. \ 'a',
  696. \ 'a321',
  697. \ 'a123',
  698. \ 'a122',
  699. \ 'b321',
  700. \ 'b123',
  701. \ 'c123d',
  702. \ ' 123b',
  703. \ 'c321d',
  704. \ 'b322b',
  705. \ 'b321',
  706. \ 'b321b',
  707. \ '',
  708. \ ''
  709. \ ],
  710. \ 'expected' : [
  711. \ 'abc',
  712. \ 'ab',
  713. \ 'a',
  714. \ '',
  715. \ '',
  716. \ 'a321',
  717. \ 'b321',
  718. \ 'b321',
  719. \ 'b321b',
  720. \ 'c321d',
  721. \ 'a122',
  722. \ 'b322b',
  723. \ 'a123',
  724. \ 'b123',
  725. \ ' 123b',
  726. \ 'c123d'
  727. \ ]
  728. \ },
  729. \ {
  730. \ 'name' : 'alpha, sort on first digit',
  731. \ 'cmd' : 'sort/\d/r',
  732. \ 'input' : [
  733. \ 'abc',
  734. \ 'ab',
  735. \ 'a',
  736. \ 'a321',
  737. \ 'a123',
  738. \ 'a122',
  739. \ 'b321',
  740. \ 'b123',
  741. \ 'c123d',
  742. \ ' 123b',
  743. \ 'c321d',
  744. \ 'b322b',
  745. \ 'b321',
  746. \ 'b321b',
  747. \ '',
  748. \ ''
  749. \ ],
  750. \ 'expected' : [
  751. \ 'abc',
  752. \ 'ab',
  753. \ 'a',
  754. \ '',
  755. \ '',
  756. \ 'a123',
  757. \ 'a122',
  758. \ 'b123',
  759. \ 'c123d',
  760. \ ' 123b',
  761. \ 'a321',
  762. \ 'b321',
  763. \ 'c321d',
  764. \ 'b322b',
  765. \ 'b321',
  766. \ 'b321b'
  767. \ ]
  768. \ },
  769. \ {
  770. \ 'name' : 'numeric, skip past first digit',
  771. \ 'cmd' : 'sort/\d/n',
  772. \ 'input' : [
  773. \ 'abc',
  774. \ 'ab',
  775. \ 'a',
  776. \ 'a321',
  777. \ 'a123',
  778. \ 'a122',
  779. \ 'b321',
  780. \ 'b123',
  781. \ 'c123d',
  782. \ ' 123b',
  783. \ 'c321d',
  784. \ 'b322b',
  785. \ 'b321',
  786. \ 'b321b',
  787. \ '',
  788. \ ''
  789. \ ],
  790. \ 'expected' : [
  791. \ 'abc',
  792. \ 'ab',
  793. \ 'a',
  794. \ '',
  795. \ '',
  796. \ 'a321',
  797. \ 'b321',
  798. \ 'c321d',
  799. \ 'b321',
  800. \ 'b321b',
  801. \ 'a122',
  802. \ 'b322b',
  803. \ 'a123',
  804. \ 'b123',
  805. \ 'c123d',
  806. \ ' 123b'
  807. \ ]
  808. \ },
  809. \ {
  810. \ 'name' : 'numeric, sort on first digit',
  811. \ 'cmd' : 'sort/\d/rn',
  812. \ 'input' : [
  813. \ 'abc',
  814. \ 'ab',
  815. \ 'a',
  816. \ 'a321',
  817. \ 'a123',
  818. \ 'a122',
  819. \ 'b321',
  820. \ 'b123',
  821. \ 'c123d',
  822. \ ' 123b',
  823. \ 'c321d',
  824. \ 'b322b',
  825. \ 'b321',
  826. \ 'b321b',
  827. \ '',
  828. \ ''
  829. \ ],
  830. \ 'expected' : [
  831. \ 'abc',
  832. \ 'ab',
  833. \ 'a',
  834. \ '',
  835. \ '',
  836. \ 'a123',
  837. \ 'a122',
  838. \ 'b123',
  839. \ 'c123d',
  840. \ ' 123b',
  841. \ 'a321',
  842. \ 'b321',
  843. \ 'c321d',
  844. \ 'b322b',
  845. \ 'b321',
  846. \ 'b321b'
  847. \ ]
  848. \ },
  849. \ {
  850. \ 'name' : 'alpha, skip past first 2 digits',
  851. \ 'cmd' : 'sort/\d\d/',
  852. \ 'input' : [
  853. \ 'abc',
  854. \ 'ab',
  855. \ 'a',
  856. \ 'a321',
  857. \ 'a123',
  858. \ 'a122',
  859. \ 'b321',
  860. \ 'b123',
  861. \ 'c123d',
  862. \ ' 123b',
  863. \ 'c321d',
  864. \ 'b322b',
  865. \ 'b321',
  866. \ 'b321b',
  867. \ '',
  868. \ ''
  869. \ ],
  870. \ 'expected' : [
  871. \ 'abc',
  872. \ 'ab',
  873. \ 'a',
  874. \ '',
  875. \ '',
  876. \ 'a321',
  877. \ 'b321',
  878. \ 'b321',
  879. \ 'b321b',
  880. \ 'c321d',
  881. \ 'a122',
  882. \ 'b322b',
  883. \ 'a123',
  884. \ 'b123',
  885. \ ' 123b',
  886. \ 'c123d'
  887. \ ]
  888. \ },
  889. \ {
  890. \ 'name' : 'numeric, skip past first 2 digits',
  891. \ 'cmd' : 'sort/\d\d/n',
  892. \ 'input' : [
  893. \ 'abc',
  894. \ 'ab',
  895. \ 'a',
  896. \ 'a321',
  897. \ 'a123',
  898. \ 'a122',
  899. \ 'b321',
  900. \ 'b123',
  901. \ 'c123d',
  902. \ ' 123b',
  903. \ 'c321d',
  904. \ 'b322b',
  905. \ 'b321',
  906. \ 'b321b',
  907. \ '',
  908. \ ''
  909. \ ],
  910. \ 'expected' : [
  911. \ 'abc',
  912. \ 'ab',
  913. \ 'a',
  914. \ '',
  915. \ '',
  916. \ 'a321',
  917. \ 'b321',
  918. \ 'c321d',
  919. \ 'b321',
  920. \ 'b321b',
  921. \ 'a122',
  922. \ 'b322b',
  923. \ 'a123',
  924. \ 'b123',
  925. \ 'c123d',
  926. \ ' 123b'
  927. \ ]
  928. \ },
  929. \ {
  930. \ 'name' : 'hexadecimal, skip past first 2 digits',
  931. \ 'cmd' : 'sort/\d\d/x',
  932. \ 'input' : [
  933. \ 'abc',
  934. \ 'ab',
  935. \ 'a',
  936. \ 'a321',
  937. \ 'a123',
  938. \ 'a122',
  939. \ 'b321',
  940. \ 'b123',
  941. \ 'c123d',
  942. \ ' 123b',
  943. \ 'c321d',
  944. \ 'b322b',
  945. \ 'b321',
  946. \ 'b321b',
  947. \ '',
  948. \ ''
  949. \ ],
  950. \ 'expected' : [
  951. \ 'abc',
  952. \ 'ab',
  953. \ 'a',
  954. \ '',
  955. \ '',
  956. \ 'a321',
  957. \ 'b321',
  958. \ 'b321',
  959. \ 'a122',
  960. \ 'a123',
  961. \ 'b123',
  962. \ 'b321b',
  963. \ 'c321d',
  964. \ 'b322b',
  965. \ ' 123b',
  966. \ 'c123d'
  967. \ ]
  968. \ },
  969. \ {
  970. \ 'name' : 'alpha, sort on first 2 digits',
  971. \ 'cmd' : 'sort/\d\d/r',
  972. \ 'input' : [
  973. \ 'abc',
  974. \ 'ab',
  975. \ 'a',
  976. \ 'a321',
  977. \ 'a123',
  978. \ 'a122',
  979. \ 'b321',
  980. \ 'b123',
  981. \ 'c123d',
  982. \ ' 123b',
  983. \ 'c321d',
  984. \ 'b322b',
  985. \ 'b321',
  986. \ 'b321b',
  987. \ '',
  988. \ ''
  989. \ ],
  990. \ 'expected' : [
  991. \ 'abc',
  992. \ 'ab',
  993. \ 'a',
  994. \ '',
  995. \ '',
  996. \ 'a123',
  997. \ 'a122',
  998. \ 'b123',
  999. \ 'c123d',
  1000. \ ' 123b',
  1001. \ 'a321',
  1002. \ 'b321',
  1003. \ 'c321d',
  1004. \ 'b322b',
  1005. \ 'b321',
  1006. \ 'b321b'
  1007. \ ]
  1008. \ },
  1009. \ {
  1010. \ 'name' : 'numeric, sort on first 2 digits',
  1011. \ 'cmd' : 'sort/\d\d/rn',
  1012. \ 'input' : [
  1013. \ 'abc',
  1014. \ 'ab',
  1015. \ 'a',
  1016. \ 'a321',
  1017. \ 'a123',
  1018. \ 'a122',
  1019. \ 'b321',
  1020. \ 'b123',
  1021. \ 'c123d',
  1022. \ ' 123b',
  1023. \ 'c321d',
  1024. \ 'b322b',
  1025. \ 'b321',
  1026. \ 'b321b',
  1027. \ '',
  1028. \ ''
  1029. \ ],
  1030. \ 'expected' : [
  1031. \ 'abc',
  1032. \ 'ab',
  1033. \ 'a',
  1034. \ '',
  1035. \ '',
  1036. \ 'a123',
  1037. \ 'a122',
  1038. \ 'b123',
  1039. \ 'c123d',
  1040. \ ' 123b',
  1041. \ 'a321',
  1042. \ 'b321',
  1043. \ 'c321d',
  1044. \ 'b322b',
  1045. \ 'b321',
  1046. \ 'b321b'
  1047. \ ]
  1048. \ },
  1049. \ {
  1050. \ 'name' : 'hexadecimal, sort on first 2 digits',
  1051. \ 'cmd' : 'sort/\d\d/rx',
  1052. \ 'input' : [
  1053. \ 'abc',
  1054. \ 'ab',
  1055. \ 'a',
  1056. \ 'a321',
  1057. \ 'a123',
  1058. \ 'a122',
  1059. \ 'b321',
  1060. \ 'b123',
  1061. \ 'c123d',
  1062. \ ' 123b',
  1063. \ 'c321d',
  1064. \ 'b322b',
  1065. \ 'b321',
  1066. \ 'b321b',
  1067. \ '',
  1068. \ ''
  1069. \ ],
  1070. \ 'expected' : [
  1071. \ 'abc',
  1072. \ 'ab',
  1073. \ 'a',
  1074. \ '',
  1075. \ '',
  1076. \ 'a123',
  1077. \ 'a122',
  1078. \ 'b123',
  1079. \ 'c123d',
  1080. \ ' 123b',
  1081. \ 'a321',
  1082. \ 'b321',
  1083. \ 'c321d',
  1084. \ 'b322b',
  1085. \ 'b321',
  1086. \ 'b321b'
  1087. \ ]
  1088. \ },
  1089. \ {
  1090. \ 'name' : 'binary',
  1091. \ 'cmd' : 'sort b',
  1092. \ 'input' : [
  1093. \ '0b111000',
  1094. \ '0b101100',
  1095. \ '0b101001',
  1096. \ '0b101001',
  1097. \ '0b101000',
  1098. \ '0b000000',
  1099. \ '0b001000',
  1100. \ '0b010000',
  1101. \ '0b101000',
  1102. \ '0b100000',
  1103. \ '0b101010',
  1104. \ '0b100010',
  1105. \ '0b100100',
  1106. \ '0b100010',
  1107. \ '',
  1108. \ ''
  1109. \ ],
  1110. \ 'expected' : [
  1111. \ '',
  1112. \ '',
  1113. \ '0b000000',
  1114. \ '0b001000',
  1115. \ '0b010000',
  1116. \ '0b100000',
  1117. \ '0b100010',
  1118. \ '0b100010',
  1119. \ '0b100100',
  1120. \ '0b101000',
  1121. \ '0b101000',
  1122. \ '0b101001',
  1123. \ '0b101001',
  1124. \ '0b101010',
  1125. \ '0b101100',
  1126. \ '0b111000'
  1127. \ ]
  1128. \ },
  1129. \ {
  1130. \ 'name' : 'binary with leading characters',
  1131. \ 'cmd' : 'sort b',
  1132. \ 'input' : [
  1133. \ '0b100010',
  1134. \ '0b010000',
  1135. \ ' 0b101001',
  1136. \ 'b0b101100',
  1137. \ '0b100010',
  1138. \ ' 0b100100',
  1139. \ 'a0b001000',
  1140. \ '0b101000',
  1141. \ '0b101000',
  1142. \ 'a0b101001',
  1143. \ 'ab0b100000',
  1144. \ '0b101010',
  1145. \ '0b000000',
  1146. \ 'b0b111000',
  1147. \ '',
  1148. \ ''
  1149. \ ],
  1150. \ 'expected' : [
  1151. \ '',
  1152. \ '',
  1153. \ '0b000000',
  1154. \ 'a0b001000',
  1155. \ '0b010000',
  1156. \ 'ab0b100000',
  1157. \ '0b100010',
  1158. \ '0b100010',
  1159. \ ' 0b100100',
  1160. \ '0b101000',
  1161. \ '0b101000',
  1162. \ ' 0b101001',
  1163. \ 'a0b101001',
  1164. \ '0b101010',
  1165. \ 'b0b101100',
  1166. \ 'b0b111000'
  1167. \ ]
  1168. \ },
  1169. \ {
  1170. \ 'name' : 'alphabetical, sorted input',
  1171. \ 'cmd' : 'sort',
  1172. \ 'input' : [
  1173. \ 'a',
  1174. \ 'b',
  1175. \ 'c',
  1176. \ ],
  1177. \ 'expected' : [
  1178. \ 'a',
  1179. \ 'b',
  1180. \ 'c',
  1181. \ ]
  1182. \ },
  1183. \ {
  1184. \ 'name' : 'alphabetical, sorted input, unique at end',
  1185. \ 'cmd' : 'sort u',
  1186. \ 'input' : [
  1187. \ 'aa',
  1188. \ 'bb',
  1189. \ 'cc',
  1190. \ 'cc',
  1191. \ ],
  1192. \ 'expected' : [
  1193. \ 'aa',
  1194. \ 'bb',
  1195. \ 'cc',
  1196. \ ]
  1197. \ },
  1198. \ {
  1199. \ 'name' : 'sort one line buffer',
  1200. \ 'cmd' : 'sort',
  1201. \ 'input' : [
  1202. \ 'single line'
  1203. \ ],
  1204. \ 'expected' : [
  1205. \ 'single line'
  1206. \ ]
  1207. \ },
  1208. \ {
  1209. \ 'name' : 'sort ignoring case',
  1210. \ 'cmd' : '%sort i',
  1211. \ 'input' : [
  1212. \ 'BB',
  1213. \ 'Cc',
  1214. \ 'aa'
  1215. \ ],
  1216. \ 'expected' : [
  1217. \ 'aa',
  1218. \ 'BB',
  1219. \ 'Cc'
  1220. \ ]
  1221. \ },
  1222. \ ]
  1223. " This does not appear to work correctly on Mac.
  1224. if !has('mac')
  1225. if v:collate =~? '^\(en\|fr\)_ca.utf-\?8$'
  1226. " en_CA.utf-8 sorts capitals before lower case
  1227. " 'Œ' is omitted because it can sort before or after 'œ'
  1228. let tests += [
  1229. \ {
  1230. \ 'name' : 'sort with locale ' .. v:collate,
  1231. \ 'cmd' : '%sort l',
  1232. \ 'input' : [
  1233. \ 'A',
  1234. \ 'E',
  1235. \ 'O',
  1236. \ 'À',
  1237. \ 'È',
  1238. \ 'É',
  1239. \ 'Ô',
  1240. \ 'Z',
  1241. \ 'a',
  1242. \ 'e',
  1243. \ 'o',
  1244. \ 'à',
  1245. \ 'è',
  1246. \ 'é',
  1247. \ 'ô',
  1248. \ 'œ',
  1249. \ 'z'
  1250. \ ],
  1251. \ 'expected' : [
  1252. \ 'A',
  1253. \ 'a',
  1254. \ 'À',
  1255. \ 'à',
  1256. \ 'E',
  1257. \ 'e',
  1258. \ 'É',
  1259. \ 'é',
  1260. \ 'È',
  1261. \ 'è',
  1262. \ 'O',
  1263. \ 'o',
  1264. \ 'Ô',
  1265. \ 'ô',
  1266. \ 'œ',
  1267. \ 'Z',
  1268. \ 'z'
  1269. \ ]
  1270. \ },
  1271. \ ]
  1272. elseif v:collate =~? '^\(en\|es\|de\|fr\|it\|nl\).*\.utf-\?8$'
  1273. " With these locales, the accentuated letters are ordered
  1274. " similarly to the non-accentuated letters.
  1275. let tests += [
  1276. \ {
  1277. \ 'name' : 'sort with locale ' .. v:collate,
  1278. \ 'cmd' : '%sort l',
  1279. \ 'input' : [
  1280. \ 'A',
  1281. \ 'E',
  1282. \ 'O',
  1283. \ 'À',
  1284. \ 'È',
  1285. \ 'É',
  1286. \ 'Ô',
  1287. \ 'Œ',
  1288. \ 'Z',
  1289. \ 'a',
  1290. \ 'e',
  1291. \ 'o',
  1292. \ 'à',
  1293. \ 'è',
  1294. \ 'é',
  1295. \ 'ô',
  1296. \ 'œ',
  1297. \ 'z'
  1298. \ ],
  1299. \ 'expected' : [
  1300. \ 'a',
  1301. \ 'A',
  1302. \ 'à',
  1303. \ 'À',
  1304. \ 'e',
  1305. \ 'E',
  1306. \ 'é',
  1307. \ 'É',
  1308. \ 'è',
  1309. \ 'È',
  1310. \ 'o',
  1311. \ 'O',
  1312. \ 'ô',
  1313. \ 'Ô',
  1314. \ 'œ',
  1315. \ 'Œ',
  1316. \ 'z',
  1317. \ 'Z'
  1318. \ ]
  1319. \ },
  1320. \ ]
  1321. endif
  1322. endif
  1323. if has('float')
  1324. let tests += [
  1325. \ {
  1326. \ 'name' : 'float',
  1327. \ 'cmd' : 'sort f',
  1328. \ 'input' : [
  1329. \ '1.234',
  1330. \ '0.88',
  1331. \ ' + 123.456',
  1332. \ '1.15e-6',
  1333. \ '-1.1e3',
  1334. \ '-1.01e3',
  1335. \ '',
  1336. \ ''
  1337. \ ],
  1338. \ 'expected' : [
  1339. \ '',
  1340. \ '',
  1341. \ '-1.1e3',
  1342. \ '-1.01e3',
  1343. \ '1.15e-6',
  1344. \ '0.88',
  1345. \ '1.234',
  1346. \ ' + 123.456'
  1347. \ ]
  1348. \ },
  1349. \ ]
  1350. endif
  1351. for t in tests
  1352. enew!
  1353. call append(0, t.input)
  1354. $delete _
  1355. setlocal nomodified
  1356. execute t.cmd
  1357. call assert_equal(t.expected, getline(1, '$'), t.name)
  1358. " Previously, the ":sort" command would set 'modified' even if the buffer
  1359. " contents did not change. Here, we check that this problem is fixed.
  1360. if t.input == t.expected
  1361. call assert_false(&modified, t.name . ': &mod is not correct')
  1362. else
  1363. call assert_true(&modified, t.name . ': &mod is not correct')
  1364. endif
  1365. endfor
  1366. " Needs at least two lines for this test
  1367. call setline(1, ['line1', 'line2'])
  1368. call assert_fails('sort no', 'E474:')
  1369. call assert_fails('sort c', 'E475:')
  1370. call assert_fails('sort #pat%', 'E654:')
  1371. call assert_fails('sort /\%(/', 'E53:')
  1372. enew!
  1373. endfunc
  1374. func Test_sort_large_num()
  1375. new
  1376. a
  1377. -2147483648
  1378. -2147483647
  1379. -1
  1380. 0
  1381. 1
  1382. -2147483646
  1383. 2147483646
  1384. 2147483647
  1385. 2147483647
  1386. -2147483648
  1387. abc
  1388. .
  1389. " Numerical sort. Non-numeric lines are ordered before numerical lines.
  1390. " Ordering of non-numerical is stable.
  1391. sort n
  1392. call assert_equal(['',
  1393. \ 'abc',
  1394. \ '',
  1395. \ '-2147483648',
  1396. \ '-2147483648',
  1397. \ '-2147483647',
  1398. \ '-2147483646',
  1399. \ '-1',
  1400. \ '0',
  1401. \ '1',
  1402. \ '2147483646',
  1403. \ '2147483647',
  1404. \ '2147483647'], getline(1, '$'))
  1405. bwipe!
  1406. new
  1407. a
  1408. -9223372036854775808
  1409. -9223372036854775807
  1410. -1
  1411. 0
  1412. 1
  1413. -9223372036854775806
  1414. 9223372036854775806
  1415. 9223372036854775807
  1416. 9223372036854775807
  1417. -9223372036854775808
  1418. abc
  1419. .
  1420. sort n
  1421. call assert_equal(['',
  1422. \ 'abc',
  1423. \ '',
  1424. \ '-9223372036854775808',
  1425. \ '-9223372036854775808',
  1426. \ '-9223372036854775807',
  1427. \ '-9223372036854775806',
  1428. \ '-1',
  1429. \ '0',
  1430. \ '1',
  1431. \ '9223372036854775806',
  1432. \ '9223372036854775807',
  1433. \ '9223372036854775807'], getline(1, '$'))
  1434. bwipe!
  1435. endfunc
  1436. func Test_sort_cmd_report()
  1437. enew!
  1438. call append(0, repeat([1], 3) + repeat([2], 3) + repeat([3], 3))
  1439. $delete _
  1440. setlocal nomodified
  1441. let res = execute('%sort u')
  1442. call assert_equal([1,2,3], map(getline(1, '$'), 'v:val+0'))
  1443. call assert_match("6 fewer lines", res)
  1444. enew!
  1445. call append(0, repeat([1], 3) + repeat([2], 3) + repeat([3], 3))
  1446. $delete _
  1447. setlocal nomodified report=10
  1448. let res = execute('%sort u')
  1449. call assert_equal([1,2,3], map(getline(1, '$'), 'v:val+0'))
  1450. call assert_equal("", res)
  1451. enew!
  1452. call append(0, repeat([1], 3) + repeat([2], 3) + repeat([3], 3))
  1453. $delete _
  1454. setl report&vim
  1455. setlocal nomodified
  1456. let res = execute('1g/^/%sort u')
  1457. call assert_equal([1,2,3], map(getline(1, '$'), 'v:val+0'))
  1458. " the output comes from the :g command, not from the :sort
  1459. call assert_match("6 fewer lines", res)
  1460. enew!
  1461. endfunc
  1462. " Test for a :sort command followed by another command
  1463. func Test_sort_followed_by_cmd()
  1464. new
  1465. let var = ''
  1466. call setline(1, ['cc', 'aa', 'bb'])
  1467. %sort | let var = "sortcmdtest"
  1468. call assert_equal(var, "sortcmdtest")
  1469. call assert_equal(['aa', 'bb', 'cc'], getline(1, '$'))
  1470. " Test for :sort followed by a comment
  1471. call setline(1, ['3b', '1c', '2a'])
  1472. %sort /\d\+/ " sort alphabetically
  1473. call assert_equal(['2a', '3b', '1c'], getline(1, '$'))
  1474. close!
  1475. endfunc
  1476. " Test for :sort using last search pattern
  1477. func Test_sort_last_search_pat()
  1478. new
  1479. let @/ = '\d\+'
  1480. call setline(1, ['3b', '1c', '2a'])
  1481. sort //
  1482. call assert_equal(['2a', '3b', '1c'], getline(1, '$'))
  1483. close!
  1484. endfunc
  1485. " Test for :sort with no last search pattern
  1486. func Test_sort_with_no_last_search_pat()
  1487. let lines =<< trim [SCRIPT]
  1488. call setline(1, ['3b', '1c', '2a'])
  1489. call assert_fails('sort //', 'E35:')
  1490. call writefile(v:errors, 'Xresult')
  1491. qall!
  1492. [SCRIPT]
  1493. call writefile(lines, 'Xscript', 'D')
  1494. if RunVim([], [], '--clean -S Xscript')
  1495. call assert_equal([], readfile('Xresult'))
  1496. endif
  1497. call delete('Xresult')
  1498. endfunc
  1499. " Test for retaining marks across a :sort
  1500. func Test_sort_with_marks()
  1501. new
  1502. call setline(1, ['cc', 'aa', 'bb'])
  1503. call setpos("'c", [0, 1, 0, 0])
  1504. call setpos("'a", [0, 2, 0, 0])
  1505. call setpos("'b", [0, 3, 0, 0])
  1506. %sort
  1507. call assert_equal(['aa', 'bb', 'cc'], getline(1, '$'))
  1508. call assert_equal(2, line("'a"))
  1509. call assert_equal(3, line("'b"))
  1510. call assert_equal(1, line("'c"))
  1511. close!
  1512. endfunc
  1513. " vim: shiftwidth=2 sts=2 expandtab