-- 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 helpers = require('test.functional.helpers')(after_each) local feed, insert, eq, eval, clear, feed_command, expect = helpers.feed, helpers.insert, helpers.eq, helpers.eval, helpers.clear, helpers.feed_command, helpers.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') feed('XYZ') feed('abc XYZ') 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') feed('X') feed('Xa') feed('X a') feed('XY') feed('X Y') 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') feed('X') feed('Xa') feed('X a') feed('XY') feed('X Y') feed('aX') feed('abX') feed('abcX') feed('abX c') feed('abXY') 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') feed('X') feed('Xa') 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') -- Literal spaces will be trimmed from the by feed(). feed('') feed('Xa') 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') feed('X') feed('Xa') feed('XaY') feed('XY') feed('XYZ') feed('X Y') feed('X YZ') feed('XX') feed('XXa') feed('XXY') 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') expect([[ { X a }]]) end) it("as values of 'mps'", function() insert([[ { ‘ two three ’ four }]]) feed_command('/^{/+1') feed_command('set mps+=‘:’') feed('d%') expect([[ { four }]]) end) it('can be replaced with r', function() insert([[ abba aab]]) feed('gg0Vjra') 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)