xref: /vim-8.2.3635/src/testdir/test_put.vim (revision f47ebf1e)
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  " FIXME: should actually check if sizeof(int) == sizeof(long)
153  CheckNotMSWindows
154
155  new
156  let @" = 'x'
157  call assert_fails('norm 44444444444444p', 'E1240:')
158  bwipe!
159endfunc
160
161
162" vim: shiftwidth=2 sts=2 expandtab
163