summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMateuszKowalczyk <>2014-10-14 20:08:00 (GMT)
committerhdiff <hdiff@hdiff.luite.com>2014-10-14 20:08:00 (GMT)
commit53adfc77cdec806ef957b3ea5c797a4759bf757d (patch)
treef38574e059e6c06686c566882510199a7dcbc1d0
parentb69df202816a2afd063d354fab5d5020d8afcf06 (diff)
version 0.10.10.10.1
-rw-r--r--src/tests/Driver.hs101
-rw-r--r--src/tests/Generic/TestPureBufferManipulations.hs212
-rw-r--r--src/tests/Generic/TestUtils.hs99
-rw-r--r--src/tests/Vim/EditorManipulations/BufferExCommand.hs174
-rw-r--r--src/tests/Vim/TestExCommandParsers.hs157
-rw-r--r--src/tests/Vim/TestPureBufferManipulations.hs30
-rw-r--r--src/tests/Vim/TestPureEditorManipulations.hs28
-rw-r--r--src/tests/vimtests/README.rst59
-rw-r--r--src/tests/vimtests/blockvisual/0.test12
-rw-r--r--src/tests/vimtests/blockvisual/8.test14
-rw-r--r--src/tests/vimtests/blockvisual/9.test14
-rw-r--r--src/tests/vimtests/blockvisual/block.test14
-rw-r--r--src/tests/vimtests/blockvisual/block_d.test14
-rw-r--r--src/tests/vimtests/blockvisual/block_d_1.test14
-rw-r--r--src/tests/vimtests/blockvisual/block_d_2.test14
-rw-r--r--src/tests/vimtests/blockvisual/capD_1.test10
-rw-r--r--src/tests/vimtests/blockvisual/capD_2.test20
-rw-r--r--src/tests/vimtests/blockvisual/capI.test12
-rw-r--r--src/tests/vimtests/blockvisual/capU_2.test12
-rw-r--r--src/tests/vimtests/blockvisual/commentblock.test20
-rw-r--r--src/tests/vimtests/blockvisual/commentblock_1.test14
-rw-r--r--src/tests/vimtests/blockvisual/commentblock_2.test20
-rw-r--r--src/tests/vimtests/blockvisual/d.test12
-rw-r--r--src/tests/vimtests/blockvisual/d_1.test14
-rw-r--r--src/tests/vimtests/blockvisual/d_2.test20
-rw-r--r--src/tests/vimtests/blockvisual/d_3.test18
-rw-r--r--src/tests/vimtests/blockvisual/d_4.test12
-rw-r--r--src/tests/vimtests/blockvisual/hl.test12
-rw-r--r--src/tests/vimtests/blockvisual/o_1.test14
-rw-r--r--src/tests/vimtests/blockvisual/o_2.test14
-rw-r--r--src/tests/vimtests/blockvisual/o_3.test14
-rw-r--r--src/tests/vimtests/blockvisual/o_4.test14
-rw-r--r--src/tests/vimtests/blockvisual/o_5.test12
-rw-r--r--src/tests/vimtests/blockvisual/o_6.test12
-rw-r--r--src/tests/vimtests/blockvisual/r_1.test14
-rw-r--r--src/tests/vimtests/blockvisual/r_2.test10
-rw-r--r--src/tests/vimtests/blockvisual/r_3.test12
-rw-r--r--src/tests/vimtests/blockvisual/switchcase_2.test10
-rw-r--r--src/tests/vimtests/blockvisual/u_2.test12
-rw-r--r--src/tests/vimtests/blockvisual/y_10.test14
-rw-r--r--src/tests/vimtests/blockvisual/y_11.test14
-rw-r--r--src/tests/vimtests/blockvisual/y_12.test15
-rw-r--r--src/tests/vimtests/blockvisual/y_13.test14
-rw-r--r--src/tests/vimtests/blockvisual/y_14.test14
-rw-r--r--src/tests/vimtests/blockvisual/y_15.test14
-rw-r--r--src/tests/vimtests/blockvisual/y_3.test10
-rw-r--r--src/tests/vimtests/blockvisual/y_4.test14
-rw-r--r--src/tests/vimtests/blockvisual/y_7.test14
-rw-r--r--src/tests/vimtests/blockvisual/y_8.test14
-rw-r--r--src/tests/vimtests/blockvisual/y_9.test14
-rw-r--r--src/tests/vimtests/change/C_part_of_line.test12
-rw-r--r--src/tests/vimtests/change/C_whole_line.test12
-rw-r--r--src/tests/vimtests/change/S.test12
-rw-r--r--src/tests/vimtests/change/c3l.test12
-rw-r--r--src/tests/vimtests/change/ciw.test12
-rw-r--r--src/tests/vimtests/delete/10dd.test10
-rw-r--r--src/tests/vimtests/delete/2d3w.test8
-rw-r--r--src/tests/vimtests/delete/2d3w_1.test10
-rw-r--r--src/tests/vimtests/delete/2dd.test10
-rw-r--r--src/tests/vimtests/delete/C-u_1.test10
-rw-r--r--src/tests/vimtests/delete/C-u_2.test9
-rw-r--r--src/tests/vimtests/delete/capD.test12
-rw-r--r--src/tests/vimtests/delete/capX.test10
-rw-r--r--src/tests/vimtests/delete/capX_1.test12
-rw-r--r--src/tests/vimtests/delete/d0.test12
-rw-r--r--src/tests/vimtests/delete/d2G.test12
-rw-r--r--src/tests/vimtests/delete/d2vd.test12
-rw-r--r--src/tests/vimtests/delete/d2vd_1.test11
-rw-r--r--src/tests/vimtests/delete/d3G.test12
-rw-r--r--src/tests/vimtests/delete/d3vd.test12
-rw-r--r--src/tests/vimtests/delete/dVl.test11
-rw-r--r--src/tests/vimtests/delete/d_capG.test11
-rw-r--r--src/tests/vimtests/delete/d_capV}.test10
-rw-r--r--src/tests/vimtests/delete/daw.test12
-rw-r--r--src/tests/vimtests/delete/dd.test11
-rw-r--r--src/tests/vimtests/delete/dd_1.test11
-rw-r--r--src/tests/vimtests/delete/dd_2.test10
-rw-r--r--src/tests/vimtests/delete/dd_3.test11
-rw-r--r--src/tests/vimtests/delete/dd_4.test12
-rw-r--r--src/tests/vimtests/delete/dd_5.test14
-rw-r--r--src/tests/vimtests/delete/de.test12
-rw-r--r--src/tests/vimtests/delete/diw.test12
-rw-r--r--src/tests/vimtests/delete/dj.test10
-rw-r--r--src/tests/vimtests/delete/dt.test12
-rw-r--r--src/tests/vimtests/delete/dvd.test12
-rw-r--r--src/tests/vimtests/delete/dve.test8
-rw-r--r--src/tests/vimtests/delete/dv}.test10
-rw-r--r--src/tests/vimtests/delete/dw_1.test12
-rw-r--r--src/tests/vimtests/delete/d}.test12
-rw-r--r--src/tests/vimtests/delete/ld3w.test10
-rw-r--r--src/tests/vimtests/delete/ld3w_1.test8
-rw-r--r--src/tests/vimtests/delete/ldw.test10
-rw-r--r--src/tests/vimtests/delete/ldwdw.test10
-rw-r--r--src/tests/vimtests/delete/spec_delete.test12
-rw-r--r--src/tests/vimtests/delete/x.test10
-rw-r--r--src/tests/vimtests/delete/x_1.test12
-rw-r--r--src/tests/vimtests/digraphs/ae.test8
-rw-r--r--src/tests/vimtests/digraphs/eacute.test8
-rw-r--r--src/tests/vimtests/empty/empty.test13
-rw-r--r--src/tests/vimtests/empty/emptytest/events0
-rw-r--r--src/tests/vimtests/empty/emptytest/input8
-rw-r--r--src/tests/vimtests/empty/emptytest/output8
-rw-r--r--src/tests/vimtests/ex/d/1.test11
-rw-r--r--src/tests/vimtests/ex/d/2.test11
-rw-r--r--src/tests/vimtests/ex/empty.test8
-rw-r--r--src/tests/vimtests/ex/esc.test12
-rw-r--r--src/tests/vimtests/ex/esc_1.test12
-rw-r--r--src/tests/vimtests/ex/fail.test12
-rw-r--r--src/tests/vimtests/ex/g/1.test20
-rw-r--r--src/tests/vimtests/ex/g/2.test19
-rw-r--r--src/tests/vimtests/ex/gotoline/1.test14
-rw-r--r--src/tests/vimtests/ex/gotoline/2.test14
-rw-r--r--src/tests/vimtests/ex/gotoline/3.test14
-rw-r--r--src/tests/vimtests/ex/gotoline/4.test14
-rw-r--r--src/tests/vimtests/ex/s/1.test12
-rw-r--r--src/tests/vimtests/ex/s/1_dollar.test12
-rw-r--r--src/tests/vimtests/ex/s/1_question.test12
-rw-r--r--src/tests/vimtests/ex/s/1_sharp.test12
-rw-r--r--src/tests/vimtests/ex/s/2.test12
-rw-r--r--src/tests/vimtests/ex/s/3.test12
-rw-r--r--src/tests/vimtests/ex/s/4.test12
-rw-r--r--src/tests/vimtests/ex/s/5.test12
-rw-r--r--src/tests/vimtests/ex/s/6.test12
-rw-r--r--src/tests/vimtests/ex/s/7.test16
-rw-r--r--src/tests/vimtests/find/f.test12
-rw-r--r--src/tests/vimtests/find/f1.test12
-rw-r--r--src/tests/vimtests/find/f2.test12
-rw-r--r--src/tests/vimtests/find/f3.test12
-rw-r--r--src/tests/vimtests/find/f4.test12
-rw-r--r--src/tests/vimtests/find/t.test12
-rw-r--r--src/tests/vimtests/find/t1.test12
-rw-r--r--src/tests/vimtests/find/t2.test12
-rw-r--r--src/tests/vimtests/find/t3.test12
-rw-r--r--src/tests/vimtests/find/t4.test12
-rw-r--r--src/tests/vimtests/find/t5.test12
-rw-r--r--src/tests/vimtests/find/t6.test12
-rw-r--r--src/tests/vimtests/indent/1.test14
-rw-r--r--src/tests/vimtests/indent/2.test14
-rw-r--r--src/tests/vimtests/indent/3.test14
-rw-r--r--src/tests/vimtests/indent/4.test14
-rw-r--r--src/tests/vimtests/indent/5.test14
-rw-r--r--src/tests/vimtests/indent/6.test14
-rw-r--r--src/tests/vimtests/indent/setpaste.test14
-rw-r--r--src/tests/vimtests/insertion/2o.test14
-rw-r--r--src/tests/vimtests/insertion/C-c_0.test8
-rw-r--r--src/tests/vimtests/insertion/C-c_1.test8
-rw-r--r--src/tests/vimtests/insertion/C-c_10.test11
-rw-r--r--src/tests/vimtests/insertion/C-c_11.test8
-rw-r--r--src/tests/vimtests/insertion/C-c_12.test8
-rw-r--r--src/tests/vimtests/insertion/C-c_13.test8
-rw-r--r--src/tests/vimtests/insertion/C-c_2.test10
-rw-r--r--src/tests/vimtests/insertion/C-c_3.test8
-rw-r--r--src/tests/vimtests/insertion/C-c_4.test8
-rw-r--r--src/tests/vimtests/insertion/C-c_5.test12
-rw-r--r--src/tests/vimtests/insertion/C-c_6.test8
-rw-r--r--src/tests/vimtests/insertion/C-c_7.test13
-rw-r--r--src/tests/vimtests/insertion/C-c_8.test13
-rw-r--r--src/tests/vimtests/insertion/C-c_9.test11
-rw-r--r--src/tests/vimtests/insertion/C-d_0.test8
-rw-r--r--src/tests/vimtests/insertion/C-d_1.test8
-rw-r--r--src/tests/vimtests/insertion/C-d_2.test10
-rw-r--r--src/tests/vimtests/insertion/C-e_0.test10
-rw-r--r--src/tests/vimtests/insertion/C-e_1.test10
-rw-r--r--src/tests/vimtests/insertion/C-e_2.test10
-rw-r--r--src/tests/vimtests/insertion/C-h_0.test8
-rw-r--r--src/tests/vimtests/insertion/C-h_1.test8
-rw-r--r--src/tests/vimtests/insertion/C-h_2.test9
-rw-r--r--src/tests/vimtests/insertion/C-h_3.test8
-rw-r--r--src/tests/vimtests/insertion/C-h_4.test10
-rw-r--r--src/tests/vimtests/insertion/C-o_2.test8
-rw-r--r--src/tests/vimtests/insertion/C-o_3.test11
-rw-r--r--src/tests/vimtests/insertion/C-o_4.test8
-rw-r--r--src/tests/vimtests/insertion/C-r_0.test8
-rw-r--r--src/tests/vimtests/insertion/C-r_1.test11
-rw-r--r--src/tests/vimtests/insertion/C-w_0.test8
-rw-r--r--src/tests/vimtests/insertion/C-w_1.test8
-rw-r--r--src/tests/vimtests/insertion/C-y_0.test10
-rw-r--r--src/tests/vimtests/insertion/C-y_1.test10
-rw-r--r--src/tests/vimtests/insertion/C-y_2.test10
-rw-r--r--src/tests/vimtests/insertion/O2.test13
-rw-r--r--src/tests/vimtests/insertion/a.test8
-rw-r--r--src/tests/vimtests/insertion/a2.test8
-rw-r--r--src/tests/vimtests/insertion/a3.test8
-rw-r--r--src/tests/vimtests/insertion/a4.test8
-rw-r--r--src/tests/vimtests/insertion/capA.test8
-rw-r--r--src/tests/vimtests/insertion/capA2.test14
-rw-r--r--src/tests/vimtests/insertion/capA3.test8
-rw-r--r--src/tests/vimtests/insertion/capA4.test8
-rw-r--r--src/tests/vimtests/insertion/capI.test8
-rw-r--r--src/tests/vimtests/insertion/capI2.test8
-rw-r--r--src/tests/vimtests/insertion/capI3.test8
-rw-r--r--src/tests/vimtests/insertion/capO.test14
-rw-r--r--src/tests/vimtests/insertion/counted_a.test8
-rw-r--r--src/tests/vimtests/insertion/counted_capA.test8
-rw-r--r--src/tests/vimtests/insertion/counted_capI.test8
-rw-r--r--src/tests/vimtests/insertion/counted_capO.test14
-rw-r--r--src/tests/vimtests/insertion/counted_i.test8
-rw-r--r--src/tests/vimtests/insertion/counted_o.test14
-rw-r--r--src/tests/vimtests/insertion/cursorkeys/down.test12
-rw-r--r--src/tests/vimtests/insertion/cursorkeys/left.test12
-rw-r--r--src/tests/vimtests/insertion/cursorkeys/right.test12
-rw-r--r--src/tests/vimtests/insertion/cursorkeys/up.test12
-rw-r--r--src/tests/vimtests/insertion/i.test8
-rw-r--r--src/tests/vimtests/insertion/i2.test8
-rw-r--r--src/tests/vimtests/insertion/i3.test8
-rw-r--r--src/tests/vimtests/insertion/indent_0.test14
-rw-r--r--src/tests/vimtests/insertion/indent_1.test11
-rw-r--r--src/tests/vimtests/insertion/indent_2.test11
-rw-r--r--src/tests/vimtests/insertion/indent_3.test16
-rw-r--r--src/tests/vimtests/insertion/indent_4.test16
-rw-r--r--src/tests/vimtests/insertion/indent_5.test16
-rw-r--r--src/tests/vimtests/insertion/indent_6.test14
-rw-r--r--src/tests/vimtests/insertion/indent_7.test14
-rw-r--r--src/tests/vimtests/insertion/indent_8.test16
-rw-r--r--src/tests/vimtests/insertion/nl_insert.test9
-rw-r--r--src/tests/vimtests/insertion/o.test14
-rw-r--r--src/tests/vimtests/insertion/o1.test13
-rw-r--r--src/tests/vimtests/insertion/onechar.test11
-rw-r--r--src/tests/vimtests/insertion/spec_delete.test12
-rw-r--r--src/tests/vimtests/insertion/spec_insert.test12
-rw-r--r--src/tests/vimtests/joinlines/1.test9
-rw-r--r--src/tests/vimtests/joinlines/2.test9
-rw-r--r--src/tests/vimtests/joinlines/counted_1.test9
-rw-r--r--src/tests/vimtests/joinlines/counted_2.test10
-rw-r--r--src/tests/vimtests/jumplist/1.test14
-rw-r--r--src/tests/vimtests/jumplist/2.test14
-rw-r--r--src/tests/vimtests/macros/0.test12
-rw-r--r--src/tests/vimtests/macros/1.test12
-rw-r--r--src/tests/vimtests/macros/10.test12
-rw-r--r--src/tests/vimtests/macros/11.test12
-rw-r--r--src/tests/vimtests/macros/12.test12
-rw-r--r--src/tests/vimtests/macros/13.test10
-rw-r--r--src/tests/vimtests/macros/14.test10
-rw-r--r--src/tests/vimtests/macros/15.test8
-rw-r--r--src/tests/vimtests/macros/16.test12
-rw-r--r--src/tests/vimtests/macros/2.test12
-rw-r--r--src/tests/vimtests/macros/3.test12
-rw-r--r--src/tests/vimtests/macros/4.test12
-rw-r--r--src/tests/vimtests/macros/5.test12
-rw-r--r--src/tests/vimtests/macros/6.test12
-rw-r--r--src/tests/vimtests/macros/7.test12
-rw-r--r--src/tests/vimtests/macros/8.test12
-rw-r--r--src/tests/vimtests/macros/9.test12
-rw-r--r--src/tests/vimtests/marks/unjump_backquote.test14
-rw-r--r--src/tests/vimtests/marks/unjump_quote.test14
-rw-r--r--src/tests/vimtests/marks/unjump_quote_blank.test14
-rw-r--r--src/tests/vimtests/movement/bigWord/2e.test8
-rw-r--r--src/tests/vimtests/movement/bigWord/2w.test8
-rw-r--r--src/tests/vimtests/movement/bigWord/6b.test12
-rw-r--r--src/tests/vimtests/movement/bigWord/B_1.test8
-rw-r--r--src/tests/vimtests/movement/bigWord/b.test12
-rw-r--r--src/tests/vimtests/movement/bigWord/bbbb.test12
-rw-r--r--src/tests/vimtests/movement/bigWord/e.test8
-rw-r--r--src/tests/vimtests/movement/bigWord/ee.test8
-rw-r--r--src/tests/vimtests/movement/bigWord/punctuation.test8
-rw-r--r--src/tests/vimtests/movement/bigWord/punctuation_b.test8
-rw-r--r--src/tests/vimtests/movement/bigWord/punctuation_e.test8
-rw-r--r--src/tests/vimtests/movement/bigWord/too_much_b.test12
-rw-r--r--src/tests/vimtests/movement/bigWord/too_much_e.test8
-rw-r--r--src/tests/vimtests/movement/bigWord/too_much_w.test8
-rw-r--r--src/tests/vimtests/movement/bigWord/w.test8
-rw-r--r--src/tests/vimtests/movement/bigWord/ww.test8
-rw-r--r--src/tests/vimtests/movement/char/counted_hjkl.test16
-rw-r--r--src/tests/vimtests/movement/char/esc_resets_count.test14
-rw-r--r--src/tests/vimtests/movement/char/h.test8
-rw-r--r--src/tests/vimtests/movement/char/h_1.test12
-rw-r--r--src/tests/vimtests/movement/char/h_2.test8
-rw-r--r--src/tests/vimtests/movement/char/h_at_bol/events1
-rw-r--r--src/tests/vimtests/movement/char/h_at_bol/input4
-rw-r--r--src/tests/vimtests/movement/char/h_at_bol/output4
-rw-r--r--src/tests/vimtests/movement/char/hjkl.test10
-rw-r--r--src/tests/vimtests/movement/char/hjkl1.test12
-rw-r--r--src/tests/vimtests/movement/char/hjkl2.test14
-rw-r--r--src/tests/vimtests/movement/char/hl/events1
-rw-r--r--src/tests/vimtests/movement/char/hl/input4
-rw-r--r--src/tests/vimtests/movement/char/hl/output4
-rw-r--r--src/tests/vimtests/movement/char/j.test10
-rw-r--r--src/tests/vimtests/movement/char/j/events1
-rw-r--r--src/tests/vimtests/movement/char/j/input4
-rw-r--r--src/tests/vimtests/movement/char/j/output4
-rw-r--r--src/tests/vimtests/movement/char/j_1.test10
-rw-r--r--src/tests/vimtests/movement/char/j_2.test10
-rw-r--r--src/tests/vimtests/movement/char/j_3.test38
-rw-r--r--src/tests/vimtests/movement/char/k.test38
-rw-r--r--src/tests/vimtests/movement/char/l.test8
-rw-r--r--src/tests/vimtests/movement/char/l_1.test8
-rw-r--r--src/tests/vimtests/movement/char/l_2.test8
-rw-r--r--src/tests/vimtests/movement/char/l_3.test8
-rw-r--r--src/tests/vimtests/movement/char/l_4.test8
-rw-r--r--src/tests/vimtests/movement/char/l_at_eol/events1
-rw-r--r--src/tests/vimtests/movement/char/l_at_eol/input4
-rw-r--r--src/tests/vimtests/movement/char/l_at_eol/output4
-rw-r--r--src/tests/vimtests/movement/cursorkeys/down.test12
-rw-r--r--src/tests/vimtests/movement/cursorkeys/left.test12
-rw-r--r--src/tests/vimtests/movement/cursorkeys/right.test12
-rw-r--r--src/tests/vimtests/movement/cursorkeys/up.test12
-rw-r--r--src/tests/vimtests/movement/empty.test8
-rw-r--r--src/tests/vimtests/movement/empty_1.test8
-rw-r--r--src/tests/vimtests/movement/eol_j.test14
-rw-r--r--src/tests/vimtests/movement/eol_j2.test14
-rw-r--r--src/tests/vimtests/movement/file/G_no_count.test14
-rw-r--r--src/tests/vimtests/movement/file/G_with_count_1.test14
-rw-r--r--src/tests/vimtests/movement/file/G_with_count_2.test14
-rw-r--r--src/tests/vimtests/movement/file/G_with_too_much_count.test14
-rw-r--r--src/tests/vimtests/movement/file/H_no_count.test21
-rw-r--r--src/tests/vimtests/movement/file/H_with_count_2.test21
-rw-r--r--src/tests/vimtests/movement/file/L_no_count.test21
-rw-r--r--src/tests/vimtests/movement/file/L_with_count_2.test21
-rw-r--r--src/tests/vimtests/movement/file/M.test21
-rw-r--r--src/tests/vimtests/movement/intraline/0.test14
-rw-r--r--src/tests/vimtests/movement/intraline/00.test14
-rw-r--r--src/tests/vimtests/movement/intraline/2dollar.test14
-rw-r--r--src/tests/vimtests/movement/intraline/caret.test10
-rw-r--r--src/tests/vimtests/movement/intraline/dollar.test14
-rw-r--r--src/tests/vimtests/movement/intraline/dollardollar.test14
-rw-r--r--src/tests/vimtests/movement/intraline/dollarj.test12
-rw-r--r--src/tests/vimtests/movement/intraline/end.test12
-rw-r--r--src/tests/vimtests/movement/intraline/home.test12
-rw-r--r--src/tests/vimtests/movement/v_eol_j2.test14
-rw-r--r--src/tests/vimtests/movement/word/2e.test8
-rw-r--r--src/tests/vimtests/movement/word/2w.test8
-rw-r--r--src/tests/vimtests/movement/word/6b.test12
-rw-r--r--src/tests/vimtests/movement/word/b.test12
-rw-r--r--src/tests/vimtests/movement/word/bbbb.test12
-rw-r--r--src/tests/vimtests/movement/word/e.test8
-rw-r--r--src/tests/vimtests/movement/word/ee.test8
-rw-r--r--src/tests/vimtests/movement/word/punctuation.test8
-rw-r--r--src/tests/vimtests/movement/word/punctuation_b.test8
-rw-r--r--src/tests/vimtests/movement/word/punctuation_e.test8
-rw-r--r--src/tests/vimtests/movement/word/too_much_b.test12
-rw-r--r--src/tests/vimtests/movement/word/too_much_e.test8
-rw-r--r--src/tests/vimtests/movement/word/too_much_w.test8
-rw-r--r--src/tests/vimtests/movement/word/w.test8
-rw-r--r--src/tests/vimtests/movement/word/w_1.test8
-rw-r--r--src/tests/vimtests/movement/word/w_2.test8
-rw-r--r--src/tests/vimtests/movement/word/ww.test8
-rw-r--r--src/tests/vimtests/numbers/cursor_on_digits.test14
-rw-r--r--src/tests/vimtests/numbers/decrement.test20
-rw-r--r--src/tests/vimtests/numbers/hex_decrease.test16
-rw-r--r--src/tests/vimtests/numbers/hex_increase.test16
-rw-r--r--src/tests/vimtests/numbers/increment.test14
-rw-r--r--src/tests/vimtests/numbers/no_numbers.test12
-rw-r--r--src/tests/vimtests/numbers/oct_decrease.test14
-rw-r--r--src/tests/vimtests/numbers/oct_hex_letters.test10
-rw-r--r--src/tests/vimtests/numbers/oct_increase.test14
-rw-r--r--src/tests/vimtests/numbers/sol_eol.test12
-rw-r--r--src/tests/vimtests/paste/2dd_capP.test14
-rw-r--r--src/tests/vimtests/paste/2dd_capP_1.test12
-rw-r--r--src/tests/vimtests/paste/2ddp.test12
-rw-r--r--src/tests/vimtests/paste/2ddp_1.test12
-rw-r--r--src/tests/vimtests/paste/2yyp.test14
-rw-r--r--src/tests/vimtests/paste/Yp.test12
-rw-r--r--src/tests/vimtests/paste/d2wp.test12
-rw-r--r--src/tests/vimtests/paste/dbp.test12
-rw-r--r--src/tests/vimtests/paste/dd_capP.test12
-rw-r--r--src/tests/vimtests/paste/dd_capP_1.test12
-rw-r--r--src/tests/vimtests/paste/ddjp.test12
-rw-r--r--src/tests/vimtests/paste/ddkP.test12
-rw-r--r--src/tests/vimtests/paste/ddp.test12
-rw-r--r--src/tests/vimtests/paste/ddp_1.test12
-rw-r--r--src/tests/vimtests/paste/dep.test12
-rw-r--r--src/tests/vimtests/paste/dw_capP.test12
-rw-r--r--src/tests/vimtests/paste/dwp.test12
-rw-r--r--src/tests/vimtests/paste/p_at_newline.test18
-rw-r--r--src/tests/vimtests/paste/p_at_newline2.test18
-rw-r--r--src/tests/vimtests/paste/visual.test13
-rw-r--r--src/tests/vimtests/paste/y_1.test12
-rw-r--r--src/tests/vimtests/paste/y_2.test12
-rw-r--r--src/tests/vimtests/paste/y_3.test12
-rw-r--r--src/tests/vimtests/paste/yep.test12
-rw-r--r--src/tests/vimtests/paste/yjp.test14
-rw-r--r--src/tests/vimtests/paste/ywp.test12
-rw-r--r--src/tests/vimtests/paste/yy_capP.test13
-rw-r--r--src/tests/vimtests/paste/yyp.test13
-rw-r--r--src/tests/vimtests/repeat/2r.test8
-rw-r--r--src/tests/vimtests/repeat/O1.test17
-rw-r--r--src/tests/vimtests/repeat/a.test8
-rw-r--r--src/tests/vimtests/repeat/a2.test8
-rw-r--r--src/tests/vimtests/repeat/a3.test8
-rw-r--r--src/tests/vimtests/repeat/a4.test8
-rw-r--r--src/tests/vimtests/repeat/a5.test8
-rw-r--r--src/tests/vimtests/repeat/capA.test8
-rw-r--r--src/tests/vimtests/repeat/capA2.test8
-rw-r--r--src/tests/vimtests/repeat/capA3.test8
-rw-r--r--src/tests/vimtests/repeat/capA4.test8
-rw-r--r--src/tests/vimtests/repeat/capI.test8
-rw-r--r--src/tests/vimtests/repeat/capI2.test8
-rw-r--r--src/tests/vimtests/repeat/capI3.test8
-rw-r--r--src/tests/vimtests/repeat/capI4.test8
-rw-r--r--src/tests/vimtests/repeat/capO.test18
-rw-r--r--src/tests/vimtests/repeat/capO2.test15
-rw-r--r--src/tests/vimtests/repeat/capO3.test15
-rw-r--r--src/tests/vimtests/repeat/capX.test12
-rw-r--r--src/tests/vimtests/repeat/capX_1.test12
-rw-r--r--src/tests/vimtests/repeat/counted_2r.test8
-rw-r--r--src/tests/vimtests/repeat/dw_capP.test12
-rw-r--r--src/tests/vimtests/repeat/dwp.test12
-rw-r--r--src/tests/vimtests/repeat/i.test8
-rw-r--r--src/tests/vimtests/repeat/i2.test8
-rw-r--r--src/tests/vimtests/repeat/i3.test8
-rw-r--r--src/tests/vimtests/repeat/i4.test8
-rw-r--r--src/tests/vimtests/repeat/o.test18
-rw-r--r--src/tests/vimtests/repeat/o1.test17
-rw-r--r--src/tests/vimtests/repeat/o2.test15
-rw-r--r--src/tests/vimtests/repeat/o3.test15
-rw-r--r--src/tests/vimtests/repeat/r.test8
-rw-r--r--src/tests/vimtests/repeat/r_1.test8
-rw-r--r--src/tests/vimtests/repeat/r_2.test8
-rw-r--r--src/tests/vimtests/repeat/r_3.test8
-rw-r--r--src/tests/vimtests/repeat/tilde_repeat.test12
-rw-r--r--src/tests/vimtests/repeat/tilde_repeat_does_not_affect_other_lines.test12
-rw-r--r--src/tests/vimtests/repeat/x.test12
-rw-r--r--src/tests/vimtests/repeat/x_1.test12
-rw-r--r--src/tests/vimtests/repeat/x_2.test12
-rw-r--r--src/tests/vimtests/replace/0.test8
-rw-r--r--src/tests/vimtests/replace/1.test8
-rw-r--r--src/tests/vimtests/replace/10.test12
-rw-r--r--src/tests/vimtests/replace/11.test12
-rw-r--r--src/tests/vimtests/replace/2.test8
-rw-r--r--src/tests/vimtests/replace/3.test12
-rw-r--r--src/tests/vimtests/replace/4.test12
-rw-r--r--src/tests/vimtests/replace/5.test12
-rw-r--r--src/tests/vimtests/replace/6.test12
-rw-r--r--src/tests/vimtests/replace/7.test12
-rw-r--r--src/tests/vimtests/replace/8.test8
-rw-r--r--src/tests/vimtests/replace/9.test12
-rw-r--r--src/tests/vimtests/search/1.test12
-rw-r--r--src/tests/vimtests/search/2.test14
-rw-r--r--src/tests/vimtests/search/3.test16
-rw-r--r--src/tests/vimtests/search/4.test16
-rw-r--r--src/tests/vimtests/search/5.test16
-rw-r--r--src/tests/vimtests/search/6.test14
-rw-r--r--src/tests/vimtests/search/7.test14
-rw-r--r--src/tests/vimtests/search/8.test16
-rw-r--r--src/tests/vimtests/search/9.test8
-rw-r--r--src/tests/vimtests/search/counted_1.test14
-rw-r--r--src/tests/vimtests/search/counted_2.test14
-rw-r--r--src/tests/vimtests/search/counted_3.test12
-rw-r--r--src/tests/vimtests/search/counted_capN_1.test18
-rw-r--r--src/tests/vimtests/search/counted_capN_2.test16
-rw-r--r--src/tests/vimtests/search/counted_n_1.test16
-rw-r--r--src/tests/vimtests/search/counted_n_2.test18
-rw-r--r--src/tests/vimtests/search/counted_n_3.test18
-rw-r--r--src/tests/vimtests/search/history1.test12
-rw-r--r--src/tests/vimtests/search/history2.test12
-rw-r--r--src/tests/vimtests/search/history3.test12
-rw-r--r--src/tests/vimtests/search/history4.test12
-rw-r--r--src/tests/vimtests/searchword/g_pound.test12
-rw-r--r--src/tests/vimtests/searchword/g_repeat_pound.test12
-rw-r--r--src/tests/vimtests/searchword/g_repeat_pound_1.test12
-rw-r--r--src/tests/vimtests/searchword/g_repeat_star.test12
-rw-r--r--src/tests/vimtests/searchword/g_star.test12
-rw-r--r--src/tests/vimtests/searchword/pound.test12
-rw-r--r--src/tests/vimtests/searchword/repeat_pound.test12
-rw-r--r--src/tests/vimtests/searchword/repeat_star.test12
-rw-r--r--src/tests/vimtests/searchword/star.test12
-rw-r--r--src/tests/vimtests/searchword/star_2.test12
-rw-r--r--src/tests/vimtests/switchcase/g_capU.test12
-rw-r--r--src/tests/vimtests/switchcase/gtilde.test12
-rw-r--r--src/tests/vimtests/switchcase/gtilde_1.test12
-rw-r--r--src/tests/vimtests/switchcase/gu.test12
-rw-r--r--src/tests/vimtests/switchcase/tilde_does_not_cross_lines.test12
-rw-r--r--src/tests/vimtests/switchcase/tilde_left_over_count_at_eol_is_ignored.test18
-rw-r--r--src/tests/vimtests/switchcase/tilde_near_eol.test12
-rw-r--r--src/tests/vimtests/switchcase/tilde_no_count.test12
-rw-r--r--src/tests/vimtests/switchcase/tilde_with_count.test12
-rw-r--r--src/tests/vimtests/undo/1.test12
-rw-r--r--src/tests/vimtests/undo/2.test12
-rw-r--r--src/tests/vimtests/undo/3.test12
-rw-r--r--src/tests/vimtests/undo/4.test12
-rw-r--r--src/tests/vimtests/undo/5.test12
-rw-r--r--src/tests/vimtests/undo/6.test12
-rw-r--r--src/tests/vimtests/undo/7.test12
-rw-r--r--src/tests/vimtests/undo/8.test12
-rw-r--r--src/tests/vimtests/undo/9.test12
-rw-r--r--src/tests/vimtests/unicode/chinese-simp.test8
-rw-r--r--src/tests/vimtests/unicode/chinese-trad.test8
-rw-r--r--src/tests/vimtests/unicode/russian.test8
-rw-r--r--src/tests/vimtests/unsorted/2yy.test12
-rw-r--r--src/tests/vimtests/unsorted/v3lcABC.test8
-rw-r--r--src/tests/vimtests/visual/1.test8
-rw-r--r--src/tests/vimtests/visual/10.test8
-rw-r--r--src/tests/vimtests/visual/11.test8
-rw-r--r--src/tests/vimtests/visual/12.test8
-rw-r--r--src/tests/vimtests/visual/13.test8
-rw-r--r--src/tests/vimtests/visual/14.test10
-rw-r--r--src/tests/vimtests/visual/15.test8
-rw-r--r--src/tests/vimtests/visual/2.test8
-rw-r--r--src/tests/vimtests/visual/3.test10
-rw-r--r--src/tests/vimtests/visual/4.test10
-rw-r--r--src/tests/vimtests/visual/6.test10
-rw-r--r--src/tests/vimtests/visual/7.test10
-rw-r--r--src/tests/vimtests/visual/A_0.test14
-rw-r--r--src/tests/vimtests/visual/A_1.test12
-rw-r--r--src/tests/vimtests/visual/A_2.test12
-rw-r--r--src/tests/vimtests/visual/I_0.test10
-rw-r--r--src/tests/vimtests/visual/I_1.test10
-rw-r--r--src/tests/vimtests/visual/Vd.test9
-rw-r--r--src/tests/vimtests/visual/capD_0.test10
-rw-r--r--src/tests/vimtests/visual/capD_1.test10
-rw-r--r--src/tests/vimtests/visual/capD_2.test9
-rw-r--r--src/tests/vimtests/visual/capU_0.test8
-rw-r--r--src/tests/vimtests/visual/capU_1.test12
-rw-r--r--src/tests/vimtests/visual/capY_0.test13
-rw-r--r--src/tests/vimtests/visual/d_0.test8
-rw-r--r--src/tests/vimtests/visual/d_1.test8
-rw-r--r--src/tests/vimtests/visual/d_2.test11
-rw-r--r--src/tests/vimtests/visual/gq_0.test12
-rw-r--r--src/tests/vimtests/visual/gq_1.test11
-rw-r--r--src/tests/vimtests/visual/indent_0.test10
-rw-r--r--src/tests/vimtests/visual/indent_1.test12
-rw-r--r--src/tests/vimtests/visual/indent_10.test14
-rw-r--r--src/tests/vimtests/visual/indent_2.test8
-rw-r--r--src/tests/vimtests/visual/indent_3.test8
-rw-r--r--src/tests/vimtests/visual/indent_4.test12
-rw-r--r--src/tests/vimtests/visual/indent_5.test12
-rw-r--r--src/tests/vimtests/visual/indent_6.test12
-rw-r--r--src/tests/vimtests/visual/indent_7.test12
-rw-r--r--src/tests/vimtests/visual/indent_8.test12
-rw-r--r--src/tests/vimtests/visual/indent_9.test12
-rw-r--r--src/tests/vimtests/visual/m_0.test10
-rw-r--r--src/tests/vimtests/visual/m_1.test14
-rw-r--r--src/tests/vimtests/visual/o_0.test8
-rw-r--r--src/tests/vimtests/visual/r_0.test8
-rw-r--r--src/tests/vimtests/visual/r_1.test10
-rw-r--r--src/tests/vimtests/visual/r_2.test12
-rw-r--r--src/tests/vimtests/visual/switchcase_0.test8
-rw-r--r--src/tests/vimtests/visual/switchcase_1.test8
-rw-r--r--src/tests/vimtests/visual/u_0.test8
-rw-r--r--src/tests/vimtests/visual/u_1.test8
-rw-r--r--src/tests/vimtests/visual/vlllx.test8
-rw-r--r--src/tests/vimtests/visual/vx.test12
-rw-r--r--src/tests/vimtests/visual/y_0.test10
-rw-r--r--src/tests/vimtests/visual/y_1.test11
-rw-r--r--src/tests/vimtests/visual/y_2.test10
-rw-r--r--src/tests/vimtests/visual/y_3.test12
-rw-r--r--src/tests/vimtests/visual/y_5.test11
-rw-r--r--src/tests/vimtests/visual/y_6.test11
-rw-r--r--src/tests/vimtests/yank/yy.test12
-rw-r--r--yi.cabal73
540 files changed, 6972 insertions, 5 deletions
diff --git a/src/tests/Driver.hs b/src/tests/Driver.hs
new file mode 100644
index 0000000..f203302
--- /dev/null
+++ b/src/tests/Driver.hs
@@ -0,0 +1,101 @@
+{-# LANGUAGE TypeSynonymInstances, GeneralizedNewtypeDeriving #-}
+
+module Driver where
+
+import System.Environment
+import Control.Monad
+import Test.QuickCheck hiding (promote)
+import System.Random hiding (next)
+import Text.Printf
+import Data.List (sort,group,intersperse)
+
+-- Following code shamelessly stolen from XMonad.
+main :: (Read t, Num t, PrintfArg t1, Num b, PrintfArg b) =>
+ [(t1, t -> IO (Bool, b))] -> IO ()
+main tests = do
+ args <- fmap (drop 1) getArgs
+ let n = if null args then 100 else read (head args)
+ (results, passed) <- fmap unzip $ mapM (\(s,a) -> printf "%-25s: " s >> a n) tests
+ printf "Passed %d tests!\n" (sum passed) :: IO ()
+ when (not . and $ results) $ fail "Not all tests passed!"
+
+------------------------------------------------------------------------
+--
+-- QC driver
+--
+
+
+debug :: Bool
+debug = False
+
+mytest :: Testable a => a -> Int -> IO (Bool, Int)
+mytest a n = mycheck (stdArgs {maxSuccess = n}) a
+-- mytest a n = mycheck stdArgs
+-- { maxSuccess=n
+-- , configEvery = \o _ -> let s = show o in s ++ [ '\b' | _ <- s ] } a
+ -- , configEvery= \n args -> if debug then show n ++ ":\n" ++ unlines args else [] } a
+
+mycheck :: Testable a => Args -> a -> IO (Bool, Int)
+mycheck config a = do
+ rnd <- newStdGen
+ results <- quickCheckWithResult config {replay = Just (rnd, 1)} a
+ print results
+ return $ case results of
+ Success {} ->(True, maxSuccess config)
+ GaveUp {numTests = n} ->(True, n)
+ Failure {} -> (False, 0)
+ NoExpectedFailure {} -> (True, 0)
+
+-- mytests :: Args -> Gen Result -> StdGen -> Int -> Int -> [[String]] -> IO (Bool, Int)
+-- mytests config gen rnd0 ntest nfail stamps
+-- | ntest == maxTest config = done "OK," ntest stamps >> return (True, ntest)
+-- | nfail == maxFail config = done "Arguments exhausted after" ntest stamps >> return (True, ntest)
+-- | otherwise =
+-- do putStr (configEvery config ntest (arguments result)) >> hFlush stdout
+-- case ok result of
+-- Nothing ->
+-- mytests config gen rnd1 ntest (nfail+1) stamps
+-- Just True ->
+-- mytests config gen rnd1 (ntest+1) nfail (stamp result:stamps)
+-- Just False ->
+-- putStr ( "Falsifiable after "
+-- ++ show ntest
+-- ++ " tests:\n"
+-- ++ unlines (arguments result)
+-- ) >> hFlush stdout >> return (False, ntest)
+-- where
+-- result = generate (maxSize config ntest) rnd2 gen
+-- (rnd1,rnd2) = split rnd0
+
+done :: String -> Int -> [[String]] -> IO ()
+done mesg ntest stamps = putStr ( mesg ++ " " ++ show ntest ++ " tests" ++ table )
+ where
+ table = display
+ . map entry
+ . reverse
+ . sort
+ . map pairLength
+ . group
+ . sort
+ . filter (not . null)
+ $ stamps
+
+ display [] = ".\n"
+ display [x] = " (" ++ x ++ ").\n"
+ display xs = ".\n" ++ unlines (map (++ ".") xs)
+
+ pairLength xss@(xs:_) = (length xss, xs)
+ pairLength [] = (0, [])
+ entry (n, xs) = percentage n ntest
+ ++ " "
+ ++ concat (intersperse ", " xs)
+
+ percentage n m = show ((100 * n) `div` m) ++ "%"
+
+------------------------------------------------------------------------
+
+integralRandomR :: (Integral a, RandomGen g) => (a,a) -> g -> (a,g)
+integralRandomR (a,b) g = case randomR (fromIntegral a :: Integer,
+ fromIntegral b :: Integer) g of
+ (x,h) -> (fromIntegral x, h)
+
diff --git a/src/tests/Generic/TestPureBufferManipulations.hs b/src/tests/Generic/TestPureBufferManipulations.hs
new file mode 100644
index 0000000..28480f4
--- /dev/null
+++ b/src/tests/Generic/TestPureBufferManipulations.hs
@@ -0,0 +1,212 @@
+-- | This module aims to provide a generic back-end for other keymaps to
+-- use for pure buffer manipulations. Pure buffer manipulations are considered
+-- to be operations which simply change the contents of the buffer and move the
+-- cursor. For example, opening a second buffer is not considered a pure buffer
+-- operation.
+
+module Generic.TestPureBufferManipulations where
+
+import Test.Tasty.HUnit
+import Test.Tasty (TestTree, testGroup)
+
+import Control.Monad (filterM, forM, void, unless)
+import Control.Lens ((%=))
+
+import Data.List (sort, isSuffixOf, intercalate, isPrefixOf)
+import Data.Ord (comparing)
+
+import System.Directory
+import System.FilePath
+
+import Text.Printf
+
+import Yi.Buffer
+import Yi.Config (Config)
+import Yi.Editor
+import Yi.Window
+import Yi.Region
+
+import Generic.TestUtils
+
+data KeymapTest = KeymapTest {
+ ktName :: String
+ , ktOptionalSettings :: [OptionalSetting]
+ , ktInput :: String
+ , ktOutput :: String
+ , ktEventString :: String
+ , ktKeysEval :: KeyEval
+ }
+
+data OptionalSetting = WindowSize Int Int -- ^ WindowSize Width Height
+ deriving Eq
+
+instance Show OptionalSetting where
+ show (WindowSize w h) = unwords ["+WindowSize", (show w), (show h)]
+
+instance Eq KeymapTest where
+ KeymapTest n s i o e _ == KeymapTest n' s' i' o' e' _ =
+ n == n' && s == s' && i == i' && o == o' && e == e'
+
+instance Ord KeymapTest where
+ compare = comparing ktName
+
+
+data TestResult = TestPassed String
+ | TestFailed String String
+
+instance Show TestResult where
+ show (TestPassed name) = "PASSED " ++ name
+ show (TestFailed name msg) = "FAILED " ++ name ++ ":\n" ++ msg
+
+unlines' :: [String] -> String
+unlines' = intercalate "\n"
+
+optionalSettingPrefix :: String
+optionalSettingPrefix = "--+ "
+
+isOptionalSetting :: String -> Bool
+isOptionalSetting = (optionalSettingPrefix `isPrefixOf`)
+
+decodeOptionalSetting :: [String] -> OptionalSetting
+decodeOptionalSetting ["WindowSize", w, h] = WindowSize (read w) (read h)
+decodeOptionalSetting unknownSetting =
+ error $ "Invalid Setting: " ++ (intercalate " " unknownSetting)
+
+loadTestFromDirectory :: FilePath -- ^ Directory of the test
+ -> KeyEval -- ^ Function that can run
+ -- ‘events’ commands
+ -> IO KeymapTest
+loadTestFromDirectory path ev = do
+ [input, output, events] <- mapM (readFile' . (path </>)) ["input", "output", "events"]
+ return $ KeymapTest (joinPath . drop 1 . splitPath $ path) [] input output events ev
+
+isValidTestFile :: String -> Bool
+isValidTestFile text =
+ case (skipOptionals . lines $ text) of
+ [] -> False
+ ("-- Input": ls) ->
+ case break (== "-- Output") ls of
+ (_, []) -> False
+ (_, "-- Output":ls') -> "-- Events" `elem` ls'
+ _ -> False
+ _ -> False
+ where
+ skipOptionals = dropWhile isOptionalSetting
+
+-- | See Arguments to 'loadTestFromDirectory'
+loadTestFromFile :: FilePath -> KeyEval -> IO KeymapTest
+loadTestFromFile path ev = do
+ text <- readFile' path
+ unless (isValidTestFile text) $
+ void $ printf "Test %s is invalid\n" path
+ let (optionals, testContents) = span isOptionalSetting (lines text)
+ ls = tail testContents
+ (input, rest) = break (== "-- Output") ls
+ (output, rest2) = break (== "-- Events") $ tail rest
+ eventText = tail rest2
+ return $
+ KeymapTest
+ (joinPath . drop 1 . splitPath . dropExtension $ path)
+ (map (decodeOptionalSetting . drop 1 . words) optionals)
+ (unlines' input)
+ (unlines' output)
+ (unlines' eventText)
+ ev
+
+containsTest :: FilePath -> IO Bool
+containsTest d = do
+ files <- fmap (filter (`notElem` [".", ".."])) $ getDirectoryContents d
+ return $ sort files == ["events", "input", "output"]
+
+getRecursiveFiles :: FilePath -> IO [FilePath]
+getRecursiveFiles topdir = do
+ names <- getDirectoryContents topdir
+ let properNames = filter (`notElem` [".", "..", ".git", ".svn"]) names
+ paths <- forM properNames $ \name -> do
+ let path = topdir </> name
+ isDirectory <- doesDirectoryExist path
+ if isDirectory
+ then getRecursiveFiles path
+ else return [path]
+ return (concat paths)
+
+getRecursiveDirectories :: FilePath -> IO [FilePath]
+getRecursiveDirectories topdir = do
+ names <- getDirectoryContents topdir
+ let properNames = filter (`notElem` [".", "..", ".git", ".svn"]) names
+ paths <- forM properNames $ \name -> do
+ let path = topdir </> name
+ isDirectory <- doesDirectoryExist path
+ if isDirectory
+ then fmap (path:) $ getRecursiveDirectories path
+ else return []
+ return (concat paths)
+
+discoverTests :: FilePath -> KeyEval -> IO [KeymapTest]
+discoverTests topdir ev = do
+ dirs <- getRecursiveDirectories topdir
+ testDirs <- filterM containsTest dirs
+ testFiles <- fmap (filter (isSuffixOf ".test")) $ getRecursiveFiles topdir
+ testsFromDirs <- mapM (`loadTestFromDirectory` ev) testDirs
+ testsFromFiles <- mapM (`loadTestFromFile` ev) testFiles
+ return $ testsFromDirs ++ testsFromFiles
+
+optionalSettingAction :: OptionalSetting -> EditorM ()
+optionalSettingAction (WindowSize w h) =
+ let region = mkSizeRegion (Point 0) (Size (w*h))
+ in currentWindowA %= (\w -> w { height = h, winRegion = region })
+
+mkTestCase :: Config -> KeymapTest -> TestTree
+mkTestCase cf t = testCase (ktName t) $ do
+ let setupActions = do
+ let (cursorLine, '\n':text) = break (== '\n') (ktInput t)
+ mapM_ optionalSettingAction $ ktOptionalSettings t
+ insertText text
+ setCursorPosition cursorLine
+
+ preConditions _ _ = return ()
+
+ testActions _ = ktKeysEval t $ ktEventString t
+
+ assertions editor _ =
+ let actualOut = cursorPos editor ++ "\n" ++
+ extractBufferString cf editor
+ in assertEqual (errorMsg actualOut) actualOut (ktOutput t)
+
+ runTest setupActions preConditions testActions assertions cf
+
+ where
+ setCursorPosition cursorLine =
+ let (x, y) = read cursorLine
+ in withCurrentBuffer $ moveToLineColB x (y - 1)
+ cursorPos = show . snd . runEditor cf (withCurrentBuffer $ do
+ l <- curLn
+ c <- curCol
+ return (l, c + 1))
+ errorMsg actualOut = unlines $ optionalSettings ++
+ [ "Input:", ktInput t
+ , "Expected:", ktOutput t
+ , "Got:", actualOut
+ , "Events:", ktEventString t
+ , "---"]
+ optionalSettings = map show $ ktOptionalSettings t
+
+-- | Takes a directory with the tests, a name of the keymap
+-- and an evaluation function for the keys contained in the tests.
+-- For Vim, we might do something like:
+--
+-- @
+-- getTests defaultVimConfig "src/tests/vimtests"
+-- "Vim" (pureEval $ extractValue defVimConfig)
+-- @
+getTests :: Config -> FilePath -> String
+ -> KeyEval -> IO TestTree
+getTests c fp n ev = do
+ tests <- discoverTests fp ev
+ return $ testGroup (n ++ " keymap tests") $
+ fmap (mkTestCase c) . sort $ tests
+
+readFile' :: FilePath -> IO String
+readFile' f = do
+ s <- readFile f
+ return $! length s `seq` s
diff --git a/src/tests/Generic/TestUtils.hs b/src/tests/Generic/TestUtils.hs
new file mode 100644
index 0000000..a5a1ad1
--- /dev/null
+++ b/src/tests/Generic/TestUtils.hs
@@ -0,0 +1,99 @@
+module Generic.TestUtils where
+
+import Control.Monad (unless)
+import Test.Tasty.HUnit
+import Yi.Buffer
+import Yi.Config (Config)
+import Yi.Editor
+import qualified Yi.Rope as R
+
+
+type KeyEval = String -> EditorM ()
+-- | Run a pure editor manipulation test.
+--
+-- Runs the @setupActions@ against an empty editor. Checks that @preConditions@
+-- hold for that editor. Then runs @testActions@ against the setup editor.
+-- Finally checks that @assertions@ hold for the final editor state.
+--
+-- @preConditions@, @testActions@ and @assertions@ are each passed the return
+-- value of @setupActions@.
+--
+runTest :: EditorM a
+ -- ^ Setup actions to initialize the editor.
+ -> (Editor -> a -> Assertion)
+ -- ^ Precondition assertions. Used to check that the editor
+ -- is in the expected state prior to running the test actions.
+ -> (a -> EditorM ())
+ -- ^ The actions to run as part of the test. The return value
+ -- from the setup action is passed to this.
+ -> (Editor -> a -> Assertion)
+ -- ^ Assertions to check that the editor is in the expected
+ -- state. The return value from the setup action is passed to
+ -- this.
+ -> Config
+ -- ^ The 'Config' to use for this test. 'defaultVimConfig' is
+ -- an example of a value we could provide.
+ -> Assertion
+runTest setupActions preConditions testActions assertions c = do
+ let (setupEditor, a) = runEditor c setupActions emptyEditor
+ preConditions setupEditor a
+ let finalEditor = fst $ runEditor c (testActions a) setupEditor
+ assertions finalEditor a
+
+
+-- Return the contents of the current buffer as a string.
+extractBufferString :: Config -> Editor -> String
+extractBufferString c editor =
+ R.toString $ snd (runEditor c (withCurrentBuffer elemsB) editor)
+
+
+--------------------------------------------------
+-- Functions for altering the state of the editor.
+
+-- | Insert the given text into the editor inside an update transaction.
+insertText :: String -> EditorM ()
+insertText text =
+ withCurrentBuffer $ do
+ startUpdateTransactionB
+ insertN (R.fromString text)
+ commitUpdateTransactionB
+
+
+--------------------------------------------------
+-- Useful assertions.
+
+-- | Asserts that the specified actual value is not equal to the unexpected
+-- value. The output message will contain the prefix and the actual value.
+--
+-- If the prefix is the empty string (i.e., @\"\"@), then the prefix is omitted
+-- and only the actual value is output.
+assertNotEqual :: (Eq a, Show a) => String -- ^ The message prefix
+ -> a -- ^ The expected value
+ -> a -- ^ The actual value
+ -> Assertion
+assertNotEqual preface expected actual =
+ unless (actual /= expected) (assertFailure msg)
+ where
+ msg = (if null preface then "" else preface ++ "\n") ++
+ "expected not to get: " ++ show expected
+
+
+-- | Asserts that the contents of the current buffer are equal to the expected
+-- value. The output message will contain the expected value and the actual value.
+assertContentOfCurrentBuffer :: Config -> String -> Editor -> Assertion
+assertContentOfCurrentBuffer c expectedContent editor =
+ assertEqual "Unexpected buffer content" expectedContent (extractBufferString c editor)
+
+
+-- | Asserts that the current buffer is not the specified buffer. The output will
+-- contain the BufferKey of the current buffer.
+assertNotCurrentBuffer :: BufferRef -> Editor -> Assertion
+assertNotCurrentBuffer bufref editor =
+ assertNotEqual "Unexpected current buffer" bufref (currentBuffer editor)
+
+
+-- | Asserts that the current buffer is the expected buffer. The output will
+-- contain the expected BufferKey and the acutal BufferKey of the current buffer.
+assertCurrentBuffer :: BufferRef -> Editor -> Assertion
+assertCurrentBuffer bufref editor =
+ assertEqual "Unexpected current buffer" bufref (currentBuffer editor)
diff --git a/src/tests/Vim/EditorManipulations/BufferExCommand.hs b/src/tests/Vim/EditorManipulations/BufferExCommand.hs
new file mode 100644
index 0000000..a54b0b8
--- /dev/null
+++ b/src/tests/Vim/EditorManipulations/BufferExCommand.hs
@@ -0,0 +1,174 @@
+{-# LANGUAGE OverloadedStrings #-}
+-- | Tests for the :buffer ex command in the Vim keymap
+--
+module Vim.EditorManipulations.BufferExCommand (tests) where
+
+import qualified Data.List.NonEmpty as NE
+import Generic.TestUtils
+import Test.Tasty (TestTree, testGroup)
+import Test.Tasty.HUnit
+import Yi.Buffer
+import Yi.Config (Config)
+import Yi.Editor
+import Yi.Rope ()
+
+type BufferName = String
+
+-- | Create three buffers and return the 'BufferRef' and buffer name of
+-- each.
+createInitialBuffers :: EditorM [(BufferRef, BufferName)]
+createInitialBuffers = do
+ one <- newBufferE (FileBuffer "one") "Buffer one"
+ two <- newBufferE (FileBuffer "two") "Buffer two"
+ three <- newBufferE (FileBuffer "three") "Buffer three"
+ return [(one, "one"), (two, "two"), (three, "three")]
+
+
+nthBufferRef :: Int -> [(BufferRef, BufferName)] -> BufferRef
+nthBufferRef n buffers = fst $ buffers !! n
+
+nthBufferName :: Int -> [(BufferRef, BufferName)] -> BufferName
+nthBufferName n buffers = snd $ buffers !! n
+
+
+tests :: Config -> KeyEval -> TestTree
+tests c ev =
+ testGroup ":buffer" [
+ testCase ":buffer {bufname} switches to the named buffer" $ do
+ let setupActions = createInitialBuffers
+
+ preConditions editor buffers =
+ assertNotCurrentBuffer (nthBufferRef 1 buffers) editor
+
+ testActions buffers =
+ ev $ ":buffer " ++ nthBufferName 1 buffers ++ "<CR>"
+
+ assertions editor buffers = do
+ assertContentOfCurrentBuffer c "Buffer two" editor
+ assertCurrentBuffer (nthBufferRef 1 buffers) editor
+
+ runTest setupActions preConditions testActions assertions c
+
+
+ , testCase ":buffer N switches to the numbered buffer" $ do
+ let setupActions = createInitialBuffers
+
+ preConditions editor buffers =
+ assertNotCurrentBuffer (nthBufferRef 1 buffers) editor
+
+ testActions buffers =
+ let (BufferRef bref) = nthBufferRef 1 buffers
+ in ev $ ":buffer " ++ show bref ++ "<CR>"
+
+ assertions editor buffers = do
+ assertContentOfCurrentBuffer c "Buffer two" editor
+ assertCurrentBuffer (nthBufferRef 1 buffers) editor
+
+ runTest setupActions preConditions testActions assertions c
+
+
+ , testCase ":buffer # switches to the previous buffer" $ do
+ let setupActions = createInitialBuffers
+
+ preConditions editor buffers =
+ assertEqual "Unexpected buffer stack"
+ [nthBufferRef 2 buffers, nthBufferRef 1 buffers]
+ (take 2 . NE.toList $ bufferStack editor)
+
+ testActions _ =
+ ev $ ":buffer #<CR>"
+
+ assertions editor buffers = do
+ assertEqual "Unexpected buffer stack"
+ [nthBufferRef 1 buffers, nthBufferRef 2 buffers]
+ (take 2 . NE.toList $ bufferStack editor)
+
+ runTest setupActions preConditions testActions assertions c
+
+
+ , testCase ":buffer % is a no-op" $ do
+ let setupActions = createInitialBuffers
+
+ preConditions editor buffers =
+ assertCurrentBuffer (nthBufferRef 2 buffers) editor
+
+ testActions _ =
+ ev $ ":buffer %<CR>"
+
+ assertions editor buffers = do
+ assertContentOfCurrentBuffer c "Buffer three" editor
+ assertCurrentBuffer (nthBufferRef 2 buffers) editor
+
+ runTest setupActions preConditions testActions assertions c
+
+
+ , testCase ":buffer is a no-op" $ do
+ let setupActions = createInitialBuffers
+
+ preConditions editor buffers =
+ assertCurrentBuffer (nthBufferRef 2 buffers) editor
+
+ testActions _ =
+ ev $ ":buffer<CR>"
+
+ assertions editor buffers = do
+ assertContentOfCurrentBuffer c "Buffer three" editor
+ assertCurrentBuffer (nthBufferRef 2 buffers) editor
+
+ runTest setupActions preConditions testActions assertions c
+
+
+ , testCase "A modified buffer is not abandoned" $ do
+ let setupActions = createInitialBuffers
+
+ preConditions editor buffers =
+ assertNotCurrentBuffer (nthBufferRef 1 buffers) editor
+
+ testActions buffers = do
+ withCurrentBuffer $ insertN "The buffer is altered"
+ ev $ ":buffer " ++ nthBufferName 1 buffers ++ "<CR>"
+
+ assertions editor buffers = do
+ assertNotCurrentBuffer (nthBufferRef 1 buffers) editor
+
+ runTest setupActions preConditions testActions assertions c
+
+
+ , testCase "A modified buffer can be abandoned with a bang" $ do
+ let setupActions = createInitialBuffers
+
+ preConditions editor buffers =
+ assertNotCurrentBuffer (nthBufferRef 1 buffers) editor
+
+ testActions buffers = do
+ withCurrentBuffer $ insertN "The buffer is altered"
+ ev $ ":buffer! " ++ nthBufferName 1 buffers ++ "<CR>"
+
+ assertions editor buffers = do
+ assertCurrentBuffer (nthBufferRef 1 buffers) editor
+
+ runTest setupActions preConditions testActions assertions c
+
+
+ , testCase ":Nbuffer switches to the numbered buffer" $ do
+ let setupActions = createInitialBuffers
+
+ preConditions editor buffers =
+ assertNotCurrentBuffer (nthBufferRef 1 buffers) editor
+
+ testActions buffers =
+ -- return ()
+ let (BufferRef bref) = nthBufferRef 1 buffers
+ in ev $ ":" ++ show bref ++ "buffer<CR>"
+ -- in ev $ ":buffer " ++ show bref ++ "<CR>"
+
+ assertions editor buffers = do
+ -- assertContentOfCurrentBuffer c "Buffer two" editor
+ assertCurrentBuffer (nthBufferRef 1 buffers) editor
+
+ runTest setupActions preConditions testActions assertions c
+
+
+ -- , testCase "A named buffer can be shown in a split window" $ do
+ -- , testCase "A numbered buffer can be shown in a split window" $ do
+ ]
diff --git a/src/tests/Vim/TestExCommandParsers.hs b/src/tests/Vim/TestExCommandParsers.hs
new file mode 100644
index 0000000..0d8043b
--- /dev/null
+++ b/src/tests/Vim/TestExCommandParsers.hs
@@ -0,0 +1,157 @@
+{-# LANGUAGE OverloadedStrings #-}
+module Vim.TestExCommandParsers (tests) where
+
+import Control.Applicative
+import Data.Maybe
+import Data.Monoid
+import qualified Data.Text as T
+import Test.QuickCheck
+import Test.Tasty (TestTree, testGroup)
+import Test.Tasty.QuickCheck
+import Yi.Keymap.Vim.Common
+import Yi.Keymap.Vim.Ex
+import qualified Yi.Keymap.Vim.Ex.Commands.Buffer as Buffer
+import qualified Yi.Keymap.Vim.Ex.Commands.BufferDelete as BufferDelete
+import qualified Yi.Keymap.Vim.Ex.Commands.Delete as Delete
+
+data CommandParser = CommandParser
+ { cpDescription :: String
+ , cpParser :: String -> Maybe ExCommand
+ , cpNames :: [String]
+ , cpAcceptsBang :: Bool
+ , cpAcceptsCount :: Bool
+ , cpArgs :: Gen String
+ }
+
+addingSpace :: Gen String -> Gen String
+addingSpace = fmap (" " <>)
+
+numberString :: Gen String
+numberString = (\(NonNegative n) -> show n) <$> (arbitrary :: Gen (NonNegative Int))
+
+-- | QuickCheck Generator of buffer identifiers.
+--
+-- A buffer identifier is either an empty string, a "%" character, a "#"
+-- character, a string containing only numbers (optionally preceeded by
+-- a space), or a string containing any chars preceeded by a space. E.g.,
+--
+-- ["", "%", "#", " myBufferName", " 45", "45"]
+--
+-- TODO Don't select "", "%", "#" half of the time.
+bufferIdentifier :: Gen String
+bufferIdentifier =
+ oneof [ addingSpace arbitrary
+ , addingSpace numberString
+ , numberString
+ , oneof [pure "%", pure " %"]
+ , oneof [pure "#", pure " #"]
+ , pure ""
+ ]
+
+-- | QuickCheck generator of strings suitable for use as register names in Vim
+-- ex command lines. Does not include a preceding @"@.
+registerName :: Gen String
+registerName =
+ (:[]) <$> oneof [ elements ['0'..'9']
+ , elements ['a'..'z']
+ , elements ['A'..'Z']
+ , elements ['"', '-', '=', '*', '+', '~', '_', '/']
+ -- TODO Should the read-only registers be included here?
+ -- , element [':', '.', '%', '#']
+ ]
+
+-- | QuickCheck generator of strings suitable for use as counts in Vim ex
+-- command lines
+count :: Gen String
+count = numberString
+
+commandParsers :: [CommandParser]
+commandParsers =
+ [ CommandParser
+ "Buffer.parse"
+ (Buffer.parse . Ev . T.pack)
+ ["buffer", "buf", "bu", "b"]
+ True
+ True
+ bufferIdentifier
+
+ , CommandParser
+ "BufferDelete.parse"
+ (BufferDelete.parse . Ev . T.pack)
+ ["bdelete", "bdel", "bd"]
+ True
+ False
+ (unwords <$> listOf bufferIdentifier)
+
+ , CommandParser
+ "Delete.parse"
+ (Delete.parse . Ev . T.pack)
+ ["delete", "del", "de", "d"]
+ -- XXX TODO support these weird abbreviations too?
+ -- :dl, :dell, :delel, :deletl, :deletel
+ -- :dp, :dep, :delp, :delep, :deletp, :deletep
+ True
+ False
+ (oneof [ pure ""
+ , addingSpace registerName
+ , addingSpace count
+ , (<>) <$> addingSpace registerName <*> addingSpace count
+ ])
+ ]
+
+
+commandString :: CommandParser -> Gen String
+commandString cp = do
+ name <- elements $ cpNames cp
+ bang <- if cpAcceptsBang cp
+ then elements ["!", ""]
+ else pure ""
+ count' <- if cpAcceptsCount cp
+ then count
+ else pure ""
+ args <- cpArgs cp
+ return $ concat [count', name, bang, args]
+
+
+expectedParserParses :: CommandParser -> TestTree
+expectedParserParses commandParser =
+ testProperty (cpDescription commandParser <> " parses expected input") $
+ forAll (commandString commandParser)
+ (isJust . cpParser commandParser)
+
+
+expectedParserSelected :: CommandParser -> TestTree
+expectedParserSelected expectedCommandParser =
+ testProperty testName $
+ forAll (commandString expectedCommandParser) $ \s ->
+ let expectedName = expectedCommandName (Ev $ T.pack s)
+ actualName = actualCommandName (Ev $ T.pack s)
+ in counterexample (errorMessage s actualName)
+ (expectedName == actualName)
+ where
+ unE = T.unpack . _unEv
+ expectedCommandName = commandNameFor [cpParser expectedCommandParser . unE]
+ actualCommandName = commandNameFor defExCommandParsers
+ commandNameFor parsers s =
+ cmdShow <$> evStringToExCommand parsers s
+ errorMessage s actualName =
+ "Parsed " <> show s <> " to " <> show actualName <> " command"
+ testName =
+ cpDescription expectedCommandParser <> " selected for expected input"
+
+
+
+-- | Tests for the Ex command parsers in the Vim Keymap.
+--
+-- Tests that the parsers parse the strings they are expected to and that
+-- the expected parser is selected for string.
+--
+-- The actions of the ex commands are not tested here.
+tests :: TestTree
+tests =
+ testGroup "Vim keymap ex command parsers"
+ [ testGroup "Expected parser parses" $
+ map expectedParserParses commandParsers
+ , testGroup "Expected parser selected" $
+ map expectedParserSelected commandParsers
+ ]
diff --git a/src/tests/Vim/TestPureBufferManipulations.hs b/src/tests/Vim/TestPureBufferManipulations.hs
new file mode 100644
index 0000000..313c199
--- /dev/null
+++ b/src/tests/Vim/TestPureBufferManipulations.hs
@@ -0,0 +1,30 @@
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE ScopedTypeVariables #-}
+
+-- | Tests for pure manipulations of a single buffer in the Vim Keymap.
+--
+-- A manipulation of a single buffer is an operation or sequence of operations
+-- which do nothing other than change the contents or cursor position of a
+-- single buffer.
+--
+-- This module loads the tests from files in @src/tests/vimtests@. Adding new
+-- tests, or altering existing tests is done by editing files there. The format
+-- should be self explanatory.
+--
+-- If a test is pure and manipulates something other than the contents or cursor
+-- position of a single buffer, it should be added to the
+-- 'Vim.TestPureEditorManipulations' module.
+--
+module Vim.TestPureBufferManipulations (getTests) where
+
+import qualified Data.Text as T
+import qualified Generic.TestPureBufferManipulations as GT
+import Test.Tasty (TestTree)
+import Yi (extractValue)
+import Yi.Config.Default (defaultVimConfig)
+import Yi.Keymap.Vim
+import Yi.Keymap.Vim.Common
+
+getTests :: IO TestTree
+getTests = GT.getTests defaultVimConfig "src/tests/vimtests"
+ "Vim" (pureEval (extractValue defVimConfig) . Ev . T.pack)
diff --git a/src/tests/Vim/TestPureEditorManipulations.hs b/src/tests/Vim/TestPureEditorManipulations.hs
new file mode 100644
index 0000000..00c81ea
--- /dev/null
+++ b/src/tests/Vim/TestPureEditorManipulations.hs
@@ -0,0 +1,28 @@
+{-# LANGUAGE OverloadedStrings #-}
+-- | Tests for pure manipulations of the editor in the Vim Keymap.
+--
+-- Pure manipulations of the editor refers to such things as changing layout,
+-- navigating buffers, creating or deleting buffers, creating or deleting tabs.
+-- In short, anything which 1) doesn't perform IO and 2) interacts with
+-- something other than a single buffer.
+--
+-- If a test is pure and manipulates only a single buffer, it would be better
+-- being part of the 'Vim.TestPureBufferManipulations' module. That module
+-- provides a nicer way of writing pure single buffer manipulation tests.
+--
+module Vim.TestPureEditorManipulations (tests) where
+
+import qualified Data.Text as T
+import Test.Tasty (TestTree, testGroup)
+import qualified Vim.EditorManipulations.BufferExCommand as BufferExCommand
+import Yi (extractValue)
+import Yi.Config.Default (defaultVimConfig)
+import Yi.Keymap.Vim
+import Yi.Keymap.Vim.Common
+
+tests :: TestTree
+tests =
+ testGroup "Vim pure editor manipulation tests"
+ [ BufferExCommand.tests defaultVimConfig
+ (pureEval (extractValue defVimConfig) . Ev . T.pack)
+ ]
diff --git a/src/tests/vimtests/README.rst b/src/tests/vimtests/README.rst
new file mode 100644
index 0000000..713af20
--- /dev/null
+++ b/src/tests/vimtests/README.rst
@@ -0,0 +1,59 @@
+Testing Vim bindings
+====================
+
+Single file test format
+-----------------------
+
+ Files with names like "foo.test" are treated as single file tests.
+
+::
+
+ -- Input <-- This marks beginning of initial buffer state
+ (1,1) <-- This is initial cursor position, (row, column), both 1-based
+ aaaaa <-- Here goes actual buffer content
+ b b b
+ ccccc
+ -- Output <-- This marks beginning of expected buffer state after test
+ (3,5) <-- This is expected cursor position
+ aaaaa <-- Expected buffer text
+ b bfoo b
+ ccccc
+ -- Events <-- This line starts event sequence that is fed to editor after loading initial state
+ 2wifoo
+ <Esc>jj
+
+Directory test format
+---------------------
+
+ Directories that contain files "input", "output" and "events" and nothing else are considered directory tests. These three files have the same format as the sections of single file test described above.
+
+Test file naming note
+---------------------
+
+Originally we've used names like "ddP.test" and "ddp.test". It turned out to be really inconvenient on OSX, which uses case-insensitive filesystem by default. We had to rename tests to avoid collisions: "ddP.test" became "dd_capP.test".
+
+Event notation
+--------------
+
+ Event parsing expects a subset of vim notation (see :help <>). Backslash escaping is not supported. So to enter left angle bracket one must write <lt> and not \<.
+
+Intentionally not supported features of Vim
+-------------------------------------------
+
+ * select mode
+ * folds
+ * 0<C-d> and ^<C-d> in insert mode
+ * After i_<C-o> only motions are allowed
+
+Features incompatible with Vim because why not
+----------------------------------------------
+
+ * Y yanks to EOL
+ * A and I in linewise visual mode behave like in blockwise visual mode
+ * 999rZ turns ABC into ZZZ instead of doing nothing
+ * Operators in visual mode always leave cursor at selection start. Vim doesn't do this in some cases and I don't understand the pattern.
+ * Paragraph text object is slightly different
+ * Repeating insert actions with dot works differently when insertion events contain oneshot normal commands, e.g. "ifoo<C-o>hbar<Esc>". In Vim dot would insert only "bar", but yi dot inserts "fobaro"
+ * Scrolling motions (<C-f>, PageUp, etc) are treated like linewise motions.
+ * <C-w>, <C-u> remove whole region, not only entered characters.
+
diff --git a/src/tests/vimtests/blockvisual/0.test b/src/tests/vimtests/blockvisual/0.test
new file mode 100644
index 0000000..cd1d77e
--- /dev/null
+++ b/src/tests/vimtests/blockvisual/0.test
@@ -0,0 +1,12 @@
+-- Input
+(1,1)
+1234
+1234
+1234
+-- Output
+(1,2)
+14
+14
+14
+-- Events
+l<C-v>ljjd \ No newline at end of file
diff --git a/src/tests/vimtests/blockvisual/8.test b/src/tests/vimtests/blockvisual/8.test
new file mode 100644
index 0000000..eb62b1a
--- /dev/null
+++ b/src/tests/vimtests/blockvisual/8.test
@@ -0,0 +1,14 @@
+-- Input
+(1,1)
+ABCD
+ABCD
+ABCD
+ABCD
+-- Output
+(2,2)
+ABCD
+AcD
+AbcD
+ABCD
+-- Events
+lj<C-v>jlgux \ No newline at end of file
diff --git a/src/tests/vimtests/blockvisual/9.test b/src/tests/vimtests/blockvisual/9.test
new file mode 100644
index 0000000..3272971
--- /dev/null
+++ b/src/tests/vimtests/blockvisual/9.test
@@ -0,0 +1,14 @@
+-- Input
+(1,1)
+abcd
+abcd
+abcd
+abcd
+-- Output
+(2,3)
+abcd
+abD
+abCD
+abCD
+-- Events
+jjjlll<C-v>kkhgUx \ No newline at end of file
diff --git a/src/tests/vimtests/blockvisual/block.test b/src/tests/vimtests/blockvisual/block.test
new file mode 100644
index 0000000..15ec6a1
--- /dev/null
+++ b/src/tests/vimtests/blockvisual/block.test
@@ -0,0 +1,14 @@
+-- Input
+(1,1)
+ABCD
+ABCD
+ABCD
+ABCD
+-- Output
+(3,3)
+ABCD
+ABCD
+ABCD
+ABCD
+-- Events
+jl<C-v>jl \ No newline at end of file
diff --git a/src/tests/vimtests/blockvisual/block_d.test b/src/tests/vimtests/blockvisual/block_d.test
new file mode 100644
index 0000000..e3907f9
--- /dev/null
+++ b/src/tests/vimtests/blockvisual/block_d.test
@@ -0,0 +1,14 @@
+-- Input
+(1,1)
+ABCD
+ABCD
+ABCD
+ABCD
+-- Output
+(2,2)
+ABCD
+AD
+AD
+ABCD
+-- Events
+jl<C-v>jld \ No newline at end of file
diff --git a/src/tests/vimtests/blockvisual/block_d_1.test b/src/tests/vimtests/blockvisual/block_d_1.test
new file mode 100644
index 0000000..b14bbdc
--- /dev/null
+++ b/src/tests/vimtests/blockvisual/block_d_1.test
@@ -0,0 +1,14 @@
+-- Input
+(1,4)
+ABCD
+ABCD
+ABCD
+ABCD
+-- Output
+(2,2)
+ABCD
+AD
+AD
+ABCD
+-- Events
+hj<C-v>jhd \ No newline at end of file
diff --git a/src/tests/vimtests/blockvisual/block_d_2.test b/src/tests/vimtests/blockvisual/block_d_2.test
new file mode 100644
index 0000000..44d15f8
--- /dev/null
+++ b/src/tests/vimtests/blockvisual/block_d_2.test
@@ -0,0 +1,14 @@
+-- Input
+(1,4)
+ABCD
+ABCD
+ABCD
+ABCD
+-- Output
+(1,1)
+A
+A
+A
+ABCD
+-- Events
+<C-v>2jhhd \ No newline at end of file
diff --git a/src/tests/vimtests/blockvisual/capD_1.test b/src/tests/vimtests/blockvisual/capD_1.test
new file mode 100644
index 0000000..d6d0a74
--- /dev/null
+++ b/src/tests/vimtests/blockvisual/capD_1.test
@@ -0,0 +1,10 @@
+-- Input
+(1,1)
+foo
+bar
+-- Output
+(1,1)
+f
+b
+-- Events
+l<C-v>jD \ No newline at end of file
diff --git a/src/tests/vimtests/blockvisual/capD_2.test b/src/tests/vimtests/blockvisual/capD_2.test
new file mode 100644
index 0000000..17e5ca5
--- /dev/null
+++ b/src/tests/vimtests/blockvisual/capD_2.test
@@ -0,0 +1,20 @@
+-- Input
+(2,2)
+foo
+44444444
+bar
+
+baz
+xyzzy
+123123
+-- Output
+(2,1)
+foo
+4
+b
+
+b
+x
+123123
+-- Events
+<C-v>4jD
diff --git a/src/tests/vimtests/blockvisual/capI.test b/src/tests/vimtests/blockvisual/capI.test
new file mode 100644
index 0000000..0f22964
--- /dev/null
+++ b/src/tests/vimtests/blockvisual/capI.test
@@ -0,0 +1,12 @@
+-- Input
+(1,1)
+foo
+bar
+baz
+-- Output
+(1,3)
+fo-o
+ba-r
+ba-z
+-- Events
+ll<C-v>jjI-<Esc> \ No newline at end of file
diff --git a/src/tests/vimtests/blockvisual/capU_2.test b/src/tests/vimtests/blockvisual/capU_2.test
new file mode 100644
index 0000000..c072835
--- /dev/null
+++ b/src/tests/vimtests/blockvisual/capU_2.test
@@ -0,0 +1,12 @@
+-- Input
+(1,1)
+foo
+bar
+baz
+-- Output
+(1,1)
+FOo
+BAr
+BAz
+-- Events
+<C-v>ljjU \ No newline at end of file
diff --git a/src/tests/vimtests/blockvisual/commentblock.test b/src/tests/vimtests/blockvisual/commentblock.test
new file mode 100644
index 0000000..14cb430
--- /dev/null
+++ b/src/tests/vimtests/blockvisual/commentblock.test
@@ -0,0 +1,20 @@
+-- Input
+(2,3)
+444
+ foo bar
+ baz xyzzy
+
+ abc
+ 123
+ 555
+-- Output
+(2,5)
+444
+ // foo bar
+ // baz xyzzy
+
+ // abc
+ 123
+ 555
+-- Events
+<C-v>3jI// <Esc> \ No newline at end of file
diff --git a/src/tests/vimtests/blockvisual/commentblock_1.test b/src/tests/vimtests/blockvisual/commentblock_1.test
new file mode 100644
index 0000000..4bc4342
--- /dev/null
+++ b/src/tests/vimtests/blockvisual/commentblock_1.test
@@ -0,0 +1,14 @@
+-- Input
+(1,3)
+ foo bar
+ baz xyzzy
+ abc
+123
+-- Output
+(1,3)
+ @foo bar
+ @baz xyzzy
+ @abc
+12@3
+-- Events
+<C-v>3jI@<Esc> \ No newline at end of file
diff --git a/src/tests/vimtests/blockvisual/commentblock_2.test b/src/tests/vimtests/blockvisual/commentblock_2.test
new file mode 100644
index 0000000..14cb430
--- /dev/null
+++ b/src/tests/vimtests/blockvisual/commentblock_2.test
@@ -0,0 +1,20 @@
+-- Input
+(2,3)
+444
+ foo bar
+ baz xyzzy
+
+ abc
+ 123
+ 555
+-- Output
+(2,5)
+444
+ // foo bar
+ // baz xyzzy
+
+ // abc
+ 123
+ 555
+-- Events
+<C-v>3jI// <Esc> \ No newline at end of file
diff --git a/src/tests/vimtests/blockvisual/d.test b/src/tests/vimtests/blockvisual/d.test
new file mode 100644
index 0000000..6e5592c
--- /dev/null
+++ b/src/tests/vimtests/blockvisual/d.test
@@ -0,0 +1,12 @@
+-- Input
+(1,17)
+Lorem ipsum dolor sit amet
+abc def ghi
+qwe rty uiop
+-- Output
+(1,7)
+Lorem sit amet
+abc de
+qwe rty uiop
+-- Events
+<C-v>10hjd \ No newline at end of file
diff --git a/src/tests/vimtests/blockvisual/d_1.test b/src/tests/vimtests/blockvisual/d_1.test
new file mode 100644
index 0000000..b252b83
--- /dev/null
+++ b/src/tests/vimtests/blockvisual/d_1.test
@@ -0,0 +1,14 @@
+-- Input
+(2,3)
+ABCD
+ABCD
+ABCD
+ABCD
+-- Output
+(2,2)
+ABCD
+AD
+AD
+ABCD
+-- Events
+<C-v>jhd \ No newline at end of file
diff --git a/src/tests/vimtests/blockvisual/d_2.test b/src/tests/vimtests/blockvisual/d_2.test
new file mode 100644
index 0000000..3779fda
--- /dev/null
+++ b/src/tests/vimtests/blockvisual/d_2.test
@@ -0,0 +1,20 @@
+-- Input
+(2,1)
+444
+ foo bar
+ baz xyzzy
+
+ abc
+ 123
+ 555
+-- Output
+(2,1)
+444
+foo bar
+baz xyzzy
+
+abc
+ 123
+ 555
+-- Events
+<C-v>3jld \ No newline at end of file
diff --git a/src/tests/vimtests/blockvisual/d_3.test b/src/tests/vimtests/blockvisual/d_3.test
new file mode 100644
index 0000000..c4bad34
--- /dev/null
+++ b/src/tests/vimtests/blockvisual/d_3.test
@@ -0,0 +1,18 @@
+-- Input
+(2,1)
+foo
+
+
+
+
+bar
+-- Output
+(2,1)
+foo
+
+
+
+
+bar
+-- Events
+<C-v>3jd \ No newline at end of file
diff --git a/src/tests/vimtests/blockvisual/d_4.test b/src/tests/vimtests/blockvisual/d_4.test
new file mode 100644
index 0000000..5aedfb1
--- /dev/null
+++ b/src/tests/vimtests/blockvisual/d_4.test
@@ -0,0 +1,12 @@
+-- Input
+(1,6)
+xyzzy123
+foo
+barbaz90
+-- Output
+(1,6)
+xyzzy3
+foo
+barba0
+-- Events
+<C-v>jjld \ No newline at end of file
diff --git a/src/tests/vimtests/blockvisual/hl.test b/src/tests/vimtests/blockvisual/hl.test
new file mode 100644
index 0000000..e7f9732
--- /dev/null
+++ b/src/tests/vimtests/blockvisual/hl.test
@@ -0,0 +1,12 @@
+-- Input
+(1,17)
+Lorem ipsum dolor sit amet
+abc def ghi
+qwe rty uiop
+-- Output
+(2,7)
+Lorem ipsum dolor sit amet
+abc def ghi
+qwe rty uiop
+-- Events
+<C-v>10hj \ No newline at end of file
diff --git a/src/tests/vimtests/blockvisual/o_1.test b/src/tests/vimtests/blockvisual/o_1.test
new file mode 100644
index 0000000..b22a378
--- /dev/null
+++ b/src/tests/vimtests/blockvisual/o_1.test
@@ -0,0 +1,14 @@
+-- Input
+(2,2)
+abcd
+abcd
+abcd
+abcd
+-- Output
+(2,2)
+abcd
+abcd
+abcd
+abcd
+-- Events
+<C-v>jlo \ No newline at end of file
diff --git a/src/tests/vimtests/blockvisual/o_2.test b/src/tests/vimtests/blockvisual/o_2.test
new file mode 100644
index 0000000..7109928
--- /dev/null
+++ b/src/tests/vimtests/blockvisual/o_2.test
@@ -0,0 +1,14 @@
+-- Input
+(2,2)
+abcd
+abcd
+abcd
+abcd
+-- Output
+(2,3)
+abcd
+abcd
+abcd
+abcd
+-- Events
+<C-v>jloO \ No newline at end of file
diff --git a/src/tests/vimtests/blockvisual/o_3.test b/src/tests/vimtests/blockvisual/o_3.test
new file mode 100644
index 0000000..32c1f3c
--- /dev/null
+++ b/src/tests/vimtests/blockvisual/o_3.test
@@ -0,0 +1,14 @@
+-- Input
+(2,2)
+abcd
+abcd
+abcd
+abcd
+-- Output
+(3,3)
+abcd
+abcd
+abcd
+abcd
+-- Events
+<C-v>jloo \ No newline at end of file
diff --git a/src/tests/vimtests/blockvisual/o_4.test b/src/tests/vimtests/blockvisual/o_4.test
new file mode 100644
index 0000000..6a66b6c
--- /dev/null
+++ b/src/tests/vimtests/blockvisual/o_4.test
@@ -0,0 +1,14 @@
+-- Input
+(2,2)
+abcd
+abcd
+abcd
+abcd
+-- Output
+(3,2)
+abcd
+abcd
+abcd
+abcd
+-- Events
+<C-v>jlO \ No newline at end of file
diff --git a/src/tests/vimtests/blockvisual/o_5.test b/src/tests/vimtests/blockvisual/o_5.test
new file mode 100644
index 0000000..fe1dc6b
--- /dev/null
+++ b/src/tests/vimtests/blockvisual/o_5.test
@@ -0,0 +1,12 @@
+-- Input
+(1,17)
+Lorem ipsum dolor sit amet
+abc def ghi
+qwe rty uiop
+-- Output
+(1,2)
+Ldolor sit amet
+a
+qwe rty uiop
+-- Events
+<C-v>j2|Od \ No newline at end of file
diff --git a/src/tests/vimtests/blockvisual/o_6.test b/src/tests/vimtests/blockvisual/o_6.test
new file mode 100644
index 0000000..6d35668
--- /dev/null
+++ b/src/tests/vimtests/blockvisual/o_6.test
@@ -0,0 +1,12 @@
+-- Input
+(1,17)
+Lorem ipsum dolor sit amet
+abc def ghi
+qwe rty uiop
+-- Output
+(1,7)
+Lorem dolor sit amet
+abc de
+qwe rty uiop
+-- Events
+<C-v>10hjOhd \ No newline at end of file
diff --git a/src/tests/vimtests/blockvisual/r_1.test b/src/tests/vimtests/blockvisual/r_1.test
new file mode 100644
index 0000000..e87d78a
--- /dev/null
+++ b/src/tests/vimtests/blockvisual/r_1.test
@@ -0,0 +1,14 @@
+-- Input
+(1,3)
+ foo bar
+ baz xyzzy
+ abc
+123
+-- Output
+(1,3)
+ xoo bar
+ xaz xyzzy
+ xbc
+12x
+-- Events
+<C-v>3jrx \ No newline at end of file
diff --git a/src/tests/vimtests/blockvisual/r_2.test b/src/tests/vimtests/blockvisual/r_2.test
new file mode 100644
index 0000000..681dc56
--- /dev/null
+++ b/src/tests/vimtests/blockvisual/r_2.test
@@ -0,0 +1,10 @@
+-- Input
+(1,1)
+1234
+1234
+-- Output
+(1,2)
+1xx4
+1xx4
+-- Events
+l<C-v>ljrx \ No newline at end of file
diff --git a/src/tests/vimtests/blockvisual/r_3.test b/src/tests/vimtests/blockvisual/r_3.test
new file mode 100644
index 0000000..8a89713
--- /dev/null
+++ b/src/tests/vimtests/blockvisual/r_3.test
@@ -0,0 +1,12 @@
+-- Input
+(1,1)
+foo
+bar
+baz
+-- Output
+(1,2)
+fxx
+bxx
+baz
+-- Events
+l<C-v>ljrx \ No newline at end of file
diff --git a/src/tests/vimtests/blockvisual/switchcase_2.test b/src/tests/vimtests/blockvisual/switchcase_2.test
new file mode 100644
index 0000000..85bcccb
--- /dev/null
+++ b/src/tests/vimtests/blockvisual/switchcase_2.test
@@ -0,0 +1,10 @@
+-- Input
+(1,1)
+foo
+bar
+-- Output
+(1,1)
+FOo
+BAr
+-- Events
+<C-v>jl~ \ No newline at end of file
diff --git a/src/tests/vimtests/blockvisual/u_2.test b/src/tests/vimtests/blockvisual/u_2.test
new file mode 100644
index 0000000..2542fcb
--- /dev/null
+++ b/src/tests/vimtests/blockvisual/u_2.test
@@ -0,0 +1,12 @@
+-- Input
+(1,1)
+FOO
+BAR
+BAZ
+-- Output
+(1,1)
+foO
+baR
+baZ
+-- Events
+<C-v>ljju \ No newline at end of file
diff --git a/src/tests/vimtests/blockvisual/y_10.test b/src/tests/vimtests/blockvisual/y_10.test
new file mode 100644
index 0000000..12d4abd
--- /dev/null
+++ b/src/tests/vimtests/blockvisual/y_10.test
@@ -0,0 +1,14 @@
+-- Input
+(2,2)
+1234
+abcd
+ABCD
+XYZW
+-- Output
+(2,2)
+1234
+abcdbcd
+ABCD
+XYZW
+-- Events
+<C-v>llyP \ No newline at end of file
diff --git a/src/tests/vimtests/blockvisual/y_11.test b/src/tests/vimtests/blockvisual/y_11.test
new file mode 100644
index 0000000..ca6214e
--- /dev/null
+++ b/src/tests/vimtests/blockvisual/y_11.test
@@ -0,0 +1,14 @@
+-- Input
+(2,2)
+abcdef
+abcdef
+abcdef
+abcdef
+-- Output
+(2,2)
+abcdef
+a bcdef
+a bcdef
+a bcdef
+-- Events
+<C-v>jj>
diff --git a/src/tests/vimtests/blockvisual/y_12.test b/src/tests/vimtests/blockvisual/y_12.test
new file mode 100644
index 0000000..50391a8
--- /dev/null
+++ b/src/tests/vimtests/blockvisual/y_12.test
@@ -0,0 +1,15 @@
+-- Input
+(2,2)
+abcdef
+abcdef
+abcdef
+abcdef
+-- Output
+(3,3)
+abcdef
+abcdef
+abbcdcdef
+abbcdcdef
+ bcd
+-- Events
+<C-v>lljjyjp
diff --git a/src/tests/vimtests/blockvisual/y_13.test b/src/tests/vimtests/blockvisual/y_13.test
new file mode 100644
index 0000000..ff9aeff
--- /dev/null
+++ b/src/tests/vimtests/blockvisual/y_13.test
@@ -0,0 +1,14 @@
+-- Input
+(2,2)
+abcdef
+a bcdef
+a bcdef
+abcdef
+-- Output
+(2,2)
+abcdef
+a bcdef
+a bcdef
+a bcdef
+-- Events
+<C-v>jj> \ No newline at end of file
diff --git a/src/tests/vimtests/blockvisual/y_14.test b/src/tests/vimtests/blockvisual/y_14.test
new file mode 100644
index 0000000..5858b52
--- /dev/null
+++ b/src/tests/vimtests/blockvisual/y_14.test
@@ -0,0 +1,14 @@
+-- Input
+(2,2)
+abcdef
+a bcdef
+a bcdef
+a bcdef
+-- Output
+(2,2)
+abcdef
+abcdef
+abcdef
+abcdef
+-- Events
+<C-v>jj<lt> \ No newline at end of file
diff --git a/src/tests/vimtests/blockvisual/y_15.test b/src/tests/vimtests/blockvisual/y_15.test
new file mode 100644
index 0000000..215c050
--- /dev/null
+++ b/src/tests/vimtests/blockvisual/y_15.test
@@ -0,0 +1,14 @@
+-- Input
+(2,2)
+abcdef
+a bcdef
+a bcdef
+a bcdef
+-- Output
+(2,2)
+abcdef
+a bcdef
+a bcdef
+a bcdef
+-- Events
+<C-v>jj<lt> \ No newline at end of file
diff --git a/src/tests/vimtests/blockvisual/y_3.test b/src/tests/vimtests/blockvisual/y_3.test
new file mode 100644
index 0000000..599ef26
--- /dev/null
+++ b/src/tests/vimtests/blockvisual/y_3.test
@@ -0,0 +1,10 @@
+-- Input
+(1,1)
+12
+12
+-- Output
+(1,2)
+112
+112
+-- Events
+<C-v>jyp \ No newline at end of file
diff --git a/src/tests/vimtests/blockvisual/y_4.test b/src/tests/vimtests/blockvisual/y_4.test
new file mode 100644
index 0000000..310d7d6
--- /dev/null
+++ b/src/tests/vimtests/blockvisual/y_4.test
@@ -0,0 +1,14 @@
+-- Input
+(1,1)
+1234
+abcd
+ABCD
+XYZW
+-- Output
+(2,3)
+1234
+abbccd
+ABBCCD
+XYZW
+-- Events
+lj<C-v>ljyp \ No newline at end of file
diff --git a/src/tests/vimtests/blockvisual/y_7.test b/src/tests/vimtests/blockvisual/y_7.test
new file mode 100644
index 0000000..05b8588
--- /dev/null
+++ b/src/tests/vimtests/blockvisual/y_7.test
@@ -0,0 +1,14 @@
+-- Input
+(1,1)
+1234
+abcd
+ABCD
+XYZW
+-- Output
+(2,2)
+1234
+abcbcd
+ABCBCD
+XYZW
+-- Events
+lj<C-v>ljyP \ No newline at end of file
diff --git a/src/tests/vimtests/blockvisual/y_8.test b/src/tests/vimtests/blockvisual/y_8.test
new file mode 100644
index 0000000..e853b94
--- /dev/null
+++ b/src/tests/vimtests/blockvisual/y_8.test
@@ -0,0 +1,14 @@
+-- Input
+(1,1)
+1234
+abcd
+ABCD
+XYZW
+-- Output
+(1,5)
+12344
+abcdd
+ABCDD
+XYZW
+-- Events
+$<C-v>jjyp \ No newline at end of file
diff --git a/src/tests/vimtests/blockvisual/y_9.test b/src/tests/vimtests/blockvisual/y_9.test
new file mode 100644
index 0000000..b887179
--- /dev/null
+++ b/src/tests/vimtests/blockvisual/y_9.test
@@ -0,0 +1,14 @@
+-- Input
+(2,2)
+1234
+abcd
+ABCD
+XYZW
+-- Output
+(2,2)
+1234
+abcdbcd
+ABCD
+XYZW
+-- Events
+<C-v>llllllllyP \ No newline at end of file
diff --git a/src/tests/vimtests/change/C_part_of_line.test b/src/tests/vimtests/change/C_part_of_line.test
new file mode 100644
index 0000000..8909ced
--- /dev/null
+++ b/src/tests/vimtests/change/C_part_of_line.test
@@ -0,0 +1,12 @@
+-- Input
+(1,9)
+Lorem ipsum dolor sit amet
+abc def ghi
+qwe rty uiop
+-- Output
+(1,11)
+Lorem ipman
+abc def ghi
+qwe rty uiop
+-- Events
+Cman<Esc> \ No newline at end of file
diff --git a/src/tests/vimtests/change/C_whole_line.test b/src/tests/vimtests/change/C_whole_line.test
new file mode 100644
index 0000000..06ff576
--- /dev/null
+++ b/src/tests/vimtests/change/C_whole_line.test
@@ -0,0 +1,12 @@
+-- Input
+(1,1)
+Lorem ipsum dolor sit amet
+abc def ghi
+qwe rty uiop
+-- Output
+(1,3)
+man
+abc def ghi
+qwe rty uiop
+-- Events
+Cman<Esc> \ No newline at end of file
diff --git a/src/tests/vimtests/change/S.test b/src/tests/vimtests/change/S.test
new file mode 100644
index 0000000..308a5ee
--- /dev/null
+++ b/src/tests/vimtests/change/S.test
@@ -0,0 +1,12 @@
+-- Input
+(1,11)
+Lorem ipsum dolor sit amet
+abc def ghi
+qwe rty uiop
+-- Output
+(1,3)
+man
+abc def ghi
+qwe rty uiop
+-- Events
+Sman<Esc> \ No newline at end of file
diff --git a/src/tests/vimtests/change/c3l.test b/src/tests/vimtests/change/c3l.test
new file mode 100644
index 0000000..6a531d9
--- /dev/null
+++ b/src/tests/vimtests/change/c3l.test
@@ -0,0 +1,12 @@
+-- Input
+(1,1)
+Lorem ipsum dolor sit amet
+abc def ghi
+qwe rty uiop
+-- Output
+(1,11)
+xem ipsum xor sit amet
+abc def ghi
+qwe rty uiop
+-- Events
+c3lx<Esc>ww. \ No newline at end of file
diff --git a/src/tests/vimtests/change/ciw.test b/src/tests/vimtests/change/ciw.test
new file mode 100644
index 0000000..a82a040
--- /dev/null
+++ b/src/tests/vimtests/change/ciw.test
@@ -0,0 +1,12 @@
+-- Input
+(1,1)
+Lorem ipsum dolor sit amet
+abc def ghi
+qwe rty uiop
+-- Output
+(1,3)
+foo ipsum dolor sit amet
+abc def ghi
+qwe rty uiop
+-- Events
+ciwfoo<Esc> \ No newline at end of file
diff --git a/src/tests/vimtests/delete/10dd.test b/src/tests/vimtests/delete/10dd.test
new file mode 100644
index 0000000..df9437b
--- /dev/null
+++ b/src/tests/vimtests/delete/10dd.test
@@ -0,0 +1,10 @@
+-- Input
+(2,2)
+Lorem ipsum dolor sit amet
+abc def ghi
+qwe rty uiop
+-- Output
+(1,1)
+Lorem ipsum dolor sit amet
+-- Events
+10dd \ No newline at end of file
diff --git a/src/tests/vimtests/delete/2d3w.test b/src/tests/vimtests/delete/2d3w.test
new file mode 100644
index 0000000..541dad8
--- /dev/null
+++ b/src/tests/vimtests/delete/2d3w.test
@@ -0,0 +1,8 @@
+-- Input
+(1,1)
+a b c d e f g h
+-- Output
+(1,1)
+g h
+-- Events
+2d3w \ No newline at end of file
diff --git a/src/tests/vimtests/delete/2d3w_1.test b/src/tests/vimtests/delete/2d3w_1.test
new file mode 100644
index 0000000..35d7a28
--- /dev/null
+++ b/src/tests/vimtests/delete/2d3w_1.test
@@ -0,0 +1,10 @@
+-- Input
+(1,1)
+a b c d e f g h
+a b c d e f g h
+-- Output
+(2,1)
+g h
+e f g h
+-- Events
+2d3wj4. \ No newline at end of file
diff --git a/src/tests/vimtests/delete/2dd.test b/src/tests/vimtests/delete/2dd.test
new file mode 100644
index 0000000..dc4b697
--- /dev/null
+++ b/src/tests/vimtests/delete/2dd.test
@@ -0,0 +1,10 @@
+-- Input
+(1,1)
+Lorem ipsum dolor sit amet
+abc def ghi
+qwe rty uiop
+-- Output
+(1,1)
+qwe rty uiop
+-- Events
+2dd \ No newline at end of file
diff --git a/src/tests/vimtests/delete/C-u_1.test b/src/tests/vimtests/delete/C-u_1.test
new file mode 100644
index 0000000..06301f8
--- /dev/null
+++ b/src/tests/vimtests/delete/C-u_1.test
@@ -0,0 +1,10 @@
+-- Input
+(2,5)
+Lorem ipsum dolor sit amet
+qwe rty uiop
+-- Output
+(2,1)
+Lorem ipsum dolor sit amet
+rty uiop
+-- Events
+i<C-u>
diff --git a/src/tests/vimtests/delete/C-u_2.test b/src/tests/vimtests/delete/C-u_2.test
new file mode 100644
index 0000000..29243c4
--- /dev/null
+++ b/src/tests/vimtests/delete/C-u_2.test
@@ -0,0 +1,9 @@
+-- Input
+(2,1)
+foo bar
+baz
+-- Output
+(1,8)
+foo barbaz
+-- Events
+i<C-u>
diff --git a/src/tests/vimtests/delete/capD.test b/src/tests/vimtests/delete/capD.test
new file mode 100644
index 0000000..5003d90
--- /dev/null
+++ b/src/tests/vimtests/delete/capD.test
@@ -0,0 +1,12 @@
+-- Input
+(1,1)
+ foo
+ bar
+ baz
+-- Output
+(2,2)
+ foo
+ b
+ baz
+-- Events
+jllD \ No newline at end of file
diff --git a/src/tests/vimtests/delete/capX.test b/src/tests/vimtests/delete/capX.test
new file mode 100644
index 0000000..795af04
--- /dev/null
+++ b/src/tests/vimtests/delete/capX.test
@@ -0,0 +1,10 @@
+-- Input
+(1,1)
+A very intelligent turtle
+Found programming UNIX a hurdle
+-- Output
+(2,11)
+A very intelligent turtle
+Found progng UNIX a hurdle
+-- Events
+15lj3XXX \ No newline at end of file
diff --git a/src/tests/vimtests/delete/capX_1.test b/src/tests/vimtests/delete/capX_1.test
new file mode 100644
index 0000000..9d9ff42
--- /dev/null
+++ b/src/tests/vimtests/delete/capX_1.test
@@ -0,0 +1,12 @@
+-- Input
+(2,2)
+foo
+bar
+baz
+-- Output
+(2,1)
+foo
+ar
+baz
+-- Events
+5X \ No newline at end of file
diff --git a/src/tests/vimtests/delete/d0.test b/src/tests/vimtests/delete/d0.test
new file mode 100644
index 0000000..c61fc12
--- /dev/null
+++ b/src/tests/vimtests/delete/d0.test
@@ -0,0 +1,12 @@
+-- Input
+(1,1)
+abc def ghi
+123 456 789
+lorem ipsum
+-- Output
+(1,1)
+bc def ghi
+123 456 789
+lorem ipsum
+-- Events
+dl \ No newline at end of file
diff --git a/src/tests/vimtests/delete/d2G.test b/src/tests/vimtests/delete/d2G.test
new file mode 100644
index 0000000..3f4f152
--- /dev/null
+++ b/src/tests/vimtests/delete/d2G.test
@@ -0,0 +1,12 @@
+-- Input
+(3,1)
+Lorem ipsum dolor sit amet
+abc def ghi
+qwe rty uiop
+aze rty uiop
+-- Output
+(2,1)
+Lorem ipsum dolor sit amet
+aze rty uiop
+-- Events
+d2G
diff --git a/src/tests/vimtests/delete/d2vd.test b/src/tests/vimtests/delete/d2vd.test
new file mode 100644
index 0000000..d73fccc
--- /dev/null
+++ b/src/tests/vimtests/delete/d2vd.test
@@ -0,0 +1,12 @@
+-- Input
+(2,8)
+Lorem ipsum dolor sit amet
+ abc def ghi
+qwe rty uiop
+-- Output
+(2,7)
+Lorem ipsum dolor sit amet
+ abc
+qwe rty uiop
+-- Events
+d2vd
diff --git a/src/tests/vimtests/delete/d2vd_1.test b/src/tests/vimtests/delete/d2vd_1.test
new file mode 100644
index 0000000..1a32eef
--- /dev/null
+++ b/src/tests/vimtests/delete/d2vd_1.test
@@ -0,0 +1,11 @@
+-- Input
+(2,8)
+Lorem ipsum dolor sit amet
+ abc def ghi
+ qwe rty uiop
+-- Output
+(2,8)
+Lorem ipsum dolor sit amet
+ abc qwe rty uiop
+-- Events
+d2vd
diff --git a/src/tests/vimtests/delete/d3G.test b/src/tests/vimtests/delete/d3G.test
new file mode 100644
index 0000000..56d93af
--- /dev/null
+++ b/src/tests/vimtests/delete/d3G.test
@@ -0,0 +1,12 @@
+-- Input
+(2,1)
+Lorem ipsum dolor sit amet
+abc def ghi
+qwe rty uiop
+aze rty uiop
+-- Output
+(2,1)
+Lorem ipsum dolor sit amet
+aze rty uiop
+-- Events
+d3G
diff --git a/src/tests/vimtests/delete/d3vd.test b/src/tests/vimtests/delete/d3vd.test
new file mode 100644
index 0000000..d7a1c95
--- /dev/null
+++ b/src/tests/vimtests/delete/d3vd.test
@@ -0,0 +1,12 @@
+-- Input
+(2,8)
+Lorem ipsum dolor sit amet
+ abc def ghi
+ qwe rty uiop
+ qwe rty uiop
+-- Output
+(2,8)
+Lorem ipsum dolor sit amet
+ abc qwe rty uiop
+-- Events
+d3vd
diff --git a/src/tests/vimtests/delete/dVl.test b/src/tests/vimtests/delete/dVl.test
new file mode 100644
index 0000000..b7f48c1
--- /dev/null
+++ b/src/tests/vimtests/delete/dVl.test
@@ -0,0 +1,11 @@
+-- Input
+(2,1)
+Lorem ipsum dolor sit amet
+abc def ghi
+qwe rty uiop
+-- Output
+(2,1)
+Lorem ipsum dolor sit amet
+qwe rty uiop
+-- Events
+dVl \ No newline at end of file
diff --git a/src/tests/vimtests/delete/d_capG.test b/src/tests/vimtests/delete/d_capG.test
new file mode 100644
index 0000000..19f7d91
--- /dev/null
+++ b/src/tests/vimtests/delete/d_capG.test
@@ -0,0 +1,11 @@
+-- Input
+(1,1)
+Lorem ipsum dolor sit amet
+abc def ghi
+qwe rty uiop
+aze rty uiop
+-- Output
+(1,1)
+
+-- Events
+dG
diff --git a/src/tests/vimtests/delete/d_capV}.test b/src/tests/vimtests/delete/d_capV}.test
new file mode 100644
index 0000000..38c8e8a
--- /dev/null
+++ b/src/tests/vimtests/delete/d_capV}.test
@@ -0,0 +1,10 @@
+-- Input
+(1,5)
+Foo bar baz
+
+123 234 345
+-- Output
+(1,1)
+123 234 345
+-- Events
+dV} \ No newline at end of file
diff --git a/src/tests/vimtests/delete/daw.test b/src/tests/vimtests/delete/daw.test
new file mode 100644
index 0000000..4bf377f
--- /dev/null
+++ b/src/tests/vimtests/delete/daw.test
@@ -0,0 +1,12 @@
+-- Input
+(1,1)
+Lorem ipsum dolor sit amet
+abc def ghi
+qwe rty uiop
+-- Output
+(1,1)
+ipsum dolor sit amet
+abc def ghi
+qwe rty uiop
+-- Events
+daw \ No newline at end of file
diff --git a/src/tests/vimtests/delete/dd.test b/src/tests/vimtests/delete/dd.test
new file mode 100644
index 0000000..69cb816
--- /dev/null
+++ b/src/tests/vimtests/delete/dd.test
@@ -0,0 +1,11 @@
+-- Input
+(1,1)
+Lorem ipsum dolor sit amet
+abc def ghi
+qwe rty uiop
+-- Output
+(2,1)
+Lorem ipsum dolor sit amet
+qwe rty uiop
+-- Events
+jdd \ No newline at end of file
diff --git a/src/tests/vimtests/delete/dd_1.test b/src/tests/vimtests/delete/dd_1.test
new file mode 100644
index 0000000..ec607df
--- /dev/null
+++ b/src/tests/vimtests/delete/dd_1.test
@@ -0,0 +1,11 @@
+-- Input
+(1,1)
+Lorem ipsum dolor sit amet
+abc def ghi
+qwe rty uiop
+-- Output
+(2,1)
+Lorem ipsum dolor sit amet
+qwe rty uiop
+-- Events
+j$dd \ No newline at end of file
diff --git a/src/tests/vimtests/delete/dd_2.test b/src/tests/vimtests/delete/dd_2.test
new file mode 100644
index 0000000..5478d71
--- /dev/null
+++ b/src/tests/vimtests/delete/dd_2.test
@@ -0,0 +1,10 @@
+-- Input
+(1,1)
+Lorem ipsum dolor sit amet
+abc def ghi
+qwe rty uiop
+-- Output
+(1,1)
+qwe rty uiop
+-- Events
+$2dd \ No newline at end of file
diff --git a/src/tests/vimtests/delete/dd_3.test b/src/tests/vimtests/delete/dd_3.test
new file mode 100644
index 0000000..d2dc290
--- /dev/null
+++ b/src/tests/vimtests/delete/dd_3.test
@@ -0,0 +1,11 @@
+-- Input
+(3,3)
+Lorem ipsum dolor sit amet
+abc def ghi
+qwe rty uiop
+-- Output
+(2,1)
+Lorem ipsum dolor sit amet
+abc def ghi
+-- Events
+dd \ No newline at end of file
diff --git a/src/tests/vimtests/delete/dd_4.test b/src/tests/vimtests/delete/dd_4.test
new file mode 100644
index 0000000..7b23cfc
--- /dev/null
+++ b/src/tests/vimtests/delete/dd_4.test
@@ -0,0 +1,12 @@
+-- Input
+(2,1)
+Lorem ipsum dolor sit amet
+abc def ghi
+qwe rty uiop
+
+-- Output
+(2,1)
+Lorem ipsum dolor sit amet
+
+-- Events
+2dd \ No newline at end of file
diff --git a/src/tests/vimtests/delete/dd_5.test b/src/tests/vimtests/delete/dd_5.test
new file mode 100644
index 0000000..c626ca7
--- /dev/null
+++ b/src/tests/vimtests/delete/dd_5.test
@@ -0,0 +1,14 @@
+-- Input
+(2,1)
+Lorem ipsum dolor sit amet
+abc def ghi
+qwe rty uiop
+
+
+-- Output
+(2,1)
+Lorem ipsum dolor sit amet
+
+
+-- Events
+2dd \ No newline at end of file
diff --git a/src/tests/vimtests/delete/de.test b/src/tests/vimtests/delete/de.test
new file mode 100644
index 0000000..853255d
--- /dev/null
+++ b/src/tests/vimtests/delete/de.test
@@ -0,0 +1,12 @@
+-- Input
+(1,1)
+Lorem ipsum dolor sit amet
+abc def ghi
+qwe rty uiop
+-- Output
+(1,1)
+ ipsum dolor sit amet
+abc def ghi
+qwe rty uiop
+-- Events
+de \ No newline at end of file
diff --git a/src/tests/vimtests/delete/diw.test b/src/tests/vimtests/delete/diw.test
new file mode 100644
index 0000000..fffb045
--- /dev/null
+++ b/src/tests/vimtests/delete/diw.test
@@ -0,0 +1,12 @@
+-- Input
+(1,1)
+Lorem ipsum dolor sit amet
+abc def ghi
+qwe rty uiop
+-- Output
+(1,1)
+ ipsum dolor sit amet
+abc def ghi
+qwe rty uiop
+-- Events
+diw \ No newline at end of file
diff --git a/src/tests/vimtests/delete/dj.test b/src/tests/vimtests/delete/dj.test
new file mode 100644
index 0000000..08598f0
--- /dev/null
+++ b/src/tests/vimtests/delete/dj.test
@@ -0,0 +1,10 @@
+-- Input
+(1,1)
+Lorem ipsum dolor sit amet
+abc def ghi
+qwe rty uiop
+-- Output
+(1,1)
+qwe rty uiop
+-- Events
+dj \ No newline at end of file
diff --git a/src/tests/vimtests/delete/dt.test b/src/tests/vimtests/delete/dt.test
new file mode 100644
index 0000000..5af0e04
--- /dev/null
+++ b/src/tests/vimtests/delete/dt.test
@@ -0,0 +1,12 @@
+-- Input
+(2,10)
+Lorem ipsum dolor sit amet
+[peanut butter and jelly]
+qwe rty uiop
+-- Output
+(2,10)
+Lorem ipsum dolor sit amet
+[peanut b]
+qwe rty uiop
+-- Events
+dt] \ No newline at end of file
diff --git a/src/tests/vimtests/delete/dvd.test b/src/tests/vimtests/delete/dvd.test
new file mode 100644
index 0000000..a4d85e3
--- /dev/null
+++ b/src/tests/vimtests/delete/dvd.test
@@ -0,0 +1,12 @@
+-- Input
+(2,8)
+Lorem ipsum dolor sit amet
+ abc def ghi
+qwe rty uiop
+-- Output
+(2,4)
+Lorem ipsum dolor sit amet
+ def ghi
+qwe rty uiop
+-- Events
+dvd \ No newline at end of file
diff --git a/src/tests/vimtests/delete/dve.test b/src/tests/vimtests/delete/dve.test
new file mode 100644
index 0000000..41ea833
--- /dev/null
+++ b/src/tests/vimtests/delete/dve.test
@@ -0,0 +1,8 @@
+-- Input
+(1,1)
+Foo bar baz
+-- Output
+(1,1)
+o bar baz
+-- Events
+dve \ No newline at end of file
diff --git a/src/tests/vimtests/delete/dv}.test b/src/tests/vimtests/delete/dv}.test
new file mode 100644
index 0000000..83e40fe
--- /dev/null
+++ b/src/tests/vimtests/delete/dv}.test
@@ -0,0 +1,10 @@
+-- Input
+(1,5)
+Foo bar baz
+
+123 234 345
+-- Output
+(1,5)
+Foo 123 234 345
+-- Events
+dv} \ No newline at end of file
diff --git a/src/tests/vimtests/delete/dw_1.test b/src/tests/vimtests/delete/dw_1.test
new file mode 100644
index 0000000..749e868
--- /dev/null
+++ b/src/tests/vimtests/delete/dw_1.test
@@ -0,0 +1,12 @@
+-- Input
+(1,1)
+Lorem ipsum dolor sit amet
+abc def ghi
+qwe rty uiop
+-- Output
+(1,1)
+sit amet
+abc def ghi
+qwe rty uiop
+-- Events
+dw.. \ No newline at end of file
diff --git a/src/tests/vimtests/delete/d}.test b/src/tests/vimtests/delete/d}.test
new file mode 100644
index 0000000..45497ef
--- /dev/null
+++ b/src/tests/vimtests/delete/d}.test
@@ -0,0 +1,12 @@
+-- Input
+(1,5)
+Foo bar baz
+
+123 234 345
+-- Output
+(1,4)
+Foo
+
+123 234 345
+-- Events
+d}
diff --git a/src/tests/vimtests/delete/ld3w.test b/src/tests/vimtests/delete/ld3w.test
new file mode 100644
index 0000000..2874ff9
--- /dev/null
+++ b/src/tests/vimtests/delete/ld3w.test
@@ -0,0 +1,10 @@
+-- Input
+(1,1)
+1 2 3
+4 5 6
+-- Output
+(1,1)
+1
+4 5 6
+-- Events
+ld3w \ No newline at end of file
diff --git a/src/tests/vimtests/delete/ld3w_1.test b/src/tests/vimtests/delete/ld3w_1.test
new file mode 100644
index 0000000..327578d
--- /dev/null
+++ b/src/tests/vimtests/delete/ld3w_1.test
@@ -0,0 +1,8 @@
+-- Input
+(1,1)
+1 2 3 4 5 6
+-- Output
+(1,2)
+14 5 6
+-- Events
+ld3w \ No newline at end of file
diff --git a/src/tests/vimtests/delete/ldw.test b/src/tests/vimtests/delete/ldw.test
new file mode 100644
index 0000000..0c9131c
--- /dev/null
+++ b/src/tests/vimtests/delete/ldw.test
@@ -0,0 +1,10 @@
+-- Input
+(1,1)
+1 2 3
+4 5 6
+-- Output
+(1,2)
+12 3
+4 5 6
+-- Events
+ldw \ No newline at end of file
diff --git a/src/tests/vimtests/delete/ldwdw.test b/src/tests/vimtests/delete/ldwdw.test
new file mode 100644
index 0000000..ad32299
--- /dev/null
+++ b/src/tests/vimtests/delete/ldwdw.test
@@ -0,0 +1,10 @@
+-- Input
+(1,1)
+1 2 3
+4 5 6
+-- Output
+(1,2)
+13
+4 5 6
+-- Events
+ldwdw \ No newline at end of file
diff --git a/src/tests/vimtests/delete/spec_delete.test b/src/tests/vimtests/delete/spec_delete.test
new file mode 100644
index 0000000..fcd36a0
--- /dev/null
+++ b/src/tests/vimtests/delete/spec_delete.test
@@ -0,0 +1,12 @@
+-- Input
+(2,2)
+foo
+bar
+baz
+-- Output
+(2,2)
+foo
+br
+baz
+-- Events
+<Del> \ No newline at end of file
diff --git a/src/tests/vimtests/delete/x.test b/src/tests/vimtests/delete/x.test
new file mode 100644
index 0000000..c844cd9
--- /dev/null
+++ b/src/tests/vimtests/delete/x.test
@@ -0,0 +1,10 @@
+-- Input
+(1,1)
+A very intelligent turtle
+Found programming UNIX a hurdle
+-- Output
+(2,4)
+A very intelligent turtle
+Foumming UNIX a hurdle
+-- Events
+3lj5xxxxx \ No newline at end of file
diff --git a/src/tests/vimtests/delete/x_1.test b/src/tests/vimtests/delete/x_1.test
new file mode 100644
index 0000000..f1b123d
--- /dev/null
+++ b/src/tests/vimtests/delete/x_1.test
@@ -0,0 +1,12 @@
+-- Input
+(2,2)
+foo
+bar
+baz
+-- Output
+(2,1)
+foo
+b
+baz
+-- Events
+5x \ No newline at end of file
diff --git a/src/tests/vimtests/digraphs/ae.test b/src/tests/vimtests/digraphs/ae.test
new file mode 100644
index 0000000..2de8069
--- /dev/null
+++ b/src/tests/vimtests/digraphs/ae.test
@@ -0,0 +1,8 @@
+-- Input
+(1,5)
+abcdf
+-- Output
+(1,5)
+abcdæf
+-- Events
+i<C-k>ae<Esc> \ No newline at end of file
diff --git a/src/tests/vimtests/digraphs/eacute.test b/src/tests/vimtests/digraphs/eacute.test
new file mode 100644
index 0000000..b034a06
--- /dev/null
+++ b/src/tests/vimtests/digraphs/eacute.test
@@ -0,0 +1,8 @@
+-- Input
+(1,5)
+abcdf
+-- Output
+(1,5)
+abcdéf
+-- Events
+i<C-k>'e<Esc> \ No newline at end of file
diff --git a/src/tests/vimtests/empty/empty.test b/src/tests/vimtests/empty/empty.test
new file mode 100644
index 0000000..ee7c19e
--- /dev/null
+++ b/src/tests/vimtests/empty/empty.test
@@ -0,0 +1,13 @@
+-- Input
+(1,1)
+
+
+
+
+-- Output
+(1,1)
+
+
+
+
+-- Events
diff --git a/src/tests/vimtests/empty/emptytest/events b/src/tests/vimtests/empty/emptytest/events
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/src/tests/vimtests/empty/emptytest/events
diff --git a/src/tests/vimtests/empty/emptytest/input b/src/tests/vimtests/empty/emptytest/input
new file mode 100644
index 0000000..3e17593
--- /dev/null
+++ b/src/tests/vimtests/empty/emptytest/input
@@ -0,0 +1,8 @@
+(1,1)
+
+
+
+
+
+
+
diff --git a/src/tests/vimtests/empty/emptytest/output b/src/tests/vimtests/empty/emptytest/output
new file mode 100644
index 0000000..3e17593
--- /dev/null
+++ b/src/tests/vimtests/empty/emptytest/output
@@ -0,0 +1,8 @@
+(1,1)
+
+
+
+
+
+
+
diff --git a/src/tests/vimtests/ex/d/1.test b/src/tests/vimtests/ex/d/1.test
new file mode 100644
index 0000000..3aa2ac3
--- /dev/null
+++ b/src/tests/vimtests/ex/d/1.test
@@ -0,0 +1,11 @@
+-- Input
+(1,1)
+foo
+bar
+baz
+-- Output
+(2,1)
+foo
+baz
+-- Events
+j:d<CR>
diff --git a/src/tests/vimtests/ex/d/2.test b/src/tests/vimtests/ex/d/2.test
new file mode 100644
index 0000000..0cd01a5
--- /dev/null
+++ b/src/tests/vimtests/ex/d/2.test
@@ -0,0 +1,11 @@
+-- Input
+(1,1)
+foo
+bar
+baz
+-- Output
+(2,1)
+foo
+baz
+-- Events
+j:delete<CR>
diff --git a/src/tests/vimtests/ex/empty.test b/src/tests/vimtests/ex/empty.test
new file mode 100644
index 0000000..7afc495
--- /dev/null
+++ b/src/tests/vimtests/ex/empty.test
@@ -0,0 +1,8 @@
+-- Input
+(1,1)
+
+-- Output
+(1,1)
+
+-- Events
+:<CR>:<CR>:<CR> \ No newline at end of file
diff --git a/src/tests/vimtests/ex/esc.test b/src/tests/vimtests/ex/esc.test
new file mode 100644
index 0000000..79f245a
--- /dev/null
+++ b/src/tests/vimtests/ex/esc.test
@@ -0,0 +1,12 @@
+-- Input
+(1,1)
+foo
+bar
+baz
+-- Output
+(2,2)
+foo
+bar
+baz
+-- Events
+ll:<Esc>hj
diff --git a/src/tests/vimtests/ex/esc_1.test b/src/tests/vimtests/ex/esc_1.test
new file mode 100644
index 0000000..e745956
--- /dev/null
+++ b/src/tests/vimtests/ex/esc_1.test
@@ -0,0 +1,12 @@
+-- Input
+(1,1)
+foo
+bar
+baz
+-- Output
+(2,2)
+foo
+bar
+baz
+-- Events
+ll:blah<Esc>hj
diff --git a/src/tests/vimtests/ex/fail.test b/src/tests/vimtests/ex/fail.test
new file mode 100644
index 0000000..0ee31be
--- /dev/null
+++ b/src/tests/vimtests/ex/fail.test
@@ -0,0 +1,12 @@
+-- Input
+(1,1)
+foo
+bar
+baz
+-- Output
+(2,2)
+foo
+bar
+baz
+-- Events
+ll:blah<CR>hj
diff --git a/src/tests/vimtests/ex/g/1.test b/src/tests/vimtests/ex/g/1.test
new file mode 100644
index 0000000..1c94cc3
--- /dev/null
+++ b/src/tests/vimtests/ex/g/1.test
@@ -0,0 +1,20 @@
+-- Input
+(2,1)
+a 1
+bb 2
+bb 3
+bb 4
+ba 5
+bb 6
+bb 3
+-- Output
+(2,1)
+a 1
+bb 2
+bb x
+bb 4
+ba 5
+bb 6
+bb x
+-- Events
+:g/bb/s/3/x/<CR>
diff --git a/src/tests/vimtests/ex/g/2.test b/src/tests/vimtests/ex/g/2.test
new file mode 100644
index 0000000..25bb594
--- /dev/null
+++ b/src/tests/vimtests/ex/g/2.test
@@ -0,0 +1,19 @@
+-- Input
+(1,1)
+a 1
+bb 2
+bb 3
+bb 4
+ba 5
+bb 6
+bb 7
+-- Output
+(1,1)
+a 1
+bb 2
+bb 3
+bb 4
+bb 6
+bb 7
+-- Events
+:g/ba/d<CR>
diff --git a/src/tests/vimtests/ex/gotoline/1.test b/src/tests/vimtests/ex/gotoline/1.test
new file mode 100644
index 0000000..f23ffa0
--- /dev/null
+++ b/src/tests/vimtests/ex/gotoline/1.test
@@ -0,0 +1,14 @@
+-- Input
+(1,1)
+foo
+bar
+baz
+xyzzy
+-- Output
+(3,1)
+foo
+bar
+baz
+xyzzy
+-- Events
+:3<CR> \ No newline at end of file
diff --git a/src/tests/vimtests/ex/gotoline/2.test b/src/tests/vimtests/ex/gotoline/2.test
new file mode 100644
index 0000000..c5dffc3
--- /dev/null
+++ b/src/tests/vimtests/ex/gotoline/2.test
@@ -0,0 +1,14 @@
+-- Input
+(1,1)
+foo
+bar
+ baz
+xyzzy
+-- Output
+(3,3)
+foo
+bar
+ baz
+xyzzy
+-- Events
+:3<CR> \ No newline at end of file
diff --git a/src/tests/vimtests/ex/gotoline/3.test b/src/tests/vimtests/ex/gotoline/3.test
new file mode 100644
index 0000000..760221d
--- /dev/null
+++ b/src/tests/vimtests/ex/gotoline/3.test
@@ -0,0 +1,14 @@
+-- Input
+(1,1)
+foo
+bar
+ baz
+xyzzy
+-- Output
+(1,1)
+foo
+bar
+ baz
+xyzzy
+-- Events
+:0<CR> \ No newline at end of file
diff --git a/src/tests/vimtests/ex/gotoline/4.test b/src/tests/vimtests/ex/gotoline/4.test
new file mode 100644
index 0000000..0b43c9e
--- /dev/null
+++ b/src/tests/vimtests/ex/gotoline/4.test
@@ -0,0 +1,14 @@
+-- Input
+(1,1)
+foo
+bar
+ baz
+xyzzy
+-- Output
+(4,1)
+foo
+bar
+ baz
+xyzzy
+-- Events
+:100500<CR> \ No newline at end of file
diff --git a/src/tests/vimtests/ex/s/1.test b/src/tests/vimtests/ex/s/1.test
new file mode 100644
index 0000000..06bbe0a
--- /dev/null
+++ b/src/tests/vimtests/ex/s/1.test
@@ -0,0 +1,12 @@
+-- Input
+(1,1)
+foo
+bar
+baz
+-- Output
+(2,1)
+foo
+car
+baz
+-- Events
+j:s/b/c/<CR>
diff --git a/src/tests/vimtests/ex/s/1_dollar.test b/src/tests/vimtests/ex/s/1_dollar.test
new file mode 100644
index 0000000..25fb0b2
--- /dev/null
+++ b/src/tests/vimtests/ex/s/1_dollar.test
@@ -0,0 +1,12 @@
+-- Input
+(1,1)
+foo
+bar
+baz
+-- Output
+(2,1)
+foo
+car
+baz
+-- Events
+j:s$b$c$<CR> \ No newline at end of file
diff --git a/src/tests/vimtests/ex/s/1_question.test b/src/tests/vimtests/ex/s/1_question.test
new file mode 100644
index 0000000..2a381be
--- /dev/null
+++ b/src/tests/vimtests/ex/s/1_question.test
@@ -0,0 +1,12 @@
+-- Input
+(1,1)
+foo
+bar
+baz
+-- Output
+(2,1)
+foo
+car
+baz
+-- Events
+j:s?b?c?<CR> \ No newline at end of file
diff --git a/src/tests/vimtests/ex/s/1_sharp.test b/src/tests/vimtests/ex/s/1_sharp.test
new file mode 100644
index 0000000..37ab036
--- /dev/null
+++ b/src/tests/vimtests/ex/s/1_sharp.test
@@ -0,0 +1,12 @@
+-- Input
+(1,1)
+foo
+bar
+baz
+-- Output
+(2,1)
+foo
+car
+baz
+-- Events
+j:s#b#c#<CR> \ No newline at end of file
diff --git a/src/tests/vimtests/ex/s/2.test b/src/tests/vimtests/ex/s/2.test
new file mode 100644
index 0000000..d7dec56
--- /dev/null
+++ b/src/tests/vimtests/ex/s/2.test
@@ -0,0 +1,12 @@
+-- Input
+(1,1)
+foo
+bar
+baz
+-- Output
+(2,1)
+foo
+car
+caz
+-- Events
+j:%s/b/c/<CR>
diff --git a/src/tests/vimtests/ex/s/3.test b/src/tests/vimtests/ex/s/3.test
new file mode 100644
index 0000000..cd4452c
--- /dev/null
+++ b/src/tests/vimtests/ex/s/3.test
@@ -0,0 +1,12 @@
+-- Input
+(1,1)
+foo
+bbar
+baz
+-- Output
+(2,1)
+foo
+cbar
+baz
+-- Events
+j:s/b/c/<CR>
diff --git a/src/tests/vimtests/ex/s/4.test b/src/tests/vimtests/ex/s/4.test
new file mode 100644
index 0000000..6640abf
--- /dev/null
+++ b/src/tests/vimtests/ex/s/4.test
@@ -0,0 +1,12 @@
+-- Input
+(1,1)
+foo
+bbar
+baz
+-- Output
+(2,1)
+foo
+ccar
+baz
+-- Events
+j:s/b/c/g<CR>
diff --git a/src/tests/vimtests/ex/s/5.test b/src/tests/vimtests/ex/s/5.test
new file mode 100644
index 0000000..92ea370
--- /dev/null
+++ b/src/tests/vimtests/ex/s/5.test
@@ -0,0 +1,12 @@
+-- Input
+(1,1)
+foo
+bbar
+bbaz
+-- Output
+(2,1)
+foo
+cbar
+cbaz
+-- Events
+j:%s/b/c/<CR>
diff --git a/src/tests/vimtests/ex/s/6.test b/src/tests/vimtests/ex/s/6.test
new file mode 100644
index 0000000..0037476
--- /dev/null
+++ b/src/tests/vimtests/ex/s/6.test
@@ -0,0 +1,12 @@
+-- Input
+(1,1)
+foo
+bbar
+bbaz
+-- Output
+(2,1)
+foo
+ccar
+ccaz
+-- Events
+j:%s/b/c/g<CR>
diff --git a/src/tests/vimtests/ex/s/7.test b/src/tests/vimtests/ex/s/7.test
new file mode 100644
index 0000000..a6b0bb2
--- /dev/null
+++ b/src/tests/vimtests/ex/s/7.test
@@ -0,0 +1,16 @@
+-- Input
+(1,1)
+foo
+bbar
+bbaz
+bbaz
+quux
+-- Output
+(2,1)
+foo
+cbar
+cbaz
+cbaz
+quux
+-- Events
+j:%s/b/c/<CR>
diff --git a/src/tests/vimtests/find/f.test b/src/tests/vimtests/find/f.test
new file mode 100644
index 0000000..1c8cdc2
--- /dev/null
+++ b/src/tests/vimtests/find/f.test
@@ -0,0 +1,12 @@
+-- Input
+(1,1)
+Lorem ipsum dolor sit amet
+abc def ghi
+qwe rty uiop
+-- Output
+(1,7)
+Lorem ipsum dolor sit amet
+abc def ghi
+qwe rty uiop
+-- Events
+fi \ No newline at end of file
diff --git a/src/tests/vimtests/find/f1.test b/src/tests/vimtests/find/f1.test
new file mode 100644
index 0000000..2e41f02
--- /dev/null
+++ b/src/tests/vimtests/find/f1.test
@@ -0,0 +1,12 @@
+-- Input
+(1,1)
+Lorem ipsum dolor sit amet
+abc def ghi
+qwe rty uiop
+-- Output
+(1,20)
+Lorem ipsum dolor sit amet
+abc def ghi
+qwe rty uiop
+-- Events
+2fi \ No newline at end of file
diff --git a/src/tests/vimtests/find/f2.test b/src/tests/vimtests/find/f2.test
new file mode 100644
index 0000000..98169bf
--- /dev/null
+++ b/src/tests/vimtests/find/f2.test
@@ -0,0 +1,12 @@
+-- Input
+(1,1)
+Lorem ipsum dolor sit amet
+abc def ghi
+qwe rty uiop
+-- Output
+(1,20)
+Lorem ipsum dolor sit amet
+abc def ghi
+qwe rty uiop
+-- Events
+fi; \ No newline at end of file
diff --git a/src/tests/vimtests/find/f3.test b/src/tests/vimtests/find/f3.test
new file mode 100644
index 0000000..94053ba
--- /dev/null
+++ b/src/tests/vimtests/find/f3.test
@@ -0,0 +1,12 @@
+-- Input
+(1,1)
+Lorem ipsum dolor sit amet
+abc def ghi
+qwe rty uiop
+-- Output
+(1,7)
+Lorem ipsum dolor sit amet
+abc def ghi
+qwe rty uiop
+-- Events
+fi;, \ No newline at end of file
diff --git a/src/tests/vimtests/find/f4.test b/src/tests/vimtests/find/f4.test
new file mode 100644
index 0000000..5efff42
--- /dev/null
+++ b/src/tests/vimtests/find/f4.test
@@ -0,0 +1,12 @@
+-- Input
+(1,1)
+Lorem ipsum dolor sit amet
+abc def ghi
+qwe rty uiop
+-- Output
+(1,1)
+Lorem ipsum dolor sit amet
+abc def ghi
+qwe rty uiop
+-- Events
+fh \ No newline at end of file
diff --git a/src/tests/vimtests/find/t.test b/src/tests/vimtests/find/t.test
new file mode 100644
index 0000000..5b9ea40
--- /dev/null
+++ b/src/tests/vimtests/find/t.test
@@ -0,0 +1,12 @@
+-- Input
+(1,1)
+Lorem ipsum dolor sit amet
+abc def ghi
+qwe rty uiop
+-- Output
+(1,6)
+Lorem ipsum dolor sit amet
+abc def ghi
+qwe rty uiop
+-- Events
+ti \ No newline at end of file
diff --git a/src/tests/vimtests/find/t1.test b/src/tests/vimtests/find/t1.test
new file mode 100644
index 0000000..89fd8aa
--- /dev/null
+++ b/src/tests/vimtests/find/t1.test
@@ -0,0 +1,12 @@
+-- Input
+(1,1)
+Lorem ipsum dolor sit amet
+abc def ghi
+qwe rty uiop
+-- Output
+(1,19)
+Lorem ipsum dolor sit amet
+abc def ghi
+qwe rty uiop
+-- Events
+2ti \ No newline at end of file
diff --git a/src/tests/vimtests/find/t2.test b/src/tests/vimtests/find/t2.test
new file mode 100644
index 0000000..d078793
--- /dev/null
+++ b/src/tests/vimtests/find/t2.test
@@ -0,0 +1,12 @@
+-- Input
+(1,1)
+Lorem ipsum dolor sit amet
+abc def ghi
+qwe rty uiop
+-- Output
+(1,19)
+Lorem ipsum dolor sit amet
+abc def ghi
+qwe rty uiop
+-- Events
+til; \ No newline at end of file
diff --git a/src/tests/vimtests/find/t3.test b/src/tests/vimtests/find/t3.test
new file mode 100644
index 0000000..94053ba
--- /dev/null
+++ b/src/tests/vimtests/find/t3.test
@@ -0,0 +1,12 @@
+-- Input
+(1,1)
+Lorem ipsum dolor sit amet
+abc def ghi
+qwe rty uiop
+-- Output
+(1,7)
+Lorem ipsum dolor sit amet
+abc def ghi
+qwe rty uiop
+-- Events
+fi;, \ No newline at end of file
diff --git a/src/tests/vimtests/find/t4.test b/src/tests/vimtests/find/t4.test
new file mode 100644
index 0000000..658d698
--- /dev/null
+++ b/src/tests/vimtests/find/t4.test
@@ -0,0 +1,12 @@
+-- Input
+(1,1)
+Lorem ipsum dolor sit amet
+abc def ghi
+qwe rty uiop
+-- Output
+(1,1)
+Lorem ipsum dolor sit amet
+abc def ghi
+qwe rty uiop
+-- Events
+th \ No newline at end of file
diff --git a/src/tests/vimtests/find/t5.test b/src/tests/vimtests/find/t5.test
new file mode 100644
index 0000000..d2ff2e7
--- /dev/null
+++ b/src/tests/vimtests/find/t5.test
@@ -0,0 +1,12 @@
+-- Input
+(1,1)
+Lorem ipsum dolor sit amet
+abc def ghi
+qwe rty uiop
+-- Output
+(1,6)
+Lorem ipsum dolor sit amet
+abc def ghi
+qwe rty uiop
+-- Events
+ti; \ No newline at end of file
diff --git a/src/tests/vimtests/find/t6.test b/src/tests/vimtests/find/t6.test
new file mode 100644
index 0000000..4234ab6
--- /dev/null
+++ b/src/tests/vimtests/find/t6.test
@@ -0,0 +1,12 @@
+-- Input
+(1,1)
+Lorem ipsum dolor sit amet
+abc def ghi
+qwe rty uiop
+-- Output
+(1,13)
+Lorem ipsum dolor sit amet
+abc def ghi
+qwe rty uiop
+-- Events
+to2; \ No newline at end of file
diff --git a/src/tests/vimtests/indent/1.test b/src/tests/vimtests/indent/1.test
new file mode 100644
index 0000000..df23e07
--- /dev/null
+++ b/src/tests/vimtests/indent/1.test
@@ -0,0 +1,14 @@
+-- Input
+(1,1)
+foo
+bar
+baz
+123
+-- Output
+(2,5)
+foo
+ bar
+ baz
+123
+-- Events
+j>j
diff --git a/src/tests/vimtests/indent/2.test b/src/tests/vimtests/indent/2.test
new file mode 100644
index 0000000..97d0874
--- /dev/null
+++ b/src/tests/vimtests/indent/2.test
@@ -0,0 +1,14 @@
+-- Input
+(1,1)
+foo
+bar
+baz
+123
+-- Output
+(2,5)
+foo
+ bar
+baz
+123
+-- Events
+j>>
diff --git a/src/tests/vimtests/indent/3.test b/src/tests/vimtests/indent/3.test
new file mode 100644
index 0000000..fdb9057
--- /dev/null
+++ b/src/tests/vimtests/indent/3.test
@@ -0,0 +1,14 @@
+-- Input
+(1,1)
+foo
+bar
+baz
+123
+-- Output
+(2,5)
+foo
+ bar
+ baz
+123
+-- Events
+j2>>
diff --git a/src/tests/vimtests/indent/4.test b/src/tests/vimtests/indent/4.test
new file mode 100644
index 0000000..616f9ce
--- /dev/null
+++ b/src/tests/vimtests/indent/4.test
@@ -0,0 +1,14 @@
+-- Input
+(2,5)
+foo
+ bar
+baz
+123
+-- Output
+(2,1)
+foo
+bar
+baz
+123
+-- Events
+<lt><lt> \ No newline at end of file
diff --git a/src/tests/vimtests/indent/5.test b/src/tests/vimtests/indent/5.test
new file mode 100644
index 0000000..ebf2320
--- /dev/null
+++ b/src/tests/vimtests/indent/5.test
@@ -0,0 +1,14 @@
+-- Input
+(2,5)
+foo
+ bar
+ baz
+ 123
+-- Output
+(2,1)
+foo
+bar
+baz
+ 123
+-- Events
+2<lt><lt> \ No newline at end of file
diff --git a/src/tests/vimtests/indent/6.test b/src/tests/vimtests/indent/6.test
new file mode 100644
index 0000000..c04e28a
--- /dev/null
+++ b/src/tests/vimtests/indent/6.test
@@ -0,0 +1,14 @@
+-- Input
+(2,6)
+foo
+ bar
+ baz
+ 123
+-- Output
+(2,1)
+foo
+bar
+baz
+ 123
+-- Events
+Vj<lt> \ No newline at end of file
diff --git a/src/tests/vimtests/indent/setpaste.test b/src/tests/vimtests/indent/setpaste.test
new file mode 100644
index 0000000..0941900
--- /dev/null
+++ b/src/tests/vimtests/indent/setpaste.test
@@ -0,0 +1,14 @@
+-- Input
+(1,7)
+ foo
+ bar
+ baz
+-- Output
+(3,3)
+ foo
+ quux
+123
+ bar
+ baz
+-- Events
+a<CR>quux<Esc>:set paste<CR>a<CR>123<Esc>
diff --git a/src/tests/vimtests/insertion/2o.test b/src/tests/vimtests/insertion/2o.test
new file mode 100644
index 0000000..5de4476
--- /dev/null
+++ b/src/tests/vimtests/insertion/2o.test
@@ -0,0 +1,14 @@
+-- Input
+(2,1)
+123
+456
+789
+-- Output
+(4,3)
+123
+456
+abc
+abc
+789
+-- Events
+2oabc<Esc> \ No newline at end of file
diff --git a/src/tests/vimtests/insertion/C-c_0.test b/src/tests/vimtests/insertion/C-c_0.test
new file mode 100644
index 0000000..46394a2
--- /dev/null
+++ b/src/tests/vimtests/insertion/C-c_0.test
@@ -0,0 +1,8 @@
+-- Input
+(1,1)
+bar
+-- Output
+(1,1)
+ar
+-- Events
+s<C-c> \ No newline at end of file
diff --git a/src/tests/vimtests/insertion/C-c_1.test b/src/tests/vimtests/insertion/C-c_1.test
new file mode 100644
index 0000000..a54f030
--- /dev/null
+++ b/src/tests/vimtests/insertion/C-c_1.test
@@ -0,0 +1,8 @@
+-- Input
+(1,1)
+bar
+-- Output
+(1,1)
+br
+-- Events
+ls<C-c> \ No newline at end of file
diff --git a/src/tests/vimtests/insertion/C-c_10.test b/src/tests/vimtests/insertion/C-c_10.test
new file mode 100644
index 0000000..ef8434b
--- /dev/null
+++ b/src/tests/vimtests/insertion/C-c_10.test
@@ -0,0 +1,11 @@
+-- Input
+(1,1)
+foo
+bar
+-- Output
+(2,1)
+foo
+
+bar
+-- Events
+o<C-c> \ No newline at end of file
diff --git a/src/tests/vimtests/insertion/C-c_11.test b/src/tests/vimtests/insertion/C-c_11.test
new file mode 100644
index 0000000..0ab5ece
--- /dev/null
+++ b/src/tests/vimtests/insertion/C-c_11.test
@@ -0,0 +1,8 @@
+-- Input
+(1,1)
+foo bar
+-- Output
+(1,1)
+oo bar
+-- Events
+wlI<C-c>x \ No newline at end of file
diff --git a/src/tests/vimtests/insertion/C-c_12.test b/src/tests/vimtests/insertion/C-c_12.test
new file mode 100644
index 0000000..3eaccbf
--- /dev/null
+++ b/src/tests/vimtests/insertion/C-c_12.test
@@ -0,0 +1,8 @@
+-- Input
+(1,1)
+foo bar
+-- Output
+(1,5)
+foo ar
+-- Events
+wli<C-c>x \ No newline at end of file
diff --git a/src/tests/vimtests/insertion/C-c_13.test b/src/tests/vimtests/insertion/C-c_13.test
new file mode 100644
index 0000000..d0ddb6e
--- /dev/null
+++ b/src/tests/vimtests/insertion/C-c_13.test
@@ -0,0 +1,8 @@
+-- Input
+(1,1)
+foo bar
+-- Output
+(1,10)
+foo bhelloar
+-- Events
+wlihello<C-c> \ No newline at end of file
diff --git a/src/tests/vimtests/insertion/C-c_2.test b/src/tests/vimtests/insertion/C-c_2.test
new file mode 100644
index 0000000..66c45e1
--- /dev/null
+++ b/src/tests/vimtests/insertion/C-c_2.test
@@ -0,0 +1,10 @@
+-- Input
+(1,1)
+foo
+bar
+-- Output
+(1,1)
+
+bar
+-- Events
+S<C-c> \ No newline at end of file
diff --git a/src/tests/vimtests/insertion/C-c_3.test b/src/tests/vimtests/insertion/C-c_3.test
new file mode 100644
index 0000000..b69c310
--- /dev/null
+++ b/src/tests/vimtests/insertion/C-c_3.test
@@ -0,0 +1,8 @@
+-- Input
+(1,1)
+baz bar
+-- Output
+(1,6)
+baz ba
+-- Events
+lA<C-c>x \ No newline at end of file
diff --git a/src/tests/vimtests/insertion/C-c_4.test b/src/tests/vimtests/insertion/C-c_4.test
new file mode 100644
index 0000000..26ad15a
--- /dev/null
+++ b/src/tests/vimtests/insertion/C-c_4.test
@@ -0,0 +1,8 @@
+-- Input
+(1,1)
+baz bar
+-- Output
+(1,2)
+bz bar
+-- Events
+la<C-c>x \ No newline at end of file
diff --git a/src/tests/vimtests/insertion/C-c_5.test b/src/tests/vimtests/insertion/C-c_5.test
new file mode 100644
index 0000000..3cc5fd9
--- /dev/null
+++ b/src/tests/vimtests/insertion/C-c_5.test
@@ -0,0 +1,12 @@
+-- Input
+(1,1)
+foo
+bar
+baz
+-- Output
+(1,1)
+
+bar
+baz
+-- Events
+C<C-c> \ No newline at end of file
diff --git a/src/tests/vimtests/insertion/C-c_6.test b/src/tests/vimtests/insertion/C-c_6.test
new file mode 100644
index 0000000..7f34485
--- /dev/null
+++ b/src/tests/vimtests/insertion/C-c_6.test
@@ -0,0 +1,8 @@
+-- Input
+(1,1)
+foo bar baz
+-- Output
+(1,1)
+ baz
+-- Events
+c2w<C-c> \ No newline at end of file
diff --git a/src/tests/vimtests/insertion/C-c_7.test b/src/tests/vimtests/insertion/C-c_7.test
new file mode 100644
index 0000000..2880956
--- /dev/null
+++ b/src/tests/vimtests/insertion/C-c_7.test
@@ -0,0 +1,13 @@
+-- Input
+(1,1)
+foo
+bar
+baz
+-- Output
+(3,1)
+foo
+bar
+
+baz
+-- Events
+jo<C-c> \ No newline at end of file
diff --git a/src/tests/vimtests/insertion/C-c_8.test b/src/tests/vimtests/insertion/C-c_8.test
new file mode 100644
index 0000000..0037c44
--- /dev/null
+++ b/src/tests/vimtests/insertion/C-c_8.test
@@ -0,0 +1,13 @@
+-- Input
+(1,1)
+foo
+bar
+baz
+-- Output
+(2,1)
+foo
+
+bar
+baz
+-- Events
+jO<C-c> \ No newline at end of file
diff --git a/src/tests/vimtests/insertion/C-c_9.test b/src/tests/vimtests/insertion/C-c_9.test
new file mode 100644
index 0000000..d23156a
--- /dev/null
+++ b/src/tests/vimtests/insertion/C-c_9.test
@@ -0,0 +1,11 @@
+-- Input
+(1,1)
+foo
+bar
+-- Output
+(1,1)
+
+foo
+bar
+-- Events
+O<C-c> \ No newline at end of file
diff --git a/src/tests/vimtests/insertion/C-d_0.test b/src/tests/vimtests/insertion/C-d_0.test
new file mode 100644
index 0000000..e542cc5
--- /dev/null
+++ b/src/tests/vimtests/insertion/C-d_0.test
@@ -0,0 +1,8 @@
+-- Input
+(1,1)
+foo
+-- Output
+(1,5)
+ foo
+-- Events
+i<C-t> \ No newline at end of file
diff --git a/src/tests/vimtests/insertion/C-d_1.test b/src/tests/vimtests/insertion/C-d_1.test
new file mode 100644
index 0000000..01610f9
--- /dev/null
+++ b/src/tests/vimtests/insertion/C-d_1.test
@@ -0,0 +1,8 @@
+-- Input
+(1,1)
+ foo
+-- Output
+(1,1)
+foo
+-- Events
+i<C-d> \ No newline at end of file
diff --git a/src/tests/vimtests/insertion/C-d_2.test b/src/tests/vimtests/insertion/C-d_2.test
new file mode 100644
index 0000000..2e861fe
--- /dev/null
+++ b/src/tests/vimtests/insertion/C-d_2.test
@@ -0,0 +1,10 @@
+-- Input
+(1,1)
+foo
+bar
+-- Output
+(1,1)
+foo
+bar
+-- Events
+i<C-t><C-d> \ No newline at end of file
diff --git a/src/tests/vimtests/insertion/C-e_0.test b/src/tests/vimtests/insertion/C-e_0.test
new file mode 100644
index 0000000..2229f19
--- /dev/null
+++ b/src/tests/vimtests/insertion/C-e_0.test
@@ -0,0 +1,10 @@
+-- Input
+(1,1)
+foo
+bar
+-- Output
+(1,1)
+bfoo
+bar
+-- Events
+i<C-e><Esc> \ No newline at end of file
diff --git a/src/tests/vimtests/insertion/C-e_1.test b/src/tests/vimtests/insertion/C-e_1.test
new file mode 100644
index 0000000..f7bec1a
--- /dev/null
+++ b/src/tests/vimtests/insertion/C-e_1.test
@@ -0,0 +1,10 @@
+-- Input
+(1,1)
+foo
+bar
+-- Output
+(1,3)
+barfoo
+bar
+-- Events
+i<C-e><C-e><C-e><Esc> \ No newline at end of file
diff --git a/src/tests/vimtests/insertion/C-e_2.test b/src/tests/vimtests/insertion/C-e_2.test
new file mode 100644
index 0000000..89277aa
--- /dev/null
+++ b/src/tests/vimtests/insertion/C-e_2.test
@@ -0,0 +1,10 @@
+-- Input
+(1,1)
+foo
+b
+-- Output
+(1,1)
+bfoo
+b
+-- Events
+i<C-e><C-e><C-e><Esc> \ No newline at end of file
diff --git a/src/tests/vimtests/insertion/C-h_0.test b/src/tests/vimtests/insertion/C-h_0.test
new file mode 100644
index 0000000..5987457
--- /dev/null
+++ b/src/tests/vimtests/insertion/C-h_0.test
@@ -0,0 +1,8 @@
+-- Input
+(1,1)
+foo
+-- Output
+(1,1)
+foo
+-- Events
+i<C-h> \ No newline at end of file
diff --git a/src/tests/vimtests/insertion/C-h_1.test b/src/tests/vimtests/insertion/C-h_1.test
new file mode 100644
index 0000000..eae7f01
--- /dev/null
+++ b/src/tests/vimtests/insertion/C-h_1.test
@@ -0,0 +1,8 @@
+-- Input
+(1,1)
+ foo
+-- Output
+(1,1)
+foo
+-- Events
+li<C-h><Esc> \ No newline at end of file
diff --git a/src/tests/vimtests/insertion/C-h_2.test b/src/tests/vimtests/insertion/C-h_2.test
new file mode 100644
index 0000000..45226b3
--- /dev/null
+++ b/src/tests/vimtests/insertion/C-h_2.test
@@ -0,0 +1,9 @@
+-- Input
+(1,1)
+foo
+bar
+-- Output
+(1,3)
+foobar
+-- Events
+ji<C-h><Esc> \ No newline at end of file
diff --git a/src/tests/vimtests/insertion/C-h_3.test b/src/tests/vimtests/insertion/C-h_3.test
new file mode 100644
index 0000000..08a1c67
--- /dev/null
+++ b/src/tests/vimtests/insertion/C-h_3.test
@@ -0,0 +1,8 @@
+-- Input
+(1,1)
+1234567890
+-- Output
+(1,5)
+12345
+-- Events
+A<C-h><C-h><C-h><C-h><C-h><Esc> \ No newline at end of file
diff --git a/src/tests/vimtests/insertion/C-h_4.test b/src/tests/vimtests/insertion/C-h_4.test
new file mode 100644
index 0000000..d3e5850
--- /dev/null
+++ b/src/tests/vimtests/insertion/C-h_4.test
@@ -0,0 +1,10 @@
+-- Input
+(1,1)
+1
+2
+3
+-- Output
+(1,1)
+1
+-- Events
+GA<C-h><C-h><C-h><C-h><Esc> \ No newline at end of file
diff --git a/src/tests/vimtests/insertion/C-o_2.test b/src/tests/vimtests/insertion/C-o_2.test
new file mode 100644
index 0000000..e101833
--- /dev/null
+++ b/src/tests/vimtests/insertion/C-o_2.test
@@ -0,0 +1,8 @@
+-- Input
+(1,1)
+foo bar baz
+-- Output
+(1,4)
+foo baz
+-- Events
+i<C-o>7l<C-w><Esc> \ No newline at end of file
diff --git a/src/tests/vimtests/insertion/C-o_3.test b/src/tests/vimtests/insertion/C-o_3.test
new file mode 100644
index 0000000..637334e
--- /dev/null
+++ b/src/tests/vimtests/insertion/C-o_3.test
@@ -0,0 +1,11 @@
+-- Input
+(1,1)
+foo
+bar
+baz
+-- Output
+(2,3)
+foo
+arbaz
+-- Events
+li<C-o>j<C-w><C-o>j<C-w>
diff --git a/src/tests/vimtests/insertion/C-o_4.test b/src/tests/vimtests/insertion/C-o_4.test
new file mode 100644
index 0000000..a236c4f
--- /dev/null
+++ b/src/tests/vimtests/insertion/C-o_4.test
@@ -0,0 +1,8 @@
+-- Input
+(1,1)
+
+-- Output
+(1,3)
+ugougsausageosausage
+-- Events
+isausage<C-o>bugo<Esc>.
diff --git a/src/tests/vimtests/insertion/C-r_0.test b/src/tests/vimtests/insertion/C-r_0.test
new file mode 100644
index 0000000..22f4cce
--- /dev/null
+++ b/src/tests/vimtests/insertion/C-r_0.test
@@ -0,0 +1,8 @@
+-- Input
+(1,1)
+barbaz
+-- Output
+(1,3)
+barbarbaz
+-- Events
+"ay3li<C-r>a<Esc> \ No newline at end of file
diff --git a/src/tests/vimtests/insertion/C-r_1.test b/src/tests/vimtests/insertion/C-r_1.test
new file mode 100644
index 0000000..d61cd41
--- /dev/null
+++ b/src/tests/vimtests/insertion/C-r_1.test
@@ -0,0 +1,11 @@
+-- Input
+(1,1)
+bar
+baz
+-- Output
+(2,1)
+babar
+r
+baz
+-- Events
+"byylli<C-r>b<Esc>
diff --git a/src/tests/vimtests/insertion/C-w_0.test b/src/tests/vimtests/insertion/C-w_0.test
new file mode 100644
index 0000000..673856c
--- /dev/null
+++ b/src/tests/vimtests/insertion/C-w_0.test
@@ -0,0 +1,8 @@
+-- Input
+(1,1)
+foobar
+-- Output
+(1,1)
+r
+-- Events
+$i<C-w> \ No newline at end of file
diff --git a/src/tests/vimtests/insertion/C-w_1.test b/src/tests/vimtests/insertion/C-w_1.test
new file mode 100644
index 0000000..673856c
--- /dev/null
+++ b/src/tests/vimtests/insertion/C-w_1.test
@@ -0,0 +1,8 @@
+-- Input
+(1,1)
+foobar
+-- Output
+(1,1)
+r
+-- Events
+$i<C-w> \ No newline at end of file
diff --git a/src/tests/vimtests/insertion/C-y_0.test b/src/tests/vimtests/insertion/C-y_0.test
new file mode 100644
index 0000000..2108713
--- /dev/null
+++ b/src/tests/vimtests/insertion/C-y_0.test
@@ -0,0 +1,10 @@
+-- Input
+(1,1)
+foo
+bar
+-- Output
+(2,3)
+foo
+foobar
+-- Events
+ji<C-y><C-y><C-y><Esc> \ No newline at end of file
diff --git a/src/tests/vimtests/insertion/C-y_1.test b/src/tests/vimtests/insertion/C-y_1.test
new file mode 100644
index 0000000..8024829
--- /dev/null
+++ b/src/tests/vimtests/insertion/C-y_1.test
@@ -0,0 +1,10 @@
+-- Input
+(1,1)
+foo
+bar
+-- Output
+(2,1)
+foo
+fbar
+-- Events
+ji<C-y><Esc> \ No newline at end of file
diff --git a/src/tests/vimtests/insertion/C-y_2.test b/src/tests/vimtests/insertion/C-y_2.test
new file mode 100644
index 0000000..0130af3
--- /dev/null
+++ b/src/tests/vimtests/insertion/C-y_2.test
@@ -0,0 +1,10 @@
+-- Input
+(1,1)
+f
+bar
+-- Output
+(2,1)
+f
+fbar
+-- Events
+ji<C-y><C-y><C-y><Esc> \ No newline at end of file
diff --git a/src/tests/vimtests/insertion/O2.test b/src/tests/vimtests/insertion/O2.test
new file mode 100644
index 0000000..5e74fb8
--- /dev/null
+++ b/src/tests/vimtests/insertion/O2.test
@@ -0,0 +1,13 @@
+-- Input
+(2,1)
+abc
+def
+ghi
+-- Output
+(2,1)
+abc
+
+def
+ghi
+-- Events
+O<Esc> \ No newline at end of file
diff --git a/src/tests/vimtests/insertion/a.test b/src/tests/vimtests/insertion/a.test
new file mode 100644
index 0000000..07f0cfd
--- /dev/null
+++ b/src/tests/vimtests/insertion/a.test
@@ -0,0 +1,8 @@
+-- Input
+(1,1)
+
+-- Output
+(1,4)
+foOOo
+-- Events
+ifoo<Esc>haOO<Esc> \ No newline at end of file
diff --git a/src/tests/vimtests/insertion/a2.test b/src/tests/vimtests/insertion/a2.test
new file mode 100644
index 0000000..1f74b44
--- /dev/null
+++ b/src/tests/vimtests/insertion/a2.test
@@ -0,0 +1,8 @@
+-- Input
+(1,1)
+
+-- Output
+(1,3)
+fOOoo
+-- Events
+ifoo<Esc>0aOO<Esc> \ No newline at end of file
diff --git a/src/tests/vimtests/insertion/a3.test b/src/tests/vimtests/insertion/a3.test
new file mode 100644
index 0000000..a8623f0
--- /dev/null
+++ b/src/tests/vimtests/insertion/a3.test
@@ -0,0 +1,8 @@
+-- Input
+(1,1)
+
+-- Output
+(1,5)
+fooOO
+-- Events
+ifoo<Esc>$aOO<Esc> \ No newline at end of file
diff --git a/src/tests/vimtests/insertion/a4.test b/src/tests/vimtests/insertion/a4.test
new file mode 100644
index 0000000..06e09d8
--- /dev/null
+++ b/src/tests/vimtests/insertion/a4.test
@@ -0,0 +1,8 @@
+-- Input
+(1,1)
+
+-- Output
+(1,5)
+fooOO
+-- Events
+ifoo<Esc>aOO<Esc> \ No newline at end of file
diff --git a/src/tests/vimtests/insertion/capA.test b/src/tests/vimtests/insertion/capA.test
new file mode 100644
index 0000000..f00974b
--- /dev/null
+++ b/src/tests/vimtests/insertion/capA.test
@@ -0,0 +1,8 @@
+-- Input
+(1,1)
+
+-- Output
+(1,5)
+fooOO
+-- Events
+ifoo<Esc>AOO<Esc> \ No newline at end of file
diff --git a/src/tests/vimtests/insertion/capA2.test b/src/tests/vimtests/insertion/capA2.test
new file mode 100644
index 0000000..ef5f6e2
--- /dev/null
+++ b/src/tests/vimtests/insertion/capA2.test
@@ -0,0 +1,14 @@
+-- Input
+(2,1)
+
+
+
+
+-- Output
+(2,3)
+
+foo
+
+
+-- Events
+Afoo<Esc> \ No newline at end of file
diff --git a/src/tests/vimtests/insertion/capA3.test b/src/tests/vimtests/insertion/capA3.test
new file mode 100644
index 0000000..27dca19
--- /dev/null
+++ b/src/tests/vimtests/insertion/capA3.test
@@ -0,0 +1,8 @@
+-- Input
+(1,1)
+
+-- Output
+(1,5)
+fooOO
+-- Events
+ifoo<Esc>hAOO<Esc> \ No newline at end of file
diff --git a/src/tests/vimtests/insertion/capA4.test b/src/tests/vimtests/insertion/capA4.test
new file mode 100644
index 0000000..0abd150
--- /dev/null
+++ b/src/tests/vimtests/insertion/capA4.test
@@ -0,0 +1,8 @@
+-- Input
+(1,1)
+
+-- Output
+(1,5)
+fooOO
+-- Events
+ifoo<Esc>$AOO<Esc> \ No newline at end of file
diff --git a/src/tests/vimtests/insertion/capI.test b/src/tests/vimtests/insertion/capI.test
new file mode 100644
index 0000000..caa4232
--- /dev/null
+++ b/src/tests/vimtests/insertion/capI.test
@@ -0,0 +1,8 @@
+-- Input
+(1,1)
+
+-- Output
+(1,2)
+OOfoo
+-- Events
+ifoo<Esc>IOO<Esc> \ No newline at end of file
diff --git a/src/tests/vimtests/insertion/capI2.test b/src/tests/vimtests/insertion/capI2.test
new file mode 100644
index 0000000..294417b
--- /dev/null
+++ b/src/tests/vimtests/insertion/capI2.test
@@ -0,0 +1,8 @@
+-- Input
+(1,7)
+ foo
+-- Output
+(1,7)
+ barfoo
+-- Events
+Ibar<Esc> \ No newline at end of file
diff --git a/src/tests/vimtests/insertion/capI3.test b/src/tests/vimtests/insertion/capI3.test
new file mode 100644
index 0000000..3a2e08e
--- /dev/null
+++ b/src/tests/vimtests/insertion/capI3.test
@@ -0,0 +1,8 @@
+-- Input
+(1,7)
+
+-- Output
+(1,3)
+bar
+-- Events
+Ibar<Esc> \ No newline at end of file
diff --git a/src/tests/vimtests/insertion/capO.test b/src/tests/vimtests/insertion/capO.test
new file mode 100644
index 0000000..cde9955
--- /dev/null
+++ b/src/tests/vimtests/insertion/capO.test
@@ -0,0 +1,14 @@
+-- Input
+(2,1)
+abc
+def
+ghi
+-- Output
+(3,3)
+abc
+123
+456
+def
+ghi
+-- Events
+O123<CR>456<Esc> \ No newline at end of file
diff --git a/src/tests/vimtests/insertion/counted_a.test b/src/tests/vimtests/insertion/counted_a.test
new file mode 100644
index 0000000..da5d778
--- /dev/null
+++ b/src/tests/vimtests/insertion/counted_a.test
@@ -0,0 +1,8 @@
+-- Input
+(1,2)
+aa
+-- Output
+(1,44)
+aaxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
+-- Events
+42ax<Esc> \ No newline at end of file
diff --git a/src/tests/vimtests/insertion/counted_capA.test b/src/tests/vimtests/insertion/counted_capA.test
new file mode 100644
index 0000000..d46e315
--- /dev/null
+++ b/src/tests/vimtests/insertion/counted_capA.test
@@ -0,0 +1,8 @@
+-- Input
+(1,1)
+aa
+-- Output
+(1,44)
+aaxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
+-- Events
+42Ax<Esc> \ No newline at end of file
diff --git a/src/tests/vimtests/insertion/counted_capI.test b/src/tests/vimtests/insertion/counted_capI.test
new file mode 100644
index 0000000..5f8f626
--- /dev/null
+++ b/src/tests/vimtests/insertion/counted_capI.test
@@ -0,0 +1,8 @@
+-- Input
+(1,2)
+aa
+-- Output
+(1,42)
+xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxaa
+-- Events
+42Ix<Esc> \ No newline at end of file
diff --git a/src/tests/vimtests/insertion/counted_capO.test b/src/tests/vimtests/insertion/counted_capO.test
new file mode 100644
index 0000000..cf113d8
--- /dev/null
+++ b/src/tests/vimtests/insertion/counted_capO.test
@@ -0,0 +1,14 @@
+-- Input
+(2,1)
+abc
+def
+ghi
+-- Output
+(3,3)
+abc
+123
+123
+def
+ghi
+-- Events
+2O123<Esc> \ No newline at end of file
diff --git a/src/tests/vimtests/insertion/counted_i.test b/src/tests/vimtests/insertion/counted_i.test
new file mode 100644
index 0000000..95e4a9d
--- /dev/null
+++ b/src/tests/vimtests/insertion/counted_i.test
@@ -0,0 +1,8 @@
+-- Input
+(1,2)
+aa
+-- Output
+(1,25)
+axyzxyzxyzxyzxyzxyzxyzxyza
+-- Events
+8ixyz<Esc> \ No newline at end of file
diff --git a/src/tests/vimtests/insertion/counted_o.test b/src/tests/vimtests/insertion/counted_o.test
new file mode 100644
index 0000000..903f680
--- /dev/null
+++ b/src/tests/vimtests/insertion/counted_o.test
@@ -0,0 +1,14 @@
+-- Input
+(2,1)
+abc
+def
+ghi
+-- Output
+(4,3)
+abc
+def
+123
+123
+ghi
+-- Events
+2o123<Esc> \ No newline at end of file
diff --git a/src/tests/vimtests/insertion/cursorkeys/down.test b/src/tests/vimtests/insertion/cursorkeys/down.test
new file mode 100644
index 0000000..ff22d20
--- /dev/null
+++ b/src/tests/vimtests/insertion/cursorkeys/down.test
@@ -0,0 +1,12 @@
+-- Input
+(2,2)
+foo
+bar
+baz
+-- Output
+(3,3)
+foo
+b1ar
+ba3z
+-- Events
+i1<Down>3<Esc> \ No newline at end of file
diff --git a/src/tests/vimtests/insertion/cursorkeys/left.test b/src/tests/vimtests/insertion/cursorkeys/left.test
new file mode 100644
index 0000000..0068b31
--- /dev/null
+++ b/src/tests/vimtests/insertion/cursorkeys/left.test
@@ -0,0 +1,12 @@
+-- Input
+(2,2)
+foo
+bar
+baz
+-- Output
+(2,2)
+foo
+b31ar
+baz
+-- Events
+i1<Left>3<Esc> \ No newline at end of file
diff --git a/src/tests/vimtests/insertion/cursorkeys/right.test b/src/tests/vimtests/insertion/cursorkeys/right.test
new file mode 100644
index 0000000..163f99c
--- /dev/null
+++ b/src/tests/vimtests/insertion/cursorkeys/right.test
@@ -0,0 +1,12 @@
+-- Input
+(2,2)
+foo
+bar
+baz
+-- Output
+(2,4)
+foo
+b1a3r
+baz
+-- Events
+i1<Right>3<Esc> \ No newline at end of file
diff --git a/src/tests/vimtests/insertion/cursorkeys/up.test b/src/tests/vimtests/insertion/cursorkeys/up.test
new file mode 100644
index 0000000..29e65fa
--- /dev/null
+++ b/src/tests/vimtests/insertion/cursorkeys/up.test
@@ -0,0 +1,12 @@
+-- Input
+(2,2)
+foo
+bar
+baz
+-- Output
+(1,3)
+fo3o
+b1ar
+baz
+-- Events
+i1<Up>3<Esc> \ No newline at end of file
diff --git a/src/tests/vimtests/insertion/i.test b/src/tests/vimtests/insertion/i.test
new file mode 100644
index 0000000..ec10ae6
--- /dev/null
+++ b/src/tests/vimtests/insertion/i.test
@@ -0,0 +1,8 @@
+-- Input
+(1,1)
+
+-- Output
+(1,3)
+fOOoo
+-- Events
+ifoo<Esc>hiOO<Esc> \ No newline at end of file
diff --git a/src/tests/vimtests/insertion/i2.test b/src/tests/vimtests/insertion/i2.test
new file mode 100644
index 0000000..2780c05
--- /dev/null
+++ b/src/tests/vimtests/insertion/i2.test
@@ -0,0 +1,8 @@
+-- Input
+(1,1)
+
+-- Output
+(1,2)
+OOfoo
+-- Events
+ifoo<Esc>0iOO<Esc> \ No newline at end of file
diff --git a/src/tests/vimtests/insertion/i3.test b/src/tests/vimtests/insertion/i3.test
new file mode 100644
index 0000000..63b272e
--- /dev/null
+++ b/src/tests/vimtests/insertion/i3.test
@@ -0,0 +1,8 @@
+-- Input
+(1,1)
+
+-- Output
+(1,4)
+foOOo
+-- Events
+ifoo<Esc>$iOO<Esc> \ No newline at end of file
diff --git a/src/tests/vimtests/insertion/indent_0.test b/src/tests/vimtests/insertion/indent_0.test
new file mode 100644
index 0000000..8695830
--- /dev/null
+++ b/src/tests/vimtests/insertion/indent_0.test
@@ -0,0 +1,14 @@
+-- Input
+(1,1)
+ foo
+ bar
+ baz
+-- Output
+(4,9)
+ foo
+ bar
+
+ xyzzy
+ baz
+-- Events
+jo<CR>xyzzy<Esc> \ No newline at end of file
diff --git a/src/tests/vimtests/insertion/indent_1.test b/src/tests/vimtests/insertion/indent_1.test
new file mode 100644
index 0000000..c0dc949
--- /dev/null
+++ b/src/tests/vimtests/insertion/indent_1.test
@@ -0,0 +1,11 @@
+-- Input
+(1,8)
+ foo bar
+ baz
+-- Output
+(2,4)
+ foo
+ bar
+ baz
+-- Events
+i<CR><Esc> \ No newline at end of file
diff --git a/src/tests/vimtests/insertion/indent_2.test b/src/tests/vimtests/insertion/indent_2.test
new file mode 100644
index 0000000..d2a1e28
--- /dev/null
+++ b/src/tests/vimtests/insertion/indent_2.test
@@ -0,0 +1,11 @@
+-- Input
+(1,9)
+ foo bar
+ baz
+-- Output
+(2,4)
+ foo
+ bar
+ baz
+-- Events
+i<CR><Esc> \ No newline at end of file
diff --git a/src/tests/vimtests/insertion/indent_3.test b/src/tests/vimtests/insertion/indent_3.test
new file mode 100644
index 0000000..e61ed06
--- /dev/null
+++ b/src/tests/vimtests/insertion/indent_3.test
@@ -0,0 +1,16 @@
+-- Input
+(1,1)
+ foo
+ bar
+ baz
+-- Output
+(6,9)
+ foo
+ bar
+
+
+
+ xyzzy
+ baz
+-- Events
+jo<CR><CR><CR>xyzzy<Esc> \ No newline at end of file
diff --git a/src/tests/vimtests/insertion/indent_4.test b/src/tests/vimtests/insertion/indent_4.test
new file mode 100644
index 0000000..0d45f43
--- /dev/null
+++ b/src/tests/vimtests/insertion/indent_4.test
@@ -0,0 +1,16 @@
+-- Input
+(1,1)
+ foo
+ bar
+ baz
+-- Output
+(6,1)
+ foo
+ bar
+
+
+
+
+ baz
+-- Events
+jo<CR><CR><CR><Esc> \ No newline at end of file
diff --git a/src/tests/vimtests/insertion/indent_5.test b/src/tests/vimtests/insertion/indent_5.test
new file mode 100644
index 0000000..c83f991
--- /dev/null
+++ b/src/tests/vimtests/insertion/indent_5.test
@@ -0,0 +1,16 @@
+-- Input
+(1,1)
+ foo
+ bar
+ baz
+-- Output
+(6,5)
+ foo
+ bar
+
+
+
+xyzzy
+ baz
+-- Events
+jo<CR><C-d><CR><CR>xyzzy<Esc> \ No newline at end of file
diff --git a/src/tests/vimtests/insertion/indent_6.test b/src/tests/vimtests/insertion/indent_6.test
new file mode 100644
index 0000000..3286e88
--- /dev/null
+++ b/src/tests/vimtests/insertion/indent_6.test
@@ -0,0 +1,14 @@
+-- Input
+(1,1)
+ foo
+ bar
+ baz
+-- Output
+(4,5)
+ foo
+ bar
+
+xyzzy
+ baz
+-- Events
+jo<CR><C-d>xyzzy<Esc> \ No newline at end of file
diff --git a/src/tests/vimtests/insertion/indent_7.test b/src/tests/vimtests/insertion/indent_7.test
new file mode 100644
index 0000000..baba4c0
--- /dev/null
+++ b/src/tests/vimtests/insertion/indent_7.test
@@ -0,0 +1,14 @@
+-- Input
+(1,1)
+ foo
+ bar
+ baz
+-- Output
+(4,5)
+ foo
+ bar
+
+xyzzy
+ baz
+-- Events
+jo<C-d><CR>xyzzy<Esc> \ No newline at end of file
diff --git a/src/tests/vimtests/insertion/indent_8.test b/src/tests/vimtests/insertion/indent_8.test
new file mode 100644
index 0000000..581792b
--- /dev/null
+++ b/src/tests/vimtests/insertion/indent_8.test
@@ -0,0 +1,16 @@
+-- Input
+(1,1)
+ foo
+ bar
+ baz
+-- Output
+(6,9)
+ foo
+ bar
+
+
+
+ xyzzy
+ baz
+-- Events
+jo<CR><C-d><CR><CR>xyzzy<Esc> \ No newline at end of file
diff --git a/src/tests/vimtests/insertion/nl_insert.test b/src/tests/vimtests/insertion/nl_insert.test
new file mode 100644
index 0000000..0d4e05c
--- /dev/null
+++ b/src/tests/vimtests/insertion/nl_insert.test
@@ -0,0 +1,9 @@
+-- Input
+(1,2)
+x
+-- Output
+(2,1)
+xbc
+d
+-- Events
+abc<CR>d<Esc> \ No newline at end of file
diff --git a/src/tests/vimtests/insertion/o.test b/src/tests/vimtests/insertion/o.test
new file mode 100644
index 0000000..c193643
--- /dev/null
+++ b/src/tests/vimtests/insertion/o.test
@@ -0,0 +1,14 @@
+-- Input
+(2,1)
+abc
+def
+ghi
+-- Output
+(4,3)
+abc
+def
+123
+456
+ghi
+-- Events
+o123<CR>456<Esc> \ No newline at end of file
diff --git a/src/tests/vimtests/insertion/o1.test b/src/tests/vimtests/insertion/o1.test
new file mode 100644
index 0000000..c753252
--- /dev/null
+++ b/src/tests/vimtests/insertion/o1.test
@@ -0,0 +1,13 @@
+-- Input
+(2,1)
+abc
+def
+ghi
+-- Output
+(3,1)
+abc
+def
+
+ghi
+-- Events
+o<Esc> \ No newline at end of file
diff --git a/src/tests/vimtests/insertion/onechar.test b/src/tests/vimtests/insertion/onechar.test
new file mode 100644
index 0000000..b95e765
--- /dev/null
+++ b/src/tests/vimtests/insertion/onechar.test
@@ -0,0 +1,11 @@
+-- Input
+(1,4)
+foo
+bar
+-- Output
+(2,1)
+foo
+x
+bar
+-- Events
+i<CR>x<Esc>
diff --git a/src/tests/vimtests/insertion/spec_delete.test b/src/tests/vimtests/insertion/spec_delete.test
new file mode 100644
index 0000000..be5aa6e
--- /dev/null
+++ b/src/tests/vimtests/insertion/spec_delete.test
@@ -0,0 +1,12 @@
+-- Input
+(2,2)
+foo
+bar
+baz
+-- Output
+(2,1)
+foo
+br
+baz
+-- Events
+i<Del><Esc> \ No newline at end of file
diff --git a/src/tests/vimtests/insertion/spec_insert.test b/src/tests/vimtests/insertion/spec_insert.test
new file mode 100644
index 0000000..269fdaf
--- /dev/null
+++ b/src/tests/vimtests/insertion/spec_insert.test
@@ -0,0 +1,12 @@
+-- Input
+(2,2)
+foo
+bar
+baz
+-- Output
+(2,2)
+foo
+b1ar
+baz
+-- Events
+<Ins>1<Esc> \ No newline at end of file
diff --git a/src/tests/vimtests/joinlines/1.test b/src/tests/vimtests/joinlines/1.test
new file mode 100644
index 0000000..98a9f8a
--- /dev/null
+++ b/src/tests/vimtests/joinlines/1.test
@@ -0,0 +1,9 @@
+-- Input
+(1,3)
+aaa
+bbb
+-- Output
+(1,4)
+aaa bbb
+-- Events
+J \ No newline at end of file
diff --git a/src/tests/vimtests/joinlines/2.test b/src/tests/vimtests/joinlines/2.test
new file mode 100644
index 0000000..5f8313e
--- /dev/null
+++ b/src/tests/vimtests/joinlines/2.test
@@ -0,0 +1,9 @@
+-- Input
+(1,1)
+aaa
+bbb
+-- Output
+(1,4)
+aaa bbb
+-- Events
+J \ No newline at end of file
diff --git a/src/tests/vimtests/joinlines/counted_1.test b/src/tests/vimtests/joinlines/counted_1.test
new file mode 100644
index 0000000..83eb9ac
--- /dev/null
+++ b/src/tests/vimtests/joinlines/counted_1.test
@@ -0,0 +1,9 @@
+-- Input
+(1,3)
+aaa
+bbb
+-- Output
+(1,4)
+aaa bbb
+-- Events
+1J \ No newline at end of file
diff --git a/src/tests/vimtests/joinlines/counted_2.test b/src/tests/vimtests/joinlines/counted_2.test
new file mode 100644
index 0000000..2d4784d
--- /dev/null
+++ b/src/tests/vimtests/joinlines/counted_2.test
@@ -0,0 +1,10 @@
+-- Input
+(1,2)
+aaa
+bbb
+ccc
+-- Output
+(1,8)
+aaa bbb ccc
+-- Events
+3J \ No newline at end of file
diff --git a/src/tests/vimtests/jumplist/1.test b/src/tests/vimtests/jumplist/1.test
new file mode 100644
index 0000000..4ca0840
--- /dev/null
+++ b/src/tests/vimtests/jumplist/1.test
@@ -0,0 +1,14 @@
+-- Input
+(1,1)
+Lorem ipsum dolor sit amet
+Lorem ipsum dolor sit amet
+Lorem ipsum dolor sit amet
+Lorem ipsum dolor sit amet
+-- Output
+(2,7)
+Lorem ipsum dolor sit amet
+Lorem ipsum dolor sit amet
+Lorem ipsum dolor sit amet
+Lorem ipsum dolor sit amet
+-- Events
+w***<C-o><C-o> \ No newline at end of file
diff --git a/src/tests/vimtests/jumplist/2.test b/src/tests/vimtests/jumplist/2.test
new file mode 100644
index 0000000..9b675cd
--- /dev/null
+++ b/src/tests/vimtests/jumplist/2.test
@@ -0,0 +1,14 @@
+-- Input
+(1,1)
+Lorem ipsum dolor sit amet
+Lorem ipsum dolor sit amet
+Lorem ipsum dolor sit amet
+Lorem ipsum dolor sit amet
+-- Output
+(4,7)
+Lorem ipsum dolor sit amet
+Lorem ipsum dolor sit amet
+Lorem ipsum dolor sit amet
+Lorem ipsum dolor sit amet
+-- Events
+w***<C-o><C-o><Tab><Tab> \ No newline at end of file
diff --git a/src/tests/vimtests/macros/0.test b/src/tests/vimtests/macros/0.test
new file mode 100644
index 0000000..a369dca
--- /dev/null
+++ b/src/tests/vimtests/macros/0.test
@@ -0,0 +1,12 @@
+-- Input
+(2,2)
+qwf
+ars
+zxc
+-- Output
+(2,5)
+qwf
+arfoos
+zxc
+-- Events
+qaafoo<Esc>q
diff --git a/src/tests/vimtests/macros/1.test b/src/tests/vimtests/macros/1.test
new file mode 100644
index 0000000..04eb25a
--- /dev/null
+++ b/src/tests/vimtests/macros/1.test
@@ -0,0 +1,12 @@
+-- Input
+(2,2)
+qwf
+ars
+zxc
+-- Output
+(2,11)
+qwf
+arfoofoofoos
+zxc
+-- Events
+qaafoo<Esc>q@a@a
diff --git a/src/tests/vimtests/macros/10.test b/src/tests/vimtests/macros/10.test
new file mode 100644
index 0000000..3fa7151
--- /dev/null
+++ b/src/tests/vimtests/macros/10.test
@@ -0,0 +1,12 @@
+-- Input
+(1,1)
+123 123 123 qwf
+123 123 123 ars
+123 123 123 zxc
+-- Output
+(1,11)
+123 123 123 qwf
+123 123 123 ars
+123 123 123 zxc
+-- Events
+q1eq2@1
diff --git a/src/tests/vimtests/macros/11.test b/src/tests/vimtests/macros/11.test
new file mode 100644
index 0000000..f4f8d2d
--- /dev/null
+++ b/src/tests/vimtests/macros/11.test
@@ -0,0 +1,12 @@
+-- Input
+(1,1)
+123 123 123 qwf
+123 123 123 ars
+123 123 123 zxc
+-- Output
+(1,8)
+123 123 123 qwf
+123 123 123 ars
+123 123 123 zxc
+-- Events
+q1f3lq@1
diff --git a/src/tests/vimtests/macros/12.test b/src/tests/vimtests/macros/12.test
new file mode 100644
index 0000000..94dc78e
--- /dev/null
+++ b/src/tests/vimtests/macros/12.test
@@ -0,0 +1,12 @@
+-- Input
+(1,1)
+123 123 123 qwf
+123 123 123 ars
+123 123 123 zxc
+-- Output
+(1,15)
+123 123 123 qwf
+123 123 123 ars
+123 123 123 zxc
+-- Events
+q1eeq@1
diff --git a/src/tests/vimtests/macros/13.test b/src/tests/vimtests/macros/13.test
new file mode 100644
index 0000000..29416f1
--- /dev/null
+++ b/src/tests/vimtests/macros/13.test
@@ -0,0 +1,10 @@
+-- Input
+(1,1)
+abc
+
+-- Output
+(2,10)
+abc123
+A123<Esc>b
+-- Events
+qqA123<Esc>bqj"qp
diff --git a/src/tests/vimtests/macros/14.test b/src/tests/vimtests/macros/14.test
new file mode 100644
index 0000000..07dbf12
--- /dev/null
+++ b/src/tests/vimtests/macros/14.test
@@ -0,0 +1,10 @@
+-- Input
+(2,1)
+abc
+A123<Esc>b
+-- Output
+(1,1)
+abc123
+A123<Esc>b
+-- Events
+"0yyk@0
diff --git a/src/tests/vimtests/macros/15.test b/src/tests/vimtests/macros/15.test
new file mode 100644
index 0000000..5cf2f1e
--- /dev/null
+++ b/src/tests/vimtests/macros/15.test
@@ -0,0 +1,8 @@
+-- Input
+(1,1)
+
+-- Output
+(1,4)
+^x$x
+-- Events
+qr^x$xq"rp
diff --git a/src/tests/vimtests/macros/16.test b/src/tests/vimtests/macros/16.test
new file mode 100644
index 0000000..710d321
--- /dev/null
+++ b/src/tests/vimtests/macros/16.test
@@ -0,0 +1,12 @@
+-- Input
+(1,1)
+^x$x
+"123 123 123"
+"123 123 123"
+-- Output
+(3,11)
+^x$x
+123 123 123
+123 123 123
+-- Events
+"ry$j@rj@r
diff --git a/src/tests/vimtests/macros/2.test b/src/tests/vimtests/macros/2.test
new file mode 100644
index 0000000..ae25439
--- /dev/null
+++ b/src/tests/vimtests/macros/2.test
@@ -0,0 +1,12 @@
+-- Input
+(2,2)
+qwf
+ars
+zxc
+-- Output
+(2,2)
+qwf
+ars
+zxc
+-- Events
+qaq
diff --git a/src/tests/vimtests/macros/3.test b/src/tests/vimtests/macros/3.test
new file mode 100644
index 0000000..76262c7
--- /dev/null
+++ b/src/tests/vimtests/macros/3.test
@@ -0,0 +1,12 @@
+-- Input
+(2,2)
+qwf
+ars
+zxc
+-- Output
+(2,8)
+qwf
+arfoofoos
+zxc
+-- Events
+qaafoo<Esc>q@a
diff --git a/src/tests/vimtests/macros/4.test b/src/tests/vimtests/macros/4.test
new file mode 100644
index 0000000..fee032f
--- /dev/null
+++ b/src/tests/vimtests/macros/4.test
@@ -0,0 +1,12 @@
+-- Input
+(2,2)
+qwf
+ars
+zxc
+-- Output
+(2,11)
+qwf
+arfoofoofoos
+zxc
+-- Events
+qaafoo<Esc>q2@a
diff --git a/src/tests/vimtests/macros/5.test b/src/tests/vimtests/macros/5.test
new file mode 100644
index 0000000..48fccc6
--- /dev/null
+++ b/src/tests/vimtests/macros/5.test
@@ -0,0 +1,12 @@
+-- Input
+(2,2)
+qwf
+ars
+zxc
+-- Output
+(2,4)
+qwf
+afoorfoofoos
+zxc
+-- Events
+qaafoo<Esc>q@a0@a
diff --git a/src/tests/vimtests/macros/6.test b/src/tests/vimtests/macros/6.test
new file mode 100644
index 0000000..500c29f
--- /dev/null
+++ b/src/tests/vimtests/macros/6.test
@@ -0,0 +1,12 @@
+-- Input
+(1,1)
+123 123 123 qwf
+123 123 123 ars
+123 123 123 zxc
+-- Output
+(1,7)
+123 123 123 qwf
+123 123 123 ars
+123 123 123 zxc
+-- Events
+qqf3q@q
diff --git a/src/tests/vimtests/macros/7.test b/src/tests/vimtests/macros/7.test
new file mode 100644
index 0000000..d93b9a5
--- /dev/null
+++ b/src/tests/vimtests/macros/7.test
@@ -0,0 +1,12 @@
+-- Input
+(1,1)
+123 123 123 qwf
+123 123 123 ars
+123 123 123 zxc
+-- Output
+(1,11)
+123 123 123 qwf
+123 123 123 ars
+123 123 123 zxc
+-- Events
+qqf3q2@q
diff --git a/src/tests/vimtests/macros/8.test b/src/tests/vimtests/macros/8.test
new file mode 100644
index 0000000..bcd7a7c
--- /dev/null
+++ b/src/tests/vimtests/macros/8.test
@@ -0,0 +1,12 @@
+-- Input
+(1,1)
+123 123 123 qwf
+123 123 123 ars
+123 123 123 zxc
+-- Output
+(1,7)
+123 123 123 qwf
+123 123 123 ars
+123 123 123 zxc
+-- Events
+q1f3q@1
diff --git a/src/tests/vimtests/macros/9.test b/src/tests/vimtests/macros/9.test
new file mode 100644
index 0000000..c341189
--- /dev/null
+++ b/src/tests/vimtests/macros/9.test
@@ -0,0 +1,12 @@
+-- Input
+(1,1)
+123 123 123 qwf
+123 123 123 ars
+123 123 123 zxc
+-- Output
+(1,7)
+123 123 123 qwf
+123 123 123 ars
+123 123 123 zxc
+-- Events
+q1eq@1
diff --git a/src/tests/vimtests/marks/unjump_backquote.test b/src/tests/vimtests/marks/unjump_backquote.test
new file mode 100644
index 0000000..6857ecf
--- /dev/null
+++ b/src/tests/vimtests/marks/unjump_backquote.test
@@ -0,0 +1,14 @@
+-- Input
+(1,1)
+Lorem ipsum dolor sit amet
+Lorem ipsum dolor sit amet
+Lorem ipsum dolor sit amet
+Lorem ipsum dolor sit amet
+-- Output
+(2,7)
+Lorem ipsum dolor sit amet
+Lorem ipsum dolor sit amet
+Lorem ipsum dolor sit amet
+Lorem ipsum dolor sit amet
+-- Events
+w**``
diff --git a/src/tests/vimtests/marks/unjump_quote.test b/src/tests/vimtests/marks/unjump_quote.test
new file mode 100644
index 0000000..bd3ded7
--- /dev/null
+++ b/src/tests/vimtests/marks/unjump_quote.test
@@ -0,0 +1,14 @@
+-- Input
+(1,1)
+ Lorem ipsum dolor sit amet
+ Lorem ipsum dolor sit amet
+ Lorem ipsum dolor sit amet
+ Lorem ipsum dolor sit amet
+-- Output
+(2,5)
+ Lorem ipsum dolor sit amet
+ Lorem ipsum dolor sit amet
+ Lorem ipsum dolor sit amet
+ Lorem ipsum dolor sit amet
+-- Events
+ww**''
diff --git a/src/tests/vimtests/marks/unjump_quote_blank.test b/src/tests/vimtests/marks/unjump_quote_blank.test
new file mode 100644
index 0000000..0400f88
--- /dev/null
+++ b/src/tests/vimtests/marks/unjump_quote_blank.test
@@ -0,0 +1,14 @@
+-- Input
+(1,1)
+ Lorem ipsum dolor sit amet
+
+ Lorem ipsum dolor sit amet
+ Lorem ipsum dolor sit amet
+-- Output
+(2,16)
+ Lorem ipsum dolor sit amet
+
+ Lorem ipsum dolor sit amet
+ Lorem ipsum dolor sit amet
+-- Events
+wwjG''
diff --git a/src/tests/vimtests/movement/bigWord/2e.test b/src/tests/vimtests/movement/bigWord/2e.test
new file mode 100644
index 0000000..cc3259e
--- /dev/null
+++ b/src/tests/vimtests/movement/bigWord/2e.test
@@ -0,0 +1,8 @@
+-- Input
+(1,1)
+aa bb cc dd
+-- Output
+(1,5)
+aa bb cc dd
+-- Events
+2E
diff --git a/src/tests/vimtests/movement/bigWord/2w.test b/src/tests/vimtests/movement/bigWord/2w.test
new file mode 100644
index 0000000..53bddfc
--- /dev/null
+++ b/src/tests/vimtests/movement/bigWord/2w.test
@@ -0,0 +1,8 @@
+-- Input
+(1,1)
+aa bb cc dd
+-- Output
+(1,7)
+aa bb cc dd
+-- Events
+2W
diff --git a/src/tests/vimtests/movement/bigWord/6b.test b/src/tests/vimtests/movement/bigWord/6b.test
new file mode 100644
index 0000000..22b84d6
--- /dev/null
+++ b/src/tests/vimtests/movement/bigWord/6b.test
@@ -0,0 +1,12 @@
+-- Input
+(3,3)
+a b
+ ccc 111 22 3
+d e
+-- Output
+(1,3)
+a b
+ ccc 111 22 3
+d e
+-- Events
+6B \ No newline at end of file
diff --git a/src/tests/vimtests/movement/bigWord/B_1.test b/src/tests/vimtests/movement/bigWord/B_1.test
new file mode 100644
index 0000000..211573c
--- /dev/null
+++ b/src/tests/vimtests/movement/bigWord/B_1.test
@@ -0,0 +1,8 @@
+-- Input
+(1,1)
+quux(foo, bar, baz);
+-- Output
+(1,11)
+quux(foo, ar, baz);
+-- Events
+2W4lBBx \ No newline at end of file
diff --git a/src/tests/vimtests/movement/bigWord/b.test b/src/tests/vimtests/movement/bigWord/b.test
new file mode 100644
index 0000000..91ec7a0
--- /dev/null
+++ b/src/tests/vimtests/movement/bigWord/b.test
@@ -0,0 +1,12 @@
+-- Input
+(3,3)
+a b
+ ccc 111 22 3
+d e
+-- Output
+(3,1)
+a b
+ ccc 111 22 3
+d e
+-- Events
+B \ No newline at end of file
diff --git a/src/tests/vimtests/movement/bigWord/bbbb.test b/src/tests/vimtests/movement/bigWord/bbbb.test
new file mode 100644
index 0000000..e26b924
--- /dev/null
+++ b/src/tests/vimtests/movement/bigWord/bbbb.test
@@ -0,0 +1,12 @@
+-- Input
+(3,3)
+a b
+ ccc 111 22 3
+d e
+-- Output
+(2,6)
+a b
+ ccc 111 22 3
+d e
+-- Events
+BBBB \ No newline at end of file
diff --git a/src/tests/vimtests/movement/bigWord/e.test b/src/tests/vimtests/movement/bigWord/e.test
new file mode 100644
index 0000000..93e1b38
--- /dev/null
+++ b/src/tests/vimtests/movement/bigWord/e.test
@@ -0,0 +1,8 @@
+-- Input
+(1,1)
+aa bb cc dd
+-- Output
+(1,2)
+aa bb cc dd
+-- Events
+E
diff --git a/src/tests/vimtests/movement/bigWord/ee.test b/src/tests/vimtests/movement/bigWord/ee.test
new file mode 100644
index 0000000..3cca6c8
--- /dev/null
+++ b/src/tests/vimtests/movement/bigWord/ee.test
@@ -0,0 +1,8 @@
+-- Input
+(1,1)
+aa bb cc dd
+-- Output
+(1,5)
+aa bb cc dd
+-- Events
+EE
diff --git a/src/tests/vimtests/movement/bigWord/punctuation.test b/src/tests/vimtests/movement/bigWord/punctuation.test
new file mode 100644
index 0000000..f47a3bb
--- /dev/null
+++ b/src/tests/vimtests/movement/bigWord/punctuation.test
@@ -0,0 +1,8 @@
+-- Input
+(1,1)
+a-b+c"d foo
+-- Output
+(1,9)
+a-b+c"d foo
+-- Events
+W \ No newline at end of file
diff --git a/src/tests/vimtests/movement/bigWord/punctuation_b.test b/src/tests/vimtests/movement/bigWord/punctuation_b.test
new file mode 100644
index 0000000..fa6718d
--- /dev/null
+++ b/src/tests/vimtests/movement/bigWord/punctuation_b.test
@@ -0,0 +1,8 @@
+-- Input
+(1,11)
+a-b+c"d foo
+-- Output
+(1,1)
+a-b+c"d foo
+-- Events
+BB \ No newline at end of file
diff --git a/src/tests/vimtests/movement/bigWord/punctuation_e.test b/src/tests/vimtests/movement/bigWord/punctuation_e.test
new file mode 100644
index 0000000..a7f38e6
--- /dev/null
+++ b/src/tests/vimtests/movement/bigWord/punctuation_e.test
@@ -0,0 +1,8 @@
+-- Input
+(1,1)
+a-b+c"d foo
+-- Output
+(1,7)
+a-b+c"d foo
+-- Events
+E \ No newline at end of file
diff --git a/src/tests/vimtests/movement/bigWord/too_much_b.test b/src/tests/vimtests/movement/bigWord/too_much_b.test
new file mode 100644
index 0000000..f3497a3
--- /dev/null
+++ b/src/tests/vimtests/movement/bigWord/too_much_b.test
@@ -0,0 +1,12 @@
+-- Input
+(3,3)
+a b
+ ccc 111 22 3
+d e
+-- Output
+(1,1)
+a b
+ ccc 111 22 3
+d e
+-- Events
+BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
diff --git a/src/tests/vimtests/movement/bigWord/too_much_e.test b/src/tests/vimtests/movement/bigWord/too_much_e.test
new file mode 100644
index 0000000..f3ae4fa
--- /dev/null
+++ b/src/tests/vimtests/movement/bigWord/too_much_e.test
@@ -0,0 +1,8 @@
+-- Input
+(1,1)
+aa bb cc dd
+-- Output
+(1,11)
+aa bb cc dd
+-- Events
+EEEEEEEEEEEEEEEEEEEE
diff --git a/src/tests/vimtests/movement/bigWord/too_much_w.test b/src/tests/vimtests/movement/bigWord/too_much_w.test
new file mode 100644
index 0000000..33d66c4
--- /dev/null
+++ b/src/tests/vimtests/movement/bigWord/too_much_w.test
@@ -0,0 +1,8 @@
+-- Input
+(1,1)
+aa bb cc dd
+-- Output
+(1,11)
+aa bb cc dd
+-- Events
+WWWWWWWWWWW
diff --git a/src/tests/vimtests/movement/bigWord/w.test b/src/tests/vimtests/movement/bigWord/w.test
new file mode 100644
index 0000000..a15f907
--- /dev/null
+++ b/src/tests/vimtests/movement/bigWord/w.test
@@ -0,0 +1,8 @@
+-- Input
+(1,1)
+aa bb cc dd
+-- Output
+(1,4)
+aa bb cc dd
+-- Events
+W
diff --git a/src/tests/vimtests/movement/bigWord/ww.test b/src/tests/vimtests/movement/bigWord/ww.test
new file mode 100644
index 0000000..76aa34d
--- /dev/null
+++ b/src/tests/vimtests/movement/bigWord/ww.test
@@ -0,0 +1,8 @@
+-- Input
+(1,1)
+aa bb cc dd
+-- Output
+(1,7)
+aa bb cc dd
+-- Events
+WW
diff --git a/src/tests/vimtests/movement/char/counted_hjkl.test b/src/tests/vimtests/movement/char/counted_hjkl.test
new file mode 100644
index 0000000..b297638
--- /dev/null
+++ b/src/tests/vimtests/movement/char/counted_hjkl.test
@@ -0,0 +1,16 @@
+-- Input
+(1,2)
+aaaaaaaaaaaaaa
+bbbbbbbbbbbbbb
+cccccccccccccc
+dddddddddddddd
+eeeeeeeeeeeeee
+-- Output
+(5,4)
+aaaaaaaaaaaaaa
+bbbbbbbbbbbbbb
+cccccccccccccc
+dddddddddddddd
+eeeeeeeeeeeeee
+-- Events
+h2j3l1k2lkk4j2h \ No newline at end of file
diff --git a/src/tests/vimtests/movement/char/esc_resets_count.test b/src/tests/vimtests/movement/char/esc_resets_count.test
new file mode 100644
index 0000000..77d39c0
--- /dev/null
+++ b/src/tests/vimtests/movement/char/esc_resets_count.test
@@ -0,0 +1,14 @@
+-- Input
+(1,1)
+abc
+eee
+cd
+ddd
+-- Output
+(3,1)
+abc
+eee
+cd
+ddd
+-- Events
+3<Esc>2j \ No newline at end of file
diff --git a/src/tests/vimtests/movement/char/h.test b/src/tests/vimtests/movement/char/h.test
new file mode 100644
index 0000000..cfd0f74
--- /dev/null
+++ b/src/tests/vimtests/movement/char/h.test
@@ -0,0 +1,8 @@
+-- Input
+(1,3)
+bar
+-- Output
+(1,2)
+br
+-- Events
+hx \ No newline at end of file
diff --git a/src/tests/vimtests/movement/char/h_1.test b/src/tests/vimtests/movement/char/h_1.test
new file mode 100644
index 0000000..1c081a9
--- /dev/null
+++ b/src/tests/vimtests/movement/char/h_1.test
@@ -0,0 +1,12 @@
+-- Input
+(2,3)
+foo
+bar
+baz
+-- Output
+(2,1)
+foo
+ar
+baz
+-- Events
+10l9hx \ No newline at end of file
diff --git a/src/tests/vimtests/movement/char/h_2.test b/src/tests/vimtests/movement/char/h_2.test
new file mode 100644
index 0000000..575071f
--- /dev/null
+++ b/src/tests/vimtests/movement/char/h_2.test
@@ -0,0 +1,8 @@
+-- Input
+(1,1)
+0123456789012345
+-- Output
+(1,4)
+012456789012345
+-- Events
+13l10hx \ No newline at end of file
diff --git a/src/tests/vimtests/movement/char/h_at_bol/events b/src/tests/vimtests/movement/char/h_at_bol/events
new file mode 100644
index 0000000..f6ab3cf
--- /dev/null
+++ b/src/tests/vimtests/movement/char/h_at_bol/events
@@ -0,0 +1 @@
+hhh
diff --git a/src/tests/vimtests/movement/char/h_at_bol/input b/src/tests/vimtests/movement/char/h_at_bol/input
new file mode 100644
index 0000000..04e1d89
--- /dev/null
+++ b/src/tests/vimtests/movement/char/h_at_bol/input
@@ -0,0 +1,4 @@
+(2,1)
+aaa
+bbb
+ccc \ No newline at end of file
diff --git a/src/tests/vimtests/movement/char/h_at_bol/output b/src/tests/vimtests/movement/char/h_at_bol/output
new file mode 100644
index 0000000..04e1d89
--- /dev/null
+++ b/src/tests/vimtests/movement/char/h_at_bol/output
@@ -0,0 +1,4 @@
+(2,1)
+aaa
+bbb
+ccc \ No newline at end of file
diff --git a/src/tests/vimtests/movement/char/hjkl.test b/src/tests/vimtests/movement/char/hjkl.test
new file mode 100644
index 0000000..5aacd1c
--- /dev/null
+++ b/src/tests/vimtests/movement/char/hjkl.test
@@ -0,0 +1,10 @@
+-- Input
+(1,1)
+ab
+cd
+-- Output
+(2,2)
+ab
+cd
+-- Events
+jlllkjhl
diff --git a/src/tests/vimtests/movement/char/hjkl1.test b/src/tests/vimtests/movement/char/hjkl1.test
new file mode 100644
index 0000000..9becd4f
--- /dev/null
+++ b/src/tests/vimtests/movement/char/hjkl1.test
@@ -0,0 +1,12 @@
+-- Input
+(1,1)
+abc
+eee
+cd
+-- Output
+(3,2)
+abc
+eee
+cd
+-- Events
+lljj
diff --git a/src/tests/vimtests/movement/char/hjkl2.test b/src/tests/vimtests/movement/char/hjkl2.test
new file mode 100644
index 0000000..5141673
--- /dev/null
+++ b/src/tests/vimtests/movement/char/hjkl2.test
@@ -0,0 +1,14 @@
+-- Input
+(1,1)
+abc
+eee
+cd
+ddd
+-- Output
+(4,3)
+abc
+eee
+cd
+ddd
+-- Events
+lljjj
diff --git a/src/tests/vimtests/movement/char/hl/events b/src/tests/vimtests/movement/char/hl/events
new file mode 100644
index 0000000..f9d795c
--- /dev/null
+++ b/src/tests/vimtests/movement/char/hl/events
@@ -0,0 +1 @@
+lllhlhhl
diff --git a/src/tests/vimtests/movement/char/hl/input b/src/tests/vimtests/movement/char/hl/input
new file mode 100644
index 0000000..4b71600
--- /dev/null
+++ b/src/tests/vimtests/movement/char/hl/input
@@ -0,0 +1,4 @@
+(1,1)
+aaaaaaaaa
+bbbbbbbbb
+ccccccccc \ No newline at end of file
diff --git a/src/tests/vimtests/movement/char/hl/output b/src/tests/vimtests/movement/char/hl/output
new file mode 100644
index 0000000..df88bc7
--- /dev/null
+++ b/src/tests/vimtests/movement/char/hl/output
@@ -0,0 +1,4 @@
+(1,3)
+aaaaaaaaa
+bbbbbbbbb
+ccccccccc \ No newline at end of file
diff --git a/src/tests/vimtests/movement/char/j.test b/src/tests/vimtests/movement/char/j.test
new file mode 100644
index 0000000..a8908ae
--- /dev/null
+++ b/src/tests/vimtests/movement/char/j.test
@@ -0,0 +1,10 @@
+-- Input
+(1,1)
+bar
+bar
+-- Output
+(2,1)
+bar
+ar
+-- Events
+jx \ No newline at end of file
diff --git a/src/tests/vimtests/movement/char/j/events b/src/tests/vimtests/movement/char/j/events
new file mode 100644
index 0000000..4c559f7
--- /dev/null
+++ b/src/tests/vimtests/movement/char/j/events
@@ -0,0 +1 @@
+j
diff --git a/src/tests/vimtests/movement/char/j/input b/src/tests/vimtests/movement/char/j/input
new file mode 100644
index 0000000..d383d4a
--- /dev/null
+++ b/src/tests/vimtests/movement/char/j/input
@@ -0,0 +1,4 @@
+(1,1)
+aaa
+bbb
+ccc \ No newline at end of file
diff --git a/src/tests/vimtests/movement/char/j/output b/src/tests/vimtests/movement/char/j/output
new file mode 100644
index 0000000..04e1d89
--- /dev/null
+++ b/src/tests/vimtests/movement/char/j/output
@@ -0,0 +1,4 @@
+(2,1)
+aaa
+bbb
+ccc \ No newline at end of file
diff --git a/src/tests/vimtests/movement/char/j_1.test b/src/tests/vimtests/movement/char/j_1.test
new file mode 100644
index 0000000..6ab0b13
--- /dev/null
+++ b/src/tests/vimtests/movement/char/j_1.test
@@ -0,0 +1,10 @@
+-- Input
+(1,1)
+bar
+bar
+-- Output
+(2,1)
+bar
+ar
+-- Events
+10jx \ No newline at end of file
diff --git a/src/tests/vimtests/movement/char/j_2.test b/src/tests/vimtests/movement/char/j_2.test
new file mode 100644
index 0000000..9754407
--- /dev/null
+++ b/src/tests/vimtests/movement/char/j_2.test
@@ -0,0 +1,10 @@
+-- Input
+(1,1)
+bar
+bara
+-- Output
+(2,3)
+bar
+baa
+-- Events
+llljx \ No newline at end of file
diff --git a/src/tests/vimtests/movement/char/j_3.test b/src/tests/vimtests/movement/char/j_3.test
new file mode 100644
index 0000000..f430370
--- /dev/null
+++ b/src/tests/vimtests/movement/char/j_3.test
@@ -0,0 +1,38 @@
+-- Input
+(1,1)
+0
+1
+2
+3
+4
+5
+6
+7
+8
+9
+0
+1
+2
+3
+4
+5
+-- Output
+(14,1)
+0
+1
+2
+3
+4
+5
+6
+7
+8
+9
+0
+1
+2
+
+4
+5
+-- Events
+13jx \ No newline at end of file
diff --git a/src/tests/vimtests/movement/char/k.test b/src/tests/vimtests/movement/char/k.test
new file mode 100644
index 0000000..7c4d1b2
--- /dev/null
+++ b/src/tests/vimtests/movement/char/k.test
@@ -0,0 +1,38 @@
+-- Input
+(14,1)
+0
+1
+2
+3
+4
+5
+6
+7
+8
+9
+0
+1
+2
+3
+4
+5
+-- Output
+(4,1)
+0
+1
+2
+
+4
+5
+6
+7
+8
+9
+0
+1
+2
+3
+4
+5
+-- Events
+10kx \ No newline at end of file
diff --git a/src/tests/vimtests/movement/char/l.test b/src/tests/vimtests/movement/char/l.test
new file mode 100644
index 0000000..c061d4f
--- /dev/null
+++ b/src/tests/vimtests/movement/char/l.test
@@ -0,0 +1,8 @@
+-- Input
+(1,1)
+abcdefghijk
+-- Output
+(1,8)
+abcdefghijk
+-- Events
+2l.3l.2l. \ No newline at end of file
diff --git a/src/tests/vimtests/movement/char/l_1.test b/src/tests/vimtests/movement/char/l_1.test
new file mode 100644
index 0000000..be773b4
--- /dev/null
+++ b/src/tests/vimtests/movement/char/l_1.test
@@ -0,0 +1,8 @@
+-- Input
+(1,1)
+bar
+-- Output
+(1,2)
+br
+-- Events
+lx \ No newline at end of file
diff --git a/src/tests/vimtests/movement/char/l_2.test b/src/tests/vimtests/movement/char/l_2.test
new file mode 100644
index 0000000..dbf4eb8
--- /dev/null
+++ b/src/tests/vimtests/movement/char/l_2.test
@@ -0,0 +1,8 @@
+-- Input
+(1,1)
+bar
+-- Output
+(1,2)
+ba
+-- Events
+2lx \ No newline at end of file
diff --git a/src/tests/vimtests/movement/char/l_3.test b/src/tests/vimtests/movement/char/l_3.test
new file mode 100644
index 0000000..f49ff37
--- /dev/null
+++ b/src/tests/vimtests/movement/char/l_3.test
@@ -0,0 +1,8 @@
+-- Input
+(1,1)
+0123456789012345
+-- Output
+(1,14)
+012345678901245
+-- Events
+13lx \ No newline at end of file
diff --git a/src/tests/vimtests/movement/char/l_4.test b/src/tests/vimtests/movement/char/l_4.test
new file mode 100644
index 0000000..c900e9c
--- /dev/null
+++ b/src/tests/vimtests/movement/char/l_4.test
@@ -0,0 +1,8 @@
+-- Input
+(1,1)
+bar
+-- Output
+(1,2)
+ba
+-- Events
+10lx \ No newline at end of file
diff --git a/src/tests/vimtests/movement/char/l_at_eol/events b/src/tests/vimtests/movement/char/l_at_eol/events
new file mode 100644
index 0000000..a4a8dab
--- /dev/null
+++ b/src/tests/vimtests/movement/char/l_at_eol/events
@@ -0,0 +1 @@
+lllll
diff --git a/src/tests/vimtests/movement/char/l_at_eol/input b/src/tests/vimtests/movement/char/l_at_eol/input
new file mode 100644
index 0000000..d383d4a
--- /dev/null
+++ b/src/tests/vimtests/movement/char/l_at_eol/input
@@ -0,0 +1,4 @@
+(1,1)
+aaa
+bbb
+ccc \ No newline at end of file
diff --git a/src/tests/vimtests/movement/char/l_at_eol/output b/src/tests/vimtests/movement/char/l_at_eol/output
new file mode 100644
index 0000000..bf5d711
--- /dev/null
+++ b/src/tests/vimtests/movement/char/l_at_eol/output
@@ -0,0 +1,4 @@
+(1,3)
+aaa
+bbb
+ccc \ No newline at end of file
diff --git a/src/tests/vimtests/movement/cursorkeys/down.test b/src/tests/vimtests/movement/cursorkeys/down.test
new file mode 100644
index 0000000..368f164
--- /dev/null
+++ b/src/tests/vimtests/movement/cursorkeys/down.test
@@ -0,0 +1,12 @@
+-- Input
+(2,2)
+foo
+bar
+baz
+-- Output
+(3,2)
+foo
+bar
+baz
+-- Events
+<Down> \ No newline at end of file
diff --git a/src/tests/vimtests/movement/cursorkeys/left.test b/src/tests/vimtests/movement/cursorkeys/left.test
new file mode 100644
index 0000000..37d2528
--- /dev/null
+++ b/src/tests/vimtests/movement/cursorkeys/left.test
@@ -0,0 +1,12 @@
+-- Input
+(2,2)
+foo
+bar
+baz
+-- Output
+(2,1)
+foo
+bar
+baz
+-- Events
+<Left> \ No newline at end of file
diff --git a/src/tests/vimtests/movement/cursorkeys/right.test b/src/tests/vimtests/movement/cursorkeys/right.test
new file mode 100644
index 0000000..5e59a4e
--- /dev/null
+++ b/src/tests/vimtests/movement/cursorkeys/right.test
@@ -0,0 +1,12 @@
+-- Input
+(2,2)
+foo
+bar
+baz
+-- Output
+(2,3)
+foo
+bar
+baz
+-- Events
+<Right> \ No newline at end of file
diff --git a/src/tests/vimtests/movement/cursorkeys/up.test b/src/tests/vimtests/movement/cursorkeys/up.test
new file mode 100644
index 0000000..f0bfdac
--- /dev/null
+++ b/src/tests/vimtests/movement/cursorkeys/up.test
@@ -0,0 +1,12 @@
+-- Input
+(2,2)
+foo
+bar
+baz
+-- Output
+(1,2)
+foo
+bar
+baz
+-- Events
+<Up> \ No newline at end of file
diff --git a/src/tests/vimtests/movement/empty.test b/src/tests/vimtests/movement/empty.test
new file mode 100644
index 0000000..6e63a2f
--- /dev/null
+++ b/src/tests/vimtests/movement/empty.test
@@ -0,0 +1,8 @@
+-- Input
+(1,1)
+
+-- Output
+(1,1)
+
+-- Events
+hjkl \ No newline at end of file
diff --git a/src/tests/vimtests/movement/empty_1.test b/src/tests/vimtests/movement/empty_1.test
new file mode 100644
index 0000000..bc2b728
--- /dev/null
+++ b/src/tests/vimtests/movement/empty_1.test
@@ -0,0 +1,8 @@
+-- Input
+(1,1)
+
+-- Output
+(1,1)
+
+-- Events
+ggG$0 \ No newline at end of file
diff --git a/src/tests/vimtests/movement/eol_j.test b/src/tests/vimtests/movement/eol_j.test
new file mode 100644
index 0000000..38851c7
--- /dev/null
+++ b/src/tests/vimtests/movement/eol_j.test
@@ -0,0 +1,14 @@
+-- Input
+(2,2)
+Lorem ipsum dolor sit amet
+abc def ghi
+
+qwe rty uiop
+-- Output
+(4,12)
+Lorem ipsum dolor sit amet
+abc def ghi
+
+qwe rty uiop
+-- Events
+$jj \ No newline at end of file
diff --git a/src/tests/vimtests/movement/eol_j2.test b/src/tests/vimtests/movement/eol_j2.test
new file mode 100644
index 0000000..c305ede
--- /dev/null
+++ b/src/tests/vimtests/movement/eol_j2.test
@@ -0,0 +1,14 @@
+-- Input
+(1,2)
+Lorem ipsum dolor sit amet
+abc def ghi
+
+qwe rty uiop
+-- Output
+(2,1)
+Lorem ipsum dolor sit amet
+abc def ghi
+
+qwe rty uiop
+-- Events
+$0j \ No newline at end of file
diff --git a/src/tests/vimtests/movement/file/G_no_count.test b/src/tests/vimtests/movement/file/G_no_count.test
new file mode 100644
index 0000000..b759b33
--- /dev/null
+++ b/src/tests/vimtests/movement/file/G_no_count.test
@@ -0,0 +1,14 @@
+-- Input
+(1,4)
+aa bb cc dd
+aa bb cc dd
+aa bb cc dd
+aa bb cc dd
+-- Output
+(4,1)
+aa bb cc dd
+aa bb cc dd
+aa bb cc dd
+aa bb cc dd
+-- Events
+G
diff --git a/src/tests/vimtests/movement/file/G_with_count_1.test b/src/tests/vimtests/movement/file/G_with_count_1.test
new file mode 100644
index 0000000..77cdcca
--- /dev/null
+++ b/src/tests/vimtests/movement/file/G_with_count_1.test
@@ -0,0 +1,14 @@
+-- Input
+(3,4)
+aa bb cc dd
+aa bb cc dd
+aa bb cc dd
+aa bb cc dd
+-- Output
+(1,1)
+aa bb cc dd
+aa bb cc dd
+aa bb cc dd
+aa bb cc dd
+-- Events
+1G
diff --git a/src/tests/vimtests/movement/file/G_with_count_2.test b/src/tests/vimtests/movement/file/G_with_count_2.test
new file mode 100644
index 0000000..4da8082
--- /dev/null
+++ b/src/tests/vimtests/movement/file/G_with_count_2.test
@@ -0,0 +1,14 @@
+-- Input
+(3,4)
+aa bb cc dd
+aa bb cc dd
+aa bb cc dd
+aa bb cc dd
+-- Output
+(2,1)
+aa bb cc dd
+aa bb cc dd
+aa bb cc dd
+aa bb cc dd
+-- Events
+2G
diff --git a/src/tests/vimtests/movement/file/G_with_too_much_count.test b/src/tests/vimtests/movement/file/G_with_too_much_count.test
new file mode 100644
index 0000000..820a680
--- /dev/null
+++ b/src/tests/vimtests/movement/file/G_with_too_much_count.test
@@ -0,0 +1,14 @@
+-- Input
+(3,4)
+aa bb cc dd
+aa bb cc dd
+aa bb cc dd
+aa bb cc dd
+-- Output
+(4,1)
+aa bb cc dd
+aa bb cc dd
+aa bb cc dd
+aa bb cc dd
+-- Events
+1000G
diff --git a/src/tests/vimtests/movement/file/H_no_count.test b/src/tests/vimtests/movement/file/H_no_count.test
new file mode 100644
index 0000000..a8b876e
--- /dev/null
+++ b/src/tests/vimtests/movement/file/H_no_count.test
@@ -0,0 +1,21 @@
+--+ WindowSize 12 5
+-- Input
+(4,3)
+aa bb cc dd
+aa bb cc dd
+aa bb cc dd
+aa bb cc dd
+aa bb cc dd
+aa bb cc dd
+aa bb cc dd
+-- Output
+(2,1)
+aa bb cc dd
+aa bb cc dd
+aa bb cc dd
+aa bb cc dd
+aa bb cc dd
+aa bb cc dd
+aa bb cc dd
+-- Events
+2H
diff --git a/src/tests/vimtests/movement/file/H_with_count_2.test b/src/tests/vimtests/movement/file/H_with_count_2.test
new file mode 100644
index 0000000..a8b876e
--- /dev/null
+++ b/src/tests/vimtests/movement/file/H_with_count_2.test
@@ -0,0 +1,21 @@
+--+ WindowSize 12 5
+-- Input
+(4,3)
+aa bb cc dd
+aa bb cc dd
+aa bb cc dd
+aa bb cc dd
+aa bb cc dd
+aa bb cc dd
+aa bb cc dd
+-- Output
+(2,1)
+aa bb cc dd
+aa bb cc dd
+aa bb cc dd
+aa bb cc dd
+aa bb cc dd
+aa bb cc dd
+aa bb cc dd
+-- Events
+2H
diff --git a/src/tests/vimtests/movement/file/L_no_count.test b/src/tests/vimtests/movement/file/L_no_count.test
new file mode 100644
index 0000000..cfff4e9
--- /dev/null
+++ b/src/tests/vimtests/movement/file/L_no_count.test
@@ -0,0 +1,21 @@
+--+ WindowSize 12 5
+-- Input
+(2,3)
+aa bb cc dd
+aa bb cc dd
+aa bb cc dd
+aa bb cc dd
+aa bb cc dd
+aa bb cc dd
+aa bb cc dd
+-- Output
+(5,1)
+aa bb cc dd
+aa bb cc dd
+aa bb cc dd
+aa bb cc dd
+aa bb cc dd
+aa bb cc dd
+aa bb cc dd
+-- Events
+L
diff --git a/src/tests/vimtests/movement/file/L_with_count_2.test b/src/tests/vimtests/movement/file/L_with_count_2.test
new file mode 100644
index 0000000..37346f3
--- /dev/null
+++ b/src/tests/vimtests/movement/file/L_with_count_2.test
@@ -0,0 +1,21 @@
+--+ WindowSize 12 5
+-- Input
+(2,3)
+aa bb cc dd
+aa bb cc dd
+aa bb cc dd
+aa bb cc dd
+aa bb cc dd
+aa bb cc dd
+aa bb cc dd
+-- Output
+(4,1)
+aa bb cc dd
+aa bb cc dd
+aa bb cc dd
+aa bb cc dd
+aa bb cc dd
+aa bb cc dd
+aa bb cc dd
+-- Events
+2L
diff --git a/src/tests/vimtests/movement/file/M.test b/src/tests/vimtests/movement/file/M.test
new file mode 100644
index 0000000..6cfdf79
--- /dev/null
+++ b/src/tests/vimtests/movement/file/M.test
@@ -0,0 +1,21 @@
+--+ WindowSize 12 5
+-- Input
+(2,3)
+aa bb cc dd
+aa bb cc dd
+aa bb cc dd
+aa bb cc dd
+aa bb cc dd
+aa bb cc dd
+aa bb cc dd
+-- Output
+(3,1)
+aa bb cc dd
+aa bb cc dd
+aa bb cc dd
+aa bb cc dd
+aa bb cc dd
+aa bb cc dd
+aa bb cc dd
+-- Events
+M
diff --git a/src/tests/vimtests/movement/intraline/0.test b/src/tests/vimtests/movement/intraline/0.test
new file mode 100644
index 0000000..e8f0b1a
--- /dev/null
+++ b/src/tests/vimtests/movement/intraline/0.test
@@ -0,0 +1,14 @@
+-- Input
+(1,3)
+abc
+eee
+cd
+ddd
+-- Output
+(1,1)
+abc
+eee
+cd
+ddd
+-- Events
+0
diff --git a/src/tests/vimtests/movement/intraline/00.test b/src/tests/vimtests/movement/intraline/00.test
new file mode 100644
index 0000000..7142c7c
--- /dev/null
+++ b/src/tests/vimtests/movement/intraline/00.test
@@ -0,0 +1,14 @@
+-- Input
+(2,2)
+abc
+eee
+cd
+ddd
+-- Output
+(2,1)
+abc
+eee
+cd
+ddd
+-- Events
+00
diff --git a/src/tests/vimtests/movement/intraline/2dollar.test b/src/tests/vimtests/movement/intraline/2dollar.test
new file mode 100644
index 0000000..2703c5a
--- /dev/null
+++ b/src/tests/vimtests/movement/intraline/2dollar.test
@@ -0,0 +1,14 @@
+-- Input
+(1,1)
+abc
+eeefoo
+cd
+ddd
+-- Output
+(2,6)
+abc
+eeefoo
+cd
+ddd
+-- Events
+2$
diff --git a/src/tests/vimtests/movement/intraline/caret.test b/src/tests/vimtests/movement/intraline/caret.test
new file mode 100644
index 0000000..7e66469
--- /dev/null
+++ b/src/tests/vimtests/movement/intraline/caret.test
@@ -0,0 +1,10 @@
+-- Input
+(1,1)
+abc def ghi
+ qwe rty uiop
+-- Output
+(2,5)
+abc def ghi
+ qwe rty uiop
+-- Events
+$j^ \ No newline at end of file
diff --git a/src/tests/vimtests/movement/intraline/dollar.test b/src/tests/vimtests/movement/intraline/dollar.test
new file mode 100644
index 0000000..f9d8330
--- /dev/null
+++ b/src/tests/vimtests/movement/intraline/dollar.test
@@ -0,0 +1,14 @@
+-- Input
+(1,1)
+abc
+eee
+cd
+ddd
+-- Output
+(1,3)
+abc
+eee
+cd
+ddd
+-- Events
+$
diff --git a/src/tests/vimtests/movement/intraline/dollardollar.test b/src/tests/vimtests/movement/intraline/dollardollar.test
new file mode 100644
index 0000000..edc0161
--- /dev/null
+++ b/src/tests/vimtests/movement/intraline/dollardollar.test
@@ -0,0 +1,14 @@
+-- Input
+(1,1)
+abc
+eee
+cd
+ddd
+-- Output
+(1,3)
+abc
+eee
+cd
+ddd
+-- Events
+$$
diff --git a/src/tests/vimtests/movement/intraline/dollarj.test b/src/tests/vimtests/movement/intraline/dollarj.test
new file mode 100644
index 0000000..e5e70ac
--- /dev/null
+++ b/src/tests/vimtests/movement/intraline/dollarj.test
@@ -0,0 +1,12 @@
+-- Input
+(3,1)
+Lorem ipsum dolor sit amet
+abc def ghi
+qwe rty uiop
+-- Output
+(1,26)
+Lorem ipsum dolor sit amet
+abc def ghi
+qwe rty uiop
+-- Events
+$kk \ No newline at end of file
diff --git a/src/tests/vimtests/movement/intraline/end.test b/src/tests/vimtests/movement/intraline/end.test
new file mode 100644
index 0000000..893eeae
--- /dev/null
+++ b/src/tests/vimtests/movement/intraline/end.test
@@ -0,0 +1,12 @@
+-- Input
+(2,2)
+foo
+bar
+baz
+-- Output
+(2,3)
+foo
+bar
+baz
+-- Events
+<End> \ No newline at end of file
diff --git a/src/tests/vimtests/movement/intraline/home.test b/src/tests/vimtests/movement/intraline/home.test
new file mode 100644
index 0000000..83cb499
--- /dev/null
+++ b/src/tests/vimtests/movement/intraline/home.test
@@ -0,0 +1,12 @@
+-- Input
+(2,2)
+foo
+bar
+baz
+-- Output
+(2,1)
+foo
+bar
+baz
+-- Events
+<Home> \ No newline at end of file
diff --git a/src/tests/vimtests/movement/v_eol_j2.test b/src/tests/vimtests/movement/v_eol_j2.test
new file mode 100644
index 0000000..19e57af
--- /dev/null
+++ b/src/tests/vimtests/movement/v_eol_j2.test
@@ -0,0 +1,14 @@
+-- Input
+(1,2)
+Lorem ipsum dolor sit amet
+abc def ghi
+
+qwe rty uiop
+-- Output
+(2,1)
+Lorem ipsum dolor sit amet
+abc def ghi
+
+qwe rty uiop
+-- Events
+v$0j \ No newline at end of file
diff --git a/src/tests/vimtests/movement/word/2e.test b/src/tests/vimtests/movement/word/2e.test
new file mode 100644
index 0000000..2a7c263
--- /dev/null
+++ b/src/tests/vimtests/movement/word/2e.test
@@ -0,0 +1,8 @@
+-- Input
+(1,1)
+aa bb cc dd
+-- Output
+(1,5)
+aa bb cc dd
+-- Events
+2e
diff --git a/src/tests/vimtests/movement/word/2w.test b/src/tests/vimtests/movement/word/2w.test
new file mode 100644
index 0000000..5f482a0
--- /dev/null
+++ b/src/tests/vimtests/movement/word/2w.test
@@ -0,0 +1,8 @@
+-- Input
+(1,1)
+aa bb cc dd
+-- Output
+(1,7)
+aa bb cc dd
+-- Events
+2w
diff --git a/src/tests/vimtests/movement/word/6b.test b/src/tests/vimtests/movement/word/6b.test
new file mode 100644
index 0000000..cbf6fe0
--- /dev/null
+++ b/src/tests/vimtests/movement/word/6b.test
@@ -0,0 +1,12 @@
+-- Input
+(3,3)
+a b
+ ccc 111 22 3
+d e
+-- Output
+(1,3)
+a b
+ ccc 111 22 3
+d e
+-- Events
+6b \ No newline at end of file
diff --git a/src/tests/vimtests/movement/word/b.test b/src/tests/vimtests/movement/word/b.test
new file mode 100644
index 0000000..6c0e553
--- /dev/null
+++ b/src/tests/vimtests/movement/word/b.test
@@ -0,0 +1,12 @@
+-- Input
+(3,3)
+a b
+ ccc 111 22 3
+d e
+-- Output
+(3,1)
+a b
+ ccc 111 22 3
+d e
+-- Events
+b \ No newline at end of file
diff --git a/src/tests/vimtests/movement/word/bbbb.test b/src/tests/vimtests/movement/word/bbbb.test
new file mode 100644
index 0000000..fefd56a
--- /dev/null
+++ b/src/tests/vimtests/movement/word/bbbb.test
@@ -0,0 +1,12 @@
+-- Input
+(3,3)
+a b
+ ccc 111 22 3
+d e
+-- Output
+(2,6)
+a b
+ ccc 111 22 3
+d e
+-- Events
+bbbb \ No newline at end of file
diff --git a/src/tests/vimtests/movement/word/e.test b/src/tests/vimtests/movement/word/e.test
new file mode 100644
index 0000000..35097bf
--- /dev/null
+++ b/src/tests/vimtests/movement/word/e.test
@@ -0,0 +1,8 @@
+-- Input
+(1,1)
+aa bb cc dd
+-- Output
+(1,2)
+aa bb cc dd
+-- Events
+e
diff --git a/src/tests/vimtests/movement/word/ee.test b/src/tests/vimtests/movement/word/ee.test
new file mode 100644
index 0000000..5bdd0b0
--- /dev/null
+++ b/src/tests/vimtests/movement/word/ee.test
@@ -0,0 +1,8 @@
+-- Input
+(1,1)
+aa bb cc dd
+-- Output
+(1,5)
+aa bb cc dd
+-- Events
+ee
diff --git a/src/tests/vimtests/movement/word/punctuation.test b/src/tests/vimtests/movement/word/punctuation.test
new file mode 100644
index 0000000..c964f5b
--- /dev/null
+++ b/src/tests/vimtests/movement/word/punctuation.test
@@ -0,0 +1,8 @@
+-- Input
+(1,1)
+a-b+c"d foo
+-- Output
+(1,5)
+a-b+c"d foo
+-- Events
+wwww \ No newline at end of file
diff --git a/src/tests/vimtests/movement/word/punctuation_b.test b/src/tests/vimtests/movement/word/punctuation_b.test
new file mode 100644
index 0000000..c610bf0
--- /dev/null
+++ b/src/tests/vimtests/movement/word/punctuation_b.test
@@ -0,0 +1,8 @@
+-- Input
+(1,11)
+a-b+c"d foo
+-- Output
+(1,5)
+a-b+c"d foo
+-- Events
+bbbb \ No newline at end of file
diff --git a/src/tests/vimtests/movement/word/punctuation_e.test b/src/tests/vimtests/movement/word/punctuation_e.test
new file mode 100644
index 0000000..e4053e0
--- /dev/null
+++ b/src/tests/vimtests/movement/word/punctuation_e.test
@@ -0,0 +1,8 @@
+-- Input
+(1,1)
+a-b+c"d foo
+-- Output
+(1,5)
+a-b+c"d foo
+-- Events
+eeee \ No newline at end of file
diff --git a/src/tests/vimtests/movement/word/too_much_b.test b/src/tests/vimtests/movement/word/too_much_b.test
new file mode 100644
index 0000000..4e11e2f
--- /dev/null
+++ b/src/tests/vimtests/movement/word/too_much_b.test
@@ -0,0 +1,12 @@
+-- Input
+(3,3)
+a b
+ ccc 111 22 3
+d e
+-- Output
+(1,1)
+a b
+ ccc 111 22 3
+d e
+-- Events
+bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
diff --git a/src/tests/vimtests/movement/word/too_much_e.test b/src/tests/vimtests/movement/word/too_much_e.test
new file mode 100644
index 0000000..085d7ce
--- /dev/null
+++ b/src/tests/vimtests/movement/word/too_much_e.test
@@ -0,0 +1,8 @@
+-- Input
+(1,1)
+aa bb cc dd
+-- Output
+(1,11)
+aa bb cc dd
+-- Events
+eeeeeeeeeeeeeeeeeeee
diff --git a/src/tests/vimtests/movement/word/too_much_w.test b/src/tests/vimtests/movement/word/too_much_w.test
new file mode 100644
index 0000000..437c3a2
--- /dev/null
+++ b/src/tests/vimtests/movement/word/too_much_w.test
@@ -0,0 +1,8 @@
+-- Input
+(1,1)
+aa bb cc dd
+-- Output
+(1,11)
+aa bb cc dd
+-- Events
+wwwwwwwwwww
diff --git a/src/tests/vimtests/movement/word/w.test b/src/tests/vimtests/movement/word/w.test
new file mode 100644
index 0000000..35199d2
--- /dev/null
+++ b/src/tests/vimtests/movement/word/w.test
@@ -0,0 +1,8 @@
+-- Input
+(1,1)
+aa bb cc dd
+-- Output
+(1,4)
+aa bb cc dd
+-- Events
+w
diff --git a/src/tests/vimtests/movement/word/w_1.test b/src/tests/vimtests/movement/word/w_1.test
new file mode 100644
index 0000000..875b741
--- /dev/null
+++ b/src/tests/vimtests/movement/word/w_1.test
@@ -0,0 +1,8 @@
+-- Input
+(1,1)
+bar
+-- Output
+(1,3)
+bar
+-- Events
+w \ No newline at end of file
diff --git a/src/tests/vimtests/movement/word/w_2.test b/src/tests/vimtests/movement/word/w_2.test
new file mode 100644
index 0000000..03ba993
--- /dev/null
+++ b/src/tests/vimtests/movement/word/w_2.test
@@ -0,0 +1,8 @@
+-- Input
+(1,1)
+quux(foo, bar, baz);
+-- Output
+(1,15)
+quuxfoo ar baz;
+-- Events
+wxwxwxwx2wx \ No newline at end of file
diff --git a/src/tests/vimtests/movement/word/ww.test b/src/tests/vimtests/movement/word/ww.test
new file mode 100644
index 0000000..06a9f38
--- /dev/null
+++ b/src/tests/vimtests/movement/word/ww.test
@@ -0,0 +1,8 @@
+-- Input
+(1,1)
+aa bb cc dd
+-- Output
+(1,7)
+aa bb cc dd
+-- Events
+ww
diff --git a/src/tests/vimtests/numbers/cursor_on_digits.test b/src/tests/vimtests/numbers/cursor_on_digits.test
new file mode 100644
index 0000000..d1fab16
--- /dev/null
+++ b/src/tests/vimtests/numbers/cursor_on_digits.test
@@ -0,0 +1,14 @@
+-- Input
+(1,1)
+Test increasing 109 to 110 when cursor is on 9.
+Test increasing 109 to 110 when cursor is on 0.
+Test increasing 109 to 110 when cursor is on 1.
+Test increasing 109 to 110 when cursor is on space before 1.
+-- Output
+(4,19)
+Test increasing 110 to 110 when cursor is on 9.
+Test increasing 110 to 110 when cursor is on 0.
+Test increasing 110 to 110 when cursor is on 1.
+Test increasing 110 to 110 when cursor is on space before 1.
+-- Events
+3e<C-a>jh<C-a>j2h<C-a>j3h<C-a> \ No newline at end of file
diff --git a/src/tests/vimtests/numbers/decrement.test b/src/tests/vimtests/numbers/decrement.test
new file mode 100644
index 0000000..5ff625f
--- /dev/null
+++ b/src/tests/vimtests/numbers/decrement.test
@@ -0,0 +1,20 @@
+-- Input
+(1,1)
+Test decreasing 101 to 99
+Test decreasing 11 to 9
+Test decreasing 9 to 1
+Test decreasing 1 to 0
+Test decreasing 0 to -1
+Test decreasing -1 to -11
+Test decreasing -99 to -101
+-- Output
+(7,20)
+Test decreasing 99 to 99
+Test decreasing 9 to 9
+Test decreasing 1 to 1
+Test decreasing 0 to 0
+Test decreasing -1 to -1
+Test decreasing -11 to -11
+Test decreasing -101 to -101
+-- Events
+2<C-x>j2<C-x>j8<C-x>j<C-x>j<C-x>j10<C-x>j2<C-x>
diff --git a/src/tests/vimtests/numbers/hex_decrease.test b/src/tests/vimtests/numbers/hex_decrease.test
new file mode 100644
index 0000000..a9a19ff
--- /dev/null
+++ b/src/tests/vimtests/numbers/hex_decrease.test
@@ -0,0 +1,16 @@
+-- Input
+(1,1)
+Test decreasing 0x1 to 0x0
+Test decreasing 0xa to 0x9
+Test decreasing 0x10 to 0xf
+Test decreasing 0x20 to 0x1f
+Test decreasing 0x100 to 0xff
+-- Output
+(5,20)
+Test decreasing 0x0 to 0x0
+Test decreasing 0x9 to 0x9
+Test decreasing 0xf to 0xf
+Test decreasing 0x1f to 0x1f
+Test decreasing 0xff to 0xff
+-- Events
+<C-x>j<C-x>j<C-x>j<C-x>j<C-x> \ No newline at end of file
diff --git a/src/tests/vimtests/numbers/hex_increase.test b/src/tests/vimtests/numbers/hex_increase.test
new file mode 100644
index 0000000..6a5c919
--- /dev/null
+++ b/src/tests/vimtests/numbers/hex_increase.test
@@ -0,0 +1,16 @@
+-- Input
+(1,1)
+Test increasing 0x1 to 0x2
+Test increasing 0x9 to 0xa
+Test increasing 0xf to 0x10
+Test increasing 0x1f to 0x20
+Test increasing 0xff to 0x100
+-- Output
+(5,21)
+Test increasing 0x2 to 0x2
+Test increasing 0xa to 0xa
+Test increasing 0x10 to 0x10
+Test increasing 0x20 to 0x20
+Test increasing 0x100 to 0x100
+-- Events
+<C-a>j<C-a>j<C-a>j<C-a>j<C-a> \ No newline at end of file
diff --git a/src/tests/vimtests/numbers/increment.test b/src/tests/vimtests/numbers/increment.test
new file mode 100644
index 0000000..a6bae6b
--- /dev/null
+++ b/src/tests/vimtests/numbers/increment.test
@@ -0,0 +1,14 @@
+-- Input
+(1,1)
+Test increasing 0 to 11
+Test increasing -11 to 11
+Test increasing -101 to -99
+Test increasing 99 to 101
+-- Output
+(4,19)
+Test increasing 11 to 11
+Test increasing 11 to 11
+Test increasing -99 to -99
+Test increasing 101 to 101
+-- Events
+11<C-a>j22<C-a>j2<C-a>jh2<C-a>
diff --git a/src/tests/vimtests/numbers/no_numbers.test b/src/tests/vimtests/numbers/no_numbers.test
new file mode 100644
index 0000000..4d6bf61
--- /dev/null
+++ b/src/tests/vimtests/numbers/no_numbers.test
@@ -0,0 +1,12 @@
+-- Input
+(1,1)
+Test case if numbers are not present on the line.
+This should not cause yi to freeze.
+This should not cause the cursor to move.
+-- Output
+(3,1)
+Test case if numbers are not present on the line.
+This should not cause yi to freeze.
+This should not cause the cursor to move.
+-- Events
+<C-a><C-x>j<C-a><C-x>$<C-a><C-x>^11<C-x>j \ No newline at end of file
diff --git a/src/tests/vimtests/numbers/oct_decrease.test b/src/tests/vimtests/numbers/oct_decrease.test
new file mode 100644
index 0000000..4ddb50a
--- /dev/null
+++ b/src/tests/vimtests/numbers/oct_decrease.test
@@ -0,0 +1,14 @@
+-- Input
+(1,1)
+Test decreasing 0o1 to 0o0
+Test decreasing 0o10 to 0o7
+Test decreasing 0o20 to 0o17
+Test decreasing 0o100 to 0o77
+-- Output
+(4,20)
+Test decreasing 0o0 to 0o0
+Test decreasing 0o7 to 0o7
+Test decreasing 0o17 to 0o17
+Test decreasing 0o77 to 0o77
+-- Events
+<C-x>j<C-x>j<C-x>j<C-x> \ No newline at end of file
diff --git a/src/tests/vimtests/numbers/oct_hex_letters.test b/src/tests/vimtests/numbers/oct_hex_letters.test
new file mode 100644
index 0000000..4677840
--- /dev/null
+++ b/src/tests/vimtests/numbers/oct_hex_letters.test
@@ -0,0 +1,10 @@
+-- Input
+(1,1)
+Make sure aa bb cc dd ee ff 0x1 increments correctly.
+Make sure oo 0o1 increments correctly.
+-- Output
+(2,16)
+Make sure aa bb cc dd ee ff 0x2 increments correctly.
+Make sure oo 0o2 increments correctly.
+-- Events
+<C-a>+<C-a> \ No newline at end of file
diff --git a/src/tests/vimtests/numbers/oct_increase.test b/src/tests/vimtests/numbers/oct_increase.test
new file mode 100644
index 0000000..e7c6741
--- /dev/null
+++ b/src/tests/vimtests/numbers/oct_increase.test
@@ -0,0 +1,14 @@
+-- Input
+(1,1)
+Test increasing 0o1 to 0o2
+Test increasing 0o7 to 0o10
+Test increasing 0o17 to 0o20
+Test increasing 0o77 to 0o100
+-- Output
+(4,21)
+Test increasing 0o2 to 0o2
+Test increasing 0o10 to 0o10
+Test increasing 0o20 to 0o20
+Test increasing 0o100 to 0o100
+-- Events
+<C-a>j<C-a>j<C-a>j<C-a> \ No newline at end of file
diff --git a/src/tests/vimtests/numbers/sol_eol.test b/src/tests/vimtests/numbers/sol_eol.test
new file mode 100644
index 0000000..6f3a67b
--- /dev/null
+++ b/src/tests/vimtests/numbers/sol_eol.test
@@ -0,0 +1,12 @@
+-- Input
+(1,1)
+0x1
+0o1
+1
+-- Output
+(3,1)
+0x5
+0o4
+3
+-- Events
+4<C-a>j3<C-a>j2<C-a> \ No newline at end of file
diff --git a/src/tests/vimtests/paste/2dd_capP.test b/src/tests/vimtests/paste/2dd_capP.test
new file mode 100644
index 0000000..ec1e930
--- /dev/null
+++ b/src/tests/vimtests/paste/2dd_capP.test
@@ -0,0 +1,14 @@
+-- Input
+(2,1)
+Lorem ipsum dolor sit amet
+abc def ghi
+qwe rty uiop
+foo
+-- Output
+(2,1)
+Lorem ipsum dolor sit amet
+abc def ghi
+qwe rty uiop
+foo
+-- Events
+2ddP \ No newline at end of file
diff --git a/src/tests/vimtests/paste/2dd_capP_1.test b/src/tests/vimtests/paste/2dd_capP_1.test
new file mode 100644
index 0000000..043e1d0
--- /dev/null
+++ b/src/tests/vimtests/paste/2dd_capP_1.test
@@ -0,0 +1,12 @@
+-- Input
+(2,1)
+Lorem ipsum dolor sit amet
+abc def ghi
+qwe rty uiop
+-- Output
+(1,1)
+abc def ghi
+qwe rty uiop
+Lorem ipsum dolor sit amet
+-- Events
+2ddP \ No newline at end of file
diff --git a/src/tests/vimtests/paste/2ddp.test b/src/tests/vimtests/paste/2ddp.test
new file mode 100644
index 0000000..28b1ec8
--- /dev/null
+++ b/src/tests/vimtests/paste/2ddp.test
@@ -0,0 +1,12 @@
+-- Input
+(1,1)
+Lorem ipsum dolor sit amet
+abc def ghi
+qwe rty uiop
+-- Output
+(2,1)
+qwe rty uiop
+Lorem ipsum dolor sit amet
+abc def ghi
+-- Events
+2ddp \ No newline at end of file
diff --git a/src/tests/vimtests/paste/2ddp_1.test b/src/tests/vimtests/paste/2ddp_1.test
new file mode 100644
index 0000000..15cb1c3
--- /dev/null
+++ b/src/tests/vimtests/paste/2ddp_1.test
@@ -0,0 +1,12 @@
+-- Input
+(3,3)
+Lorem ipsum dolor sit amet
+abc def ghi
+qwe rty uiop
+-- Output
+(3,1)
+Lorem ipsum dolor sit amet
+abc def ghi
+qwe rty uiop
+-- Events
+2ddp \ No newline at end of file
diff --git a/src/tests/vimtests/paste/2yyp.test b/src/tests/vimtests/paste/2yyp.test
new file mode 100644
index 0000000..c981f39
--- /dev/null
+++ b/src/tests/vimtests/paste/2yyp.test
@@ -0,0 +1,14 @@
+-- Input
+(1,1)
+Lorem ipsum dolor sit amet
+abc def ghi
+qwe rty uiop
+-- Output
+(2,1)
+Lorem ipsum dolor sit amet
+Lorem ipsum dolor sit amet
+abc def ghi
+abc def ghi
+qwe rty uiop
+-- Events
+2yyp \ No newline at end of file
diff --git a/src/tests/vimtests/paste/Yp.test b/src/tests/vimtests/paste/Yp.test
new file mode 100644
index 0000000..c726750
--- /dev/null
+++ b/src/tests/vimtests/paste/Yp.test
@@ -0,0 +1,12 @@
+-- Input
+(1,10)
+Lorem ipsum dolor sit amet
+abc def ghi
+qwe rty uiop
+-- Output
+(1,27)
+Lorem ipsuum dolor sit ametm dolor sit amet
+abc def ghi
+qwe rty uiop
+-- Events
+Yp
diff --git a/src/tests/vimtests/paste/d2wp.test b/src/tests/vimtests/paste/d2wp.test
new file mode 100644
index 0000000..0ed4179
--- /dev/null
+++ b/src/tests/vimtests/paste/d2wp.test
@@ -0,0 +1,12 @@
+-- Input
+(1,9)
+Lorem ipsum dolor sit amet
+abc def ghi
+qwe rty uiop
+-- Output
+(1,19)
+Lorem ipssum dolor it amet
+abc def ghi
+qwe rty uiop
+-- Events
+d2wp \ No newline at end of file
diff --git a/src/tests/vimtests/paste/dbp.test b/src/tests/vimtests/paste/dbp.test
new file mode 100644
index 0000000..fc01a44
--- /dev/null
+++ b/src/tests/vimtests/paste/dbp.test
@@ -0,0 +1,12 @@
+-- Input
+(1,9)
+Lorem ipsum dolor sit amet
+abc def ghi
+qwe rty uiop
+-- Output
+(1,9)
+Lorem sipum dolor sit amet
+abc def ghi
+qwe rty uiop
+-- Events
+dbp \ No newline at end of file
diff --git a/src/tests/vimtests/paste/dd_capP.test b/src/tests/vimtests/paste/dd_capP.test
new file mode 100644
index 0000000..504cc35
--- /dev/null
+++ b/src/tests/vimtests/paste/dd_capP.test
@@ -0,0 +1,12 @@
+-- Input
+(2,6)
+Lorem ipsum dolor sit amet
+abc def ghi
+qwe rty uiop
+-- Output
+(2,1)
+Lorem ipsum dolor sit amet
+abc def ghi
+qwe rty uiop
+-- Events
+ddP \ No newline at end of file
diff --git a/src/tests/vimtests/paste/dd_capP_1.test b/src/tests/vimtests/paste/dd_capP_1.test
new file mode 100644
index 0000000..758e513
--- /dev/null
+++ b/src/tests/vimtests/paste/dd_capP_1.test
@@ -0,0 +1,12 @@
+-- Input
+(3,6)
+Lorem ipsum dolor sit amet
+abc def ghi
+qwe rty uiop
+-- Output
+(2,1)
+Lorem ipsum dolor sit amet
+qwe rty uiop
+abc def ghi
+-- Events
+ddP \ No newline at end of file
diff --git a/src/tests/vimtests/paste/ddjp.test b/src/tests/vimtests/paste/ddjp.test
new file mode 100644
index 0000000..308f929
--- /dev/null
+++ b/src/tests/vimtests/paste/ddjp.test
@@ -0,0 +1,12 @@
+-- Input
+(1,1)
+Lorem ipsum dolor sit amet
+abc def ghi
+qwe rty uiop
+-- Output
+(3,1)
+abc def ghi
+qwe rty uiop
+Lorem ipsum dolor sit amet
+-- Events
+ddjp \ No newline at end of file
diff --git a/src/tests/vimtests/paste/ddkP.test b/src/tests/vimtests/paste/ddkP.test
new file mode 100644
index 0000000..d009219
--- /dev/null
+++ b/src/tests/vimtests/paste/ddkP.test
@@ -0,0 +1,12 @@
+-- Input
+(2,1)
+Lorem ipsum dolor sit amet
+abc def ghi
+qwe rty uiop
+-- Output
+(1,1)
+abc def ghi
+Lorem ipsum dolor sit amet
+qwe rty uiop
+-- Events
+ddkP \ No newline at end of file
diff --git a/src/tests/vimtests/paste/ddp.test b/src/tests/vimtests/paste/ddp.test
new file mode 100644
index 0000000..a71a9a7
--- /dev/null
+++ b/src/tests/vimtests/paste/ddp.test
@@ -0,0 +1,12 @@
+-- Input
+(1,1)
+Lorem ipsum dolor sit amet
+abc def ghi
+qwe rty uiop
+-- Output
+(2,1)
+abc def ghi
+Lorem ipsum dolor sit amet
+qwe rty uiop
+-- Events
+ddp \ No newline at end of file
diff --git a/src/tests/vimtests/paste/ddp_1.test b/src/tests/vimtests/paste/ddp_1.test
new file mode 100644
index 0000000..83930c8
--- /dev/null
+++ b/src/tests/vimtests/paste/ddp_1.test
@@ -0,0 +1,12 @@
+-- Input
+(3,2)
+Lorem ipsum dolor sit amet
+abc def ghi
+qwe rty uiop
+-- Output
+(3,1)
+Lorem ipsum dolor sit amet
+abc def ghi
+qwe rty uiop
+-- Events
+ddp \ No newline at end of file
diff --git a/src/tests/vimtests/paste/dep.test b/src/tests/vimtests/paste/dep.test
new file mode 100644
index 0000000..c851740
--- /dev/null
+++ b/src/tests/vimtests/paste/dep.test
@@ -0,0 +1,12 @@
+-- Input
+(1,1)
+Lorem ipsum dolor sit amet
+abc def ghi
+qwe rty uiop
+-- Output
+(1,6)
+ Loremipsum dolor sit amet
+abc def ghi
+qwe rty uiop
+-- Events
+dep \ No newline at end of file
diff --git a/src/tests/vimtests/paste/dw_capP.test b/src/tests/vimtests/paste/dw_capP.test
new file mode 100644
index 0000000..c0e65da
--- /dev/null
+++ b/src/tests/vimtests/paste/dw_capP.test
@@ -0,0 +1,12 @@
+-- Input
+(1,1)
+Lorem ipsum dolor sit amet
+abc def ghi
+qwe rty uiop
+-- Output
+(1,6)
+Lorem ipsum dolor sit amet
+abc def ghi
+qwe rty uiop
+-- Events
+dwP \ No newline at end of file
diff --git a/src/tests/vimtests/paste/dwp.test b/src/tests/vimtests/paste/dwp.test
new file mode 100644
index 0000000..b5405ef
--- /dev/null
+++ b/src/tests/vimtests/paste/dwp.test
@@ -0,0 +1,12 @@
+-- Input
+(1,1)
+Lorem ipsum dolor sit amet
+abc def ghi
+qwe rty uiop
+-- Output
+(1,7)
+iLorem psum dolor sit amet
+abc def ghi
+qwe rty uiop
+-- Events
+dwp \ No newline at end of file
diff --git a/src/tests/vimtests/paste/p_at_newline.test b/src/tests/vimtests/paste/p_at_newline.test
new file mode 100644
index 0000000..368caa8
--- /dev/null
+++ b/src/tests/vimtests/paste/p_at_newline.test
@@ -0,0 +1,18 @@
+-- Input
+(1,1)
+abc
+def
+
+123
+456 789
+xxx
+-- Output
+(3,3)
+abc
+def
+789
+123
+456
+xxx
+-- Events
+4j4ld$2kp
diff --git a/src/tests/vimtests/paste/p_at_newline2.test b/src/tests/vimtests/paste/p_at_newline2.test
new file mode 100644
index 0000000..06c1093
--- /dev/null
+++ b/src/tests/vimtests/paste/p_at_newline2.test
@@ -0,0 +1,18 @@
+-- Input
+(1,1)
+abc
+def
+
+123
+456 789
+xxx
+-- Output
+(3,3)
+abc
+def
+789
+123
+456
+xxx
+-- Events
+4j4ld$2kP
diff --git a/src/tests/vimtests/paste/visual.test b/src/tests/vimtests/paste/visual.test
new file mode 100644
index 0000000..7e9a74d
--- /dev/null
+++ b/src/tests/vimtests/paste/visual.test
@@ -0,0 +1,13 @@
+-- Input
+(2,2)
+Lorem ipsum dolor sit amet
+abc def ghi
+qwe rty uiop
+-- Output
+(2,3)
+Lorem ipsum dolor sit amet
+abbc def ghi
+qwec def ghi
+qwe rty uiop
+-- Events
+vjlyp \ No newline at end of file
diff --git a/src/tests/vimtests/paste/y_1.test b/src/tests/vimtests/paste/y_1.test
new file mode 100644
index 0000000..7845dab
--- /dev/null
+++ b/src/tests/vimtests/paste/y_1.test
@@ -0,0 +1,12 @@
+-- Input
+(2,2)
+1234
+abcd
+xyzw
+-- Output
+(2,4)
+1234
+abcdbcd
+xyzw
+-- Events
+y$P \ No newline at end of file
diff --git a/src/tests/vimtests/paste/y_2.test b/src/tests/vimtests/paste/y_2.test
new file mode 100644
index 0000000..b3d569a
--- /dev/null
+++ b/src/tests/vimtests/paste/y_2.test
@@ -0,0 +1,12 @@
+-- Input
+(2,2)
+1234
+abcd
+xyzw
+-- Output
+(2,4)
+1234
+abcdbcd
+xyzw
+-- Events
+y3lP \ No newline at end of file
diff --git a/src/tests/vimtests/paste/y_3.test b/src/tests/vimtests/paste/y_3.test
new file mode 100644
index 0000000..9ab7fac
--- /dev/null
+++ b/src/tests/vimtests/paste/y_3.test
@@ -0,0 +1,12 @@
+-- Input
+(2,2)
+1234
+abcd
+xyzw
+-- Output
+(2,4)
+1234
+abcdbcd
+xyzw
+-- Events
+y20lP \ No newline at end of file
diff --git a/src/tests/vimtests/paste/yep.test b/src/tests/vimtests/paste/yep.test
new file mode 100644
index 0000000..8ea1689
--- /dev/null
+++ b/src/tests/vimtests/paste/yep.test
@@ -0,0 +1,12 @@
+-- Input
+(1,1)
+Lorem ipsum dolor sit amet
+abc def ghi
+qwe rty uiop
+-- Output
+(1,6)
+LLoremorem ipsum dolor sit amet
+abc def ghi
+qwe rty uiop
+-- Events
+yep \ No newline at end of file
diff --git a/src/tests/vimtests/paste/yjp.test b/src/tests/vimtests/paste/yjp.test
new file mode 100644
index 0000000..54749c2
--- /dev/null
+++ b/src/tests/vimtests/paste/yjp.test
@@ -0,0 +1,14 @@
+-- Input
+(1,1)
+Lorem ipsum dolor sit amet
+abc def ghi
+qwe rty uiop
+-- Output
+(2,1)
+Lorem ipsum dolor sit amet
+Lorem ipsum dolor sit amet
+abc def ghi
+abc def ghi
+qwe rty uiop
+-- Events
+yjp \ No newline at end of file
diff --git a/src/tests/vimtests/paste/ywp.test b/src/tests/vimtests/paste/ywp.test
new file mode 100644
index 0000000..3660c44
--- /dev/null
+++ b/src/tests/vimtests/paste/ywp.test
@@ -0,0 +1,12 @@
+-- Input
+(1,1)
+Lorem ipsum dolor sit amet
+abc def ghi
+qwe rty uiop
+-- Output
+(1,7)
+LLorem orem ipsum dolor sit amet
+abc def ghi
+qwe rty uiop
+-- Events
+ywp \ No newline at end of file
diff --git a/src/tests/vimtests/paste/yy_capP.test b/src/tests/vimtests/paste/yy_capP.test
new file mode 100644
index 0000000..0f7a984
--- /dev/null
+++ b/src/tests/vimtests/paste/yy_capP.test
@@ -0,0 +1,13 @@
+-- Input
+(1,1)
+Lorem ipsum dolor sit amet
+abc def ghi
+qwe rty uiop
+-- Output
+(1,1)
+Lorem ipsum dolor sit amet
+Lorem ipsum dolor sit amet
+abc def ghi
+qwe rty uiop
+-- Events
+yyP \ No newline at end of file
diff --git a/src/tests/vimtests/paste/yyp.test b/src/tests/vimtests/paste/yyp.test
new file mode 100644
index 0000000..7a58ed9
--- /dev/null
+++ b/src/tests/vimtests/paste/yyp.test
@@ -0,0 +1,13 @@
+-- Input
+(1,1)
+Lorem ipsum dolor sit amet
+abc def ghi
+qwe rty uiop
+-- Output
+(2,1)
+Lorem ipsum dolor sit amet
+Lorem ipsum dolor sit amet
+abc def ghi
+qwe rty uiop
+-- Events
+yyp \ No newline at end of file
diff --git a/src/tests/vimtests/repeat/2r.test b/src/tests/vimtests/repeat/2r.test
new file mode 100644
index 0000000..a41f82a
--- /dev/null
+++ b/src/tests/vimtests/repeat/2r.test
@@ -0,0 +1,8 @@
+-- Input
+(1,1)
+abcdef
+-- Output
+(1,6)
+xxcdxx
+-- Events
+2rx3l. \ No newline at end of file
diff --git a/src/tests/vimtests/repeat/O1.test b/src/tests/vimtests/repeat/O1.test
new file mode 100644
index 0000000..bfbef35
--- /dev/null
+++ b/src/tests/vimtests/repeat/O1.test
@@ -0,0 +1,17 @@
+-- Input
+(2,1)
+123
+456
+789
+-- Output
+(7,3)
+123
+456
+abc
+abc
+abc
+abc
+abc
+789
+-- Events
+2oabc<Esc>3. \ No newline at end of file
diff --git a/src/tests/vimtests/repeat/a.test b/src/tests/vimtests/repeat/a.test
new file mode 100644
index 0000000..40bc38d
--- /dev/null
+++ b/src/tests/vimtests/repeat/a.test
@@ -0,0 +1,8 @@
+-- Input
+(1,1)
+foo
+-- Output
+(1,10)
+fABCABCABCoo
+-- Events
+aABC<Esc>.. \ No newline at end of file
diff --git a/src/tests/vimtests/repeat/a2.test b/src/tests/vimtests/repeat/a2.test
new file mode 100644
index 0000000..c1191dc
--- /dev/null
+++ b/src/tests/vimtests/repeat/a2.test
@@ -0,0 +1,8 @@
+-- Input
+(1,1)
+foo
+-- Output
+(1,10)
+fABCABCABCoo
+-- Events
+aABC<Esc>2. \ No newline at end of file
diff --git a/src/tests/vimtests/repeat/a3.test b/src/tests/vimtests/repeat/a3.test
new file mode 100644
index 0000000..3249591
--- /dev/null
+++ b/src/tests/vimtests/repeat/a3.test
@@ -0,0 +1,8 @@
+-- Input
+(1,1)
+foo
+-- Output
+(1,28)
+fABCABCABCABCABCABCABCABCABCoo
+-- Events
+3aABC<Esc>.. \ No newline at end of file
diff --git a/src/tests/vimtests/repeat/a4.test b/src/tests/vimtests/repeat/a4.test
new file mode 100644
index 0000000..d3c859a
--- /dev/null
+++ b/src/tests/vimtests/repeat/a4.test
@@ -0,0 +1,8 @@
+-- Input
+(1,1)
+foo
+-- Output
+(1,16)
+fABCABCABCABCABCoo
+-- Events
+3aABC<Esc>2. \ No newline at end of file
diff --git a/src/tests/vimtests/repeat/a5.test b/src/tests/vimtests/repeat/a5.test
new file mode 100644
index 0000000..4a4be6f
--- /dev/null
+++ b/src/tests/vimtests/repeat/a5.test
@@ -0,0 +1,8 @@
+-- Input
+(1,1)
+foo
+-- Output
+(1,28)
+fABCABCABCABCABCABCABCABCABCoo
+-- Events
+3aABC<Esc>y<Esc>.d<Esc>. \ No newline at end of file
diff --git a/src/tests/vimtests/repeat/capA.test b/src/tests/vimtests/repeat/capA.test
new file mode 100644
index 0000000..5d33a74
--- /dev/null
+++ b/src/tests/vimtests/repeat/capA.test
@@ -0,0 +1,8 @@
+-- Input
+(1,1)
+foo
+-- Output
+(1,12)
+fooABCABCABC
+-- Events
+AABC<Esc>.. \ No newline at end of file
diff --git a/src/tests/vimtests/repeat/capA2.test b/src/tests/vimtests/repeat/capA2.test
new file mode 100644
index 0000000..2045c5b
--- /dev/null
+++ b/src/tests/vimtests/repeat/capA2.test
@@ -0,0 +1,8 @@
+-- Input
+(1,1)
+foo
+-- Output
+(1,12)
+fooABCABCABC
+-- Events
+AABC<Esc>2. \ No newline at end of file
diff --git a/src/tests/vimtests/repeat/capA3.test b/src/tests/vimtests/repeat/capA3.test
new file mode 100644
index 0000000..68bce85
--- /dev/null
+++ b/src/tests/vimtests/repeat/capA3.test
@@ -0,0 +1,8 @@
+-- Input
+(1,1)
+foo
+-- Output
+(1,30)
+fooABCABCABCABCABCABCABCABCABC
+-- Events
+3AABC<Esc>.. \ No newline at end of file
diff --git a/src/tests/vimtests/repeat/capA4.test b/src/tests/vimtests/repeat/capA4.test
new file mode 100644
index 0000000..c7ce397
--- /dev/null
+++ b/src/tests/vimtests/repeat/capA4.test
@@ -0,0 +1,8 @@
+-- Input
+(1,1)
+foo
+-- Output
+(1,18)
+fooABCABCABCABCABC
+-- Events
+3AABC<Esc>2. \ No newline at end of file
diff --git a/src/tests/vimtests/repeat/capI.test b/src/tests/vimtests/repeat/capI.test
new file mode 100644
index 0000000..7916212
--- /dev/null
+++ b/src/tests/vimtests/repeat/capI.test
@@ -0,0 +1,8 @@
+-- Input
+(1,1)
+foo
+-- Output
+(1,3)
+ABCABCABCfoo
+-- Events
+IABC<Esc>.. \ No newline at end of file
diff --git a/src/tests/vimtests/repeat/capI2.test b/src/tests/vimtests/repeat/capI2.test
new file mode 100644
index 0000000..d2c2f8c
--- /dev/null
+++ b/src/tests/vimtests/repeat/capI2.test
@@ -0,0 +1,8 @@
+-- Input
+(1,1)
+foo
+-- Output
+(1,6)
+ABCABCABCfoo
+-- Events
+IABC<Esc>2. \ No newline at end of file
diff --git a/src/tests/vimtests/repeat/capI3.test b/src/tests/vimtests/repeat/capI3.test
new file mode 100644
index 0000000..a79e1bc
--- /dev/null
+++ b/src/tests/vimtests/repeat/capI3.test
@@ -0,0 +1,8 @@
+-- Input
+(1,1)
+foo
+-- Output
+(1,6)
+ABCABCABCABCABCfoo
+-- Events
+3IABC<Esc>2. \ No newline at end of file
diff --git a/src/tests/vimtests/repeat/capI4.test b/src/tests/vimtests/repeat/capI4.test
new file mode 100644
index 0000000..aacc71e
--- /dev/null
+++ b/src/tests/vimtests/repeat/capI4.test
@@ -0,0 +1,8 @@
+-- Input
+(1,1)
+foo
+-- Output
+(1,9)
+ABCABCABCABCABCABCABCABCABCfoo
+-- Events
+3IABC<Esc>.. \ No newline at end of file
diff --git a/src/tests/vimtests/repeat/capO.test b/src/tests/vimtests/repeat/capO.test
new file mode 100644
index 0000000..48f0585
--- /dev/null
+++ b/src/tests/vimtests/repeat/capO.test
@@ -0,0 +1,18 @@
+-- Input
+(2,1)
+123
+456
+789
+-- Output
+(5,3)
+123
+abc
+abc
+abc
+abc
+abc
+abc
+456
+789
+-- Events
+2Oabc<Esc>.. \ No newline at end of file
diff --git a/src/tests/vimtests/repeat/capO2.test b/src/tests/vimtests/repeat/capO2.test
new file mode 100644
index 0000000..a8fc6f4
--- /dev/null
+++ b/src/tests/vimtests/repeat/capO2.test
@@ -0,0 +1,15 @@
+-- Input
+(2,1)
+123
+456
+789
+-- Output
+(3,3)
+123
+abc
+abc
+abc
+456
+789
+-- Events
+Oabc<Esc>2. \ No newline at end of file
diff --git a/src/tests/vimtests/repeat/capO3.test b/src/tests/vimtests/repeat/capO3.test
new file mode 100644
index 0000000..e313b25
--- /dev/null
+++ b/src/tests/vimtests/repeat/capO3.test
@@ -0,0 +1,15 @@
+-- Input
+(2,1)
+123
+456
+789
+-- Output
+(2,3)
+123
+abc
+abc
+abc
+456
+789
+-- Events
+Oabc<Esc>.. \ No newline at end of file
diff --git a/src/tests/vimtests/repeat/capX.test b/src/tests/vimtests/repeat/capX.test
new file mode 100644
index 0000000..36bdef4
--- /dev/null
+++ b/src/tests/vimtests/repeat/capX.test
@@ -0,0 +1,12 @@
+-- Input
+(2,5)
+Lorem ipsum dolor sit amet
+abc def ghi
+qwe rty uiop
+-- Output
+(2,2)
+Lorem ipsum dolor sit amet
+adef ghi
+qwe rty uiop
+-- Events
+X.. \ No newline at end of file
diff --git a/src/tests/vimtests/repeat/capX_1.test b/src/tests/vimtests/repeat/capX_1.test
new file mode 100644
index 0000000..c74bd6d
--- /dev/null
+++ b/src/tests/vimtests/repeat/capX_1.test
@@ -0,0 +1,12 @@
+-- Input
+(2,8)
+Lorem ipsum dolor sit amet
+abc def ghi
+qwe rty uiop
+-- Output
+(2,2)
+Lorem ipsum dolor sit amet
+a ghi
+qwe rty uiop
+-- Events
+2X.. \ No newline at end of file
diff --git a/src/tests/vimtests/repeat/counted_2r.test b/src/tests/vimtests/repeat/counted_2r.test
new file mode 100644
index 0000000..2136162
--- /dev/null
+++ b/src/tests/vimtests/repeat/counted_2r.test
@@ -0,0 +1,8 @@
+-- Input
+(1,1)
+abcdefg
+-- Output
+(1,7)
+xxxdexx
+-- Events
+3rx3l2. \ No newline at end of file
diff --git a/src/tests/vimtests/repeat/dw_capP.test b/src/tests/vimtests/repeat/dw_capP.test
new file mode 100644
index 0000000..433bb9c
--- /dev/null
+++ b/src/tests/vimtests/repeat/dw_capP.test
@@ -0,0 +1,12 @@
+-- Input
+(1,1)
+Lorem ipsum dolor sit amet
+abc def ghi
+qwe rty uiop
+-- Output
+(1,16)
+LoremLoremLorem ipsum dolor sit amet
+abc def ghi
+qwe rty uiop
+-- Events
+dwP.. \ No newline at end of file
diff --git a/src/tests/vimtests/repeat/dwp.test b/src/tests/vimtests/repeat/dwp.test
new file mode 100644
index 0000000..2375675
--- /dev/null
+++ b/src/tests/vimtests/repeat/dwp.test
@@ -0,0 +1,12 @@
+-- Input
+(1,1)
+Lorem ipsum dolor sit amet
+abc def ghi
+qwe rty uiop
+-- Output
+(1,19)
+iLorem Lorem Lorem psum dolor sit amet
+abc def ghi
+qwe rty uiop
+-- Events
+dwp.. \ No newline at end of file
diff --git a/src/tests/vimtests/repeat/i.test b/src/tests/vimtests/repeat/i.test
new file mode 100644
index 0000000..fca3969
--- /dev/null
+++ b/src/tests/vimtests/repeat/i.test
@@ -0,0 +1,8 @@
+-- Input
+(1,1)
+foo
+-- Output
+(1,7)
+ABABABCCCfoo
+-- Events
+iABC<Esc>.. \ No newline at end of file
diff --git a/src/tests/vimtests/repeat/i2.test b/src/tests/vimtests/repeat/i2.test
new file mode 100644
index 0000000..f46d2b0
--- /dev/null
+++ b/src/tests/vimtests/repeat/i2.test
@@ -0,0 +1,8 @@
+-- Input
+(1,1)
+foo
+-- Output
+(1,8)
+ABABCABCCfoo
+-- Events
+iABC<Esc>2. \ No newline at end of file
diff --git a/src/tests/vimtests/repeat/i3.test b/src/tests/vimtests/repeat/i3.test
new file mode 100644
index 0000000..040dabc
--- /dev/null
+++ b/src/tests/vimtests/repeat/i3.test
@@ -0,0 +1,8 @@
+-- Input
+(1,1)
+foo
+-- Output
+(1,14)
+ABCABCABABCABCCfoo
+-- Events
+3iABC<Esc>2. \ No newline at end of file
diff --git a/src/tests/vimtests/repeat/i4.test b/src/tests/vimtests/repeat/i4.test
new file mode 100644
index 0000000..6872fb1
--- /dev/null
+++ b/src/tests/vimtests/repeat/i4.test
@@ -0,0 +1,8 @@
+-- Input
+(1,1)
+foo
+-- Output
+(1,25)
+ABCABCABABCABCABABCABCABCCCfoo
+-- Events
+3iABC<Esc>.. \ No newline at end of file
diff --git a/src/tests/vimtests/repeat/o.test b/src/tests/vimtests/repeat/o.test
new file mode 100644
index 0000000..d6f3464
--- /dev/null
+++ b/src/tests/vimtests/repeat/o.test
@@ -0,0 +1,18 @@
+-- Input
+(2,1)
+123
+456
+789
+-- Output
+(8,3)
+123
+456
+abc
+abc
+abc
+abc
+abc
+abc
+789
+-- Events
+2oabc<Esc>.. \ No newline at end of file
diff --git a/src/tests/vimtests/repeat/o1.test b/src/tests/vimtests/repeat/o1.test
new file mode 100644
index 0000000..bfbef35
--- /dev/null
+++ b/src/tests/vimtests/repeat/o1.test
@@ -0,0 +1,17 @@
+-- Input
+(2,1)
+123
+456
+789
+-- Output
+(7,3)
+123
+456
+abc
+abc
+abc
+abc
+abc
+789
+-- Events
+2oabc<Esc>3. \ No newline at end of file
diff --git a/src/tests/vimtests/repeat/o2.test b/src/tests/vimtests/repeat/o2.test
new file mode 100644
index 0000000..0dd1441
--- /dev/null
+++ b/src/tests/vimtests/repeat/o2.test
@@ -0,0 +1,15 @@
+-- Input
+(2,1)
+123
+456
+789
+-- Output
+(5,3)
+123
+456
+abc
+abc
+abc
+789
+-- Events
+oabc<Esc>2. \ No newline at end of file
diff --git a/src/tests/vimtests/repeat/o3.test b/src/tests/vimtests/repeat/o3.test
new file mode 100644
index 0000000..65c2d18
--- /dev/null
+++ b/src/tests/vimtests/repeat/o3.test
@@ -0,0 +1,15 @@
+-- Input
+(2,1)
+123
+456
+789
+-- Output
+(5,3)
+123
+456
+abc
+abc
+abc
+789
+-- Events
+oabc<Esc>.. \ No newline at end of file
diff --git a/src/tests/vimtests/repeat/r.test b/src/tests/vimtests/repeat/r.test
new file mode 100644
index 0000000..ef8854e
--- /dev/null
+++ b/src/tests/vimtests/repeat/r.test
@@ -0,0 +1,8 @@
+-- Input
+(1,1)
+abcdef
+-- Output
+(1,5)
+xbxdxf
+-- Events
+rx2l.2l. \ No newline at end of file
diff --git a/src/tests/vimtests/repeat/r_1.test b/src/tests/vimtests/repeat/r_1.test
new file mode 100644
index 0000000..7b8f276
--- /dev/null
+++ b/src/tests/vimtests/repeat/r_1.test
@@ -0,0 +1,8 @@
+-- Input
+(1,1)
+abcdef
+-- Output
+(1,3)
+xbxdef
+-- Events
+rx2l. \ No newline at end of file
diff --git a/src/tests/vimtests/repeat/r_2.test b/src/tests/vimtests/repeat/r_2.test
new file mode 100644
index 0000000..9a7a83a
--- /dev/null
+++ b/src/tests/vimtests/repeat/r_2.test
@@ -0,0 +1,8 @@
+-- Input
+(1,1)
+abcdefghijk
+-- Output
+(1,8)
+xbxdexgxijk
+-- Events
+rx2l.3l.2l. \ No newline at end of file
diff --git a/src/tests/vimtests/repeat/r_3.test b/src/tests/vimtests/repeat/r_3.test
new file mode 100644
index 0000000..2adcf3f
--- /dev/null
+++ b/src/tests/vimtests/repeat/r_3.test
@@ -0,0 +1,8 @@
+-- Input
+(1,1)
+abcdefghijk
+-- Output
+(1,6)
+xbxdefghijk
+-- Events
+rx2l.3l \ No newline at end of file
diff --git a/src/tests/vimtests/repeat/tilde_repeat.test b/src/tests/vimtests/repeat/tilde_repeat.test
new file mode 100644
index 0000000..f2c8723
--- /dev/null
+++ b/src/tests/vimtests/repeat/tilde_repeat.test
@@ -0,0 +1,12 @@
+-- Input
+(1,1)
+Lorem ipsum dolor sit amet
+abc def ghi
+qwe rty uiop
+-- Output
+(1,13)
+lOREM IPSUM dolor sit amet
+abc def ghi
+qwe rty uiop
+-- Events
+6~.
diff --git a/src/tests/vimtests/repeat/tilde_repeat_does_not_affect_other_lines.test b/src/tests/vimtests/repeat/tilde_repeat_does_not_affect_other_lines.test
new file mode 100644
index 0000000..f31038c
--- /dev/null
+++ b/src/tests/vimtests/repeat/tilde_repeat_does_not_affect_other_lines.test
@@ -0,0 +1,12 @@
+-- Input
+(1,1)
+abcdefghijklmnopqrstuvwxyz
+abc def ghi
+qwe rty uiop
+-- Output
+(1,26)
+ABCDEFGHIJKLMNOPQRSTUVWXYz
+abc def ghi
+qwe rty uiop
+-- Events
+13~..
diff --git a/src/tests/vimtests/repeat/x.test b/src/tests/vimtests/repeat/x.test
new file mode 100644
index 0000000..f34e423
--- /dev/null
+++ b/src/tests/vimtests/repeat/x.test
@@ -0,0 +1,12 @@
+-- Input
+(2,2)
+Lorem ipsum dolor sit amet
+abc def ghi
+qwe rty uiop
+-- Output
+(2,2)
+Lorem ipsum dolor sit amet
+adef ghi
+qwe rty uiop
+-- Events
+x.. \ No newline at end of file
diff --git a/src/tests/vimtests/repeat/x_1.test b/src/tests/vimtests/repeat/x_1.test
new file mode 100644
index 0000000..574db8e
--- /dev/null
+++ b/src/tests/vimtests/repeat/x_1.test
@@ -0,0 +1,12 @@
+-- Input
+(2,2)
+Lorem ipsum dolor sit amet
+abc def ghi
+qwe rty uiop
+-- Output
+(2,2)
+Lorem ipsum dolor sit amet
+a ghi
+qwe rty uiop
+-- Events
+2x.. \ No newline at end of file
diff --git a/src/tests/vimtests/repeat/x_2.test b/src/tests/vimtests/repeat/x_2.test
new file mode 100644
index 0000000..87d1d47
--- /dev/null
+++ b/src/tests/vimtests/repeat/x_2.test
@@ -0,0 +1,12 @@
+-- Input
+(1,2)
+Lorem ipsum dolor sit amet
+abc def ghi
+qwe rty uiop
+-- Output
+(1,6)
+Lemps dolor sit amet
+abc def ghi
+qwe rty uiop
+-- Events
+2x2l.2l. \ No newline at end of file
diff --git a/src/tests/vimtests/replace/0.test b/src/tests/vimtests/replace/0.test
new file mode 100644
index 0000000..cccf670
--- /dev/null
+++ b/src/tests/vimtests/replace/0.test
@@ -0,0 +1,8 @@
+-- Input
+(1,1)
+foobarbaz
+-- Output
+(1,6)
+fooiarbaz
+-- Events
+3lrill \ No newline at end of file
diff --git a/src/tests/vimtests/replace/1.test b/src/tests/vimtests/replace/1.test
new file mode 100644
index 0000000..4e34605
--- /dev/null
+++ b/src/tests/vimtests/replace/1.test
@@ -0,0 +1,8 @@
+-- Input
+(1,1)
+foobarbaz
+-- Output
+(1,7)
+foo123baz
+-- Events
+3lR123<Esc>l \ No newline at end of file
diff --git a/src/tests/vimtests/replace/10.test b/src/tests/vimtests/replace/10.test
new file mode 100644
index 0000000..f2c42cf
--- /dev/null
+++ b/src/tests/vimtests/replace/10.test
@@ -0,0 +1,12 @@
+-- Input
+(3,2)
+Lorem ipsum dolor sit amet
+abc def ghi
+qwe rty uiop
+-- Output
+(3,2)
+Lorem ipsum dolor sit amet
+abc def ghi
+qwe rty uiop
+-- Events
+r<C-e> \ No newline at end of file
diff --git a/src/tests/vimtests/replace/11.test b/src/tests/vimtests/replace/11.test
new file mode 100644
index 0000000..4c23123
--- /dev/null
+++ b/src/tests/vimtests/replace/11.test
@@ -0,0 +1,12 @@
+-- Input
+(2,1)
+Lorem ipsum dolor sit amet
+
+qwe rty uiop
+-- Output
+(2,1)
+Lorem ipsum dolor sit amet
+
+qwe rty uiop
+-- Events
+rx \ No newline at end of file
diff --git a/src/tests/vimtests/replace/2.test b/src/tests/vimtests/replace/2.test
new file mode 100644
index 0000000..1cc8259
--- /dev/null
+++ b/src/tests/vimtests/replace/2.test
@@ -0,0 +1,8 @@
+-- Input
+(1,1)
+foobarbaz
+-- Output
+(1,6)
+fooxxxbaz
+-- Events
+3l3rx \ No newline at end of file
diff --git a/src/tests/vimtests/replace/3.test b/src/tests/vimtests/replace/3.test
new file mode 100644
index 0000000..06ac36f
--- /dev/null
+++ b/src/tests/vimtests/replace/3.test
@@ -0,0 +1,12 @@
+-- Input
+(2,2)
+foo
+bar
+baz
+-- Output
+(2,3)
+foo
+bxx
+baz
+-- Events
+5rx
diff --git a/src/tests/vimtests/replace/4.test b/src/tests/vimtests/replace/4.test
new file mode 100644
index 0000000..9908dc6
--- /dev/null
+++ b/src/tests/vimtests/replace/4.test
@@ -0,0 +1,12 @@
+-- Input
+(2,2)
+Lorem ipsum dolor sit amet
+abc def ghi
+qwe rty uiop
+-- Output
+(2,2)
+Lorem ipsum dolor sit amet
+awc def ghi
+qwe rty uiop
+-- Events
+r<C-e> \ No newline at end of file
diff --git a/src/tests/vimtests/replace/5.test b/src/tests/vimtests/replace/5.test
new file mode 100644
index 0000000..b30845f
--- /dev/null
+++ b/src/tests/vimtests/replace/5.test
@@ -0,0 +1,12 @@
+-- Input
+(2,2)
+Lorem ipsum dolor sit amet
+abc def ghi
+qwe rty uiop
+-- Output
+(2,2)
+Lorem ipsum dolor sit amet
+aoc def ghi
+qwe rty uiop
+-- Events
+r<C-y> \ No newline at end of file
diff --git a/src/tests/vimtests/replace/6.test b/src/tests/vimtests/replace/6.test
new file mode 100644
index 0000000..ca271d6
--- /dev/null
+++ b/src/tests/vimtests/replace/6.test
@@ -0,0 +1,12 @@
+-- Input
+(2,2)
+Lorem ipsum dolor sit amet
+abc def ghi
+qwe rty uiop
+-- Output
+(2,5)
+Lorem ipsum dolor sit amet
+awe ref ghi
+qwe rty uiop
+-- Events
+4r<C-e> \ No newline at end of file
diff --git a/src/tests/vimtests/replace/7.test b/src/tests/vimtests/replace/7.test
new file mode 100644
index 0000000..3afd63f
--- /dev/null
+++ b/src/tests/vimtests/replace/7.test
@@ -0,0 +1,12 @@
+-- Input
+(2,2)
+Lorem ipsum dolor sit amet
+abc def ghi
+qwe rty uiop
+-- Output
+(2,6)
+Lorem ipsum dolor sit amet
+aorem f ghi
+qwe rty uiop
+-- Events
+5r<C-y> \ No newline at end of file
diff --git a/src/tests/vimtests/replace/8.test b/src/tests/vimtests/replace/8.test
new file mode 100644
index 0000000..7005f93
--- /dev/null
+++ b/src/tests/vimtests/replace/8.test
@@ -0,0 +1,8 @@
+-- Input
+(1,1)
+foobarbaz
+-- Output
+(1,12)
+foo123456789
+-- Events
+3lR123456789<Esc> \ No newline at end of file
diff --git a/src/tests/vimtests/replace/9.test b/src/tests/vimtests/replace/9.test
new file mode 100644
index 0000000..ed097b3
--- /dev/null
+++ b/src/tests/vimtests/replace/9.test
@@ -0,0 +1,12 @@
+-- Input
+(1,2)
+Lorem ipsum dolor sit amet
+abc def ghi
+qwe rty uiop
+-- Output
+(1,2)
+Lorem ipsum dolor sit amet
+abc def ghi
+qwe rty uiop
+-- Events
+r<C-y> \ No newline at end of file
diff --git a/src/tests/vimtests/search/1.test b/src/tests/vimtests/search/1.test
new file mode 100644
index 0000000..cfc1e6d
--- /dev/null
+++ b/src/tests/vimtests/search/1.test
@@ -0,0 +1,12 @@
+-- Input
+(1,1)
+Lorem ipsum dolor sit amet
+abc def ghi
+qwe rty uiop
+-- Output
+(1,13)
+Lorem ipsum olor sit amet
+abc def ghi
+qwe rty uiop
+-- Events
+/dolor<CR>x \ No newline at end of file
diff --git a/src/tests/vimtests/search/2.test b/src/tests/vimtests/search/2.test
new file mode 100644
index 0000000..4bf2772
--- /dev/null
+++ b/src/tests/vimtests/search/2.test
@@ -0,0 +1,14 @@
+-- Input
+(1,1)
+Lorem ipsum dolor sit amet
+Lorem ipsum dolor sit amet
+abc def ghi
+qwe rty uiop
+-- Output
+(2,13)
+Lorem ipsum dolor sit amet
+Lorem ipsum olor sit amet
+abc def ghi
+qwe rty uiop
+-- Events
+/dolor<CR>nx \ No newline at end of file
diff --git a/src/tests/vimtests/search/3.test b/src/tests/vimtests/search/3.test
new file mode 100644
index 0000000..adfad2f
--- /dev/null
+++ b/src/tests/vimtests/search/3.test
@@ -0,0 +1,16 @@
+-- Input
+(2,16)
+Lorem ipsum dolor sit amet
+ ipsum dolor sit amet
+ ipsum dolor sit amet
+abc def ghi
+qwe rty uiop
+-- Output
+(2,8)
+Lorem ipsum dolor sit amet
+ ipsum dolor sit amet
+ ipsum dolor sit amet
+abc def ghi
+qwe rty uiop
+-- Events
+?dolor<CR> \ No newline at end of file
diff --git a/src/tests/vimtests/search/4.test b/src/tests/vimtests/search/4.test
new file mode 100644
index 0000000..7714fc2
--- /dev/null
+++ b/src/tests/vimtests/search/4.test
@@ -0,0 +1,16 @@
+-- Input
+(2,16)
+Lorem ipsum dolor sit amet
+ ipsum dolor sit amet
+ ipsum dolor sit amet
+abc def ghi
+qwe rty uiop
+-- Output
+(1,13)
+Lorem ipsum dolor sit amet
+ ipsum dolor sit amet
+ ipsum dolor sit amet
+abc def ghi
+qwe rty uiop
+-- Events
+?dolor<CR>n \ No newline at end of file
diff --git a/src/tests/vimtests/search/5.test b/src/tests/vimtests/search/5.test
new file mode 100644
index 0000000..cf379be
--- /dev/null
+++ b/src/tests/vimtests/search/5.test
@@ -0,0 +1,16 @@
+-- Input
+(2,16)
+Lorem ipsum dolor sit amet
+ ipsum dolor sit amet
+ ipsum dolor sit amet
+abc def ghi
+qwe rty uiop
+-- Output
+(2,8)
+Lorem ipsum dolor sit amet
+ ipsum dolor sit amet
+ ipsum dolor sit amet
+abc def ghi
+qwe rty uiop
+-- Events
+?dolor<CR>nN \ No newline at end of file
diff --git a/src/tests/vimtests/search/6.test b/src/tests/vimtests/search/6.test
new file mode 100644
index 0000000..f391ac4
--- /dev/null
+++ b/src/tests/vimtests/search/6.test
@@ -0,0 +1,14 @@
+-- Input
+(1,1)
+Lorem ipsum dolor sit amet
+Lorem ipsum dolor sit amet
+abc def ghi
+qwe rty uiop
+-- Output
+(1,13)
+Lorem ipsum olor sit amet
+Lorem ipsum dolor sit amet
+abc def ghi
+qwe rty uiop
+-- Events
+/dolor<CR>nNx \ No newline at end of file
diff --git a/src/tests/vimtests/search/7.test b/src/tests/vimtests/search/7.test
new file mode 100644
index 0000000..6d15ac9
--- /dev/null
+++ b/src/tests/vimtests/search/7.test
@@ -0,0 +1,14 @@
+-- Input
+(1,1)
+Lorem ipsum dolor sit amet
+Lorem ipsum dolor sit amet
+abc def ghi
+qwe rty uiop
+-- Output
+(1,13)
+Lorem ipsum olor sit amet
+Lorem ipsum dolor sit amet
+abc def ghi
+qwe rty uiop
+-- Events
+/dolor<CR>nnx \ No newline at end of file
diff --git a/src/tests/vimtests/search/8.test b/src/tests/vimtests/search/8.test
new file mode 100644
index 0000000..99d604c
--- /dev/null
+++ b/src/tests/vimtests/search/8.test
@@ -0,0 +1,16 @@
+-- Input
+(2,16)
+Lorem ipsum dolor sit amet
+ ipsum dolor sit amet
+ ipsum dolor sit amet
+abc def ghi
+qwe rty uiop
+-- Output
+(2,8)
+Lorem ipsum dolor sit amet
+ ipsum dolor sit amet
+ ipsum dolor sit amet
+abc def ghi
+qwe rty uiop
+-- Events
+?dolor<CR>nnn \ No newline at end of file
diff --git a/src/tests/vimtests/search/9.test b/src/tests/vimtests/search/9.test
new file mode 100644
index 0000000..2e06141
--- /dev/null
+++ b/src/tests/vimtests/search/9.test
@@ -0,0 +1,8 @@
+-- Input
+(1,1)
+Foo
+-- Output
+(1,1)
+oo
+-- Events
+/<CR>x \ No newline at end of file
diff --git a/src/tests/vimtests/search/counted_1.test b/src/tests/vimtests/search/counted_1.test
new file mode 100644
index 0000000..a394e9a
--- /dev/null
+++ b/src/tests/vimtests/search/counted_1.test
@@ -0,0 +1,14 @@
+-- Input
+(1,1)
+Lorem ipsum dolor sit amet
+Lorem ipsum dolor sit amet
+abc def ghi
+qwe rty uiop
+-- Output
+(2,13)
+Lorem ipsum dolor sit amet
+Lorem ipsum dolor sit amet
+abc def ghi
+qwe rty uiop
+-- Events
+2/dolor<CR> \ No newline at end of file
diff --git a/src/tests/vimtests/search/counted_2.test b/src/tests/vimtests/search/counted_2.test
new file mode 100644
index 0000000..16221d5
--- /dev/null
+++ b/src/tests/vimtests/search/counted_2.test
@@ -0,0 +1,14 @@
+-- Input
+(3,1)
+Lorem ipsum dolor sit amet
+Lorem ipsum dolor sit amet
+abc def ghi
+qwe rty uiop
+-- Output
+(1,13)
+Lorem ipsum dolor sit amet
+Lorem ipsum dolor sit amet
+abc def ghi
+qwe rty uiop
+-- Events
+2?dolor<CR> \ No newline at end of file
diff --git a/src/tests/vimtests/search/counted_3.test b/src/tests/vimtests/search/counted_3.test
new file mode 100644
index 0000000..f531cf5
--- /dev/null
+++ b/src/tests/vimtests/search/counted_3.test
@@ -0,0 +1,12 @@
+-- Input
+(1,1)
+Lorem ipsum dolor sit amet
+abc def ghi
+qwe rty uiop
+-- Output
+(1,13)
+Lorem ipsum dolor sit amet
+abc def ghi
+qwe rty uiop
+-- Events
+1/dolor<CR> \ No newline at end of file
diff --git a/src/tests/vimtests/search/counted_capN_1.test b/src/tests/vimtests/search/counted_capN_1.test
new file mode 100644
index 0000000..64cfb11
--- /dev/null
+++ b/src/tests/vimtests/search/counted_capN_1.test
@@ -0,0 +1,18 @@
+-- Input
+(1,1)
+Lorem ipsum dolor sit amet
+Lorem ipsum dolor sit amet
+Lorem ipsum dolor sit amet
+Lorem ipsum dolor sit amet
+abc def ghi
+qwe rty uiop
+-- Output
+(3,13)
+Lorem ipsum dolor sit amet
+Lorem ipsum dolor sit amet
+Lorem ipsum dolor sit amet
+Lorem ipsum dolor sit amet
+abc def ghi
+qwe rty uiop
+-- Events
+/dolor<CR>2N \ No newline at end of file
diff --git a/src/tests/vimtests/search/counted_capN_2.test b/src/tests/vimtests/search/counted_capN_2.test
new file mode 100644
index 0000000..24d67ff
--- /dev/null
+++ b/src/tests/vimtests/search/counted_capN_2.test
@@ -0,0 +1,16 @@
+-- Input
+(1,1)
+Lorem ipsum dolor sit amet
+Lorem ipsum dolor sit amet
+Lorem ipsum dolor sit amet
+abc def ghi
+qwe rty uiop
+-- Output
+(2,13)
+Lorem ipsum dolor sit amet
+Lorem ipsum dolor sit amet
+Lorem ipsum dolor sit amet
+abc def ghi
+qwe rty uiop
+-- Events
+?dolor<CR>2N \ No newline at end of file
diff --git a/src/tests/vimtests/search/counted_n_1.test b/src/tests/vimtests/search/counted_n_1.test
new file mode 100644
index 0000000..0f5612f
--- /dev/null
+++ b/src/tests/vimtests/search/counted_n_1.test
@@ -0,0 +1,16 @@
+-- Input
+(1,1)
+Lorem ipsum dolor sit amet
+Lorem ipsum dolor sit amet
+Lorem ipsum dolor sit amet
+abc def ghi
+qwe rty uiop
+-- Output
+(3,13)
+Lorem ipsum dolor sit amet
+Lorem ipsum dolor sit amet
+Lorem ipsum dolor sit amet
+abc def ghi
+qwe rty uiop
+-- Events
+/dolor<CR>2n \ No newline at end of file
diff --git a/src/tests/vimtests/search/counted_n_2.test b/src/tests/vimtests/search/counted_n_2.test
new file mode 100644
index 0000000..1cdd4f5
--- /dev/null
+++ b/src/tests/vimtests/search/counted_n_2.test
@@ -0,0 +1,18 @@
+-- Input
+(1,1)
+Lorem ipsum dolor sit amet
+Lorem ipsum dolor sit amet
+Lorem ipsum dolor sit amet
+Lorem ipsum dolor sit amet
+abc def ghi
+qwe rty uiop
+-- Output
+(4,13)
+Lorem ipsum dolor sit amet
+Lorem ipsum dolor sit amet
+Lorem ipsum dolor sit amet
+Lorem ipsum dolor sit amet
+abc def ghi
+qwe rty uiop
+-- Events
+/dolor<CR>2nn \ No newline at end of file
diff --git a/src/tests/vimtests/search/counted_n_3.test b/src/tests/vimtests/search/counted_n_3.test
new file mode 100644
index 0000000..4de0f1a
--- /dev/null
+++ b/src/tests/vimtests/search/counted_n_3.test
@@ -0,0 +1,18 @@
+-- Input
+(1,1)
+Lorem ipsum dolor sit amet
+Lorem ipsum dolor sit amet
+Lorem ipsum dolor sit amet
+Lorem ipsum dolor sit amet
+abc def ghi
+qwe rty uiop
+-- Output
+(4,13)
+Lorem ipsum dolor sit amet
+Lorem ipsum dolor sit amet
+Lorem ipsum dolor sit amet
+Lorem ipsum dolor sit amet
+abc def ghi
+qwe rty uiop
+-- Events
+/dolor<CR>n2n \ No newline at end of file
diff --git a/src/tests/vimtests/search/history1.test b/src/tests/vimtests/search/history1.test
new file mode 100644
index 0000000..d9f620a
--- /dev/null
+++ b/src/tests/vimtests/search/history1.test
@@ -0,0 +1,12 @@
+-- Input
+(1,1)
+Lorem ipsum dolor sit amet
+abc def ghi
+qwe rty uiop
+-- Output
+(1,13)
+Lorem ipsum olor sit amet
+abc def ghi
+qwe rty uiop
+-- Events
+/dolor<CR>/amet<CR>gg/<C-p><C-p><CR>x \ No newline at end of file
diff --git a/src/tests/vimtests/search/history2.test b/src/tests/vimtests/search/history2.test
new file mode 100644
index 0000000..c3464c1
--- /dev/null
+++ b/src/tests/vimtests/search/history2.test
@@ -0,0 +1,12 @@
+-- Input
+(1,1)
+Lorem ipsum dolor sit amet
+abc def ghi
+qwe rty uiop
+-- Output
+(1,13)
+Lorem ipsum olor sit amet
+abc def ghi
+qwe rty uiop
+-- Events
+/dolor<CR>/amet<CR>gg/<C-p><Up><CR>x \ No newline at end of file
diff --git a/src/tests/vimtests/search/history3.test b/src/tests/vimtests/search/history3.test
new file mode 100644
index 0000000..330502a
--- /dev/null
+++ b/src/tests/vimtests/search/history3.test
@@ -0,0 +1,12 @@
+-- Input
+(1,1)
+Lorem ipsum dolor sit amet
+abc def ghi
+qwe rty uiop
+-- Output
+(1,23)
+Lorem ipsum dolor sit met
+abc def ghi
+qwe rty uiop
+-- Events
+/dolor<CR>/amet<CR>gg/<C-p><Up><Down><CR>x \ No newline at end of file
diff --git a/src/tests/vimtests/search/history4.test b/src/tests/vimtests/search/history4.test
new file mode 100644
index 0000000..9258813
--- /dev/null
+++ b/src/tests/vimtests/search/history4.test
@@ -0,0 +1,12 @@
+-- Input
+(1,1)
+Lorem ipsum dolor sit amet
+abc def ghi
+qwe rty uiop
+-- Output
+(1,23)
+Lorem ipsum dolor sit met
+abc def ghi
+qwe rty uiop
+-- Events
+/dolor<CR>/amet<CR>gg/<C-p><Up><C-n><CR>x \ No newline at end of file
diff --git a/src/tests/vimtests/searchword/g_pound.test b/src/tests/vimtests/searchword/g_pound.test
new file mode 100644
index 0000000..d2b8c7a
--- /dev/null
+++ b/src/tests/vimtests/searchword/g_pound.test
@@ -0,0 +1,12 @@
+-- Input
+(1,1)
+lorem ipsum lorem2 dolor sit amet
+dolor sit amet lorem ipsum
+lorem-lorem ipsumipsum
+-- Output
+(3,7)
+lorem ipsum lorem2 dolor sit amet
+dolor sit amet lorem ipsum
+lorem-lorem ipsumipsum
+-- Events
+g# \ No newline at end of file
diff --git a/src/tests/vimtests/searchword/g_repeat_pound.test b/src/tests/vimtests/searchword/g_repeat_pound.test
new file mode 100644
index 0000000..6006586
--- /dev/null
+++ b/src/tests/vimtests/searchword/g_repeat_pound.test
@@ -0,0 +1,12 @@
+-- Input
+(1,1)
+lorem ipsum lorem2 dolor sit amet
+dolor sit amet lorem ipsum
+lorem-lorem ipsumipsum
+-- Output
+(1,13)
+lorem ipsum lorem2 dolor sit amet
+dolor sit amet lorem ipsum
+lorem-lorem ipsumipsum
+-- Events
+g#nnn \ No newline at end of file
diff --git a/src/tests/vimtests/searchword/g_repeat_pound_1.test b/src/tests/vimtests/searchword/g_repeat_pound_1.test
new file mode 100644
index 0000000..3e707b2
--- /dev/null
+++ b/src/tests/vimtests/searchword/g_repeat_pound_1.test
@@ -0,0 +1,12 @@
+-- Input
+(1,1)
+lorem ipsum lorem2 dolor sit amet
+dolor sit amet lorem ipsum
+lorem-lorem ipsumipsum
+-- Output
+(3,1)
+lorem ipsum lorem2 dolor sit amet
+dolor sit amet lorem ipsum
+lorem-lorem ipsumipsum
+-- Events
+g#n \ No newline at end of file
diff --git a/src/tests/vimtests/searchword/g_repeat_star.test b/src/tests/vimtests/searchword/g_repeat_star.test
new file mode 100644
index 0000000..ce17587
--- /dev/null
+++ b/src/tests/vimtests/searchword/g_repeat_star.test
@@ -0,0 +1,12 @@
+-- Input
+(1,1)
+lorem ipsum lorem2 dolor sit amet
+dolor sit amet lorem ipsum
+lorem-lorem ipsumipsum
+-- Output
+(3,1)
+lorem ipsum lorem2 dolor sit amet
+dolor sit amet lorem ipsum
+lorem-lorem ipsumipsum
+-- Events
+g*nn \ No newline at end of file
diff --git a/src/tests/vimtests/searchword/g_star.test b/src/tests/vimtests/searchword/g_star.test
new file mode 100644
index 0000000..1bdd677
--- /dev/null
+++ b/src/tests/vimtests/searchword/g_star.test
@@ -0,0 +1,12 @@
+-- Input
+(1,1)
+lorem ipsum lorem2 dolor sit amet
+dolor sit amet lorem ipsum
+lorem-lorem ipsumipsum
+-- Output
+(1,13)
+lorem ipsum lorem2 dolor sit amet
+dolor sit amet lorem ipsum
+lorem-lorem ipsumipsum
+-- Events
+g* \ No newline at end of file
diff --git a/src/tests/vimtests/searchword/pound.test b/src/tests/vimtests/searchword/pound.test
new file mode 100644
index 0000000..41caa65
--- /dev/null
+++ b/src/tests/vimtests/searchword/pound.test
@@ -0,0 +1,12 @@
+-- Input
+(1,1)
+lorem ipsum lorem2 dolor sit amet
+dolor sit amet lorem ipsum
+lorem-lorem ipsumipsum
+-- Output
+(3,7)
+lorem ipsum lorem2 dolor sit amet
+dolor sit amet lorem ipsum
+lorem-lorem ipsumipsum
+-- Events
+# \ No newline at end of file
diff --git a/src/tests/vimtests/searchword/repeat_pound.test b/src/tests/vimtests/searchword/repeat_pound.test
new file mode 100644
index 0000000..504d140
--- /dev/null
+++ b/src/tests/vimtests/searchword/repeat_pound.test
@@ -0,0 +1,12 @@
+-- Input
+(1,1)
+lorem ipsum lorem2 dolor sit amet
+dolor sit amet lorem ipsum
+lorem-lorem ipsumipsum
+-- Output
+(2,16)
+lorem ipsum lorem2 dolor sit amet
+dolor sit amet lorem ipsum
+lorem-lorem ipsumipsum
+-- Events
+#nn \ No newline at end of file
diff --git a/src/tests/vimtests/searchword/repeat_star.test b/src/tests/vimtests/searchword/repeat_star.test
new file mode 100644
index 0000000..efda7bb
--- /dev/null
+++ b/src/tests/vimtests/searchword/repeat_star.test
@@ -0,0 +1,12 @@
+-- Input
+(1,1)
+lorem ipsum lorem2 dolor sit amet
+dolor sit amet lorem ipsum
+lorem-lorem ipsumipsum
+-- Output
+(3,7)
+lorem ipsum lorem2 dolor sit amet
+dolor sit amet lorem ipsum
+lorem-lorem ipsumipsum
+-- Events
+*nn \ No newline at end of file
diff --git a/src/tests/vimtests/searchword/star.test b/src/tests/vimtests/searchword/star.test
new file mode 100644
index 0000000..9f7114f
--- /dev/null
+++ b/src/tests/vimtests/searchword/star.test
@@ -0,0 +1,12 @@
+-- Input
+(1,1)
+lorem ipsum lorem2 dolor sit amet
+dolor sit amet lorem ipsum
+lorem-lorem ipsumipsum
+-- Output
+(2,16)
+lorem ipsum lorem2 dolor sit amet
+dolor sit amet lorem ipsum
+lorem-lorem ipsumipsum
+-- Events
+* \ No newline at end of file
diff --git a/src/tests/vimtests/searchword/star_2.test b/src/tests/vimtests/searchword/star_2.test
new file mode 100644
index 0000000..4377d45
--- /dev/null
+++ b/src/tests/vimtests/searchword/star_2.test
@@ -0,0 +1,12 @@
+-- Input
+(1,2)
+(lorem ipsum lorem2 dolor sit amet
+dolor sit amet lorem ipsum
+lorem-lorem ipsumipsum
+-- Output
+(2,16)
+(lorem ipsum lorem2 dolor sit amet
+dolor sit amet lorem ipsum
+lorem-lorem ipsumipsum
+-- Events
+* \ No newline at end of file
diff --git a/src/tests/vimtests/switchcase/g_capU.test b/src/tests/vimtests/switchcase/g_capU.test
new file mode 100644
index 0000000..6fddbce
--- /dev/null
+++ b/src/tests/vimtests/switchcase/g_capU.test
@@ -0,0 +1,12 @@
+-- Input
+(1,1)
+Lorem ipsum dolor sit amet
+abc def ghi
+qwe rty uiop
+-- Output
+(1,1)
+LOREM IPSUM dolor sit amet
+abc def ghi
+qwe rty uiop
+-- Events
+gU2w \ No newline at end of file
diff --git a/src/tests/vimtests/switchcase/gtilde.test b/src/tests/vimtests/switchcase/gtilde.test
new file mode 100644
index 0000000..549a24a
--- /dev/null
+++ b/src/tests/vimtests/switchcase/gtilde.test
@@ -0,0 +1,12 @@
+-- Input
+(1,1)
+LOREM IPSUM dolor sit amet
+abc def ghi
+qwe rty uiop
+-- Output
+(1,1)
+lorem ipsum dolor sit amet
+abc def ghi
+qwe rty uiop
+-- Events
+g~2w \ No newline at end of file
diff --git a/src/tests/vimtests/switchcase/gtilde_1.test b/src/tests/vimtests/switchcase/gtilde_1.test
new file mode 100644
index 0000000..cd37db5
--- /dev/null
+++ b/src/tests/vimtests/switchcase/gtilde_1.test
@@ -0,0 +1,12 @@
+-- Input
+(1,1)
+Lorem ipsum dolor sit amet
+abc def ghi
+qwe rty uiop
+-- Output
+(1,1)
+lOREM IPSUM dolor sit amet
+abc def ghi
+qwe rty uiop
+-- Events
+g~2w \ No newline at end of file
diff --git a/src/tests/vimtests/switchcase/gu.test b/src/tests/vimtests/switchcase/gu.test
new file mode 100644
index 0000000..129815c
--- /dev/null
+++ b/src/tests/vimtests/switchcase/gu.test
@@ -0,0 +1,12 @@
+-- Input
+(1,1)
+LOREM IPSUM dolor sit amet
+abc def ghi
+qwe rty uiop
+-- Output
+(1,1)
+lorem ipsum dolor sit amet
+abc def ghi
+qwe rty uiop
+-- Events
+gu2w \ No newline at end of file
diff --git a/src/tests/vimtests/switchcase/tilde_does_not_cross_lines.test b/src/tests/vimtests/switchcase/tilde_does_not_cross_lines.test
new file mode 100644
index 0000000..d24d6ff
--- /dev/null
+++ b/src/tests/vimtests/switchcase/tilde_does_not_cross_lines.test
@@ -0,0 +1,12 @@
+-- Input
+(1,1)
+abcdefghijklmnopqrstuvwxyz
+abc def ghi
+qwe rty uiop
+-- Output
+(1,26)
+ABCDEFGHIJKLMNOPQRSTUVWXYZ
+abc def ghi
+qwe rty uiop
+-- Events
+30~
diff --git a/src/tests/vimtests/switchcase/tilde_left_over_count_at_eol_is_ignored.test b/src/tests/vimtests/switchcase/tilde_left_over_count_at_eol_is_ignored.test
new file mode 100644
index 0000000..136e994
--- /dev/null
+++ b/src/tests/vimtests/switchcase/tilde_left_over_count_at_eol_is_ignored.test
@@ -0,0 +1,18 @@
+-- Input
+(2,1)
+12345678901234567890
+If tilde is given a
+count which is greater than the line length
+the case of the final character is switched exactly once.
+We have 18 characters in the first line, a count of 19
+should switch the final 'a' to 'A', not to 'A' and then back to 'a'.
+-- Output
+(2,19)
+12345678901234567890
+iF TILDE IS GIVEN A
+count which is greater than the line length
+the case of the final character is switched exactly once.
+We have 18 characters in the first line, a count of 19
+should switch the final 'a' to 'A', not to 'A' and then back to 'a'.
+-- Events
+20~
diff --git a/src/tests/vimtests/switchcase/tilde_near_eol.test b/src/tests/vimtests/switchcase/tilde_near_eol.test
new file mode 100644
index 0000000..489352a
--- /dev/null
+++ b/src/tests/vimtests/switchcase/tilde_near_eol.test
@@ -0,0 +1,12 @@
+-- Input
+(1,1)
+Lorem ipsum dolor sit amet
+abc def ghi
+qwe rty uiop
+-- Output
+(1,26)
+Lorem ipsum dolor sit ameT
+abc def ghi
+qwe rty uiop
+-- Events
+$~ \ No newline at end of file
diff --git a/src/tests/vimtests/switchcase/tilde_no_count.test b/src/tests/vimtests/switchcase/tilde_no_count.test
new file mode 100644
index 0000000..0fca7f8
--- /dev/null
+++ b/src/tests/vimtests/switchcase/tilde_no_count.test
@@ -0,0 +1,12 @@
+-- Input
+(1,1)
+Lorem ipsum dolor sit amet
+abc def ghi
+qwe rty uiop
+-- Output
+(1,2)
+lorem ipsum dolor sit amet
+abc def ghi
+qwe rty uiop
+-- Events
+~
diff --git a/src/tests/vimtests/switchcase/tilde_with_count.test b/src/tests/vimtests/switchcase/tilde_with_count.test
new file mode 100644
index 0000000..ad54a7f
--- /dev/null
+++ b/src/tests/vimtests/switchcase/tilde_with_count.test
@@ -0,0 +1,12 @@
+-- Input
+(1,1)
+Lorem ipsum dolor sit amet
+abc def ghi
+qwe rty uiop
+-- Output
+(1,11)
+lOREM IPSUm dolor sit amet
+abc def ghi
+qwe rty uiop
+-- Events
+10~
diff --git a/src/tests/vimtests/undo/1.test b/src/tests/vimtests/undo/1.test
new file mode 100644
index 0000000..15c2f2d
--- /dev/null
+++ b/src/tests/vimtests/undo/1.test
@@ -0,0 +1,12 @@
+-- Input
+(2,2)
+foo
+bar
+baz
+-- Output
+(2,3)
+foo
+bar
+baz
+-- Events
+A 123<Esc>u \ No newline at end of file
diff --git a/src/tests/vimtests/undo/2.test b/src/tests/vimtests/undo/2.test
new file mode 100644
index 0000000..752bdd7
--- /dev/null
+++ b/src/tests/vimtests/undo/2.test
@@ -0,0 +1,12 @@
+-- Input
+(2,2)
+foo
+bar
+baz
+-- Output
+(2,7)
+foo
+bar 123
+baz
+-- Events
+A 123<Esc>u<C-r>
diff --git a/src/tests/vimtests/undo/3.test b/src/tests/vimtests/undo/3.test
new file mode 100644
index 0000000..85f8313
--- /dev/null
+++ b/src/tests/vimtests/undo/3.test
@@ -0,0 +1,12 @@
+-- Input
+(2,2)
+foo
+bar
+baz
+-- Output
+(2,2)
+foo
+bar
+baz
+-- Events
+xu
diff --git a/src/tests/vimtests/undo/4.test b/src/tests/vimtests/undo/4.test
new file mode 100644
index 0000000..bac7f29
--- /dev/null
+++ b/src/tests/vimtests/undo/4.test
@@ -0,0 +1,12 @@
+-- Input
+(1,1)
+foo
+bar
+baz
+-- Output
+(2,2)
+foo
+br
+baz
+-- Events
+jlxu<C-r>
diff --git a/src/tests/vimtests/undo/5.test b/src/tests/vimtests/undo/5.test
new file mode 100644
index 0000000..15ac740
--- /dev/null
+++ b/src/tests/vimtests/undo/5.test
@@ -0,0 +1,12 @@
+-- Input
+(1,1)
+foo
+bar
+baz
+-- Output
+(2,7)
+foo
+bar 123
+baz
+-- Events
+jlA 123<Esc>A 456<Esc>u \ No newline at end of file
diff --git a/src/tests/vimtests/undo/6.test b/src/tests/vimtests/undo/6.test
new file mode 100644
index 0000000..eb235c7
--- /dev/null
+++ b/src/tests/vimtests/undo/6.test
@@ -0,0 +1,12 @@
+-- Input
+(1,1)
+foo
+bar
+baz
+-- Output
+(2,3)
+foo
+bar
+baz
+-- Events
+jlA 123<Esc>A 456<Esc>uu \ No newline at end of file
diff --git a/src/tests/vimtests/undo/7.test b/src/tests/vimtests/undo/7.test
new file mode 100644
index 0000000..f2e1af6
--- /dev/null
+++ b/src/tests/vimtests/undo/7.test
@@ -0,0 +1,12 @@
+-- Input
+(1,1)
+foo
+bar
+baz
+-- Output
+(2,7)
+foo
+bar 123
+baz
+-- Events
+jlA 123<Esc>A 456<Esc>uu<C-r> \ No newline at end of file
diff --git a/src/tests/vimtests/undo/8.test b/src/tests/vimtests/undo/8.test
new file mode 100644
index 0000000..22ea3f2
--- /dev/null
+++ b/src/tests/vimtests/undo/8.test
@@ -0,0 +1,12 @@
+-- Input
+(1,1)
+foo
+bar
+baz
+-- Output
+(2,11)
+foo
+bar 123 456
+baz
+-- Events
+jlA 123<Esc>A 456<Esc>uu<C-r><C-r> \ No newline at end of file
diff --git a/src/tests/vimtests/undo/9.test b/src/tests/vimtests/undo/9.test
new file mode 100644
index 0000000..c99abae
--- /dev/null
+++ b/src/tests/vimtests/undo/9.test
@@ -0,0 +1,12 @@
+-- Input
+(1,1)
+foo
+bar
+baz
+-- Output
+(2,3)
+foo
+bar
+baz
+-- Events
+jlA 123<Esc>A 456<Esc>uu<C-r>u \ No newline at end of file
diff --git a/src/tests/vimtests/unicode/chinese-simp.test b/src/tests/vimtests/unicode/chinese-simp.test
new file mode 100644
index 0000000..e036e7a
--- /dev/null
+++ b/src/tests/vimtests/unicode/chinese-simp.test
@@ -0,0 +1,8 @@
+-- Input
+(1,1)
+
+-- Output
+(1,4)
+中文测试
+-- Events
+i中文测试<Esc>
diff --git a/src/tests/vimtests/unicode/chinese-trad.test b/src/tests/vimtests/unicode/chinese-trad.test
new file mode 100644
index 0000000..365ddce
--- /dev/null
+++ b/src/tests/vimtests/unicode/chinese-trad.test
@@ -0,0 +1,8 @@
+-- Input
+(1,1)
+
+-- Output
+(1,4)
+中文測試
+-- Events
+i中文測試<Esc>
diff --git a/src/tests/vimtests/unicode/russian.test b/src/tests/vimtests/unicode/russian.test
new file mode 100644
index 0000000..c453faa
--- /dev/null
+++ b/src/tests/vimtests/unicode/russian.test
@@ -0,0 +1,8 @@
+-- Input
+(1,1)
+
+-- Output
+(1,16)
+Спасибопожалусто
+-- Events
+iСпасибопожалусто<Esc>
diff --git a/src/tests/vimtests/unsorted/2yy.test b/src/tests/vimtests/unsorted/2yy.test
new file mode 100644
index 0000000..cae4742
--- /dev/null
+++ b/src/tests/vimtests/unsorted/2yy.test
@@ -0,0 +1,12 @@
+-- Input
+(1,1)
+Lorem ipsum dolor sit amet
+abc def ghi
+qwe rty uiop
+-- Output
+(1,1)
+Lorem ipsum dolor sit amet
+abc def ghi
+qwe rty uiop
+-- Events
+2yy \ No newline at end of file
diff --git a/src/tests/vimtests/unsorted/v3lcABC.test b/src/tests/vimtests/unsorted/v3lcABC.test
new file mode 100644
index 0000000..29bafd1
--- /dev/null
+++ b/src/tests/vimtests/unsorted/v3lcABC.test
@@ -0,0 +1,8 @@
+-- Input
+(1,1)
+Lorem ipsum
+-- Output
+(1,8)
+ABCm ABCm
+-- Events
+v3lcABC<Esc>w. \ No newline at end of file
diff --git a/src/tests/vimtests/visual/1.test b/src/tests/vimtests/visual/1.test
new file mode 100644
index 0000000..9fb0085
--- /dev/null
+++ b/src/tests/vimtests/visual/1.test
@@ -0,0 +1,8 @@
+-- Input
+(1,1)
+12345678
+-- Output
+(1,2)
+1345678
+-- Events
+lv3lyx \ No newline at end of file
diff --git a/src/tests/vimtests/visual/10.test b/src/tests/vimtests/visual/10.test
new file mode 100644
index 0000000..f22b965
--- /dev/null
+++ b/src/tests/vimtests/visual/10.test
@@ -0,0 +1,8 @@
+-- Input
+(1,1)
+12345678
+-- Output
+(1,5)
+1234678
+-- Events
+lv3l<Esc>x \ No newline at end of file
diff --git a/src/tests/vimtests/visual/11.test b/src/tests/vimtests/visual/11.test
new file mode 100644
index 0000000..78599a9
--- /dev/null
+++ b/src/tests/vimtests/visual/11.test
@@ -0,0 +1,8 @@
+-- Input
+(1,1)
+12345678
+-- Output
+(1,5)
+1234678
+-- Events
+lv3l<C-c>x \ No newline at end of file
diff --git a/src/tests/vimtests/visual/12.test b/src/tests/vimtests/visual/12.test
new file mode 100644
index 0000000..e89024a
--- /dev/null
+++ b/src/tests/vimtests/visual/12.test
@@ -0,0 +1,8 @@
+-- Input
+(1,1)
+12345678
+-- Output
+(1,5)
+1234678
+-- Events
+lv3l<C-c>xv3ly
diff --git a/src/tests/vimtests/visual/13.test b/src/tests/vimtests/visual/13.test
new file mode 100644
index 0000000..7c5d3f7
--- /dev/null
+++ b/src/tests/vimtests/visual/13.test
@@ -0,0 +1,8 @@
+-- Input
+(1,1)
+12345678
+-- Output
+(1,1)
+2345678
+-- Events
+y<Esc>v3lyx \ No newline at end of file
diff --git a/src/tests/vimtests/visual/14.test b/src/tests/vimtests/visual/14.test
new file mode 100644
index 0000000..d5b8308
--- /dev/null
+++ b/src/tests/vimtests/visual/14.test
@@ -0,0 +1,10 @@
+-- Input
+(1,1)
+ab1
+cd2
+-- Output
+(1,1)
+b1
+cd2
+-- Events
+jVlkgux
diff --git a/src/tests/vimtests/visual/15.test b/src/tests/vimtests/visual/15.test
new file mode 100644
index 0000000..90f2af5
--- /dev/null
+++ b/src/tests/vimtests/visual/15.test
@@ -0,0 +1,8 @@
+-- Input
+(1,1)
+foobarbaz
+-- Output
+(1,2)
+fbaz
+-- Events
+lvlkkjl2ld \ No newline at end of file
diff --git a/src/tests/vimtests/visual/2.test b/src/tests/vimtests/visual/2.test
new file mode 100644
index 0000000..66d71f6
--- /dev/null
+++ b/src/tests/vimtests/visual/2.test
@@ -0,0 +1,8 @@
+-- Input
+(1,1)
+12345678
+-- Output
+(1,4)
+1235678
+-- Events
+$hv3hyx \ No newline at end of file
diff --git a/src/tests/vimtests/visual/3.test b/src/tests/vimtests/visual/3.test
new file mode 100644
index 0000000..0806056
--- /dev/null
+++ b/src/tests/vimtests/visual/3.test
@@ -0,0 +1,10 @@
+-- Input
+(1,1)
+aaa
+bbb
+-- Output
+(1,2)
+aA
+BBb
+-- Events
+lvj~x \ No newline at end of file
diff --git a/src/tests/vimtests/visual/4.test b/src/tests/vimtests/visual/4.test
new file mode 100644
index 0000000..36b5e17
--- /dev/null
+++ b/src/tests/vimtests/visual/4.test
@@ -0,0 +1,10 @@
+-- Input
+(1,1)
+123
+456
+-- Output
+(1,2)
+13
+456
+-- Events
+jlvkyx \ No newline at end of file
diff --git a/src/tests/vimtests/visual/6.test b/src/tests/vimtests/visual/6.test
new file mode 100644
index 0000000..ef23a29
--- /dev/null
+++ b/src/tests/vimtests/visual/6.test
@@ -0,0 +1,10 @@
+-- Input
+(1,1)
+12
+34
+-- Output
+(1,1)
+2
+34
+-- Events
+lVjyx \ No newline at end of file
diff --git a/src/tests/vimtests/visual/7.test b/src/tests/vimtests/visual/7.test
new file mode 100644
index 0000000..a478078
--- /dev/null
+++ b/src/tests/vimtests/visual/7.test
@@ -0,0 +1,10 @@
+-- Input
+(1,1)
+ab
+cd
+-- Output
+(1,1)
+b
+cd
+-- Events
+jVlkgux \ No newline at end of file
diff --git a/src/tests/vimtests/visual/A_0.test b/src/tests/vimtests/visual/A_0.test
new file mode 100644
index 0000000..506b3b4
--- /dev/null
+++ b/src/tests/vimtests/visual/A_0.test
@@ -0,0 +1,14 @@
+-- Input
+(1,1)
+averyverylongline
+shortline
+shorter
+
+-- Output
+(1,18)
+averyverylonglineb
+shortlineb
+shorterb
+
+-- Events
+jjVkkAb<Esc> \ No newline at end of file
diff --git a/src/tests/vimtests/visual/A_1.test b/src/tests/vimtests/visual/A_1.test
new file mode 100644
index 0000000..04411a1
--- /dev/null
+++ b/src/tests/vimtests/visual/A_1.test
@@ -0,0 +1,12 @@
+-- Input
+(1,1)
+averyverylongline
+shortline
+
+-- Output
+(1,18)
+averyverylonglineb
+shortlineb
+
+-- Events
+VjAb<Esc> \ No newline at end of file
diff --git a/src/tests/vimtests/visual/A_2.test b/src/tests/vimtests/visual/A_2.test
new file mode 100644
index 0000000..ba0dc52
--- /dev/null
+++ b/src/tests/vimtests/visual/A_2.test
@@ -0,0 +1,12 @@
+-- Input
+(1,1)
+averyverylongline
+shortline
+
+-- Output
+(1,6)
+averybverylongline
+shortbline
+
+-- Events
+<C-v>j4lAb<Esc>
diff --git a/src/tests/vimtests/visual/I_0.test b/src/tests/vimtests/visual/I_0.test
new file mode 100644
index 0000000..3d9e75a
--- /dev/null
+++ b/src/tests/vimtests/visual/I_0.test
@@ -0,0 +1,10 @@
+-- Input
+(1,1)
+abc
+def
+-- Output
+(1,3)
+123abc
+123def
+-- Events
+VjI123<Esc>
diff --git a/src/tests/vimtests/visual/I_1.test b/src/tests/vimtests/visual/I_1.test
new file mode 100644
index 0000000..3cb5f0f
--- /dev/null
+++ b/src/tests/vimtests/visual/I_1.test
@@ -0,0 +1,10 @@
+-- Input
+(1,1)
+abc
+def
+-- Output
+(1,3)
+123abc
+123def
+-- Events
+<C-v>jI123<Esc>
diff --git a/src/tests/vimtests/visual/Vd.test b/src/tests/vimtests/visual/Vd.test
new file mode 100644
index 0000000..3996e65
--- /dev/null
+++ b/src/tests/vimtests/visual/Vd.test
@@ -0,0 +1,9 @@
+-- Input
+(1,1)
+foo
+bar
+-- Output
+(1,1)
+bar
+-- Events
+Vd \ No newline at end of file
diff --git a/src/tests/vimtests/visual/capD_0.test b/src/tests/vimtests/visual/capD_0.test
new file mode 100644
index 0000000..cf4bd76
--- /dev/null
+++ b/src/tests/vimtests/visual/capD_0.test
@@ -0,0 +1,10 @@
+-- Input
+(1,1)
+foo
+bar
+baz
+-- Output
+(1,1)
+baz
+-- Events
+lvjlD \ No newline at end of file
diff --git a/src/tests/vimtests/visual/capD_1.test b/src/tests/vimtests/visual/capD_1.test
new file mode 100644
index 0000000..783b635
--- /dev/null
+++ b/src/tests/vimtests/visual/capD_1.test
@@ -0,0 +1,10 @@
+-- Input
+(1,1)
+foo
+bar
+baz
+-- Output
+(1,1)
+baz
+-- Events
+lVjlD
diff --git a/src/tests/vimtests/visual/capD_2.test b/src/tests/vimtests/visual/capD_2.test
new file mode 100644
index 0000000..b51939f
--- /dev/null
+++ b/src/tests/vimtests/visual/capD_2.test
@@ -0,0 +1,9 @@
+-- Input
+(1,1)
+foo
+bar
+-- Output
+(1,1)
+bar
+-- Events
+VjkD \ No newline at end of file
diff --git a/src/tests/vimtests/visual/capU_0.test b/src/tests/vimtests/visual/capU_0.test
new file mode 100644
index 0000000..3f98eec
--- /dev/null
+++ b/src/tests/vimtests/visual/capU_0.test
@@ -0,0 +1,8 @@
+-- Input
+(1,1)
+foo bar
+-- Output
+(1,1)
+FOO Bar
+-- Events
+vwgU \ No newline at end of file
diff --git a/src/tests/vimtests/visual/capU_1.test b/src/tests/vimtests/visual/capU_1.test
new file mode 100644
index 0000000..ac04d0a
--- /dev/null
+++ b/src/tests/vimtests/visual/capU_1.test
@@ -0,0 +1,12 @@
+-- Input
+(1,1)
+foo
+bar
+baz
+-- Output
+(1,1)
+FOO
+BAR
+BAZ
+-- Events
+VjjU \ No newline at end of file
diff --git a/src/tests/vimtests/visual/capY_0.test b/src/tests/vimtests/visual/capY_0.test
new file mode 100644
index 0000000..92d1a2f
--- /dev/null
+++ b/src/tests/vimtests/visual/capY_0.test
@@ -0,0 +1,13 @@
+-- Input
+(1,1)
+foo
+foo
+bar
+-- Output
+(2,1)
+foo
+foo
+foo
+bar
+-- Events
+VYp \ No newline at end of file
diff --git a/src/tests/vimtests/visual/d_0.test b/src/tests/vimtests/visual/d_0.test
new file mode 100644
index 0000000..90f2af5
--- /dev/null
+++ b/src/tests/vimtests/visual/d_0.test
@@ -0,0 +1,8 @@
+-- Input
+(1,1)
+foobarbaz
+-- Output
+(1,2)
+fbaz
+-- Events
+lvlkkjl2ld \ No newline at end of file
diff --git a/src/tests/vimtests/visual/d_1.test b/src/tests/vimtests/visual/d_1.test
new file mode 100644
index 0000000..8d868d9
--- /dev/null
+++ b/src/tests/vimtests/visual/d_1.test
@@ -0,0 +1,8 @@
+-- Input
+(1,1)
+foobar
+-- Output
+(1,1)
+
+-- Events
+v$d \ No newline at end of file
diff --git a/src/tests/vimtests/visual/d_2.test b/src/tests/vimtests/visual/d_2.test
new file mode 100644
index 0000000..00649fa
--- /dev/null
+++ b/src/tests/vimtests/visual/d_2.test
@@ -0,0 +1,11 @@
+-- Input
+(1,1)
+foo
+bar
+baz
+-- Output
+(2,1)
+foo
+baz
+-- Events
+jVlld \ No newline at end of file
diff --git a/src/tests/vimtests/visual/gq_0.test b/src/tests/vimtests/visual/gq_0.test
new file mode 100644
index 0000000..89fa6e4
--- /dev/null
+++ b/src/tests/vimtests/visual/gq_0.test
@@ -0,0 +1,12 @@
+-- Input
+(1,1)
+foo
+bar
+baz
+-- Output
+(1,1)
+foo
+bar
+baz
+-- Events
+Vgq \ No newline at end of file
diff --git a/src/tests/vimtests/visual/gq_1.test b/src/tests/vimtests/visual/gq_1.test
new file mode 100644
index 0000000..759ab23
--- /dev/null
+++ b/src/tests/vimtests/visual/gq_1.test
@@ -0,0 +1,11 @@
+-- Input
+(1,1)
+foo
+bar
+baz
+-- Output
+(1,1)
+foo bar
+baz
+-- Events
+Vjgq \ No newline at end of file
diff --git a/src/tests/vimtests/visual/indent_0.test b/src/tests/vimtests/visual/indent_0.test
new file mode 100644
index 0000000..9bfe3e0
--- /dev/null
+++ b/src/tests/vimtests/visual/indent_0.test
@@ -0,0 +1,10 @@
+-- Input
+(1,1)
+foo
+bar
+-- Output
+(1,5)
+ foo
+ bar
+-- Events
+vj> \ No newline at end of file
diff --git a/src/tests/vimtests/visual/indent_1.test b/src/tests/vimtests/visual/indent_1.test
new file mode 100644
index 0000000..912d034
--- /dev/null
+++ b/src/tests/vimtests/visual/indent_1.test
@@ -0,0 +1,12 @@
+-- Input
+(1,1)
+foo
+bar
+baz
+-- Output
+(2,5)
+foo
+ bar
+ baz
+-- Events
+jVj> \ No newline at end of file
diff --git a/src/tests/vimtests/visual/indent_10.test b/src/tests/vimtests/visual/indent_10.test
new file mode 100644
index 0000000..ed2cd97
--- /dev/null
+++ b/src/tests/vimtests/visual/indent_10.test
@@ -0,0 +1,14 @@
+-- Input
+(1,1)
+ foo
+ bar
+ baz
+ xyzzy
+-- Output
+(1,1)
+foo
+bar
+baz
+ xyzzy
+-- Events
+V2j<lt> \ No newline at end of file
diff --git a/src/tests/vimtests/visual/indent_2.test b/src/tests/vimtests/visual/indent_2.test
new file mode 100644
index 0000000..5a14f01
--- /dev/null
+++ b/src/tests/vimtests/visual/indent_2.test
@@ -0,0 +1,8 @@
+-- Input
+(1,1)
+foo
+-- Output
+(1,13)
+ foo
+-- Events
+vl3> \ No newline at end of file
diff --git a/src/tests/vimtests/visual/indent_3.test b/src/tests/vimtests/visual/indent_3.test
new file mode 100644
index 0000000..3c217ec
--- /dev/null
+++ b/src/tests/vimtests/visual/indent_3.test
@@ -0,0 +1,8 @@
+-- Input
+(1,1)
+ foo
+-- Output
+(1,1)
+foo
+-- Events
+vl<lt> \ No newline at end of file
diff --git a/src/tests/vimtests/visual/indent_4.test b/src/tests/vimtests/visual/indent_4.test
new file mode 100644
index 0000000..5034340
--- /dev/null
+++ b/src/tests/vimtests/visual/indent_4.test
@@ -0,0 +1,12 @@
+-- Input
+(1,1)
+foo
+bar
+baz
+-- Output
+(1,5)
+ foo
+bar
+baz
+-- Events
+V> \ No newline at end of file
diff --git a/src/tests/vimtests/visual/indent_5.test b/src/tests/vimtests/visual/indent_5.test
new file mode 100644
index 0000000..d2fe67f
--- /dev/null
+++ b/src/tests/vimtests/visual/indent_5.test
@@ -0,0 +1,12 @@
+-- Input
+(1,1)
+foo
+bar
+baz
+-- Output
+(1,5)
+ foo
+ bar
+baz
+-- Events
+Vj> \ No newline at end of file
diff --git a/src/tests/vimtests/visual/indent_6.test b/src/tests/vimtests/visual/indent_6.test
new file mode 100644
index 0000000..07fd2ea
--- /dev/null
+++ b/src/tests/vimtests/visual/indent_6.test
@@ -0,0 +1,12 @@
+-- Input
+(1,1)
+foo
+bar
+baz
+-- Output
+(1,5)
+ foo
+ bar
+ baz
+-- Events
+V2j> \ No newline at end of file
diff --git a/src/tests/vimtests/visual/indent_7.test b/src/tests/vimtests/visual/indent_7.test
new file mode 100644
index 0000000..4675a4b
--- /dev/null
+++ b/src/tests/vimtests/visual/indent_7.test
@@ -0,0 +1,12 @@
+-- Input
+(1,1)
+foo
+bar
+baz
+-- Output
+(1,21)
+ foo
+bar
+baz
+-- Events
+V5> \ No newline at end of file
diff --git a/src/tests/vimtests/visual/indent_8.test b/src/tests/vimtests/visual/indent_8.test
new file mode 100644
index 0000000..3fef4d3
--- /dev/null
+++ b/src/tests/vimtests/visual/indent_8.test
@@ -0,0 +1,12 @@
+-- Input
+(1,1)
+ foo
+bar
+baz
+-- Output
+(1,1)
+foo
+bar
+baz
+-- Events
+V<lt> \ No newline at end of file
diff --git a/src/tests/vimtests/visual/indent_9.test b/src/tests/vimtests/visual/indent_9.test
new file mode 100644
index 0000000..d2b53bf
--- /dev/null
+++ b/src/tests/vimtests/visual/indent_9.test
@@ -0,0 +1,12 @@
+-- Input
+(1,1)
+foo
+bar
+baz
+-- Output
+(1,1)
+foo
+bar
+baz
+-- Events
+V>V<lt> \ No newline at end of file
diff --git a/src/tests/vimtests/visual/m_0.test b/src/tests/vimtests/visual/m_0.test
new file mode 100644
index 0000000..bd487f1
--- /dev/null
+++ b/src/tests/vimtests/visual/m_0.test
@@ -0,0 +1,10 @@
+-- Input
+(1,1)
+foo
+bar
+-- Output
+(2,2)
+foo
+br
+-- Events
+vljmavgg`ax \ No newline at end of file
diff --git a/src/tests/vimtests/visual/m_1.test b/src/tests/vimtests/visual/m_1.test
new file mode 100644
index 0000000..c2f3204
--- /dev/null
+++ b/src/tests/vimtests/visual/m_1.test
@@ -0,0 +1,14 @@
+-- Input
+(1,1)
+1
+2
+3
+4
+-- Output
+(2,1)
+1
+2
+3
+4
+-- Events
+Vjmajjmb<Esc>'a \ No newline at end of file
diff --git a/src/tests/vimtests/visual/o_0.test b/src/tests/vimtests/visual/o_0.test
new file mode 100644
index 0000000..b202c2a
--- /dev/null
+++ b/src/tests/vimtests/visual/o_0.test
@@ -0,0 +1,8 @@
+-- Input
+(1,1)
+foobar
+-- Output
+(1,4)
+fooar
+-- Events
+lv2lo2ld \ No newline at end of file
diff --git a/src/tests/vimtests/visual/r_0.test b/src/tests/vimtests/visual/r_0.test
new file mode 100644
index 0000000..f83f656
--- /dev/null
+++ b/src/tests/vimtests/visual/r_0.test
@@ -0,0 +1,8 @@
+-- Input
+(1,1)
+foobar
+-- Output
+(1,1)
+aaaaaa
+-- Events
+Vra \ No newline at end of file
diff --git a/src/tests/vimtests/visual/r_1.test b/src/tests/vimtests/visual/r_1.test
new file mode 100644
index 0000000..d312823
--- /dev/null
+++ b/src/tests/vimtests/visual/r_1.test
@@ -0,0 +1,10 @@
+-- Input
+(1,1)
+foo
+bar
+-- Output
+(1,3)
+fox
+xxr
+-- Events
+jlvklrx \ No newline at end of file
diff --git a/src/tests/vimtests/visual/r_2.test b/src/tests/vimtests/visual/r_2.test
new file mode 100644
index 0000000..39af94a
--- /dev/null
+++ b/src/tests/vimtests/visual/r_2.test
@@ -0,0 +1,12 @@
+-- Input
+(1,7)
+Lorem ipsum dolor sit amet
+abc def ghi
+qwe rty uiop
+-- Output
+(1,7)
+Lorem XXXXXXXXXXXXXXXXXXXX
+XXXXXXX ghi
+qwe rty uiop
+-- Events
+vj^eerX \ No newline at end of file
diff --git a/src/tests/vimtests/visual/switchcase_0.test b/src/tests/vimtests/visual/switchcase_0.test
new file mode 100644
index 0000000..e564d80
--- /dev/null
+++ b/src/tests/vimtests/visual/switchcase_0.test
@@ -0,0 +1,8 @@
+-- Input
+(1,1)
+foobar
+-- Output
+(1,2)
+fOOBar
+-- Events
+lv2l~ \ No newline at end of file
diff --git a/src/tests/vimtests/visual/switchcase_1.test b/src/tests/vimtests/visual/switchcase_1.test
new file mode 100644
index 0000000..48532ef
--- /dev/null
+++ b/src/tests/vimtests/visual/switchcase_1.test
@@ -0,0 +1,8 @@
+-- Input
+(1,1)
+FooBar
+-- Output
+(1,1)
+fOObAR
+-- Events
+V~ \ No newline at end of file
diff --git a/src/tests/vimtests/visual/u_0.test b/src/tests/vimtests/visual/u_0.test
new file mode 100644
index 0000000..3097342
--- /dev/null
+++ b/src/tests/vimtests/visual/u_0.test
@@ -0,0 +1,8 @@
+-- Input
+(1,1)
+TEST
+-- Output
+(1,1)
+test
+-- Events
+Vgu \ No newline at end of file
diff --git a/src/tests/vimtests/visual/u_1.test b/src/tests/vimtests/visual/u_1.test
new file mode 100644
index 0000000..d92297d
--- /dev/null
+++ b/src/tests/vimtests/visual/u_1.test
@@ -0,0 +1,8 @@
+-- Input
+(1,1)
+TeSt
+-- Output
+(1,1)
+teSt
+-- Events
+vlgu \ No newline at end of file
diff --git a/src/tests/vimtests/visual/vlllx.test b/src/tests/vimtests/visual/vlllx.test
new file mode 100644
index 0000000..957fb90
--- /dev/null
+++ b/src/tests/vimtests/visual/vlllx.test
@@ -0,0 +1,8 @@
+-- Input
+(1,1)
+foobar
+-- Output
+(1,1)
+ar
+-- Events
+vlllx \ No newline at end of file
diff --git a/src/tests/vimtests/visual/vx.test b/src/tests/vimtests/visual/vx.test
new file mode 100644
index 0000000..11edc5c
--- /dev/null
+++ b/src/tests/vimtests/visual/vx.test
@@ -0,0 +1,12 @@
+-- Input
+(2,2)
+Lorem ipsum dolor sit amet
+abc def ghi
+qwe rty uiop
+-- Output
+(2,2)
+Lorem ipsum dolor sit amet
+ac def ghi
+qwe rty uiop
+-- Events
+vx \ No newline at end of file
diff --git a/src/tests/vimtests/visual/y_0.test b/src/tests/vimtests/visual/y_0.test
new file mode 100644
index 0000000..b228234
--- /dev/null
+++ b/src/tests/vimtests/visual/y_0.test
@@ -0,0 +1,10 @@
+-- Input
+(1,1)
+foobar
+-- Output
+(3,1)
+foobar
+foobar
+foobar
+-- Events
+Vypp \ No newline at end of file
diff --git a/src/tests/vimtests/visual/y_1.test b/src/tests/vimtests/visual/y_1.test
new file mode 100644
index 0000000..51d64af
--- /dev/null
+++ b/src/tests/vimtests/visual/y_1.test
@@ -0,0 +1,11 @@
+-- Input
+(1,1)
+foo
+bar
+-- Output
+(1,3)
+fooo
+baro
+bar
+-- Events
+lvjlyp \ No newline at end of file
diff --git a/src/tests/vimtests/visual/y_2.test b/src/tests/vimtests/visual/y_2.test
new file mode 100644
index 0000000..961a394
--- /dev/null
+++ b/src/tests/vimtests/visual/y_2.test
@@ -0,0 +1,10 @@
+-- Input
+(1,1)
+foo
+bar
+-- Output
+(2,1)
+foo
+bar
+-- Events
+Vjlllypddxxxdd \ No newline at end of file
diff --git a/src/tests/vimtests/visual/y_3.test b/src/tests/vimtests/visual/y_3.test
new file mode 100644
index 0000000..d99ba4e
--- /dev/null
+++ b/src/tests/vimtests/visual/y_3.test
@@ -0,0 +1,12 @@
+-- Input
+(1,1)
+foo
+bar
+-- Output
+(2,1)
+foo
+foo
+bar
+bar
+-- Events
+Vjlllyp \ No newline at end of file
diff --git a/src/tests/vimtests/visual/y_5.test b/src/tests/vimtests/visual/y_5.test
new file mode 100644
index 0000000..9b0e736
--- /dev/null
+++ b/src/tests/vimtests/visual/y_5.test
@@ -0,0 +1,11 @@
+-- Input
+(1,1)
+foo
+bar
+-- Output
+(1,3)
+foo
+bar
+bar
+-- Events
+llvjypx \ No newline at end of file
diff --git a/src/tests/vimtests/visual/y_6.test b/src/tests/vimtests/visual/y_6.test
new file mode 100644
index 0000000..196f6bd
--- /dev/null
+++ b/src/tests/vimtests/visual/y_6.test
@@ -0,0 +1,11 @@
+-- Input
+(1,1)
+foo
+bar
+-- Output
+(1,4)
+fooo
+bar
+bar
+-- Events
+llvjyp \ No newline at end of file
diff --git a/src/tests/vimtests/yank/yy.test b/src/tests/vimtests/yank/yy.test
new file mode 100644
index 0000000..ed9d58b
--- /dev/null
+++ b/src/tests/vimtests/yank/yy.test
@@ -0,0 +1,12 @@
+-- Input
+(2,2)
+foo
+bar
+baz
+-- Output
+(2,2)
+foo
+bar
+baz
+-- Events
+yy \ No newline at end of file
diff --git a/yi.cabal b/yi.cabal
index e8e1686..4142f4b 100644
--- a/yi.cabal
+++ b/yi.cabal
@@ -1,24 +1,79 @@
name: yi
-version: 0.10.0
+version: 0.10.1
category: Development, Editor
synopsis: The Haskell-Scriptable Editor
description:
Yi is a text editor written in Haskell and extensible in Haskell. The goal of the Yi project is
to provide a flexible, powerful, and correct editor for haskell hacking.
-license: GPL
+license: GPL-2
license-file: LICENSE
author: AUTHORS
maintainer: yi-devel@googlegroups.com
homepage: http://haskell.org/haskellwiki/Yi
bug-reports: https://github.com/yi-editor/yi/issues
Cabal-Version: >= 1.10
-tested-with: GHC==7.6.3
+tested-with: GHC==7.8.3
build-type: Simple
data-files:
art/*.png
art/*.pdf
example-configs/*.hs
+extra-source-files:
+ src/tests/vimtests/find/*.test
+ src/tests/vimtests/repeat/*.test
+ src/tests/vimtests/ex/*.test
+ src/tests/vimtests/ex/s/*.test
+ src/tests/vimtests/ex/d/*.test
+ src/tests/vimtests/ex/gotoline/*.test
+ src/tests/vimtests/ex/g/*.test
+ src/tests/vimtests/jumplist/*.test
+ src/tests/vimtests/README.rst
+ src/tests/vimtests/undo/*.test
+ src/tests/vimtests/searchword/*.test
+ src/tests/vimtests/blockvisual/*.test
+ src/tests/vimtests/delete/*.test
+ src/tests/vimtests/paste/*.test
+ src/tests/vimtests/insertion/*.test
+ src/tests/vimtests/insertion/cursorkeys/*.test
+ src/tests/vimtests/search/*.test
+ src/tests/vimtests/visual/*.test
+ src/tests/vimtests/indent/*.test
+ src/tests/vimtests/unicode/*.test
+ src/tests/vimtests/joinlines/*.test
+ src/tests/vimtests/replace/*.test
+ src/tests/vimtests/change/*.test
+ src/tests/vimtests/digraphs/*.test
+ src/tests/vimtests/unsorted/*.test
+ src/tests/vimtests/marks/*.test
+ src/tests/vimtests/numbers/*.test
+ src/tests/vimtests/yank/*.test
+ src/tests/vimtests/switchcase/*.test
+ src/tests/vimtests/empty/*.test
+ src/tests/vimtests/empty/emptytest/input
+ src/tests/vimtests/empty/emptytest/output
+ src/tests/vimtests/empty/emptytest/events
+ src/tests/vimtests/macros/*.test
+ src/tests/vimtests/movement/*.test
+ src/tests/vimtests/movement/word/*.test
+ src/tests/vimtests/movement/bigWord/*.test
+ src/tests/vimtests/movement/char/*.test
+ src/tests/vimtests/movement/char/l_at_eol/input
+ src/tests/vimtests/movement/char/l_at_eol/output
+ src/tests/vimtests/movement/char/l_at_eol/events
+ src/tests/vimtests/movement/char/j/input
+ src/tests/vimtests/movement/char/j/output
+ src/tests/vimtests/movement/char/j/events
+ src/tests/vimtests/movement/char/h_at_bol/input
+ src/tests/vimtests/movement/char/h_at_bol/output
+ src/tests/vimtests/movement/char/h_at_bol/events
+ src/tests/vimtests/movement/char/hl/input
+ src/tests/vimtests/movement/char/hl/output
+ src/tests/vimtests/movement/char/hl/events
+ src/tests/vimtests/movement/cursorkeys/*.test
+ src/tests/vimtests/movement/file/*.test
+ src/tests/vimtests/movement/intraline/*.test
+
source-repository head
type: git
location: https://github.com/yi-editor/yi.git
@@ -26,11 +81,11 @@ source-repository head
-- Frontends
flag pango
Default: False
- Description: "Build with Pango frontend"
+ Description: Build with Pango frontend
flag vty
Default: True
- Description: "Build with Vty frontend"
+ Description: Build with Vty frontend
flag profiling
Default: False
@@ -314,6 +369,14 @@ Test-Suite test-suite
hs-source-dirs: src/tests
type: exitcode-stdio-1.0
main-is: TestSuite.hs
+ other-modules:
+ Driver
+ Generic.TestPureBufferManipulations
+ Generic.TestUtils
+ Vim.EditorManipulations.BufferExCommand
+ Vim.TestExCommandParsers
+ Vim.TestPureBufferManipulations
+ Vim.TestPureEditorManipulations
build-depends:
base,
lens >= 4.4.0.1,