File: //home/ubuntu/neovim/test/functional/legacy/069_multibyte_formatting_spec.lua
-- Test for multibyte text formatting.
-- Also test, that 'mps' with multibyte chars works.
-- And test "ra" on multibyte characters.
-- Also test byteidx() and byteidxcomp()
local t = require('test.testutil')
local n = require('test.functional.testnvim')()
local feed, insert, eq, eval, clear, feed_command, expect =
n.feed, n.insert, t.eq, n.eval, n.clear, n.feed_command, n.expect
describe('multibyte text', function()
before_each(clear)
it('formatting with "set fo=t"', function()
insert([[
{
XYZ
abc XYZ
}]])
feed_command('/^{/+1')
feed_command('set tw=2 fo=t')
feed('gqgqjgqgqo<cr>')
feed('XYZ<cr>')
feed('abc XYZ<esc><esc>')
expect([[
{
XYZ
abc
XYZ
XYZ
abc
XYZ
}]])
end)
it('formatting with "set fo=tm"', function()
insert([[
{
X
Xa
X a
XY
X Y
}]])
feed_command('/^{/+1')
feed_command('set tw=1 fo=tm')
feed('gqgqjgqgqjgqgqjgqgqjgqgqo<cr>')
feed('X<cr>')
feed('Xa<cr>')
feed('X a<cr>')
feed('XY<cr>')
feed('X Y<esc><esc>')
expect([[
{
X
X
a
X
a
X
Y
X
Y
X
X
a
X
a
X
Y
X
Y
}]])
end)
it('formatting with "set fo=tm" (part 2)', function()
insert([[
{
X
Xa
X a
XY
X Y
aX
abX
abcX
abX c
abXY
}]])
feed_command('/^{/+1')
feed_command('set tw=2 fo=tm')
feed('gqgqjgqgqjgqgqjgqgqjgqgqjgqgqjgqgqjgqgqjgqgqjgqgqo<cr>')
feed('X<cr>')
feed('Xa<cr>')
feed('X a<cr>')
feed('XY<cr>')
feed('X Y<cr>')
feed('aX<cr>')
feed('abX<cr>')
feed('abcX<cr>')
feed('abX c<cr>')
feed('abXY<esc><esc>')
expect([[
{
X
X
a
X
a
X
Y
X
Y
a
X
ab
X
abc
X
ab
X
c
ab
X
Y
X
X
a
X
a
X
Y
X
Y
a
X
ab
X
abc
X
ab
X
c
ab
X
Y
}]])
end)
it('formatting with "set ai fo=tm"', function()
insert([[
{
X
Xa
}]])
feed_command('/^{/+1')
feed_command('set ai tw=2 fo=tm')
feed('gqgqjgqgqo<cr>')
feed('X<cr>')
feed('Xa<esc>')
expect([[
{
X
X
a
X
X
a
}]])
end)
it('formatting with "set ai fo=tm" (part 2)', function()
insert([[
{
X
Xa
}]])
feed_command('/^{/+1')
feed_command('set noai tw=2 fo=tm')
feed('gqgqjgqgqo<cr>')
-- Literal spaces will be trimmed from the by feed().
feed('<space><space>X<cr>')
feed('<space><space>Xa<esc>')
expect([[
{
X
X
a
X
X
a
}]])
end)
it('formatting with "set fo=cqm" and multibyte comments', function()
insert([[
{
X
Xa
XaY
XY
XYZ
X Y
X YZ
XX
XXa
XXY
}]])
feed_command('/^{/+1')
feed_command('set tw=2 fo=cqm comments=n:X')
feed('gqgqjgqgqjgqgqjgqgqjgqgqjgqgqjgqgqjgqgqjgqgqjgqgqo<cr>')
feed('X<cr>')
feed('Xa<cr>')
feed('XaY<cr>')
feed('XY<cr>')
feed('XYZ<cr>')
feed('X Y<cr>')
feed('X YZ<cr>')
feed('XX<cr>')
feed('XXa<cr>')
feed('XXY<esc><esc>')
expect([[
{
X
Xa
Xa
XY
XY
XY
XZ
X Y
X Y
X Z
XX
XXa
XXY
X
Xa
Xa
XY
XY
XY
XZ
X Y
X Y
X Z
XX
XXa
XXY
}]])
end)
it('formatting in replace mode', function()
insert([[
{
}]])
feed_command('/^{/+1')
feed_command('set tw=2 fo=tm')
feed('RXa<esc>')
expect([[
{
X
a
}]])
end)
it("as values of 'mps'", function()
insert([[
{
‘ two three ’ four
}]])
feed_command('/^{/+1')
feed_command('set mps+=‘:’')
feed('d%<cr>')
expect([[
{
four
}]])
end)
it('can be replaced with r', function()
insert([[
abba
aab]])
feed('gg0Vjra<cr>')
expect([[
aaaa
aaa]])
end)
it("doesn't interfere with 'whichwrap'", function()
insert([[
á
x]])
feed_command('set whichwrap+=h')
feed_command('/^x')
feed('dh')
expect([[
áx]])
end)
it('can be queried with byteidx() and byteidxcomp()', function()
-- One char of two bytes.
feed_command("let a = '.é.'")
-- Normal e with composing char.
feed_command("let b = '.é.'")
eq(0, eval('byteidx(a, 0)'))
eq(1, eval('byteidx(a, 1)'))
eq(3, eval('byteidx(a, 2)'))
eq(4, eval('byteidx(a, 3)'))
eq(-1, eval('byteidx(a, 4)'))
eq(0, eval('byteidx(b, 0)'))
eq(1, eval('byteidx(b, 1)'))
eq(4, eval('byteidx(b, 2)'))
eq(5, eval('byteidx(b, 3)'))
eq(-1, eval('byteidx(b, 4)'))
eq(0, eval('byteidxcomp(a, 0)'))
eq(1, eval('byteidxcomp(a, 1)'))
eq(3, eval('byteidxcomp(a, 2)'))
eq(4, eval('byteidxcomp(a, 3)'))
eq(-1, eval('byteidxcomp(a, 4)'))
eq(0, eval('byteidxcomp(b, 0)'))
eq(1, eval('byteidxcomp(b, 1)'))
eq(2, eval('byteidxcomp(b, 2)'))
eq(4, eval('byteidxcomp(b, 3)'))
eq(5, eval('byteidxcomp(b, 4)'))
eq(-1, eval('byteidxcomp(b, 5)'))
end)
it('correctly interact with the \zs pattern', function()
eq('a1a2a3a', eval([[substitute('123', '\zs', 'a', 'g')]]))
end)
end)