void FakeVimPlugin::test_map() { TestData data; setup(&data); data.setText("abc def"); data.doCommand("map C i<space>x<space><esc>"); data.doCommand("map c iXXX"); data.doCommand("imap c YYY<space>"); KEYS("C", " x" X " abc def"); data.doCommand("map C <nop>"); KEYS("C", " x" X " abc def"); data.doCommand("map C i<bs><esc><right>"); KEYS("C", " " X " abc def"); KEYS("ccc<esc>", " XXXYYY YYY" X " abc def"); // unmap KEYS(":unmap c<cr>ccc<esc>", "YYY" X " "); KEYS(":iunmap c<cr>ccc<esc>", X "c"); data.doCommand("unmap C"); data.setText("abc def"); data.doCommand("imap x (((<space><right><right>)))<esc>"); KEYS("x", X "bc def"); KEYS("ix", "((( bc))" X ") def"); data.doCommand("iunmap x"); data.setText("abc def"); data.doCommand("map <c-right> 3l"); KEYS("<C-Right>", "abc" X " def"); KEYS("<C-Right>", "abc de" X "f"); // map vs. noremap data.setText("abc def"); data.doCommand("map x 3l"); data.doCommand("map X x"); KEYS("X", "abc" X " def"); data.doCommand("noremap X x"); KEYS("X", "abc" X "def"); data.doCommand("unmap X"); data.doCommand("unmap x"); // limit number of recursions in mappings data.doCommand("map X Y"); data.doCommand("map Y Z"); data.doCommand("map Z X"); KEYS("X", "abc" X "def"); data.doCommand("map Z i<space><esc>"); KEYS("X", "abc" X " def"); data.doCommand("unmap X"); data.doCommand("unmap Y"); data.doCommand("unmap Z"); // imcomplete mapping data.setText("abc"); data.doCommand("map Xa ia<esc>"); data.doCommand("map Xb ib<esc>"); data.doCommand("map X ic<esc>"); KEYS("Xa", X "aabc"); KEYS("Xb", X "baabc"); KEYS("Xic<esc>", X "ccbaabc"); // unmap data.doCommand("unmap Xa"); KEYS("Xa<esc>", X "cccbaabc"); data.doCommand("unmap Xb"); KEYS("Xb", X "ccccbaabc"); data.doCommand("unmap X"); KEYS("Xb", X "ccccbaabc"); KEYS("X<esc>", X "ccccbaabc"); // recursive mapping data.setText("abc"); data.doCommand("map X Y"); data.doCommand("map XXX i1<esc>"); data.doCommand("map Y i2<esc>"); data.doCommand("map YZ i3<esc>"); data.doCommand("map _ i <esc>"); KEYS("_XXX_", X " 1 abc"); KEYS("XX_0", X " 22 1 abc"); KEYS("XXXXZ_0", X " 31 22 1 abc"); KEYS("XXXXX_0", X " 221 31 22 1 abc"); KEYS("XXZ", X "32 221 31 22 1 abc"); data.doCommand("unmap X"); data.doCommand("unmap XXX"); data.doCommand("unmap Y"); data.doCommand("unmap YZ"); data.doCommand("unmap _"); // shift modifier data.setText("abc"); data.doCommand("map x i1<esc>"); data.doCommand("map X i2<esc>"); KEYS("x", X "1abc"); KEYS("X", X "21abc"); data.doCommand("map <S-X> i3<esc>"); KEYS("X", X "321abc"); data.doCommand("map X i4<esc>"); KEYS("X", X "4321abc"); KEYS("x", X "14321abc"); data.doCommand("unmap x"); data.doCommand("unmap X"); // undo/redo mapped input data.setText("abc def ghi"); data.doCommand("map X dwea xyz<esc>3l"); KEYS("X", "def xyz g" X "hi"); KEYS("u", X "abc def ghi"); KEYS("<C-r>", X "def xyz ghi"); data.doCommand("unmap X"); data.setText("abc" N " def" N " ghi"); data.doCommand("map X jdd"); KEYS("X", "abc" N " " X "ghi"); KEYS("u", "abc" N X " def" N " ghi"); KEYS("<c-r>", "abc" N X " ghi"); data.doCommand("unmap X"); data.setText("abc" N "def" N "ghi"); data.doCommand("map X jAxxx<cr>yyy<esc>"); KEYS("X", "abc" N "defxxx" N "yy" X "y" N "ghi"); KEYS("u", "abc" N "de" X "f" N "ghi"); KEYS("<c-r>", "abc" N "def" X "xxx" N "yyy" N "ghi"); data.doCommand("unmap X"); NOT_IMPLEMENTED // <C-o> data.setText("abc def"); data.doCommand("imap X <c-o>:%s/def/xxx/<cr>"); KEYS("iX", "abc xxx"); }
void FakeVimPlugin::test_vim_indent() { TestData data; setup(&data); data.doCommand("set expandtab"); data.doCommand("set shiftwidth=4"); data.setText( "abc" N "def" N "ghi" N "jkl" N "mno"); KEYS("j3>>", "abc" N " " X "def" N " ghi" N " jkl" N "mno"); KEYS("j2>>", "abc" N " def" N " " X "ghi" N " jkl" N "mno"); KEYS("2<<", "abc" N " def" N " " X "ghi" N " jkl" N "mno"); KEYS("k3<<", "abc" N X "def" N "ghi" N "jkl" N "mno"); data.setText( "abc" N "def" N "ghi" N "jkl" N "mno"); KEYS("jj>j", "abc" N "def" N " " X "ghi" N " jkl" N "mno"); data.setText("abc"); KEYS(">>", " " X "abc"); data.setText("abc"); data.doCommand("set shiftwidth=2"); KEYS(">>", " " X "abc"); data.setText("abc"); data.doCommand("set noexpandtab"); data.doCommand("set tabstop=2"); data.doCommand("set shiftwidth=7"); // shiftwidth = TABS * tabstop + SPACES // 7 = 3 * 2 + 1 KEYS(">>", "\t\t\t abc"); data.doCommand("set tabstop=3"); data.doCommand("set shiftwidth=7"); data.setText("abc"); KEYS(">>", "\t\t abc"); }
void FakeVimPlugin::test_vim_undo_redo() { TestData data; setup(&data); data.setText("abc def" N "xyz" N "123"); KEYS("ddu", X "abc def" N "xyz" N "123"); COMMAND("redo", X "xyz" N "123"); COMMAND("undo", X "abc def" N "xyz" N "123"); COMMAND("redo", X "xyz" N "123"); KEYS("dd", X "123"); KEYS("3x", X ""); KEYS("uuu", X "abc def" N "xyz" N "123"); KEYS("<C-r>", X "xyz" N "123"); KEYS("2<C-r>", X ""); KEYS("3u", X "abc def" N "xyz" N "123"); KEYS("wved", "abc" X " " N "xyz" N "123"); KEYS("2w", "abc " N "xyz" N X "123"); KEYS("u", "abc " X "def" N "xyz" N "123"); KEYS("<C-r>", "abc" X " " N "xyz" N "123"); KEYS("10ugg", X "abc def" N "xyz" N "123"); KEYS("A xxx<ESC>", "abc def xx" X "x" N "xyz" N "123"); KEYS("A yyy<ESC>", "abc def xxx yy" X "y" N "xyz" N "123"); KEYS("u", "abc def xx" X "x" N "xyz" N "123"); KEYS("u", "abc de" X "f" N "xyz" N "123"); KEYS("<C-r>", "abc def" X " xxx" N "xyz" N "123"); KEYS("<C-r>", "abc def xxx" X " yyy" N "xyz" N "123"); KEYS("izzz<ESC>", "abc def xxxzz" X "z yyy" N "xyz" N "123"); KEYS("<C-r>", "abc def xxxzz" X "z yyy" N "xyz" N "123"); KEYS("u", "abc def xxx" X " yyy" N "xyz" N "123"); data.setText("abc" N X "def"); KEYS("oxyz<ESC>", "abc" N "def" N "xy" X "z"); KEYS("u", "abc" N X "def"); // undo paste lines data.setText("abc" N); KEYS("yy2p", "abc" N X "abc" N "abc" N); KEYS("yy3p", "abc" N "abc" N X "abc" N "abc" N "abc" N "abc" N); KEYS("u", "abc" N X "abc" N "abc" N); KEYS("u", X "abc" N); KEYS("<C-r>", X "abc" N "abc" N "abc" N); KEYS("<C-r>", "abc" N X "abc" N "abc" N "abc" N "abc" N "abc" N); KEYS("u", "abc" N X "abc" N "abc" N); KEYS("u", X "abc" N); // undo paste block data.setText("abc" N "def" N "ghi"); KEYS("<C-v>jyp", "a" X "abc" N "ddef" N "ghi"); KEYS("2p", "aa" X "aabc" N "ddddef" N "ghi"); KEYS("3p", "aaa" X "aaaabc" N "dddddddef" N "ghi"); KEYS("u", "aa" X "aabc" N "ddddef" N "ghi"); KEYS("u", "a" X "abc" N "ddef" N "ghi"); // undo indent data.doCommand("set expandtab"); data.doCommand("set shiftwidth=4"); data.setText("abc" N "def"); KEYS(">>", " " X "abc" N "def"); KEYS(">>", " " X "abc" N "def"); KEYS("<<", " " X "abc" N "def"); KEYS("<<", X "abc" N "def"); KEYS("u", " " X "abc" N "def"); KEYS("u", " " X "abc" N "def"); KEYS("u", " " X "abc" N "def"); KEYS("u", X "abc" N "def"); KEYS("<C-r>", X " abc" N "def"); KEYS("<C-r>", " " X " abc" N "def"); KEYS("<C-r>", " ab" X "c" N "def"); KEYS("<C-r>", "ab" X "c" N "def"); KEYS("<C-r>", "ab" X "c" N "def"); data.setText("abc" N "def"); KEYS("2>>", " " X "abc" N " def"); KEYS("u", X "abc" N "def"); KEYS("<c-r>", X " abc" N " def"); KEYS("u", X "abc" N "def"); KEYS(">j", " " X "abc" N " def"); KEYS("u", X "abc" N "def"); KEYS("<c-r>", X " abc" N " def"); // undo replace line data.setText("abc" N " def" N "ghi"); KEYS("jlllSxyz<ESC>", "abc" N "xyz" N "ghi"); KEYS("u", "abc" N " " X "def" N "ghi"); }
void FakeVimPlugin::test_vim_search() { TestData data; setup(&data); data.setText("abc" N "def" N "ghi"); KEYS("/ghi<CR>", "abc" N "def" N X "ghi"); KEYS("gg/\\w\\{3}<CR>", "abc" N X "def" N "ghi"); KEYS("n", "abc" N "def" N X "ghi"); KEYS("N", "abc" N X "def" N "ghi"); KEYS("N", X "abc" N "def" N "ghi"); // return to search-start position on escape or not found KEYS("/def<ESC>", X "abc" N "def" N "ghi"); KEYS("/x", X "abc" N "def" N "ghi"); KEYS("/x<CR>", X "abc" N "def" N "ghi"); KEYS("/x<ESC>", X "abc" N "def" N "ghi"); KEYS("/ghX", X "abc" N "def" N "ghi"); KEYS("?def<ESC>", X "abc" N "def" N "ghi"); KEYS("?x", X "abc" N "def" N "ghi"); KEYS("?x<CR>", X "abc" N "def" N "ghi"); KEYS("?x<ESC>", X "abc" N "def" N "ghi"); // search [count] times data.setText("abc" N "def" N "ghi"); KEYS("/\\w\\{3}<CR>", "abc" N X "def" N "ghi"); KEYS("2n", X "abc" N "def" N "ghi"); KEYS("2N", "abc" N X "def" N "ghi"); KEYS("2/\\w\\{3}<CR>", X "abc" N "def" N "ghi"); // set wrapscan (search wraps at end of file) data.doCommand("set ws"); data.setText("abc" N "def" N "abc" N "ghi abc jkl"); KEYS("*", "abc" N "def" N X "abc" N "ghi abc jkl"); KEYS("*", "abc" N "def" N "abc" N "ghi " X "abc jkl"); KEYS("2*", "abc" N "def" N X "abc" N "ghi abc jkl"); KEYS("#", X "abc" N "def" N "abc" N "ghi abc jkl"); KEYS("#", "abc" N "def" N "abc" N "ghi " X "abc jkl"); KEYS("#", "abc" N "def" N X "abc" N "ghi abc jkl"); KEYS("2#", "abc" N "def" N "abc" N "ghi " X "abc jkl"); data.doCommand("set nows"); data.setText("abc" N "def" N "abc" N "ghi abc jkl"); KEYS("*", "abc" N "def" N X "abc" N "ghi abc jkl"); KEYS("*", "abc" N "def" N "abc" N "ghi " X "abc jkl"); KEYS("*", "abc" N "def" N "abc" N "ghi " X "abc jkl"); KEYS("#", "abc" N "def" N X "abc" N "ghi abc jkl"); KEYS("#", X "abc" N "def" N "abc" N "ghi abc jkl"); KEYS("#", X "abc" N "def" N "abc" N "ghi abc jkl"); data.setText("abc" N "def" N "ab" X "c" N "ghi abc jkl"); KEYS("#", X "abc" N "def" N "abc" N "ghi abc jkl"); // search with g* and g# data.doCommand("set nows"); data.setText("bc" N "abc" N "abcd" N "bc" N "b"); KEYS("g*", "bc" N "a" X "bc" N "abcd" N "bc" N "b"); KEYS("n", "bc" N "abc" N "a" X "bcd" N "bc" N "b"); KEYS("n", "bc" N "abc" N "abcd" N X "bc" N "b"); KEYS("n", "bc" N "abc" N "abcd" N X "bc" N "b"); KEYS("g#", "bc" N "abc" N "a" X "bcd" N "bc" N "b"); KEYS("n", "bc" N "a" X "bc" N "abcd" N "bc" N "b"); KEYS("N", "bc" N "abc" N "a" X "bcd" N "bc" N "b"); KEYS("3n", "bc" N "abc" N "a" X "bcd" N "bc" N "b"); KEYS("2n", X "bc" N "abc" N "abcd" N "bc" N "b"); /* QTCREATORBUG-7251 */ data.setText("abc abc abc abc"); KEYS("$?abc<CR>", "abc abc abc " X "abc"); KEYS("2?abc<CR>", "abc " X "abc abc abc"); KEYS("n", X "abc abc abc abc"); KEYS("N", "abc " X "abc abc abc"); NOT_IMPLEMENTED // find same stuff forward and backward, // i.e. '<ab>c' forward but not 'a<bc>' backward data.setText("abc" N "def" N "ghi"); KEYS("/\\w\\{2}<CR>", X "abc" N "def" N "ghi"); KEYS("2n", "abc" N "def" N X "ghi"); KEYS("N", "abc" N X "def" N "ghi"); KEYS("N", X "abc" N "def" N "ghi"); KEYS("2n2N", X "abc" N "def" N "ghi"); }