aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/nvim/testdir/Makefile2
-rw-r--r--src/nvim/testdir/test94.in94
-rw-r--r--src/nvim/testdir/test94.ok20
-rw-r--r--test/functional/legacy/094_visual_mode_operators_spec.lua153
4 files changed, 154 insertions, 115 deletions
diff --git a/src/nvim/testdir/Makefile b/src/nvim/testdir/Makefile
index 8e0f853446..70e6f8ee4c 100644
--- a/src/nvim/testdir/Makefile
+++ b/src/nvim/testdir/Makefile
@@ -27,7 +27,7 @@ SCRIPTS := test_autoformat_join.out \
test76.out test78.out test79.out test80.out \
test82.out test83.out test85.out \
test86.out test87.out test88.out \
- test92.out test93.out test94.out \
+ test92.out test93.out \
test96.out test99.out \
test_listlbr.out \
test_breakindent.out
diff --git a/src/nvim/testdir/test94.in b/src/nvim/testdir/test94.in
deleted file mode 100644
index a8b46112d2..0000000000
--- a/src/nvim/testdir/test94.in
+++ /dev/null
@@ -1,94 +0,0 @@
-Test for Visual mode and operators
-
-Tests for the two kinds of operations: Those executed with Visual mode
-followed by an operator and those executed via Operator-pending mode. Also
-part of the test are mappings, counts, and repetition with the . command.
-
-Test cases:
-- Visual modes (v V CTRL-V) followed by an operator; count; repeating
-- Visual mode maps; count; repeating
- - Simple
- - With an Ex command (custom text object)
-- Operator-pending mode maps
- - Simple
- - With Ex command moving the cursor
- - With Ex command and Visual selection (custom text object)
-- Patch 7.3.879: Properly abort Ex command in Operator-pending mode
-
-STARTTEST
-:so small.vim
-:
-:" User functions
-:function MoveToCap()
-: call search('\u', 'W')
-:endfunction
-:function SelectInCaps()
-: let [line1, col1] = searchpos('\u', 'bcnW')
-: let [line2, col2] = searchpos('.\u', 'nW')
-: call setpos("'<", [0, line1, col1, 0])
-: call setpos("'>", [0, line2, col2, 0])
-: normal! gv
-:endfunction
-:
-:" Visual modes followed by operator
-/^apple
-lvld.l3vd.:
-/^line 1
-Vcnewlinej.j2Vd.:
-/^xxxx
-jlc l.l2c----l.:
-:
-:" Visual mode maps (movement and text object)
-:vnoremap W /\u/s-1<CR>
-:vnoremap iW :<C-U>call SelectInCaps()<CR>
-/^Kiwi
-vWcNol.fD2vd.:
-/^Jambu
-llviWc-l.l2vdl.:
-:
-:" Operator-pending mode maps (movement and text object)
-:onoremap W /\u/<CR>
-:onoremap <Leader>W :<C-U>call MoveToCap()<CR>
-:onoremap iW :<C-U>call SelectInCaps()<CR>
-/^Pineapple
-cW-l.l2.l.:
-/^Juniper
-g?\WfD.:
-/^Lemon
-yiWPlciWNewfr.:
-:
-:" Patch 7.3.879: Properly abort Operator-pending mode for "dv:<Esc>" etc.
-/^zzzz
-dV: dv: :set noma | let v:errmsg = ''
-d: :set ma | put = v:errmsg =~# '^E21' ? 'ok' : 'failed'
-dv:dV::set noma | let v:errmsg = ''
-d::set ma | put = v:errmsg =~# '^E21' ? 'failed' : 'ok'
-:/^start:/+2,$w! test.out
-:q!
-ENDTEST
-
-start:
-
-apple banana cherry
-
-line 1 line 1
-line 2 line 2
-line 3 line 3
-line 4 line 4
-line 5 line 5
-line 6 line 6
-
-xxxxxxxxxxxxx
-xxxxxxxxxxxxx
-xxxxxxxxxxxxx
-xxxxxxxxxxxxx
-
-KiwiRaspberryDateWatermelonPeach
-JambuRambutanBananaTangerineMango
-
-PineappleQuinceLoganberryOrangeGrapefruitKiwiZ
-JuniperDurianZ
-LemonNectarineZ
-
-zzzz
-zzzz
diff --git a/src/nvim/testdir/test94.ok b/src/nvim/testdir/test94.ok
deleted file mode 100644
index 3996f2a3a4..0000000000
--- a/src/nvim/testdir/test94.ok
+++ /dev/null
@@ -1,20 +0,0 @@
-a y
-
-newline
-newline
-
- --------x
- --------x
-xxxx--------x
-xxxx--------x
-
-NoNoberryach
---ago
-
-----Z
-WhavcreQhevnaZ
-LemonNewNewZ
-
-zzz
-ok
-ok
diff --git a/test/functional/legacy/094_visual_mode_operators_spec.lua b/test/functional/legacy/094_visual_mode_operators_spec.lua
new file mode 100644
index 0000000000..c4aebe4ecc
--- /dev/null
+++ b/test/functional/legacy/094_visual_mode_operators_spec.lua
@@ -0,0 +1,153 @@
+-- Test for Visual mode and operators.
+--
+-- Tests for the two kinds of operations: Those executed with Visual mode
+-- followed by an operator and those executed via Operator-pending mode. Also
+-- part of the test are mappings, counts, and repetition with the . command.
+
+local helpers = require('test.functional.helpers')
+local feed, insert, source = helpers.feed, helpers.insert, helpers.source
+local clear, execute, expect = helpers.clear, helpers.execute, helpers.expect
+
+-- Vim script user functions needed for some of the test cases.
+local function source_user_functions()
+ source([[
+ function MoveToCap()
+ call search('\u', 'W')
+ endfunction
+ function SelectInCaps()
+ let [line1, col1] = searchpos('\u', 'bcnW')
+ let [line2, col2] = searchpos('.\u', 'nW')
+ call setpos("'<", [0, line1, col1, 0])
+ call setpos("'>", [0, line2, col2, 0])
+ normal! gv
+ endfunction
+ ]])
+end
+
+describe('Visual mode and operator', function()
+ before_each(function()
+ clear()
+ source_user_functions()
+ end)
+
+ it('simple change in Visual mode', function()
+ insert([[
+ apple banana cherry
+
+ line 1 line 1
+ line 2 line 2
+ line 3 line 3
+ line 4 line 4
+ line 5 line 5
+ line 6 line 6
+
+ xxxxxxxxxxxxx
+ xxxxxxxxxxxxx
+ xxxxxxxxxxxxx
+ xxxxxxxxxxxxx]])
+
+ -- Exercise characterwise Visual mode plus operator, with count and repeat.
+ execute('/^apple')
+ feed('lvld.l3vd.')
+
+ -- Same in linewise Visual mode.
+ execute('/^line 1')
+ feed('Vcnewline<esc>j.j2Vd.')
+
+ -- Same in blockwise Visual mode.
+ execute('/^xxxx')
+ feed('<c-v>jlc <esc>l.l2<c-v>c----<esc>l.')
+
+ -- Assert buffer contents.
+ expect([[
+ a y
+
+ newline
+ newline
+
+ --------x
+ --------x
+ xxxx--------x
+ xxxx--------x]])
+ end)
+
+ it('Visual mode mapping', function()
+ insert([[
+ KiwiRaspberryDateWatermelonPeach
+ JambuRambutanBananaTangerineMango]])
+
+ -- Set up Visual mode mappings.
+ execute('vnoremap W /\\u/s-1<CR>')
+ execute('vnoremap iW :<C-U>call SelectInCaps()<CR>')
+
+ -- Do a simple change using the simple vmap, also with count and repeat.
+ execute('/^Kiwi')
+ feed('vWcNo<esc>l.fD2vd.')
+
+ -- Same, using the vmap that maps to an Ex command.
+ execute('/^Jambu')
+ feed('llviWc-<esc>l.l2vdl.')
+
+ -- Assert buffer contents.
+ expect([[
+ NoNoberryach
+ --ago]])
+ end)
+
+ it('Operator-pending mode mapping', function()
+ insert([[
+ PineappleQuinceLoganberryOrangeGrapefruitKiwiZ
+ JuniperDurianZ
+ LemonNectarineZ]])
+
+ -- Set up Operator-pending mode mappings.
+ execute('onoremap W /\\u/<CR>')
+ execute('onoremap <Leader>W :<C-U>call MoveToCap()<CR>')
+ execute('onoremap iW :<C-U>call SelectInCaps()<CR>')
+
+ -- Do a simple change using the simple omap, also with count and repeat.
+ execute('/^Pineapple')
+ feed('cW-<esc>l.l2.l.')
+
+ -- Same, using the omap that maps to an Ex command to move the cursor.
+ execute('/^Juniper')
+ feed('g?\\WfD.')
+
+ -- Same, using the omap that uses Ex and Visual mode (custom text object).
+ execute('/^Lemon')
+ feed('yiWPlciWNew<esc>fr.')
+
+ -- Assert buffer contents.
+ expect([[
+ ----Z
+ WhavcreQhevnaZ
+ LemonNewNewZ]])
+ end)
+
+ -- Vim patch 7.3.879 addressed a bug where typing ":" (the start of an Ex
+ -- command) in Operator-pending mode couldn't be aborted with Escape, the
+ -- change operation implied by the operator was always executed.
+ it('patch 7.3.879', function()
+ insert([[
+ zzzz
+ zzzz]])
+
+ -- Start a change operation consisting of operator plus Ex command, like
+ -- "dV:..." etc., then either
+ -- - complete the operation by pressing Enter: as a result the buffer is
+ -- changed, taking into account the v/V/<c-v> modifier given; or
+ -- - abort the operation by pressing Escape: no change to the buffer is
+ -- carried out.
+ execute('/^zzzz')
+ feed([[dV:<cr>dv:<cr>:set noma | let v:errmsg = ''<cr>]])
+ feed([[d:<cr>:set ma | put = v:errmsg =~# '^E21' ? 'ok' : 'failed'<cr>]])
+ feed([[dv:<esc>dV:<esc>:set noma | let v:errmsg = ''<cr>]])
+ feed([[d:<esc>:set ma | put = v:errmsg =~# '^E21' ? 'failed' : 'ok'<cr>]])
+
+ -- Assert buffer contents.
+ expect([[
+ zzz
+ ok
+ ok]])
+ end)
+end)