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)