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  setl ai& tw& fo& si& comments&
167  enew!
168endfunc
169
170" Tests for :right, :center and :left on text with embedded TAB.
171func Test_format_align()
172  enew!
173  set tw=65
174
175  " :left alignment
176  call append(0, [
177	      \ "	test for :left",
178	      \ "	  a		a",
179	      \ "	    fa		a",
180	      \ "	  dfa		a",
181	      \ "	        sdfa		a",
182	      \ "	  asdfa		a",
183	      \ "	        xasdfa		a",
184	      \ "asxxdfa		a",
185	      \ ])
186  %left
187  call assert_equal([
188	      \ "test for :left",
189	      \ "a		a",
190	      \ "fa		a",
191	      \ "dfa		a",
192	      \ "sdfa		a",
193	      \ "asdfa		a",
194	      \ "xasdfa		a",
195	      \ "asxxdfa		a",
196	      \ ""
197	      \ ], getline(1, '$'))
198  enew!
199
200  " :center alignment
201  call append(0, [
202	      \ "	test for :center",
203	      \ "	  a		a",
204	      \ "	    fa		afd asdf",
205	      \ "	  dfa		a",
206	      \ "	        sdfa		afd asdf",
207	      \ "	  asdfa		a",
208	      \ "	        xasdfa		asdfasdfasdfasdfasdf",
209	      \ "asxxdfa		a"
210	      \ ])
211  %center
212  call assert_equal([
213	      \ "			test for :center",
214	      \ "			 a		a",
215	      \ "		      fa		afd asdf",
216	      \ "			 dfa		a",
217	      \ "		    sdfa		afd asdf",
218	      \ "			 asdfa		a",
219	      \ "	      xasdfa		asdfasdfasdfasdfasdf",
220	      \ "			asxxdfa		a",
221	      \ ""
222	      \ ], getline(1, '$'))
223  enew!
224
225  " :right alignment
226  call append(0, [
227	      \ "	test for :right",
228	      \ "	a		a",
229	      \ "	fa		a",
230	      \ "	dfa		a",
231	      \ "	sdfa		a",
232	      \ "	asdfa		a",
233	      \ "	xasdfa		a",
234	      \ "	asxxdfa		a",
235	      \ "	asxa;ofa		a",
236	      \ "	asdfaqwer		a",
237	      \ "	a		ax",
238	      \ "	fa		ax",
239	      \ "	dfa		ax",
240	      \ "	sdfa		ax",
241	      \ "	asdfa		ax",
242	      \ "	xasdfa		ax",
243	      \ "	asxxdfa		ax",
244	      \ "	asxa;ofa		ax",
245	      \ "	asdfaqwer		ax",
246	      \ "	a		axx",
247	      \ "	fa		axx",
248	      \ "	dfa		axx",
249	      \ "	sdfa		axx",
250	      \ "	asdfa		axx",
251	      \ "	xasdfa		axx",
252	      \ "	asxxdfa		axx",
253	      \ "	asxa;ofa		axx",
254	      \ "	asdfaqwer		axx",
255	      \ "	a		axxx",
256	      \ "	fa		axxx",
257	      \ "	dfa		axxx",
258	      \ "	sdfa		axxx",
259	      \ "	asdfa		axxx",
260	      \ "	xasdfa		axxx",
261	      \ "	asxxdfa		axxx",
262	      \ "	asxa;ofa		axxx",
263	      \ "	asdfaqwer		axxx",
264	      \ "	a		axxxo",
265	      \ "	fa		axxxo",
266	      \ "	dfa		axxxo",
267	      \ "	sdfa		axxxo",
268	      \ "	asdfa		axxxo",
269	      \ "	xasdfa		axxxo",
270	      \ "	asxxdfa		axxxo",
271	      \ "	asxa;ofa		axxxo",
272	      \ "	asdfaqwer		axxxo",
273	      \ "	a		axxxoi",
274	      \ "	fa		axxxoi",
275	      \ "	dfa		axxxoi",
276	      \ "	sdfa		axxxoi",
277	      \ "	asdfa		axxxoi",
278	      \ "	xasdfa		axxxoi",
279	      \ "	asxxdfa		axxxoi",
280	      \ "	asxa;ofa		axxxoi",
281	      \ "	asdfaqwer		axxxoi",
282	      \ "	a		axxxoik",
283	      \ "	fa		axxxoik",
284	      \ "	dfa		axxxoik",
285	      \ "	sdfa		axxxoik",
286	      \ "	asdfa		axxxoik",
287	      \ "	xasdfa		axxxoik",
288	      \ "	asxxdfa		axxxoik",
289	      \ "	asxa;ofa		axxxoik",
290	      \ "	asdfaqwer		axxxoik",
291	      \ "	a		axxxoike",
292	      \ "	fa		axxxoike",
293	      \ "	dfa		axxxoike",
294	      \ "	sdfa		axxxoike",
295	      \ "	asdfa		axxxoike",
296	      \ "	xasdfa		axxxoike",
297	      \ "	asxxdfa		axxxoike",
298	      \ "	asxa;ofa		axxxoike",
299	      \ "	asdfaqwer		axxxoike",
300	      \ "	a		axxxoikey",
301	      \ "	fa		axxxoikey",
302	      \ "	dfa		axxxoikey",
303	      \ "	sdfa		axxxoikey",
304	      \ "	asdfa		axxxoikey",
305	      \ "	xasdfa		axxxoikey",
306	      \ "	asxxdfa		axxxoikey",
307	      \ "	asxa;ofa		axxxoikey",
308	      \ "	asdfaqwer		axxxoikey",
309	      \ ])
310  %right
311  call assert_equal([
312	      \ "\t\t\t\t		  test for :right",
313	      \ "\t\t\t\t		      a		a",
314	      \ "\t\t\t\t		     fa		a",
315	      \ "\t\t\t\t		    dfa		a",
316	      \ "\t\t\t\t		   sdfa		a",
317	      \ "\t\t\t\t		  asdfa		a",
318	      \ "\t\t\t\t		 xasdfa		a",
319	      \ "\t\t\t\t		asxxdfa		a",
320	      \ "\t\t\t\t	       asxa;ofa		a",
321	      \ "\t\t\t\t	      asdfaqwer		a",
322	      \ "\t\t\t\t	      a		ax",
323	      \ "\t\t\t\t	     fa		ax",
324	      \ "\t\t\t\t	    dfa		ax",
325	      \ "\t\t\t\t	   sdfa		ax",
326	      \ "\t\t\t\t	  asdfa		ax",
327	      \ "\t\t\t\t	 xasdfa		ax",
328	      \ "\t\t\t\t	asxxdfa		ax",
329	      \ "\t\t\t\t       asxa;ofa		ax",
330	      \ "\t\t\t\t      asdfaqwer		ax",
331	      \ "\t\t\t\t	      a		axx",
332	      \ "\t\t\t\t	     fa		axx",
333	      \ "\t\t\t\t	    dfa		axx",
334	      \ "\t\t\t\t	   sdfa		axx",
335	      \ "\t\t\t\t	  asdfa		axx",
336	      \ "\t\t\t\t	 xasdfa		axx",
337	      \ "\t\t\t\t	asxxdfa		axx",
338	      \ "\t\t\t\t       asxa;ofa		axx",
339	      \ "\t\t\t\t      asdfaqwer		axx",
340	      \ "\t\t\t\t	      a		axxx",
341	      \ "\t\t\t\t	     fa		axxx",
342	      \ "\t\t\t\t	    dfa		axxx",
343	      \ "\t\t\t\t	   sdfa		axxx",
344	      \ "\t\t\t\t	  asdfa		axxx",
345	      \ "\t\t\t\t	 xasdfa		axxx",
346	      \ "\t\t\t\t	asxxdfa		axxx",
347	      \ "\t\t\t\t       asxa;ofa		axxx",
348	      \ "\t\t\t\t      asdfaqwer		axxx",
349	      \ "\t\t\t\t	      a		axxxo",
350	      \ "\t\t\t\t	     fa		axxxo",
351	      \ "\t\t\t\t	    dfa		axxxo",
352	      \ "\t\t\t\t	   sdfa		axxxo",
353	      \ "\t\t\t\t	  asdfa		axxxo",
354	      \ "\t\t\t\t	 xasdfa		axxxo",
355	      \ "\t\t\t\t	asxxdfa		axxxo",
356	      \ "\t\t\t\t       asxa;ofa		axxxo",
357	      \ "\t\t\t\t      asdfaqwer		axxxo",
358	      \ "\t\t\t\t	      a		axxxoi",
359	      \ "\t\t\t\t	     fa		axxxoi",
360	      \ "\t\t\t\t	    dfa		axxxoi",
361	      \ "\t\t\t\t	   sdfa		axxxoi",
362	      \ "\t\t\t\t	  asdfa		axxxoi",
363	      \ "\t\t\t\t	 xasdfa		axxxoi",
364	      \ "\t\t\t\t	asxxdfa		axxxoi",
365	      \ "\t\t\t\t       asxa;ofa		axxxoi",
366	      \ "\t\t\t\t      asdfaqwer		axxxoi",
367	      \ "\t\t\t\t	      a		axxxoik",
368	      \ "\t\t\t\t	     fa		axxxoik",
369	      \ "\t\t\t\t	    dfa		axxxoik",
370	      \ "\t\t\t\t	   sdfa		axxxoik",
371	      \ "\t\t\t\t	  asdfa		axxxoik",
372	      \ "\t\t\t\t	 xasdfa		axxxoik",
373	      \ "\t\t\t\t	asxxdfa		axxxoik",
374	      \ "\t\t\t\t       asxa;ofa		axxxoik",
375	      \ "\t\t\t\t      asdfaqwer		axxxoik",
376	      \ "\t\t\t\t	      a		axxxoike",
377	      \ "\t\t\t\t	     fa		axxxoike",
378	      \ "\t\t\t\t	    dfa		axxxoike",
379	      \ "\t\t\t\t	   sdfa		axxxoike",
380	      \ "\t\t\t\t	  asdfa		axxxoike",
381	      \ "\t\t\t\t	 xasdfa		axxxoike",
382	      \ "\t\t\t\t	asxxdfa		axxxoike",
383	      \ "\t\t\t\t       asxa;ofa		axxxoike",
384	      \ "\t\t\t\t      asdfaqwer		axxxoike",
385	      \ "\t\t\t\t	      a		axxxoikey",
386	      \ "\t\t\t\t	     fa		axxxoikey",
387	      \ "\t\t\t\t	    dfa		axxxoikey",
388	      \ "\t\t\t\t	   sdfa		axxxoikey",
389	      \ "\t\t\t\t	  asdfa		axxxoikey",
390	      \ "\t\t\t\t	 xasdfa		axxxoikey",
391	      \ "\t\t\t\t	asxxdfa		axxxoikey",
392	      \ "\t\t\t\t       asxa;ofa		axxxoikey",
393	      \ "\t\t\t\t      asdfaqwer		axxxoikey",
394	      \ ""
395	      \ ], getline(1, '$'))
396  enew!
397
398  set tw&
399endfunc
400
401" Test formatting a paragraph.
402func Test_format_para()
403  enew!
404  set fo+=tcroql tw=72
405
406  call append(0, [
407	\ "xxxxx xx xxxxxx ",
408	\ "xxxxxxx xxxxxxxxx xxx xxxx xxxxx xxxxx xxx xx",
409	\ "xxxxxxxxxxxxxxxxxx xxxxx xxxx, xxxx xxxx xxxx xxxx xxx xx xx",
410	\ "xx xxxxxxx. xxxx xxxx.",
411	\ "",
412	\ "> xx xx, xxxx xxxx xxx xxxx xxx xxxxx xxx xxx xxxxxxx xxx xxxxx",
413	\ "> xxxxxx xxxxxxx: xxxx xxxxxxx, xx xxxxxx xxxx xxxxxxxxxx"
414	\ ])
415  exe "normal /xxxxxxxx$\<CR>"
416  normal 0gq6kk
417  call assert_equal([
418	\ "xxxxx xx xxxxxx xxxxxxx xxxxxxxxx xxx xxxx xxxxx xxxxx xxx xx",
419	\ "xxxxxxxxxxxxxxxxxx xxxxx xxxx, xxxx xxxx xxxx xxxx xxx xx xx xx xxxxxxx.",
420	\ "xxxx xxxx.",
421	\ "",
422	\ "> xx xx, xxxx xxxx xxx xxxx xxx xxxxx xxx xxx xxxxxxx xxx xxxxx xxxxxx",
423	\ "> xxxxxxx: xxxx xxxxxxx, xx xxxxxx xxxx xxxxxxxxxx",
424	\ ""
425	\ ], getline(1, '$'))
426
427  set fo& tw&
428  enew!
429endfunc
430
431" Test undo after ":%s" and formatting.
432func Test_format_undo()
433  enew!
434  map gg :.,.+2s/^/x/<CR>kk:set tw=3<CR>gqq
435
436  call append(0, [
437	      \ "aa aa aa aa",
438	      \ "bb bb bb bb",
439	      \ "cc cc cc cc"
440	      \ ])
441  " undo/redo here to make the next undo only work on the following changes
442  exe "normal i\<C-G>u"
443  call cursor(1,1)
444  normal ggu
445  call assert_equal([
446	      \ "aa aa aa aa",
447	      \ "bb bb bb bb",
448	      \ "cc cc cc cc",
449	      \ ""
450	      \ ], getline(1, '$'))
451
452  unmap gg
453  enew!
454endfunc
455