neovim

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

menu_spec.lua (16190B)


      1 local t = require('test.testutil')
      2 local n = require('test.functional.testnvim')()
      3 
      4 local clear, command = n.clear, n.command
      5 local expect, feed = n.expect, n.feed
      6 local eq, eval = t.eq, n.eval
      7 local fn = n.fn
      8 
      9 describe(':emenu', function()
     10  before_each(function()
     11    clear()
     12    command('nnoremenu Test.Test inormal<ESC>')
     13    command('inoremenu Test.Test insert')
     14    command('vnoremenu Test.Test x')
     15    command('cnoremenu Test.Test cmdmode')
     16 
     17    command('nnoremenu Edit.Paste p')
     18    command('cnoremenu Edit.Paste <C-R>"')
     19  end)
     20 
     21  it('executes correct bindings in normal mode without using API', function()
     22    command('emenu Test.Test')
     23    expect('normal')
     24  end)
     25 
     26  it('executes correct bindings in normal mode', function()
     27    command('emenu Test.Test')
     28    expect('normal')
     29  end)
     30 
     31  it('executes correct bindings in insert mode', function()
     32    feed('i')
     33    command('emenu Test.Test')
     34    expect('insert')
     35  end)
     36 
     37  it('executes correct bindings in visual mode', function()
     38    feed('iabcde<ESC>0lvll')
     39    command('emenu Test.Test')
     40    expect('ae')
     41  end)
     42 
     43  it('executes correct bindings in command mode', function()
     44    feed('ithis is a sentence<esc>^yiwo<esc>')
     45 
     46    -- Invoke "Edit.Paste" in normal-mode.
     47    command('emenu Edit.Paste')
     48 
     49    -- Invoke "Edit.Paste" and "Test.Test" in command-mode.
     50    feed(':')
     51    command('emenu Edit.Paste')
     52    command('emenu Test.Test')
     53 
     54    expect([[
     55        this is a sentence
     56        this]])
     57    -- Assert that Edit.Paste pasted @" into the commandline.
     58    eq('thiscmdmode', eval('getcmdline()'))
     59  end)
     60 end)
     61 
     62 local test_menus_cmd = [=[
     63  aunmenu *
     64 
     65  nnoremenu &Test.Test inormal<ESC>
     66  inoremenu Test.Test insert
     67  vnoremenu Test.Test x
     68  cnoremenu Test.Test cmdmode
     69  menu Test.Nested.test level1
     70  menu Test.Nested.Nested2 level2
     71 
     72  nnoremenu <script> Export.Script p
     73  tmenu Export.Script This is the tooltip
     74  menu ]Export.hidden thisoneshouldbehidden
     75 
     76  nnoremenu Edit.Paste p
     77  cnoremenu Edit.Paste <C-R>"
     78 ]=]
     79 
     80 describe(':menu listing', function()
     81  before_each(function()
     82    clear()
     83    command(test_menus_cmd)
     84  end)
     85 
     86  it('matches by path argument', function()
     87    eq(
     88      [[
     89 --- Menus ---
     90 500 Edit
     91  500 Paste
     92      c*   <C-R>"]],
     93      n.exec_capture('cmenu Edit')
     94    )
     95    eq(
     96      [[
     97 --- Menus ---
     98 500 &Test
     99  500 Test
    100      n*   inormal<Esc>
    101  500 Nested
    102    500 test
    103        n    level1
    104    500 Nested2
    105        n    level2]],
    106      n.exec_capture('nmenu Test')
    107    )
    108    eq(
    109      [[
    110 --- Menus ---
    111 500 Nested
    112  500 test
    113      o    level1
    114  500 Nested2
    115      o    level2]],
    116      n.exec_capture('omenu Test.Nested')
    117    )
    118    eq(
    119      [[
    120 --- Menus ---
    121 500 Test
    122    n*   inormal<Esc>
    123    v*   x
    124    s*   x
    125    i*   insert
    126    c*   cmdmode]],
    127      n.exec_capture('amenu Test.Test')
    128    )
    129  end)
    130 end)
    131 
    132 describe('menu_get', function()
    133  before_each(function()
    134    clear()
    135    command(test_menus_cmd)
    136  end)
    137 
    138  it("path='', modes='a'", function()
    139    local m = fn.menu_get('', 'a')
    140    -- HINT: To print the expected table and regenerate the tests:
    141    -- print(require('vim.inspect')(m))
    142    local expected = {
    143      {
    144        shortcut = 'T',
    145        hidden = 0,
    146        submenus = {
    147          {
    148            mappings = {
    149              i = {
    150                sid = 1,
    151                noremap = 1,
    152                enabled = 1,
    153                rhs = 'insert',
    154                silent = 0,
    155              },
    156              s = {
    157                sid = 1,
    158                noremap = 1,
    159                enabled = 1,
    160                rhs = 'x',
    161                silent = 0,
    162              },
    163              n = {
    164                sid = 1,
    165                noremap = 1,
    166                enabled = 1,
    167                rhs = 'inormal<Esc>',
    168                silent = 0,
    169              },
    170              v = {
    171                sid = 1,
    172                noremap = 1,
    173                enabled = 1,
    174                rhs = 'x',
    175                silent = 0,
    176              },
    177              c = {
    178                sid = 1,
    179                noremap = 1,
    180                enabled = 1,
    181                rhs = 'cmdmode',
    182                silent = 0,
    183              },
    184            },
    185            priority = 500,
    186            name = 'Test',
    187            hidden = 0,
    188          },
    189          {
    190            priority = 500,
    191            name = 'Nested',
    192            submenus = {
    193              {
    194                mappings = {
    195                  o = {
    196                    sid = 0,
    197                    noremap = 0,
    198                    enabled = 1,
    199                    rhs = 'level1',
    200                    silent = 0,
    201                  },
    202                  v = {
    203                    sid = 0,
    204                    noremap = 0,
    205                    enabled = 1,
    206                    rhs = 'level1',
    207                    silent = 0,
    208                  },
    209                  s = {
    210                    sid = 0,
    211                    noremap = 0,
    212                    enabled = 1,
    213                    rhs = 'level1',
    214                    silent = 0,
    215                  },
    216                  n = {
    217                    sid = 0,
    218                    noremap = 0,
    219                    enabled = 1,
    220                    rhs = 'level1',
    221                    silent = 0,
    222                  },
    223                },
    224                priority = 500,
    225                name = 'test',
    226                hidden = 0,
    227              },
    228              {
    229                mappings = {
    230                  o = {
    231                    sid = 0,
    232                    noremap = 0,
    233                    enabled = 1,
    234                    rhs = 'level2',
    235                    silent = 0,
    236                  },
    237                  v = {
    238                    sid = 0,
    239                    noremap = 0,
    240                    enabled = 1,
    241                    rhs = 'level2',
    242                    silent = 0,
    243                  },
    244                  s = {
    245                    sid = 0,
    246                    noremap = 0,
    247                    enabled = 1,
    248                    rhs = 'level2',
    249                    silent = 0,
    250                  },
    251                  n = {
    252                    sid = 0,
    253                    noremap = 0,
    254                    enabled = 1,
    255                    rhs = 'level2',
    256                    silent = 0,
    257                  },
    258                },
    259                priority = 500,
    260                name = 'Nested2',
    261                hidden = 0,
    262              },
    263            },
    264            hidden = 0,
    265          },
    266        },
    267        priority = 500,
    268        name = 'Test',
    269      },
    270      {
    271        priority = 500,
    272        name = 'Export',
    273        submenus = {
    274          {
    275            tooltip = 'This is the tooltip',
    276            hidden = 0,
    277            name = 'Script',
    278            priority = 500,
    279            mappings = {
    280              n = {
    281                sid = 1,
    282                noremap = 1,
    283                enabled = 1,
    284                rhs = 'p',
    285                silent = 0,
    286              },
    287            },
    288          },
    289        },
    290        hidden = 0,
    291      },
    292      {
    293        priority = 500,
    294        name = 'Edit',
    295        submenus = {
    296          {
    297            mappings = {
    298              c = {
    299                sid = 1,
    300                noremap = 1,
    301                enabled = 1,
    302                rhs = '<C-R>"',
    303                silent = 0,
    304              },
    305              n = {
    306                sid = 1,
    307                noremap = 1,
    308                enabled = 1,
    309                rhs = 'p',
    310                silent = 0,
    311              },
    312            },
    313            priority = 500,
    314            name = 'Paste',
    315            hidden = 0,
    316          },
    317        },
    318        hidden = 0,
    319      },
    320      {
    321        priority = 500,
    322        name = ']Export',
    323        submenus = {
    324          {
    325            mappings = {
    326              o = {
    327                sid = 0,
    328                noremap = 0,
    329                enabled = 1,
    330                rhs = 'thisoneshouldbehidden',
    331                silent = 0,
    332              },
    333              v = {
    334                sid = 0,
    335                noremap = 0,
    336                enabled = 1,
    337                rhs = 'thisoneshouldbehidden',
    338                silent = 0,
    339              },
    340              s = {
    341                sid = 0,
    342                noremap = 0,
    343                enabled = 1,
    344                rhs = 'thisoneshouldbehidden',
    345                silent = 0,
    346              },
    347              n = {
    348                sid = 0,
    349                noremap = 0,
    350                enabled = 1,
    351                rhs = 'thisoneshouldbehidden',
    352                silent = 0,
    353              },
    354            },
    355            priority = 500,
    356            name = 'hidden',
    357            hidden = 0,
    358          },
    359        },
    360        hidden = 1,
    361      },
    362    }
    363    eq(expected, m)
    364  end)
    365 
    366  it('matching path, all modes', function()
    367    local m = fn.menu_get('Export', 'a')
    368    local expected = {
    369      {
    370        hidden = 0,
    371        name = 'Export',
    372        priority = 500,
    373        submenus = {
    374          {
    375            tooltip = 'This is the tooltip',
    376            hidden = 0,
    377            name = 'Script',
    378            priority = 500,
    379            mappings = {
    380              n = {
    381                sid = 1,
    382                noremap = 1,
    383                enabled = 1,
    384                rhs = 'p',
    385                silent = 0,
    386              },
    387            },
    388          },
    389        },
    390      },
    391    }
    392    eq(expected, m)
    393  end)
    394 
    395  it('no path, matching modes', function()
    396    local m = fn.menu_get('', 'i')
    397    local expected = {
    398      {
    399        shortcut = 'T',
    400        hidden = 0,
    401        submenus = {
    402          {
    403            mappings = {
    404              i = {
    405                sid = 1,
    406                noremap = 1,
    407                enabled = 1,
    408                rhs = 'insert',
    409                silent = 0,
    410              },
    411            },
    412            priority = 500,
    413            name = 'Test',
    414            hidden = 0,
    415          },
    416        },
    417        priority = 500,
    418        name = 'Test',
    419      },
    420    }
    421    eq(expected, m)
    422  end)
    423 
    424  it('matching path and modes', function()
    425    local m = fn.menu_get('Test', 'i')
    426    local expected = {
    427      {
    428        shortcut = 'T',
    429        submenus = {
    430          {
    431            mappings = {
    432              i = {
    433                sid = 1,
    434                noremap = 1,
    435                enabled = 1,
    436                rhs = 'insert',
    437                silent = 0,
    438              },
    439            },
    440            priority = 500,
    441            name = 'Test',
    442            hidden = 0,
    443          },
    444        },
    445        priority = 500,
    446        name = 'Test',
    447        hidden = 0,
    448      },
    449    }
    450    eq(expected, m)
    451  end)
    452 end)
    453 
    454 describe('menu_get', function()
    455  before_each(function()
    456    clear()
    457    command('aunmenu *')
    458  end)
    459 
    460  it('returns <keycode> representation of special keys', function()
    461    command('nnoremenu &Test.Test inormal<ESC>')
    462    command('inoremenu &Test.Test2 <Tab><Esc>')
    463    command('vnoremenu &Test.Test3 yA<C-R>0<Tab>xyz<Esc>')
    464    command('inoremenu &Test.Test4 <c-r>*')
    465    command('inoremenu &Test.Test5 <c-R>+')
    466    command('nnoremenu &Test.Test6 <Nop>')
    467    command('nnoremenu &Test.Test7 <NOP>')
    468    command('nnoremenu &Test.Test8 <NoP>')
    469    command('nnoremenu &Test.Test9 ""')
    470 
    471    local m = fn.menu_get('')
    472    local expected = {
    473      {
    474        shortcut = 'T',
    475        hidden = 0,
    476        submenus = {
    477          {
    478            priority = 500,
    479            mappings = {
    480              n = {
    481                sid = 1,
    482                noremap = 1,
    483                enabled = 1,
    484                rhs = 'inormal<Esc>',
    485                silent = 0,
    486              },
    487            },
    488            name = 'Test',
    489            hidden = 0,
    490          },
    491          {
    492            priority = 500,
    493            mappings = {
    494              i = {
    495                sid = 1,
    496                noremap = 1,
    497                enabled = 1,
    498                rhs = '<Tab><Esc>',
    499                silent = 0,
    500              },
    501            },
    502            name = 'Test2',
    503            hidden = 0,
    504          },
    505          {
    506            priority = 500,
    507            mappings = {
    508              s = {
    509                sid = 1,
    510                noremap = 1,
    511                enabled = 1,
    512                rhs = 'yA<C-R>0<Tab>xyz<Esc>',
    513                silent = 0,
    514              },
    515              v = {
    516                sid = 1,
    517                noremap = 1,
    518                enabled = 1,
    519                rhs = 'yA<C-R>0<Tab>xyz<Esc>',
    520                silent = 0,
    521              },
    522            },
    523            name = 'Test3',
    524            hidden = 0,
    525          },
    526          {
    527            priority = 500,
    528            mappings = {
    529              i = {
    530                sid = 1,
    531                noremap = 1,
    532                enabled = 1,
    533                rhs = '<C-R>*',
    534                silent = 0,
    535              },
    536            },
    537            name = 'Test4',
    538            hidden = 0,
    539          },
    540          {
    541            priority = 500,
    542            mappings = {
    543              i = {
    544                sid = 1,
    545                noremap = 1,
    546                enabled = 1,
    547                rhs = '<C-R>+',
    548                silent = 0,
    549              },
    550            },
    551            name = 'Test5',
    552            hidden = 0,
    553          },
    554          {
    555            priority = 500,
    556            mappings = {
    557              n = {
    558                sid = 1,
    559                noremap = 1,
    560                enabled = 1,
    561                rhs = '',
    562                silent = 0,
    563              },
    564            },
    565            name = 'Test6',
    566            hidden = 0,
    567          },
    568          {
    569            priority = 500,
    570            mappings = {
    571              n = {
    572                sid = 1,
    573                noremap = 1,
    574                enabled = 1,
    575                rhs = '',
    576                silent = 0,
    577              },
    578            },
    579            name = 'Test7',
    580            hidden = 0,
    581          },
    582          {
    583            priority = 500,
    584            mappings = {
    585              n = {
    586                sid = 1,
    587                noremap = 1,
    588                enabled = 1,
    589                rhs = '',
    590                silent = 0,
    591              },
    592            },
    593            name = 'Test8',
    594            hidden = 0,
    595          },
    596          {
    597            priority = 500,
    598            mappings = {
    599              n = {
    600                sid = 1,
    601                noremap = 1,
    602                enabled = 1,
    603                rhs = '""',
    604                silent = 0,
    605              },
    606            },
    607            name = 'Test9',
    608            hidden = 0,
    609          },
    610        },
    611        priority = 500,
    612        name = 'Test',
    613      },
    614    }
    615 
    616    eq(m, expected)
    617  end)
    618 
    619  it('works with right-aligned text and spaces', function()
    620    command('nnoremenu &Test<Tab>Y.Test<Tab>X\\ x inormal<Alt-j>')
    621    command('nnoremenu &Test\\ 1.Test\\ 2 Wargl')
    622    command('nnoremenu &Test4.Test<Tab>3 i space<Esc>')
    623 
    624    local m = fn.menu_get('')
    625    local expected = {
    626      {
    627        shortcut = 'T',
    628        hidden = 0,
    629        actext = 'Y',
    630        submenus = {
    631          {
    632            mappings = {
    633              n = {
    634                sid = 1,
    635                noremap = 1,
    636                enabled = 1,
    637                rhs = 'inormal<Alt-j>',
    638                silent = 0,
    639              },
    640            },
    641            hidden = 0,
    642            actext = 'X x',
    643            priority = 500,
    644            name = 'Test',
    645          },
    646        },
    647        priority = 500,
    648        name = 'Test',
    649      },
    650      {
    651        shortcut = 'T',
    652        hidden = 0,
    653        submenus = {
    654          {
    655            priority = 500,
    656            mappings = {
    657              n = {
    658                sid = 1,
    659                noremap = 1,
    660                enabled = 1,
    661                rhs = 'Wargl',
    662                silent = 0,
    663              },
    664            },
    665            name = 'Test 2',
    666            hidden = 0,
    667          },
    668        },
    669        priority = 500,
    670        name = 'Test 1',
    671      },
    672      {
    673        shortcut = 'T',
    674        hidden = 0,
    675        submenus = {
    676          {
    677            mappings = {
    678              n = {
    679                sid = 1,
    680                noremap = 1,
    681                enabled = 1,
    682                rhs = 'i space<Esc>',
    683                silent = 0,
    684              },
    685            },
    686            hidden = 0,
    687            actext = '3',
    688            priority = 500,
    689            name = 'Test',
    690          },
    691        },
    692        priority = 500,
    693        name = 'Test4',
    694      },
    695    }
    696 
    697    eq(m, expected)
    698  end)
    699 end)