1" Tests for the various 'formatoptions' settings
2func Test_text_format()
3  enew!
4
5  setl noai tw=2 fo=t
6  call append('$', [
7	      \ '{',
8	      \ '    ',
9	      \ '',
10	      \ '}'])
11  exe "normal /^{/+1\n0"
12  normal gRa b
13  let lnum = line('.')
14  call assert_equal([
15	      \ 'a',
16	      \ 'b'], getline(lnum - 1, lnum))
17
18  normal ggdG
19  setl ai tw=2 fo=tw
20  call append('$', [
21	      \ '{',
22	      \ 'a  b  ',
23	      \ '',
24	      \ 'a    ',
25	      \ '}'])
26  exe "normal /^{/+1\n0"
27  normal gqgqjjllab
28  let lnum = line('.')
29  call assert_equal([
30	      \ 'a  ',
31	      \ 'b  ',
32	      \ '',
33	      \ 'a  ',
34	      \ 'b'], getline(lnum - 4, lnum))
35
36  normal ggdG
37  setl tw=3 fo=t
38  call append('$', [
39	      \ '{',
40	      \ "a \<C-A>",
41	      \ '}'])
42  exe "normal /^{/+1\n0"
43  exe "normal gqgqo\na \<C-V>\<C-A>"
44  let lnum = line('.')
45  call assert_equal([
46	      \ 'a',
47	      \ "\<C-A>",
48	      \ '',
49	      \ 'a',
50	      \ "\<C-A>"], getline(lnum - 4, lnum))
51
52  normal ggdG
53  setl tw=2 fo=tcq1 comments=:#
54  call append('$', [
55	      \ '{',
56	      \ 'a b',
57	      \ '#a b',
58	      \ '}'])
59  exe "normal /^{/+1\n0"
60  exe "normal gqgqjgqgqo\na b\n#a b"
61  let lnum = line('.')
62  call assert_equal([
63	      \ 'a b',
64	      \ '#a b',
65	      \ '',
66	      \ 'a b',
67	      \ '#a b'], getline(lnum - 4, lnum))
68
69  normal ggdG
70  setl tw=5 fo=tcn comments=:#
71  call append('$', [
72	      \ '{',
73	      \ '  1 a',
74	      \ '# 1 a',
75	      \ '}'])
76  exe "normal /^{/+1\n0"
77  exe "normal A b\<Esc>jA b"
78  let lnum = line('.')
79  call assert_equal([
80	      \ '  1 a',
81	      \ '    b',
82	      \ '# 1 a',
83	      \ '#   b'], getline(lnum - 3, lnum))
84
85  normal ggdG
86  setl tw=5 fo=t2a si
87  call append('$', [
88	      \ '{',
89	      \ '',
90	      \ '  x a',
91	      \ '  b',
92	      \ ' c',
93	      \ '',
94	      \ '}'])
95  exe "normal /^{/+3\n0"
96  exe "normal i  \<Esc>A_"
97  let lnum = line('.')
98  call assert_equal([
99	      \ '',
100	      \ '  x a',
101	      \ '    b_',
102	      \ '    c',
103	      \ ''], getline(lnum - 2, lnum + 2))
104
105  normal ggdG
106  setl tw=5 fo=qn comments=:#
107  call append('$', [
108	      \ '{',
109	      \ '# 1 a b',
110	      \ '}'])
111  exe "normal /^{/+1\n5|"
112  normal gwap
113  call assert_equal(5, col('.'))
114  let lnum = line('.')
115  call assert_equal([
116	      \ '# 1 a',
117	      \ '#   b'], getline(lnum, lnum + 1))
118
119  normal ggdG
120  setl tw=5 fo=q2 comments=:#
121  call append('$', [
122	      \ '{',
123	      \ '# x',
124	      \ '#   a b',
125	      \ '}'])
126  exe "normal /^{/+1\n0"
127  normal gwap
128  let lnum = line('.')
129  call assert_equal([
130	      \ '# x a',
131	      \ '#   b'], getline(lnum, lnum + 1))
132
133  normal ggdG
134  setl tw& fo=a
135  call append('$', [
136	      \ '{',
137	      \ '   1aa',
138	      \ '   2bb',
139	      \ '}'])
140  exe "normal /^{/+2\n0"
141  normal I^^
142  call assert_equal('{ 1aa ^^2bb }', getline('.'))
143
144  normal ggdG
145  setl tw=20 fo=an12wcq comments=s1:/*,mb:*,ex:*/
146  call append('$', [
147	      \ '/* abc def ghi jkl ',
148	      \ ' *    mno pqr stu',
149	      \ ' */'])
150  exe "normal /mno pqr/\n"
151  normal A vwx yz
152  let lnum = line('.')
153  call assert_equal([
154	      \ ' *    mno pqr stu ',
155	      \ ' *    vwx yz',
156	      \ ' */'], getline(lnum - 1, lnum + 1))
157
158  normal ggdG
159  setl tw=12 fo=tqnc comments=:#
160  call setline('.', '# 1 xxxxx')
161  normal A foobar
162  call assert_equal([
163	      \ '# 1 xxxxx',
164	      \ '#   foobar'], getline(1, 2))
165
166  " Test the 'p' flag for 'formatoptions'
167  " First test without the flag: that it will break "Mr. Feynman" at the space
168  normal ggdG
169  setl tw=28 fo=tcq
170  call setline('.', 'Surely you''re joking, Mr. Feynman!')
171  normal gqq
172  call assert_equal([
173              \ 'Surely you''re joking, Mr.',
174              \ 'Feynman!'], getline(1, 2))
175  " Now test with the flag: that it will push the name with the title onto the
176  " next line
177  normal ggdG
178  setl fo+=p
179  call setline('.', 'Surely you''re joking, Mr. Feynman!')
180  normal gqq
181  call assert_equal([
182              \ 'Surely you''re joking,',
183              \ 'Mr. Feynman!'], getline(1, 2))
184  " Ensure that it will still break if two spaces are entered
185  normal ggdG
186  call setline('.', 'Surely you''re joking, Mr.  Feynman!')
187  normal gqq
188  call assert_equal([
189              \ 'Surely you''re joking, Mr.',
190              \ 'Feynman!'], getline(1, 2))
191
192  setl ai& tw& fo& si& comments&
193  enew!
194endfunc
195
196" Tests for :right, :center and :left on text with embedded TAB.
197func Test_format_align()
198  enew!
199  set tw=65
200
201  " :left alignment
202  call append(0, [
203	      \ "	test for :left",
204	      \ "	  a		a",
205	      \ "	    fa		a",
206	      \ "	  dfa		a",
207	      \ "	        sdfa		a",
208	      \ "	  asdfa		a",
209	      \ "	        xasdfa		a",
210	      \ "asxxdfa		a",
211	      \ ])
212  %left
213  call assert_equal([
214	      \ "test for :left",
215	      \ "a		a",
216	      \ "fa		a",
217	      \ "dfa		a",
218	      \ "sdfa		a",
219	      \ "asdfa		a",
220	      \ "xasdfa		a",
221	      \ "asxxdfa		a",
222	      \ ""
223	      \ ], getline(1, '$'))
224  enew!
225
226  " :center alignment
227  call append(0, [
228	      \ "	test for :center",
229	      \ "	  a		a",
230	      \ "	    fa		afd asdf",
231	      \ "	  dfa		a",
232	      \ "	        sdfa		afd asdf",
233	      \ "	  asdfa		a",
234	      \ "	        xasdfa		asdfasdfasdfasdfasdf",
235	      \ "asxxdfa		a"
236	      \ ])
237  %center
238  call assert_equal([
239	      \ "			test for :center",
240	      \ "			 a		a",
241	      \ "		      fa		afd asdf",
242	      \ "			 dfa		a",
243	      \ "		    sdfa		afd asdf",
244	      \ "			 asdfa		a",
245	      \ "	      xasdfa		asdfasdfasdfasdfasdf",
246	      \ "			asxxdfa		a",
247	      \ ""
248	      \ ], getline(1, '$'))
249  enew!
250
251  " :right alignment
252  call append(0, [
253	      \ "	test for :right",
254	      \ "	a		a",
255	      \ "	fa		a",
256	      \ "	dfa		a",
257	      \ "	sdfa		a",
258	      \ "	asdfa		a",
259	      \ "	xasdfa		a",
260	      \ "	asxxdfa		a",
261	      \ "	asxa;ofa		a",
262	      \ "	asdfaqwer		a",
263	      \ "	a		ax",
264	      \ "	fa		ax",
265	      \ "	dfa		ax",
266	      \ "	sdfa		ax",
267	      \ "	asdfa		ax",
268	      \ "	xasdfa		ax",
269	      \ "	asxxdfa		ax",
270	      \ "	asxa;ofa		ax",
271	      \ "	asdfaqwer		ax",
272	      \ "	a		axx",
273	      \ "	fa		axx",
274	      \ "	dfa		axx",
275	      \ "	sdfa		axx",
276	      \ "	asdfa		axx",
277	      \ "	xasdfa		axx",
278	      \ "	asxxdfa		axx",
279	      \ "	asxa;ofa		axx",
280	      \ "	asdfaqwer		axx",
281	      \ "	a		axxx",
282	      \ "	fa		axxx",
283	      \ "	dfa		axxx",
284	      \ "	sdfa		axxx",
285	      \ "	asdfa		axxx",
286	      \ "	xasdfa		axxx",
287	      \ "	asxxdfa		axxx",
288	      \ "	asxa;ofa		axxx",
289	      \ "	asdfaqwer		axxx",
290	      \ "	a		axxxo",
291	      \ "	fa		axxxo",
292	      \ "	dfa		axxxo",
293	      \ "	sdfa		axxxo",
294	      \ "	asdfa		axxxo",
295	      \ "	xasdfa		axxxo",
296	      \ "	asxxdfa		axxxo",
297	      \ "	asxa;ofa		axxxo",
298	      \ "	asdfaqwer		axxxo",
299	      \ "	a		axxxoi",
300	      \ "	fa		axxxoi",
301	      \ "	dfa		axxxoi",
302	      \ "	sdfa		axxxoi",
303	      \ "	asdfa		axxxoi",
304	      \ "	xasdfa		axxxoi",
305	      \ "	asxxdfa		axxxoi",
306	      \ "	asxa;ofa		axxxoi",
307	      \ "	asdfaqwer		axxxoi",
308	      \ "	a		axxxoik",
309	      \ "	fa		axxxoik",
310	      \ "	dfa		axxxoik",
311	      \ "	sdfa		axxxoik",
312	      \ "	asdfa		axxxoik",
313	      \ "	xasdfa		axxxoik",
314	      \ "	asxxdfa		axxxoik",
315	      \ "	asxa;ofa		axxxoik",
316	      \ "	asdfaqwer		axxxoik",
317	      \ "	a		axxxoike",
318	      \ "	fa		axxxoike",
319	      \ "	dfa		axxxoike",
320	      \ "	sdfa		axxxoike",
321	      \ "	asdfa		axxxoike",
322	      \ "	xasdfa		axxxoike",
323	      \ "	asxxdfa		axxxoike",
324	      \ "	asxa;ofa		axxxoike",
325	      \ "	asdfaqwer		axxxoike",
326	      \ "	a		axxxoikey",
327	      \ "	fa		axxxoikey",
328	      \ "	dfa		axxxoikey",
329	      \ "	sdfa		axxxoikey",
330	      \ "	asdfa		axxxoikey",
331	      \ "	xasdfa		axxxoikey",
332	      \ "	asxxdfa		axxxoikey",
333	      \ "	asxa;ofa		axxxoikey",
334	      \ "	asdfaqwer		axxxoikey",
335	      \ ])
336  %right
337  call assert_equal([
338	      \ "\t\t\t\t		  test for :right",
339	      \ "\t\t\t\t		      a		a",
340	      \ "\t\t\t\t		     fa		a",
341	      \ "\t\t\t\t		    dfa		a",
342	      \ "\t\t\t\t		   sdfa		a",
343	      \ "\t\t\t\t		  asdfa		a",
344	      \ "\t\t\t\t		 xasdfa		a",
345	      \ "\t\t\t\t		asxxdfa		a",
346	      \ "\t\t\t\t	       asxa;ofa		a",
347	      \ "\t\t\t\t	      asdfaqwer		a",
348	      \ "\t\t\t\t	      a		ax",
349	      \ "\t\t\t\t	     fa		ax",
350	      \ "\t\t\t\t	    dfa		ax",
351	      \ "\t\t\t\t	   sdfa		ax",
352	      \ "\t\t\t\t	  asdfa		ax",
353	      \ "\t\t\t\t	 xasdfa		ax",
354	      \ "\t\t\t\t	asxxdfa		ax",
355	      \ "\t\t\t\t       asxa;ofa		ax",
356	      \ "\t\t\t\t      asdfaqwer		ax",
357	      \ "\t\t\t\t	      a		axx",
358	      \ "\t\t\t\t	     fa		axx",
359	      \ "\t\t\t\t	    dfa		axx",
360	      \ "\t\t\t\t	   sdfa		axx",
361	      \ "\t\t\t\t	  asdfa		axx",
362	      \ "\t\t\t\t	 xasdfa		axx",
363	      \ "\t\t\t\t	asxxdfa		axx",
364	      \ "\t\t\t\t       asxa;ofa		axx",
365	      \ "\t\t\t\t      asdfaqwer		axx",
366	      \ "\t\t\t\t	      a		axxx",
367	      \ "\t\t\t\t	     fa		axxx",
368	      \ "\t\t\t\t	    dfa		axxx",
369	      \ "\t\t\t\t	   sdfa		axxx",
370	      \ "\t\t\t\t	  asdfa		axxx",
371	      \ "\t\t\t\t	 xasdfa		axxx",
372	      \ "\t\t\t\t	asxxdfa		axxx",
373	      \ "\t\t\t\t       asxa;ofa		axxx",
374	      \ "\t\t\t\t      asdfaqwer		axxx",
375	      \ "\t\t\t\t	      a		axxxo",
376	      \ "\t\t\t\t	     fa		axxxo",
377	      \ "\t\t\t\t	    dfa		axxxo",
378	      \ "\t\t\t\t	   sdfa		axxxo",
379	      \ "\t\t\t\t	  asdfa		axxxo",
380	      \ "\t\t\t\t	 xasdfa		axxxo",
381	      \ "\t\t\t\t	asxxdfa		axxxo",
382	      \ "\t\t\t\t       asxa;ofa		axxxo",
383	      \ "\t\t\t\t      asdfaqwer		axxxo",
384	      \ "\t\t\t\t	      a		axxxoi",
385	      \ "\t\t\t\t	     fa		axxxoi",
386	      \ "\t\t\t\t	    dfa		axxxoi",
387	      \ "\t\t\t\t	   sdfa		axxxoi",
388	      \ "\t\t\t\t	  asdfa		axxxoi",
389	      \ "\t\t\t\t	 xasdfa		axxxoi",
390	      \ "\t\t\t\t	asxxdfa		axxxoi",
391	      \ "\t\t\t\t       asxa;ofa		axxxoi",
392	      \ "\t\t\t\t      asdfaqwer		axxxoi",
393	      \ "\t\t\t\t	      a		axxxoik",
394	      \ "\t\t\t\t	     fa		axxxoik",
395	      \ "\t\t\t\t	    dfa		axxxoik",
396	      \ "\t\t\t\t	   sdfa		axxxoik",
397	      \ "\t\t\t\t	  asdfa		axxxoik",
398	      \ "\t\t\t\t	 xasdfa		axxxoik",
399	      \ "\t\t\t\t	asxxdfa		axxxoik",
400	      \ "\t\t\t\t       asxa;ofa		axxxoik",
401	      \ "\t\t\t\t      asdfaqwer		axxxoik",
402	      \ "\t\t\t\t	      a		axxxoike",
403	      \ "\t\t\t\t	     fa		axxxoike",
404	      \ "\t\t\t\t	    dfa		axxxoike",
405	      \ "\t\t\t\t	   sdfa		axxxoike",
406	      \ "\t\t\t\t	  asdfa		axxxoike",
407	      \ "\t\t\t\t	 xasdfa		axxxoike",
408	      \ "\t\t\t\t	asxxdfa		axxxoike",
409	      \ "\t\t\t\t       asxa;ofa		axxxoike",
410	      \ "\t\t\t\t      asdfaqwer		axxxoike",
411	      \ "\t\t\t\t	      a		axxxoikey",
412	      \ "\t\t\t\t	     fa		axxxoikey",
413	      \ "\t\t\t\t	    dfa		axxxoikey",
414	      \ "\t\t\t\t	   sdfa		axxxoikey",
415	      \ "\t\t\t\t	  asdfa		axxxoikey",
416	      \ "\t\t\t\t	 xasdfa		axxxoikey",
417	      \ "\t\t\t\t	asxxdfa		axxxoikey",
418	      \ "\t\t\t\t       asxa;ofa		axxxoikey",
419	      \ "\t\t\t\t      asdfaqwer		axxxoikey",
420	      \ ""
421	      \ ], getline(1, '$'))
422  enew!
423
424  set tw&
425endfunc
426
427" Test formatting a paragraph.
428func Test_format_para()
429  enew!
430  set fo+=tcroql tw=72
431
432  call append(0, [
433	\ "xxxxx xx xxxxxx ",
434	\ "xxxxxxx xxxxxxxxx xxx xxxx xxxxx xxxxx xxx xx",
435	\ "xxxxxxxxxxxxxxxxxx xxxxx xxxx, xxxx xxxx xxxx xxxx xxx xx xx",
436	\ "xx xxxxxxx. xxxx xxxx.",
437	\ "",
438	\ "> xx xx, xxxx xxxx xxx xxxx xxx xxxxx xxx xxx xxxxxxx xxx xxxxx",
439	\ "> xxxxxx xxxxxxx: xxxx xxxxxxx, xx xxxxxx xxxx xxxxxxxxxx"
440	\ ])
441  exe "normal /xxxxxxxx$\<CR>"
442  normal 0gq6kk
443  call assert_equal([
444	\ "xxxxx xx xxxxxx xxxxxxx xxxxxxxxx xxx xxxx xxxxx xxxxx xxx xx",
445	\ "xxxxxxxxxxxxxxxxxx xxxxx xxxx, xxxx xxxx xxxx xxxx xxx xx xx xx xxxxxxx.",
446	\ "xxxx xxxx.",
447	\ "",
448	\ "> xx xx, xxxx xxxx xxx xxxx xxx xxxxx xxx xxx xxxxxxx xxx xxxxx xxxxxx",
449	\ "> xxxxxxx: xxxx xxxxxxx, xx xxxxxx xxxx xxxxxxxxxx",
450	\ ""
451	\ ], getline(1, '$'))
452
453  set fo& tw&
454  enew!
455endfunc
456
457" Test undo after ":%s" and formatting.
458func Test_format_undo()
459  enew!
460  map gg :.,.+2s/^/x/<CR>kk:set tw=3<CR>gqq
461
462  call append(0, [
463	      \ "aa aa aa aa",
464	      \ "bb bb bb bb",
465	      \ "cc cc cc cc"
466	      \ ])
467  " undo/redo here to make the next undo only work on the following changes
468  exe "normal i\<C-G>u"
469  call cursor(1,1)
470  normal ggu
471  call assert_equal([
472	      \ "aa aa aa aa",
473	      \ "bb bb bb bb",
474	      \ "cc cc cc cc",
475	      \ ""
476	      \ ], getline(1, '$'))
477
478  unmap gg
479  set tw&
480  enew!
481endfunc
482
483func Test_format_list_auto()
484  new
485  call setline(1, ['1. abc', '2. def', '3.  ghi'])
486  set fo=tan ai bs=2
487  call feedkeys("3G0lli\<BS>\<BS>x\<Esc>", 'tx')
488  call assert_equal('2. defx ghi', getline(2))
489  bwipe!
490  set fo& ai& bs&
491endfunc
492