xref: /vim-8.2.3635/src/testdir/test_sort.vim (revision 95bafa29)
1" Tests for the "sort()" function and for the ":sort" command.
2
3func Compare1(a, b) abort
4    call sort(range(3), 'Compare2')
5    return a:a - a:b
6endfunc
7
8func Compare2(a, b) abort
9    return a:a - a:b
10endfunc
11
12func Test_sort_strings()
13  " numbers compared as strings
14  call assert_equal([1, 2, 3], sort([3, 2, 1]))
15  call assert_equal([13, 28, 3], sort([3, 28, 13]))
16endfunc
17
18func Test_sort_numeric()
19  call assert_equal([1, 2, 3], sort([3, 2, 1], 'n'))
20  call assert_equal([3, 13, 28], sort([13, 28, 3], 'n'))
21  " strings are not sorted
22  call assert_equal(['13', '28', '3'], sort(['13', '28', '3'], 'n'))
23endfunc
24
25func Test_sort_numbers()
26  call assert_equal([3, 13, 28], sort([13, 28, 3], 'N'))
27  call assert_equal(['3', '13', '28'], sort(['13', '28', '3'], 'N'))
28endfunc
29
30func Test_sort_float()
31  call assert_equal([0.28, 3, 13.5], sort([13.5, 0.28, 3], 'f'))
32endfunc
33
34func Test_sort_nested()
35  " test ability to call sort() from a compare function
36  call assert_equal([1, 3, 5], sort([3, 1, 5], 'Compare1'))
37endfunc
38
39func Test_sort_default()
40  " docs say omitted, empty or zero argument sorts on string representation.
41  call assert_equal(['2', 'A', 'AA', 'a', 1, 3.3], sort([3.3, 1, "2", "A", "a", "AA"]))
42  call assert_equal(['2', 'A', 'AA', 'a', 1, 3.3], sort([3.3, 1, "2", "A", "a", "AA"], ''))
43  call assert_equal(['2', 'A', 'AA', 'a', 1, 3.3], sort([3.3, 1, "2", "A", "a", "AA"], 0))
44  call assert_equal(['2', 'A', 'a', 'AA', 1, 3.3], sort([3.3, 1, "2", "A", "a", "AA"], 1))
45  call assert_fails('call sort([3.3, 1, "2"], 3)', "E474")
46endfunc
47
48" Tests for the ":sort" command.
49func Test_sort_cmd()
50  let tests = [
51	\ {
52	\    'name' : 'Alphabetical sort',
53	\    'cmd' : '%sort',
54	\    'input' : [
55	\	'abc',
56	\	'ab',
57	\	'a',
58	\	'a321',
59	\	'a123',
60	\	'a122',
61	\	'b321',
62	\	'b123',
63	\	'c123d',
64	\	' 123b',
65	\	'c321d',
66	\	'b322b',
67	\	'b321',
68	\	'b321b'
69	\    ],
70	\    'expected' : [
71	\	' 123b',
72	\	'a',
73	\	'a122',
74	\	'a123',
75	\	'a321',
76	\	'ab',
77	\	'abc',
78	\	'b123',
79	\	'b321',
80	\	'b321',
81	\	'b321b',
82	\	'b322b',
83	\	'c123d',
84	\	'c321d'
85	\    ]
86	\ },
87	\ {
88	\    'name' : 'Numeric sort',
89	\    'cmd' : '%sort n',
90	\    'input' : [
91	\	'abc',
92	\	'ab',
93	\	'a321',
94	\	'a123',
95	\	'a122',
96	\	'a',
97	\	'x-22',
98	\	'b321',
99	\	'b123',
100	\	'',
101	\	'c123d',
102	\	'-24',
103	\	' 123b',
104	\	'c321d',
105	\	'0',
106	\	'b322b',
107	\	'b321',
108	\	'b321b'
109	\    ],
110	\    'expected' : [
111	\	'abc',
112	\	'ab',
113	\	'a',
114	\	'',
115	\	'-24',
116	\	'x-22',
117	\	'0',
118	\	'a122',
119	\	'a123',
120	\	'b123',
121	\	'c123d',
122	\	' 123b',
123	\	'a321',
124	\	'b321',
125	\	'c321d',
126	\	'b321',
127	\	'b321b',
128	\	'b322b'
129	\    ]
130	\ },
131	\ {
132	\    'name' : 'Hexadecimal sort',
133	\    'cmd' : '%sort x',
134	\    'input' : [
135	\	'abc',
136	\	'ab',
137	\	'a',
138	\	'a321',
139	\	'a123',
140	\	'a122',
141	\	'b321',
142	\	'b123',
143	\	'c123d',
144	\	' 123b',
145	\	'c321d',
146	\	'b322b',
147	\	'b321',
148	\	'b321b'
149	\    ],
150	\    'expected' : [
151	\	'a',
152	\	'ab',
153	\	'abc',
154	\	' 123b',
155	\	'a122',
156	\	'a123',
157	\	'a321',
158	\	'b123',
159	\	'b321',
160	\	'b321',
161	\	'b321b',
162	\	'b322b',
163	\	'c123d',
164	\	'c321d'
165	\    ]
166	\ },
167	\ {
168	\    'name' : 'Alphabetical unique sort',
169	\    'cmd' : '%sort u',
170	\    'input' : [
171	\	'abc',
172	\	'ab',
173	\	'a',
174	\	'a321',
175	\	'a123',
176	\	'a122',
177	\	'b321',
178	\	'b123',
179	\	'c123d',
180	\	' 123b',
181	\	'c321d',
182	\	'b322b',
183	\	'b321',
184	\	'b321b'
185	\    ],
186	\    'expected' : [
187	\	' 123b',
188	\	'a',
189	\	'a122',
190	\	'a123',
191	\	'a321',
192	\	'ab',
193	\	'abc',
194	\	'b123',
195	\	'b321',
196	\	'b321b',
197	\	'b322b',
198	\	'c123d',
199	\	'c321d'
200	\    ]
201	\ },
202	\ {
203	\    'name' : 'Alphabetical reverse sort',
204	\    'cmd' : '%sort!',
205	\    'input' : [
206	\	'abc',
207	\	'ab',
208	\	'a',
209	\	'a321',
210	\	'a123',
211	\	'a122',
212	\	'b321',
213	\	'b123',
214	\	'c123d',
215	\	' 123b',
216	\	'c321d',
217	\	'b322b',
218	\	'b321',
219	\	'b321b'
220	\    ],
221	\    'expected' : [
222	\	'c321d',
223	\	'c123d',
224	\	'b322b',
225	\	'b321b',
226	\	'b321',
227	\	'b321',
228	\	'b123',
229	\	'abc',
230	\	'ab',
231	\	'a321',
232	\	'a123',
233	\	'a122',
234	\	'a',
235	\	' 123b',
236	\    ]
237	\ },
238	\ {
239	\    'name' : 'Numeric reverse sort',
240	\    'cmd' : '%sort! n',
241	\    'input' : [
242	\	'abc',
243	\	'ab',
244	\	'a',
245	\	'a321',
246	\	'a123',
247	\	'a122',
248	\	'b321',
249	\	'b123',
250	\	'c123d',
251	\	' 123b',
252	\	'c321d',
253	\	'b322b',
254	\	'b321',
255	\	'b321b'
256	\    ],
257	\    'expected' : [
258	\	'b322b',
259	\	'b321b',
260	\	'b321',
261	\	'c321d',
262	\	'b321',
263	\	'a321',
264	\	' 123b',
265	\	'c123d',
266	\	'b123',
267	\	'a123',
268	\	'a122',
269	\	'a',
270	\	'ab',
271	\	'abc'
272	\    ]
273	\ },
274	\ {
275	\    'name' : 'Unique reverse sort',
276	\    'cmd' : 'sort! u',
277	\    'input' : [
278	\	'abc',
279	\	'ab',
280	\	'a',
281	\	'a321',
282	\	'a123',
283	\	'a122',
284	\	'b321',
285	\	'b123',
286	\	'c123d',
287	\	' 123b',
288	\	'c321d',
289	\	'b322b',
290	\	'b321',
291	\	'b321b'
292	\    ],
293	\    'expected' : [
294	\	'c321d',
295	\	'c123d',
296	\	'b322b',
297	\	'b321b',
298	\	'b321',
299	\	'b123',
300	\	'abc',
301	\	'ab',
302	\	'a321',
303	\	'a123',
304	\	'a122',
305	\	'a',
306	\	' 123b',
307	\    ]
308	\ },
309	\ {
310	\    'name' : 'Octal sort',
311	\    'cmd' : 'sort o',
312	\    'input' : [
313	\	'abc',
314	\	'ab',
315	\	'a',
316	\	'a321',
317	\	'a123',
318	\	'a122',
319	\	'b321',
320	\	'b123',
321	\	'c123d',
322	\	' 123b',
323	\	'c321d',
324	\	'b322b',
325	\	'b321',
326	\	'b321b',
327	\	'',
328	\	''
329	\    ],
330	\    'expected' : [
331	\	'abc',
332	\	'ab',
333	\	'a',
334	\	'',
335	\	'',
336	\	'a122',
337	\	'a123',
338	\	'b123',
339	\	'c123d',
340	\	' 123b',
341	\	'a321',
342	\	'b321',
343	\	'c321d',
344	\	'b321',
345	\	'b321b',
346	\	'b322b'
347	\    ]
348	\ },
349	\ {
350	\    'name' : 'Reverse hexadecimal sort',
351	\    'cmd' : 'sort! x',
352	\    'input' : [
353	\	'abc',
354	\	'ab',
355	\	'a',
356	\	'a321',
357	\	'a123',
358	\	'a122',
359	\	'b321',
360	\	'b123',
361	\	'c123d',
362	\	' 123b',
363	\	'c321d',
364	\	'b322b',
365	\	'b321',
366	\	'b321b',
367	\	'',
368	\	''
369	\    ],
370	\    'expected' : [
371	\	'c321d',
372	\	'c123d',
373	\	'b322b',
374	\	'b321b',
375	\	'b321',
376	\	'b321',
377	\	'b123',
378	\	'a321',
379	\	'a123',
380	\	'a122',
381	\	' 123b',
382	\	'abc',
383	\	'ab',
384	\	'a',
385	\	'',
386	\	''
387	\    ]
388	\ },
389	\ {
390	\    'name' : 'Alpha (skip first character) sort',
391	\    'cmd' : 'sort/./',
392	\    'input' : [
393	\	'abc',
394	\	'ab',
395	\	'a',
396	\	'a321',
397	\	'a123',
398	\	'a122',
399	\	'b321',
400	\	'b123',
401	\	'c123d',
402	\	' 123b',
403	\	'c321d',
404	\	'b322b',
405	\	'b321',
406	\	'b321b',
407	\	'',
408	\	''
409	\    ],
410	\    'expected' : [
411	\	'a',
412	\	'',
413	\	'',
414	\	'a122',
415	\	'a123',
416	\	'b123',
417	\	' 123b',
418	\	'c123d',
419	\	'a321',
420	\	'b321',
421	\	'b321',
422	\	'b321b',
423	\	'c321d',
424	\	'b322b',
425	\	'ab',
426	\	'abc'
427	\    ]
428	\ },
429	\ {
430	\    'name' : 'Alpha (skip first 2 characters) sort',
431	\    'cmd' : 'sort/../',
432	\    'input' : [
433	\	'abc',
434	\	'ab',
435	\	'a',
436	\	'a321',
437	\	'a123',
438	\	'a122',
439	\	'b321',
440	\	'b123',
441	\	'c123d',
442	\	' 123b',
443	\	'c321d',
444	\	'b322b',
445	\	'b321',
446	\	'b321b',
447	\	'',
448	\	''
449	\    ],
450	\    'expected' : [
451	\	'ab',
452	\	'a',
453	\	'',
454	\	'',
455	\	'a321',
456	\	'b321',
457	\	'b321',
458	\	'b321b',
459	\	'c321d',
460	\	'a122',
461	\	'b322b',
462	\	'a123',
463	\	'b123',
464	\	' 123b',
465	\	'c123d',
466	\	'abc'
467	\    ]
468	\ },
469	\ {
470	\    'name' : 'alpha, unique, skip first 2 characters',
471	\    'cmd' : 'sort/../u',
472	\    'input' : [
473	\	'abc',
474	\	'ab',
475	\	'a',
476	\	'a321',
477	\	'a123',
478	\	'a122',
479	\	'b321',
480	\	'b123',
481	\	'c123d',
482	\	' 123b',
483	\	'c321d',
484	\	'b322b',
485	\	'b321',
486	\	'b321b',
487	\	'',
488	\	''
489	\    ],
490	\    'expected' : [
491	\	'ab',
492	\	'a',
493	\	'',
494	\	'a321',
495	\	'b321',
496	\	'b321b',
497	\	'c321d',
498	\	'a122',
499	\	'b322b',
500	\	'a123',
501	\	'b123',
502	\	' 123b',
503	\	'c123d',
504	\	'abc'
505	\    ]
506	\ },
507	\ {
508	\    'name' : 'numeric, skip first character',
509	\    'cmd' : 'sort/./n',
510	\    'input' : [
511	\	'abc',
512	\	'ab',
513	\	'a',
514	\	'a321',
515	\	'a123',
516	\	'a122',
517	\	'b321',
518	\	'b123',
519	\	'c123d',
520	\	' 123b',
521	\	'c321d',
522	\	'b322b',
523	\	'b321',
524	\	'b321b',
525	\	'',
526	\	''
527	\    ],
528	\    'expected' : [
529	\	'abc',
530	\	'ab',
531	\	'a',
532	\	'',
533	\	'',
534	\	'a122',
535	\	'a123',
536	\	'b123',
537	\	'c123d',
538	\	' 123b',
539	\	'a321',
540	\	'b321',
541	\	'c321d',
542	\	'b321',
543	\	'b321b',
544	\	'b322b'
545	\    ]
546	\ },
547	\ {
548	\    'name' : 'alpha, sort on first character',
549	\    'cmd' : 'sort/./r',
550	\    'input' : [
551	\	'abc',
552	\	'ab',
553	\	'a',
554	\	'a321',
555	\	'a123',
556	\	'a122',
557	\	'b321',
558	\	'b123',
559	\	'c123d',
560	\	' 123b',
561	\	'c321d',
562	\	'b322b',
563	\	'b321',
564	\	'b321b',
565	\	'',
566	\	''
567	\    ],
568	\    'expected' : [
569	\	'',
570	\	'',
571	\	' 123b',
572	\	'abc',
573	\	'ab',
574	\	'a',
575	\	'a321',
576	\	'a123',
577	\	'a122',
578	\	'b321',
579	\	'b123',
580	\	'b322b',
581	\	'b321',
582	\	'b321b',
583	\	'c123d',
584	\	'c321d'
585	\    ]
586	\ },
587	\ {
588	\    'name' : 'alpha, sort on first 2 characters',
589	\    'cmd' : 'sort/../r',
590	\    'input' : [
591	\	'abc',
592	\	'ab',
593	\	'a',
594	\	'a321',
595	\	'a123',
596	\	'a122',
597	\	'b321',
598	\	'b123',
599	\	'c123d',
600	\	' 123b',
601	\	'c321d',
602	\	'b322b',
603	\	'b321',
604	\	'b321b',
605	\	'',
606	\	''
607	\    ],
608	\    'expected' : [
609	\	'a',
610	\	'',
611	\	'',
612	\	' 123b',
613	\	'a123',
614	\	'a122',
615	\	'a321',
616	\	'abc',
617	\	'ab',
618	\	'b123',
619	\	'b321',
620	\	'b322b',
621	\	'b321',
622	\	'b321b',
623	\	'c123d',
624	\	'c321d'
625	\    ]
626	\ },
627	\ {
628	\    'name' : 'numeric, sort on first character',
629	\    'cmd' : 'sort/./rn',
630	\    'input' : [
631	\	'abc',
632	\	'ab',
633	\	'a',
634	\	'a321',
635	\	'a123',
636	\	'a122',
637	\	'b321',
638	\	'b123',
639	\	'c123d',
640	\	' 123b',
641	\	'c321d',
642	\	'b322b',
643	\	'b321',
644	\	'b321b',
645	\	'',
646	\	''
647	\    ],
648	\    'expected' : [
649	\	'abc',
650	\	'ab',
651	\	'a',
652	\	'a321',
653	\	'a123',
654	\	'a122',
655	\	'b321',
656	\	'b123',
657	\	'c123d',
658	\	' 123b',
659	\	'c321d',
660	\	'b322b',
661	\	'b321',
662	\	'b321b',
663	\	'',
664	\	''
665	\    ]
666	\ },
667	\ {
668	\    'name' : 'alpha, skip past first digit',
669	\    'cmd' : 'sort/\d/',
670	\    'input' : [
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	\    'expected' : [
689	\	'abc',
690	\	'ab',
691	\	'a',
692	\	'',
693	\	'',
694	\	'a321',
695	\	'b321',
696	\	'b321',
697	\	'b321b',
698	\	'c321d',
699	\	'a122',
700	\	'b322b',
701	\	'a123',
702	\	'b123',
703	\	' 123b',
704	\	'c123d'
705	\    ]
706	\ },
707	\ {
708	\    'name' : 'alpha, sort on first digit',
709	\    'cmd' : 'sort/\d/r',
710	\    'input' : [
711	\	'abc',
712	\	'ab',
713	\	'a',
714	\	'a321',
715	\	'a123',
716	\	'a122',
717	\	'b321',
718	\	'b123',
719	\	'c123d',
720	\	' 123b',
721	\	'c321d',
722	\	'b322b',
723	\	'b321',
724	\	'b321b',
725	\	'',
726	\	''
727	\    ],
728	\    'expected' : [
729	\	'abc',
730	\	'ab',
731	\	'a',
732	\	'',
733	\	'',
734	\	'a123',
735	\	'a122',
736	\	'b123',
737	\	'c123d',
738	\	' 123b',
739	\	'a321',
740	\	'b321',
741	\	'c321d',
742	\	'b322b',
743	\	'b321',
744	\	'b321b'
745	\    ]
746	\ },
747	\ {
748	\    'name' : 'numeric, skip past first digit',
749	\    'cmd' : 'sort/\d/n',
750	\    'input' : [
751	\	'abc',
752	\	'ab',
753	\	'a',
754	\	'a321',
755	\	'a123',
756	\	'a122',
757	\	'b321',
758	\	'b123',
759	\	'c123d',
760	\	' 123b',
761	\	'c321d',
762	\	'b322b',
763	\	'b321',
764	\	'b321b',
765	\	'',
766	\	''
767	\    ],
768	\    'expected' : [
769	\	'abc',
770	\	'ab',
771	\	'a',
772	\	'',
773	\	'',
774	\	'a321',
775	\	'b321',
776	\	'c321d',
777	\	'b321',
778	\	'b321b',
779	\	'a122',
780	\	'b322b',
781	\	'a123',
782	\	'b123',
783	\	'c123d',
784	\	' 123b'
785	\    ]
786	\ },
787	\ {
788	\    'name' : 'numeric, sort on first digit',
789	\    'cmd' : 'sort/\d/rn',
790	\    'input' : [
791	\	'abc',
792	\	'ab',
793	\	'a',
794	\	'a321',
795	\	'a123',
796	\	'a122',
797	\	'b321',
798	\	'b123',
799	\	'c123d',
800	\	' 123b',
801	\	'c321d',
802	\	'b322b',
803	\	'b321',
804	\	'b321b',
805	\	'',
806	\	''
807	\    ],
808	\    'expected' : [
809	\	'abc',
810	\	'ab',
811	\	'a',
812	\	'',
813	\	'',
814	\	'a123',
815	\	'a122',
816	\	'b123',
817	\	'c123d',
818	\	' 123b',
819	\	'a321',
820	\	'b321',
821	\	'c321d',
822	\	'b322b',
823	\	'b321',
824	\	'b321b'
825	\    ]
826	\ },
827	\ {
828	\    'name' : 'alpha, skip past first 2 digits',
829	\    'cmd' : 'sort/\d\d/',
830	\    'input' : [
831	\	'abc',
832	\	'ab',
833	\	'a',
834	\	'a321',
835	\	'a123',
836	\	'a122',
837	\	'b321',
838	\	'b123',
839	\	'c123d',
840	\	' 123b',
841	\	'c321d',
842	\	'b322b',
843	\	'b321',
844	\	'b321b',
845	\	'',
846	\	''
847	\    ],
848	\    'expected' : [
849	\	'abc',
850	\	'ab',
851	\	'a',
852	\	'',
853	\	'',
854	\	'a321',
855	\	'b321',
856	\	'b321',
857	\	'b321b',
858	\	'c321d',
859	\	'a122',
860	\	'b322b',
861	\	'a123',
862	\	'b123',
863	\	' 123b',
864	\	'c123d'
865	\    ]
866	\ },
867	\ {
868	\    'name' : 'numeric, skip past first 2 digits',
869	\    'cmd' : 'sort/\d\d/n',
870	\    'input' : [
871	\	'abc',
872	\	'ab',
873	\	'a',
874	\	'a321',
875	\	'a123',
876	\	'a122',
877	\	'b321',
878	\	'b123',
879	\	'c123d',
880	\	' 123b',
881	\	'c321d',
882	\	'b322b',
883	\	'b321',
884	\	'b321b',
885	\	'',
886	\	''
887	\    ],
888	\    'expected' : [
889	\	'abc',
890	\	'ab',
891	\	'a',
892	\	'',
893	\	'',
894	\	'a321',
895	\	'b321',
896	\	'c321d',
897	\	'b321',
898	\	'b321b',
899	\	'a122',
900	\	'b322b',
901	\	'a123',
902	\	'b123',
903	\	'c123d',
904	\	' 123b'
905	\    ]
906	\ },
907	\ {
908	\    'name' : 'hexadecimal, skip past first 2 digits',
909	\    'cmd' : 'sort/\d\d/x',
910	\    'input' : [
911	\	'abc',
912	\	'ab',
913	\	'a',
914	\	'a321',
915	\	'a123',
916	\	'a122',
917	\	'b321',
918	\	'b123',
919	\	'c123d',
920	\	' 123b',
921	\	'c321d',
922	\	'b322b',
923	\	'b321',
924	\	'b321b',
925	\	'',
926	\	''
927	\    ],
928	\    'expected' : [
929	\	'abc',
930	\	'ab',
931	\	'a',
932	\	'',
933	\	'',
934	\	'a321',
935	\	'b321',
936	\	'b321',
937	\	'a122',
938	\	'a123',
939	\	'b123',
940	\	'b321b',
941	\	'c321d',
942	\	'b322b',
943	\	' 123b',
944	\	'c123d'
945	\    ]
946	\ },
947	\ {
948	\    'name' : 'alpha, sort on first 2 digits',
949	\    'cmd' : 'sort/\d\d/r',
950	\    'input' : [
951	\	'abc',
952	\	'ab',
953	\	'a',
954	\	'a321',
955	\	'a123',
956	\	'a122',
957	\	'b321',
958	\	'b123',
959	\	'c123d',
960	\	' 123b',
961	\	'c321d',
962	\	'b322b',
963	\	'b321',
964	\	'b321b',
965	\	'',
966	\	''
967	\    ],
968	\    'expected' : [
969	\	'abc',
970	\	'ab',
971	\	'a',
972	\	'',
973	\	'',
974	\	'a123',
975	\	'a122',
976	\	'b123',
977	\	'c123d',
978	\	' 123b',
979	\	'a321',
980	\	'b321',
981	\	'c321d',
982	\	'b322b',
983	\	'b321',
984	\	'b321b'
985	\    ]
986	\ },
987	\ {
988	\    'name' : 'numeric, sort on first 2 digits',
989	\    'cmd' : 'sort/\d\d/rn',
990	\    'input' : [
991	\	'abc',
992	\	'ab',
993	\	'a',
994	\	'a321',
995	\	'a123',
996	\	'a122',
997	\	'b321',
998	\	'b123',
999	\	'c123d',
1000	\	' 123b',
1001	\	'c321d',
1002	\	'b322b',
1003	\	'b321',
1004	\	'b321b',
1005	\	'',
1006	\	''
1007	\    ],
1008	\    'expected' : [
1009	\	'abc',
1010	\	'ab',
1011	\	'a',
1012	\	'',
1013	\	'',
1014	\	'a123',
1015	\	'a122',
1016	\	'b123',
1017	\	'c123d',
1018	\	' 123b',
1019	\	'a321',
1020	\	'b321',
1021	\	'c321d',
1022	\	'b322b',
1023	\	'b321',
1024	\	'b321b'
1025	\    ]
1026	\ },
1027	\ {
1028	\    'name' : 'hexadecimal, sort on first 2 digits',
1029	\    'cmd' : 'sort/\d\d/rx',
1030	\    'input' : [
1031	\	'abc',
1032	\	'ab',
1033	\	'a',
1034	\	'a321',
1035	\	'a123',
1036	\	'a122',
1037	\	'b321',
1038	\	'b123',
1039	\	'c123d',
1040	\	' 123b',
1041	\	'c321d',
1042	\	'b322b',
1043	\	'b321',
1044	\	'b321b',
1045	\	'',
1046	\	''
1047	\    ],
1048	\    'expected' : [
1049	\	'abc',
1050	\	'ab',
1051	\	'a',
1052	\	'',
1053	\	'',
1054	\	'a123',
1055	\	'a122',
1056	\	'b123',
1057	\	'c123d',
1058	\	' 123b',
1059	\	'a321',
1060	\	'b321',
1061	\	'c321d',
1062	\	'b322b',
1063	\	'b321',
1064	\	'b321b'
1065	\    ]
1066	\ },
1067	\ {
1068	\    'name' : 'binary',
1069	\    'cmd' : 'sort b',
1070	\    'input' : [
1071	\	'0b111000',
1072	\	'0b101100',
1073	\	'0b101001',
1074	\	'0b101001',
1075	\	'0b101000',
1076	\	'0b000000',
1077	\	'0b001000',
1078	\	'0b010000',
1079	\	'0b101000',
1080	\	'0b100000',
1081	\	'0b101010',
1082	\	'0b100010',
1083	\	'0b100100',
1084	\	'0b100010',
1085	\	'',
1086	\	''
1087	\    ],
1088	\    'expected' : [
1089	\	'',
1090	\	'',
1091	\	'0b000000',
1092	\	'0b001000',
1093	\	'0b010000',
1094	\	'0b100000',
1095	\	'0b100010',
1096	\	'0b100010',
1097	\	'0b100100',
1098	\	'0b101000',
1099	\	'0b101000',
1100	\	'0b101001',
1101	\	'0b101001',
1102	\	'0b101010',
1103	\	'0b101100',
1104	\	'0b111000'
1105	\    ]
1106	\ },
1107	\ {
1108	\    'name' : 'binary with leading characters',
1109	\    'cmd' : 'sort b',
1110	\    'input' : [
1111	\	'0b100010',
1112	\	'0b010000',
1113	\	' 0b101001',
1114	\	'b0b101100',
1115	\	'0b100010',
1116	\	' 0b100100',
1117	\	'a0b001000',
1118	\	'0b101000',
1119	\	'0b101000',
1120	\	'a0b101001',
1121	\	'ab0b100000',
1122	\	'0b101010',
1123	\	'0b000000',
1124	\	'b0b111000',
1125	\	'',
1126	\	''
1127	\    ],
1128	\    'expected' : [
1129	\	'',
1130	\	'',
1131	\	'0b000000',
1132	\	'a0b001000',
1133	\	'0b010000',
1134	\	'ab0b100000',
1135	\	'0b100010',
1136	\	'0b100010',
1137	\	' 0b100100',
1138	\	'0b101000',
1139	\	'0b101000',
1140	\	' 0b101001',
1141	\	'a0b101001',
1142	\	'0b101010',
1143	\	'b0b101100',
1144	\	'b0b111000'
1145	\    ]
1146	\ },
1147	\ {
1148	\    'name' : 'float',
1149	\    'cmd' : 'sort f',
1150	\    'input' : [
1151	\	'1.234',
1152	\	'0.88',
1153	\	'123.456',
1154	\	'1.15e-6',
1155	\	'-1.1e3',
1156	\	'-1.01e3',
1157	\	'',
1158	\	''
1159	\    ],
1160	\    'expected' : [
1161	\	'',
1162	\	'',
1163	\	'-1.1e3',
1164	\	'-1.01e3',
1165	\	'1.15e-6',
1166	\	'0.88',
1167	\	'1.234',
1168	\	'123.456'
1169	\    ]
1170	\ },
1171	\ {
1172	\    'name' : 'alphabetical, sorted input',
1173	\    'cmd' : 'sort',
1174	\    'input' : [
1175	\	'a',
1176	\	'b',
1177	\	'c',
1178	\    ],
1179	\    'expected' : [
1180	\	'a',
1181	\	'b',
1182	\	'c',
1183	\    ]
1184	\ },
1185	\ {
1186	\    'name' : 'alphabetical, sorted input, unique at end',
1187	\    'cmd' : 'sort u',
1188	\    'input' : [
1189	\	'aa',
1190	\	'bb',
1191	\	'cc',
1192	\	'cc',
1193	\    ],
1194	\    'expected' : [
1195	\	'aa',
1196	\	'bb',
1197	\	'cc',
1198	\    ]
1199	\ },
1200	\ ]
1201
1202  for t in tests
1203    enew!
1204    call append(0, t.input)
1205    $delete _
1206    setlocal nomodified
1207    execute t.cmd
1208
1209    call assert_equal(t.expected, getline(1, '$'), t.name)
1210
1211    " Previously, the ":sort" command would set 'modified' even if the buffer
1212    " contents did not change.  Here, we check that this problem is fixed.
1213    if t.input == t.expected
1214      call assert_false(&modified, t.name . ': &mod is not correct')
1215    else
1216      call assert_true(&modified, t.name . ': &mod is not correct')
1217    endif
1218  endfor
1219
1220  call assert_fails('sort no', 'E474')
1221
1222  enew!
1223endfunc
1224
1225func Test_sort_cmd_report()
1226    enew!
1227    call append(0, repeat([1], 3) + repeat([2], 3) + repeat([3], 3))
1228    $delete _
1229    setlocal nomodified
1230    let res = execute('%sort u')
1231
1232    call assert_equal([1,2,3], map(getline(1, '$'), 'v:val+0'))
1233    call assert_match("6 fewer lines", res)
1234    enew!
1235    call append(0, repeat([1], 3) + repeat([2], 3) + repeat([3], 3))
1236    $delete _
1237    setlocal nomodified report=10
1238    let res = execute('%sort u')
1239
1240    call assert_equal([1,2,3], map(getline(1, '$'), 'v:val+0'))
1241    call assert_equal("", res)
1242    enew!
1243    call append(0, repeat([1], 3) + repeat([2], 3) + repeat([3], 3))
1244    $delete _
1245    setl report&vim
1246    setlocal nomodified
1247    let res = execute('1g/^/%sort u')
1248
1249    call assert_equal([1,2,3], map(getline(1, '$'), 'v:val+0'))
1250    " the output comes from the :g command, not from the :sort
1251    call assert_match("6 fewer lines", res)
1252    enew!
1253  endfunc
1254