xref: /vim-8.2.3635/src/testdir/test_put.vim (revision fa537223)
1f52f9ea8SBram Moolenaar" Tests for put commands, e.g. ":put", "p", "gp", "P", "gP", etc.
2c8129968SBram Moolenaar
3a9173d06SDominique Pellesource check.vim
4a9173d06SDominique Pelle
5c8129968SBram Moolenaarfunc Test_put_block()
6c8129968SBram Moolenaar  new
7c8129968SBram Moolenaar  call feedkeys("i\<C-V>u2500\<CR>x\<ESC>", 'x')
8c8129968SBram Moolenaar  call feedkeys("\<C-V>y", 'x')
9c8129968SBram Moolenaar  call feedkeys("gg0p", 'x')
10c8129968SBram Moolenaar  call assert_equal("\u2500x", getline(1))
11c8129968SBram Moolenaar  bwipe!
12c8129968SBram Moolenaarendfunc
139957a10dSBram Moolenaar
149957a10dSBram Moolenaarfunc Test_put_char_block()
159957a10dSBram Moolenaar  new
169957a10dSBram Moolenaar  call setline(1, ['Line 1', 'Line 2'])
179957a10dSBram Moolenaar  f Xfile_put
189957a10dSBram Moolenaar  " visually select both lines and put the cursor at the top of the visual
199957a10dSBram Moolenaar  " selection and then put the buffer name over it
209957a10dSBram Moolenaar  exe "norm! G0\<c-v>ke\"%p"
219957a10dSBram Moolenaar  call assert_equal(['Xfile_put 1', 'Xfile_put 2'], getline(1,2))
229957a10dSBram Moolenaar  bw!
239957a10dSBram Moolenaarendfunc
24941c12daSBram Moolenaar
25941c12daSBram Moolenaarfunc Test_put_char_block2()
26941c12daSBram Moolenaar  new
27941c12daSBram Moolenaar  call setreg('a', ' one ', 'v')
28941c12daSBram Moolenaar  call setline(1, ['Line 1', '', 'Line 3', ''])
29941c12daSBram Moolenaar  " visually select the first 3 lines and put register a over it
30941c12daSBram Moolenaar  exe "norm! ggl\<c-v>2j2l\"ap"
31941c12daSBram Moolenaar  call assert_equal(['L one  1', '', 'L one  3', ''], getline(1, 4))
32941c12daSBram Moolenaar  " clean up
33941c12daSBram Moolenaar  bw!
34941c12daSBram Moolenaarendfunc
3518d90b95SBram Moolenaar
3618d90b95SBram Moolenaarfunc Test_put_lines()
3718d90b95SBram Moolenaar  new
3818d90b95SBram Moolenaar  let a = [ getreg('a'), getregtype('a') ]
3918d90b95SBram Moolenaar  call setline(1, ['Line 1', 'Line2', 'Line 3', ''])
4018d90b95SBram Moolenaar  exe 'norm! gg"add"AddG""p'
4118d90b95SBram Moolenaar  call assert_equal(['Line 3', '', 'Line 1', 'Line2'], getline(1, '$'))
4218d90b95SBram Moolenaar  " clean up
4318d90b95SBram Moolenaar  bw!
44aad222c9SBram Moolenaar  eval a[0]->setreg('a', a[1])
4518d90b95SBram Moolenaarendfunc
46833093bfSBram Moolenaar
47833093bfSBram Moolenaarfunc Test_put_expr()
48833093bfSBram Moolenaar  new
49833093bfSBram Moolenaar  call setline(1, repeat(['A'], 6))
50833093bfSBram Moolenaar  exec "1norm! \"=line('.')\<cr>p"
51833093bfSBram Moolenaar  norm! j0.
52833093bfSBram Moolenaar  norm! j0.
53833093bfSBram Moolenaar  exec "4norm! \"=\<cr>P"
54833093bfSBram Moolenaar  norm! j0.
55833093bfSBram Moolenaar  norm! j0.
56833093bfSBram Moolenaar  call assert_equal(['A1','A2','A3','4A','5A','6A'], getline(1, '$'))
57833093bfSBram Moolenaar  bw!
58833093bfSBram Moolenaarendfunc
59f52f9ea8SBram Moolenaar
60f52f9ea8SBram Moolenaarfunc Test_put_fails_when_nomodifiable()
61f52f9ea8SBram Moolenaar  new
62ec12d649SBram Moolenaar  setlocal nomodifiable
63f52f9ea8SBram Moolenaar
64f52f9ea8SBram Moolenaar  normal! yy
65e2e4075fSBram Moolenaar  call assert_fails(':put', 'E21:')
66e2e4075fSBram Moolenaar  call assert_fails(':put!', 'E21:')
67e2e4075fSBram Moolenaar  call assert_fails(':normal! p', 'E21:')
68e2e4075fSBram Moolenaar  call assert_fails(':normal! gp', 'E21:')
69e2e4075fSBram Moolenaar  call assert_fails(':normal! P', 'E21:')
70e2e4075fSBram Moolenaar  call assert_fails(':normal! gP', 'E21:')
71f52f9ea8SBram Moolenaar
72f52f9ea8SBram Moolenaar  if has('mouse')
73f52f9ea8SBram Moolenaar    set mouse=n
74e2e4075fSBram Moolenaar    call assert_fails('execute "normal! \<MiddleMouse>"', 'E21:')
75f52f9ea8SBram Moolenaar    set mouse&
76f52f9ea8SBram Moolenaar  endif
77f52f9ea8SBram Moolenaar
78f52f9ea8SBram Moolenaar  bwipeout!
79f52f9ea8SBram Moolenaarendfunc
80f52f9ea8SBram Moolenaar
81f52f9ea8SBram Moolenaar" A bug was discovered where the Normal mode put commands (e.g., "p") would
82f52f9ea8SBram Moolenaar" output duplicate error messages when invoked in a non-modifiable buffer.
83f52f9ea8SBram Moolenaarfunc Test_put_p_errmsg_nodup()
84f52f9ea8SBram Moolenaar  new
85ec12d649SBram Moolenaar  setlocal nomodifiable
86f52f9ea8SBram Moolenaar
87f52f9ea8SBram Moolenaar  normal! yy
88f52f9ea8SBram Moolenaar
89f52f9ea8SBram Moolenaar  func Capture_p_error()
90f52f9ea8SBram Moolenaar    redir => s:p_err
91f52f9ea8SBram Moolenaar    normal! p
92f52f9ea8SBram Moolenaar    redir END
93f52f9ea8SBram Moolenaar  endfunc
94f52f9ea8SBram Moolenaar
95f52f9ea8SBram Moolenaar  silent! call Capture_p_error()
96f52f9ea8SBram Moolenaar
97f52f9ea8SBram Moolenaar  " Error message output within a function should be three lines (the function
98f52f9ea8SBram Moolenaar  " name, the line number, and the error message).
99f52f9ea8SBram Moolenaar  call assert_equal(3, count(s:p_err, "\n"))
100f52f9ea8SBram Moolenaar
101f52f9ea8SBram Moolenaar  delfunction Capture_p_error
102f52f9ea8SBram Moolenaar  bwipeout!
103f52f9ea8SBram Moolenaarendfunc
1040ab190c0SBram Moolenaar
1050ab190c0SBram Moolenaarfunc Test_put_p_indent_visual()
1060ab190c0SBram Moolenaar  new
1070ab190c0SBram Moolenaar  call setline(1, ['select this text', 'select that text'])
1080ab190c0SBram Moolenaar  " yank "that" from the second line
1090ab190c0SBram Moolenaar  normal 2Gwvey
1100ab190c0SBram Moolenaar  " select "this" in the first line and put
1110ab190c0SBram Moolenaar  normal k0wve[p
1120ab190c0SBram Moolenaar  call assert_equal('select that text', getline(1))
1130ab190c0SBram Moolenaar  call assert_equal('select that text', getline(2))
1140ab190c0SBram Moolenaar  bwipe!
1150ab190c0SBram Moolenaarendfunc
1161671f448SBram Moolenaar
1171671f448SBram Moolenaar" Test for deleting all the contents of a buffer with a put
1181671f448SBram Moolenaarfunc Test_put_visual_delete_all_lines()
1191671f448SBram Moolenaar  new
1201671f448SBram Moolenaar  call setline(1, ['one', 'two', 'three'])
1211671f448SBram Moolenaar  let @r = ''
1221671f448SBram Moolenaar  normal! VG"rgp
1231671f448SBram Moolenaar  call assert_equal(1, line('$'))
1241671f448SBram Moolenaar  close!
1251671f448SBram Moolenaarendfunc
1261671f448SBram Moolenaar
12723003e51SBram Moolenaarfunc Test_gp_with_count_leaves_cursor_at_end()
12823003e51SBram Moolenaar  new
12923003e51SBram Moolenaar  call setline(1, '<---->')
13023003e51SBram Moolenaar  call setreg('@', "foo\nbar", 'c')
13156858e4eSBram Moolenaar  normal 1G3|3gp
13256858e4eSBram Moolenaar  call assert_equal([0, 4, 4, 0], getpos("."))
13356858e4eSBram Moolenaar  call assert_equal(['<--foo', 'barfoo', 'barfoo', 'bar-->'], getline(1, '$'))
13456858e4eSBram Moolenaar  call assert_equal([0, 4, 3, 0], getpos("']"))
13523003e51SBram Moolenaar
13623003e51SBram Moolenaar  bwipe!
13723003e51SBram Moolenaarendfunc
13823003e51SBram Moolenaar
139f47ebf1eSBram Moolenaarfunc Test_p_with_count_leaves_mark_at_end()
140f47ebf1eSBram Moolenaar  new
141f47ebf1eSBram Moolenaar  call setline(1, '<---->')
142f47ebf1eSBram Moolenaar  call setreg('@', "start\nend", 'c')
143f47ebf1eSBram Moolenaar  normal 1G3|3p
144f47ebf1eSBram Moolenaar  call assert_equal([0, 1, 4, 0], getpos("."))
145f47ebf1eSBram Moolenaar  call assert_equal(['<--start', 'endstart', 'endstart', 'end-->'], getline(1, '$'))
146f47ebf1eSBram Moolenaar  call assert_equal([0, 4, 3, 0], getpos("']"))
147f47ebf1eSBram Moolenaar
148f47ebf1eSBram Moolenaar  bwipe!
149f47ebf1eSBram Moolenaarendfunc
150f47ebf1eSBram Moolenaar
151cddd5ac9SBram Moolenaarfunc Test_very_large_count()
152*fa537223Sichizok  new
153*fa537223Sichizok  " total put-length (21474837 * 100) brings 32 bit int overflow
154*fa537223Sichizok  let @" = repeat('x', 100)
155*fa537223Sichizok  call assert_fails('norm 21474837p', 'E1240:')
156*fa537223Sichizok  bwipe!
157*fa537223Sichizokendfunc
158*fa537223Sichizok
159*fa537223Sichizokfunc Test_very_large_count_64bit()
160*fa537223Sichizok  if v:sizeoflong < 8
161*fa537223Sichizok    throw 'Skipped: only works with 64 bit long ints'
1620f004412SBram Moolenaar  endif
1630f004412SBram Moolenaar
164eeed1c7aSBram Moolenaar  new
165eeed1c7aSBram Moolenaar  let @" = 'x'
166eeed1c7aSBram Moolenaar  call assert_fails('norm 44444444444444p', 'E1240:')
167eeed1c7aSBram Moolenaar  bwipe!
168eeed1c7aSBram Moolenaarendfunc
169eeed1c7aSBram Moolenaar
170*fa537223Sichizokfunc Test_very_large_count_block()
171*fa537223Sichizok  new
172*fa537223Sichizok  " total put-length (21474837 * 100) brings 32 bit int overflow
173*fa537223Sichizok  call setline(1, repeat('x', 100))
174*fa537223Sichizok  exe "norm \<C-V>99ly"
175*fa537223Sichizok  call assert_fails('norm 21474837p', 'E1240:')
176*fa537223Sichizok  bwipe!
177*fa537223Sichizokendfunc
178*fa537223Sichizok
179*fa537223Sichizokfunc Test_very_large_count_block_64bit()
180*fa537223Sichizok  if v:sizeoflong < 8
181*fa537223Sichizok    throw 'Skipped: only works with 64 bit long ints'
182*fa537223Sichizok  endif
183*fa537223Sichizok
184*fa537223Sichizok  new
185*fa537223Sichizok  call setline(1, 'x')
186*fa537223Sichizok  exe "norm \<C-V>y"
187*fa537223Sichizok  call assert_fails('norm 44444444444444p', 'E1240:')
188*fa537223Sichizok  bwipe!
189*fa537223Sichizokendfunc
190*fa537223Sichizok
1910b5b06cbSBram Moolenaarfunc Test_put_above_first_line()
1920b5b06cbSBram Moolenaar  new
1930b5b06cbSBram Moolenaar  let @" = 'text'
1940b5b06cbSBram Moolenaar  silent! normal 0o00
1950b5b06cbSBram Moolenaar  0put
1960b5b06cbSBram Moolenaar  call assert_equal('text', getline(1))
1970b5b06cbSBram Moolenaar  bwipe!
1980b5b06cbSBram Moolenaarendfunc
1990b5b06cbSBram Moolenaar
200eeed1c7aSBram Moolenaar
2011671f448SBram Moolenaar" vim: shiftwidth=2 sts=2 expandtab
202