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