xref: /vim-8.2.3635/src/testdir/test_put.vim (revision ceb56ddb)
1" Tests for put commands, e.g. ":put", "p", "gp", "P", "gP", etc.
2
3func Test_put_block()
4  new
5  call feedkeys("i\<C-V>u2500\<CR>x\<ESC>", 'x')
6  call feedkeys("\<C-V>y", 'x')
7  call feedkeys("gg0p", 'x')
8  call assert_equal("\u2500x", getline(1))
9  bwipe!
10endfunc
11
12func Test_put_char_block()
13  new
14  call setline(1, ['Line 1', 'Line 2'])
15  f Xfile_put
16  " visually select both lines and put the cursor at the top of the visual
17  " selection and then put the buffer name over it
18  exe "norm! G0\<c-v>ke\"%p"
19  call assert_equal(['Xfile_put 1', 'Xfile_put 2'], getline(1,2))
20  bw!
21endfunc
22
23func Test_put_char_block2()
24  new
25  let a = [ 'a'->getreg(), 'a'->getregtype() ]
26  call setreg('a', ' one ', 'v')
27  call setline(1, ['Line 1', '', 'Line 3', ''])
28  " visually select the first 3 lines and put register a over it
29  exe "norm! ggl\<c-v>2j2l\"ap"
30  call assert_equal(['L one  1', '', 'L one  3', ''], getline(1,4))
31  " clean up
32  bw!
33  call setreg('a', a[0], a[1])
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
127" vim: shiftwidth=2 sts=2 expandtab
128