neovim

Neovim text editor
git clone https://git.dasho.dev/neovim.git
Log | Files | Refs | README

036_regexp_character_classes_spec.lua (8269B)


      1 -- Test character classes in regexp using regexpengine 0, 1, 2.
      2 
      3 local t = require('test.testutil')
      4 local n = require('test.functional.testnvim')()
      5 
      6 local clear, command, expect = n.clear, n.command, n.expect
      7 local source, write_file = n.source, t.write_file
      8 
      9 --- @return string
     10 local function sixlines(text)
     11  local result = ''
     12  for _ = 1, 6 do
     13    result = result .. text .. '\n'
     14  end
     15  return result
     16 end
     17 
     18 local function diff(text, nodedent)
     19  local fname = t.tmpname()
     20  finally(function()
     21    os.remove(fname)
     22  end)
     23  command('w! ' .. fname)
     24  n.poke_eventloop()
     25  local data = io.open(fname):read('*all')
     26  if nodedent then
     27    t.eq(text, data)
     28  else
     29    t.eq(t.dedent(text), data)
     30  end
     31 end
     32 
     33 describe('character classes in regexp', function()
     34  local ctrl1 = '\t\012\r'
     35  local punct1 = " !\"#$%&'()#+'-./"
     36  local digits = '0123456789'
     37  local punct2 = ':;<=>?@'
     38  local upper = 'ABCDEFGHIXYZ'
     39  local punct3 = '[\\]^_`'
     40  local lower = 'abcdefghiwxyz'
     41  local punct4 = '{|}~'
     42  local ctrl2 = '\127\128\130\144\155'
     43  local iso_text = '\166\177\188\199\211\233' -- "¦±¼ÇÓé" in utf-8
     44  local function do_setup(no_dedent)
     45    -- The original test32.in file was not in utf-8 encoding and did also
     46    -- contain some control characters.  We use lua escape sequences to write
     47    -- them to the test file.
     48    local line = ctrl1
     49      .. punct1
     50      .. digits
     51      .. punct2
     52      .. upper
     53      .. punct3
     54      .. lower
     55      .. punct4
     56      .. ctrl2
     57      .. iso_text
     58    write_file('test36.in', sixlines(line), no_dedent)
     59  end
     60  setup(do_setup)
     61  before_each(function()
     62    clear()
     63    command('e test36.in')
     64  end)
     65  teardown(function()
     66    os.remove('test36.in')
     67  end)
     68 
     69  it('is working', function()
     70    source([[
     71      1 s/\%#=0\d//g
     72      2 s/\%#=1\d//g
     73      3 s/\%#=2\d//g
     74      4 s/\%#=0[0-9]//g
     75      5 s/\%#=1[0-9]//g
     76      6 s/\%#=2[0-9]//g]])
     77    diff(
     78      sixlines(ctrl1 .. punct1 .. punct2 .. upper .. punct3 .. lower .. punct4 .. ctrl2 .. iso_text)
     79    )
     80  end)
     81  it('is working', function()
     82    source([[
     83      1 s/\%#=0\D//g
     84      2 s/\%#=1\D//g
     85      3 s/\%#=2\D//g
     86      4 s/\%#=0[^0-9]//g
     87      5 s/\%#=1[^0-9]//g
     88      6 s/\%#=2[^0-9]//g]])
     89    expect([[
     90      0123456789
     91      0123456789
     92      0123456789
     93      0123456789
     94      0123456789
     95      0123456789]])
     96  end)
     97  it('is working', function()
     98    source([[
     99      1 s/\%#=0\o//g
    100      2 s/\%#=1\o//g
    101      3 s/\%#=2\o//g
    102      4 s/\%#=0[0-7]//g
    103      5 s/\%#=1[0-7]//g
    104      6 s/\%#=2[0-7]//g]])
    105    diff(
    106      sixlines(
    107        ctrl1 .. punct1 .. '89' .. punct2 .. upper .. punct3 .. lower .. punct4 .. ctrl2 .. iso_text
    108      )
    109    )
    110  end)
    111  it('is working', function()
    112    source([[
    113      1 s/\%#=0\O//g
    114      2 s/\%#=1\O//g
    115      3 s/\%#=2\O//g
    116      4 s/\%#=0[^0-7]//g
    117      5 s/\%#=1[^0-7]//g
    118      6 s/\%#=2[^0-7]//g]])
    119    expect([[
    120      01234567
    121      01234567
    122      01234567
    123      01234567
    124      01234567
    125      01234567]])
    126  end)
    127  it('is working', function()
    128    source([[
    129      1 s/\%#=0\x//g
    130      2 s/\%#=1\x//g
    131      3 s/\%#=2\x//g
    132      4 s/\%#=0[0-9A-Fa-f]//g
    133      5 s/\%#=1[0-9A-Fa-f]//g
    134      6 s/\%#=2[0-9A-Fa-f]//g]])
    135    diff(
    136      sixlines(
    137        ctrl1 .. punct1 .. punct2 .. 'GHIXYZ' .. punct3 .. 'ghiwxyz' .. punct4 .. ctrl2 .. iso_text
    138      )
    139    )
    140  end)
    141  it('is working', function()
    142    source([[
    143      1 s/\%#=0\X//g
    144      2 s/\%#=1\X//g
    145      3 s/\%#=2\X//g
    146      4 s/\%#=0[^0-9A-Fa-f]//g
    147      5 s/\%#=1[^0-9A-Fa-f]//g
    148      6 s/\%#=2[^0-9A-Fa-f]//g]])
    149    expect([[
    150      0123456789ABCDEFabcdef
    151      0123456789ABCDEFabcdef
    152      0123456789ABCDEFabcdef
    153      0123456789ABCDEFabcdef
    154      0123456789ABCDEFabcdef
    155      0123456789ABCDEFabcdef]])
    156  end)
    157  it('is working', function()
    158    source([[
    159      1 s/\%#=0\w//g
    160      2 s/\%#=1\w//g
    161      3 s/\%#=2\w//g
    162      4 s/\%#=0[0-9A-Za-z_]//g
    163      5 s/\%#=1[0-9A-Za-z_]//g
    164      6 s/\%#=2[0-9A-Za-z_]//g]])
    165    diff(sixlines(ctrl1 .. punct1 .. punct2 .. '[\\]^`' .. punct4 .. ctrl2 .. iso_text))
    166  end)
    167  it('is working', function()
    168    source([[
    169      1 s/\%#=0\W//g
    170      2 s/\%#=1\W//g
    171      3 s/\%#=2\W//g
    172      4 s/\%#=0[^0-9A-Za-z_]//g
    173      5 s/\%#=1[^0-9A-Za-z_]//g
    174      6 s/\%#=2[^0-9A-Za-z_]//g]])
    175    expect([[
    176      0123456789ABCDEFGHIXYZ_abcdefghiwxyz
    177      0123456789ABCDEFGHIXYZ_abcdefghiwxyz
    178      0123456789ABCDEFGHIXYZ_abcdefghiwxyz
    179      0123456789ABCDEFGHIXYZ_abcdefghiwxyz
    180      0123456789ABCDEFGHIXYZ_abcdefghiwxyz
    181      0123456789ABCDEFGHIXYZ_abcdefghiwxyz]])
    182  end)
    183  it('is working', function()
    184    source([[
    185      1 s/\%#=0\h//g
    186      2 s/\%#=1\h//g
    187      3 s/\%#=2\h//g
    188      4 s/\%#=0[A-Za-z_]//g
    189      5 s/\%#=1[A-Za-z_]//g
    190      6 s/\%#=2[A-Za-z_]//g]])
    191    diff(sixlines(ctrl1 .. punct1 .. digits .. punct2 .. '[\\]^`' .. punct4 .. ctrl2 .. iso_text))
    192  end)
    193  it('is working', function()
    194    source([[
    195      1 s/\%#=0\H//g
    196      2 s/\%#=1\H//g
    197      3 s/\%#=2\H//g
    198      4 s/\%#=0[^A-Za-z_]//g
    199      5 s/\%#=1[^A-Za-z_]//g
    200      6 s/\%#=2[^A-Za-z_]//g]])
    201    expect([[
    202      ABCDEFGHIXYZ_abcdefghiwxyz
    203      ABCDEFGHIXYZ_abcdefghiwxyz
    204      ABCDEFGHIXYZ_abcdefghiwxyz
    205      ABCDEFGHIXYZ_abcdefghiwxyz
    206      ABCDEFGHIXYZ_abcdefghiwxyz
    207      ABCDEFGHIXYZ_abcdefghiwxyz]])
    208  end)
    209  it('is working', function()
    210    source([[
    211      1 s/\%#=0\a//g
    212      2 s/\%#=1\a//g
    213      3 s/\%#=2\a//g
    214      4 s/\%#=0[A-Za-z]//g
    215      5 s/\%#=1[A-Za-z]//g
    216      6 s/\%#=2[A-Za-z]//g]])
    217    diff(sixlines(ctrl1 .. punct1 .. digits .. punct2 .. punct3 .. punct4 .. ctrl2 .. iso_text))
    218  end)
    219  it('is working', function()
    220    source([[
    221      1 s/\%#=0\A//g
    222      2 s/\%#=1\A//g
    223      3 s/\%#=2\A//g
    224      4 s/\%#=0[^A-Za-z]//g
    225      5 s/\%#=1[^A-Za-z]//g
    226      6 s/\%#=2[^A-Za-z]//g]])
    227    expect([[
    228      ABCDEFGHIXYZabcdefghiwxyz
    229      ABCDEFGHIXYZabcdefghiwxyz
    230      ABCDEFGHIXYZabcdefghiwxyz
    231      ABCDEFGHIXYZabcdefghiwxyz
    232      ABCDEFGHIXYZabcdefghiwxyz
    233      ABCDEFGHIXYZabcdefghiwxyz]])
    234  end)
    235  it('is working', function()
    236    source([[
    237      1 s/\%#=0\l//g
    238      2 s/\%#=1\l//g
    239      3 s/\%#=2\l//g
    240      4 s/\%#=0[a-z]//g
    241      5 s/\%#=1[a-z]//g
    242      6 s/\%#=2[a-z]//g]])
    243    diff(
    244      sixlines(
    245        ctrl1 .. punct1 .. digits .. punct2 .. upper .. punct3 .. punct4 .. ctrl2 .. iso_text
    246      )
    247    )
    248  end)
    249  it('is working', function()
    250    source([[
    251      1 s/\%#=0\L//g
    252      2 s/\%#=1\L//g
    253      3 s/\%#=2\L//g
    254      4 s/\%#=0[^a-z]//g
    255      5 s/\%#=1[^a-z]//g
    256      6 s/\%#=2[^a-z]//g]])
    257    expect([[
    258      abcdefghiwxyz
    259      abcdefghiwxyz
    260      abcdefghiwxyz
    261      abcdefghiwxyz
    262      abcdefghiwxyz
    263      abcdefghiwxyz]])
    264  end)
    265  it('is working', function()
    266    source([[
    267      1 s/\%#=0\u//g
    268      2 s/\%#=1\u//g
    269      3 s/\%#=2\u//g
    270      4 s/\%#=0[A-Z]//g
    271      5 s/\%#=1[A-Z]//g
    272      6 s/\%#=2[A-Z]//g]])
    273    diff(
    274      sixlines(
    275        ctrl1 .. punct1 .. digits .. punct2 .. punct3 .. lower .. punct4 .. ctrl2 .. iso_text
    276      )
    277    )
    278  end)
    279  it('is working', function()
    280    source([[
    281      1 s/\%#=0\U//g
    282      2 s/\%#=1\U//g
    283      3 s/\%#=2\U//g
    284      4 s/\%#=0[^A-Z]//g
    285      5 s/\%#=1[^A-Z]//g
    286      6 s/\%#=2[^A-Z]//g]])
    287    expect([[
    288      ABCDEFGHIXYZ
    289      ABCDEFGHIXYZ
    290      ABCDEFGHIXYZ
    291      ABCDEFGHIXYZ
    292      ABCDEFGHIXYZ
    293      ABCDEFGHIXYZ]])
    294  end)
    295  pending(
    296    [["\%1l^#.*" does not match on a line starting with "#". (vim-patch:7.4.1305)]],
    297    function()
    298      -- do_setup(true)
    299      source([[
    300      1 s/\%#=0\%1l^\t...//g
    301      2 s/\%#=1\%2l^\t...//g
    302      3 s/\%#=2\%3l^\t...//g
    303      4 s/\%#=0\%4l^\t...//g
    304      5 s/\%#=1\%5l^\t...//g
    305      6 s/\%#=2\%6l^\t...//g]])
    306      local text = sixlines(
    307        string.sub(punct1, 1)
    308          .. digits
    309          .. punct2
    310          .. upper
    311          .. punct3
    312          .. lower
    313          .. punct4
    314          .. ctrl2
    315          .. iso_text
    316      )
    317      diff(text)
    318    end
    319  )
    320  it('does not convert character class ranges to an incorrect class', function()
    321    source([[
    322      1 s/\%#=0[0-z]//g
    323      2 s/\%#=1[0-z]//g
    324      3 s/\%#=2[0-z]//g
    325      4 s/\%#=0[^0-z]//g
    326      5 s/\%#=1[^0-z]//g
    327      6 s/\%#=2[^0-z]//g
    328    ]])
    329    local text = string.rep(ctrl1 .. punct1 .. punct4 .. ctrl2 .. iso_text .. '\n', 3)
    330      .. string.rep(digits .. punct2 .. upper .. punct3 .. lower .. '\n', 3)
    331    text = text:gsub('\t', ''):gsub('\n\t', '\n')
    332    diff(text)
    333  end)
    334 end)