xref: /vim-8.2.3635/src/testdir/test_put.vim (revision fa537223)
1" Tests for put commands, e.g. ":put", "p", "gp", "P", "gP", etc.
2
3source check.vim
4
5func Test_put_block()
6  new
7  call feedkeys("i\<C-V>u2500\<CR>x\<ESC>", 'x')
8  call feedkeys("\<C-V>y", 'x')
9  call feedkeys("gg0p", 'x')
10  call assert_equal("\u2500x", getline(1))
11  bwipe!
12endfunc
13
14func Test_put_char_block()
15  new
16  call setline(1, ['Line 1', 'Line 2'])
17  f Xfile_put
18  " visually select both lines and put the cursor at the top of the visual
19  " selection and then put the buffer name over it
20  exe "norm! G0\<c-v>ke\"%p"
21  call assert_equal(['Xfile_put 1', 'Xfile_put 2'], getline(1,2))
22  bw!
23endfunc
24
25func Test_put_char_block2()
26  new
27  call setreg('a', ' one ', 'v')
28  call setline(1, ['Line 1', '', 'Line 3', ''])
29  " visually select the first 3 lines and put register a over it
30  exe "norm! ggl\<c-v>2j2l\"ap"
31  call assert_equal(['L one  1', '', 'L one  3', ''], getline(1, 4))
32  " clean up
33  bw!
34endfunc
35
36func Test_put_lines()
37  new
38  let a = [ getreg('a'), getregtype('a') ]
39  call setline(1, ['Line 1', 'Line2', 'Line 3', ''])
40  exe 'norm! gg"add"AddG""p'
41  call assert_equal(['Line 3', '', 'Line 1', 'Line2'], getline(1, '$'))
42  " clean up
43  bw!
44  eval a[0]->setreg('a', a[1])
45endfunc
46
47func Test_put_expr()
48  new
49  call setline(1, repeat(['A'], 6))
50  exec "1norm! \"=line('.')\<cr>p"
51  norm! j0.
52  norm! j0.
53  exec "4norm! \"=\<cr>P"
54  norm! j0.
55  norm! j0.
56  call assert_equal(['A1','A2','A3','4A','5A','6A'], getline(1, '$'))
57  bw!
58endfunc
59
60func Test_put_fails_when_nomodifiable()
61  new
62  setlocal nomodifiable
63
64  normal! yy
65  call assert_fails(':put', 'E21:')
66  call assert_fails(':put!', 'E21:')
67  call assert_fails(':normal! p', 'E21:')
68  call assert_fails(':normal! gp', 'E21:')
69  call assert_fails(':normal! P', 'E21:')
70  call assert_fails(':normal! gP', 'E21:')
71
72  if has('mouse')
73    set mouse=n
74    call assert_fails('execute "normal! \<MiddleMouse>"', 'E21:')
75    set mouse&
76  endif
77
78  bwipeout!
79endfunc
80
81" A bug was discovered where the Normal mode put commands (e.g., "p") would
82" output duplicate error messages when invoked in a non-modifiable buffer.
83func Test_put_p_errmsg_nodup()
84  new
85  setlocal nomodifiable
86
87  normal! yy
88
89  func Capture_p_error()
90    redir => s:p_err
91    normal! p
92    redir END
93  endfunc
94
95  silent! call Capture_p_error()
96
97  " Error message output within a function should be three lines (the function
98  " name, the line number, and the error message).
99  call assert_equal(3, count(s:p_err, "\n"))
100
101  delfunction Capture_p_error
102  bwipeout!
103endfunc
104
105func Test_put_p_indent_visual()
106  new
107  call setline(1, ['select this text', 'select that text'])
108  " yank "that" from the second line
109  normal 2Gwvey
110  " select "this" in the first line and put
111  normal k0wve[p
112  call assert_equal('select that text', getline(1))
113  call assert_equal('select that text', getline(2))
114  bwipe!
115endfunc
116
117" Test for deleting all the contents of a buffer with a put
118func Test_put_visual_delete_all_lines()
119  new
120  call setline(1, ['one', 'two', 'three'])
121  let @r = ''
122  normal! VG"rgp
123  call assert_equal(1, line('$'))
124  close!
125endfunc
126
127func Test_gp_with_count_leaves_cursor_at_end()
128  new
129  call setline(1, '<---->')
130  call setreg('@', "foo\nbar", 'c')
131  normal 1G3|3gp
132  call assert_equal([0, 4, 4, 0], getpos("."))
133  call assert_equal(['<--foo', 'barfoo', 'barfoo', 'bar-->'], getline(1, '$'))
134  call assert_equal([0, 4, 3, 0], getpos("']"))
135
136  bwipe!
137endfunc
138
139func Test_p_with_count_leaves_mark_at_end()
140  new
141  call setline(1, '<---->')
142  call setreg('@', "start\nend", 'c')
143  normal 1G3|3p
144  call assert_equal([0, 1, 4, 0], getpos("."))
145  call assert_equal(['<--start', 'endstart', 'endstart', 'end-->'], getline(1, '$'))
146  call assert_equal([0, 4, 3, 0], getpos("']"))
147
148  bwipe!
149endfunc
150
151func Test_very_large_count()
152  new
153  " total put-length (21474837 * 100) brings 32 bit int overflow
154  let @" = repeat('x', 100)
155  call assert_fails('norm 21474837p', 'E1240:')
156  bwipe!
157endfunc
158
159func Test_very_large_count_64bit()
160  if v:sizeoflong < 8
161    throw 'Skipped: only works with 64 bit long ints'
162  endif
163
164  new
165  let @" = 'x'
166  call assert_fails('norm 44444444444444p', 'E1240:')
167  bwipe!
168endfunc
169
170func Test_very_large_count_block()
171  new
172  " total put-length (21474837 * 100) brings 32 bit int overflow
173  call setline(1, repeat('x', 100))
174  exe "norm \<C-V>99ly"
175  call assert_fails('norm 21474837p', 'E1240:')
176  bwipe!
177endfunc
178
179func Test_very_large_count_block_64bit()
180  if v:sizeoflong < 8
181    throw 'Skipped: only works with 64 bit long ints'
182  endif
183
184  new
185  call setline(1, 'x')
186  exe "norm \<C-V>y"
187  call assert_fails('norm 44444444444444p', 'E1240:')
188  bwipe!
189endfunc
190
191func Test_put_above_first_line()
192  new
193  let @" = 'text'
194  silent! normal 0o00
195  0put
196  call assert_equal('text', getline(1))
197  bwipe!
198endfunc
199
200
201" vim: shiftwidth=2 sts=2 expandtab
202