keybindings-panel-spec.js 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. const path = require('path');
  2. const KeybindingsPanel = require('../lib/keybindings-panel');
  3. describe("KeybindingsPanel", function() {
  4. let [keyBindings, panel] = [];
  5. beforeEach(function() {
  6. expect(atom.keymaps).toBeDefined();
  7. const keySource = `${atom.getLoadSettings().resourcePath}${path.sep}keymaps`;
  8. keyBindings = [
  9. {
  10. source: keySource,
  11. keystrokes: 'ctrl-a',
  12. command: 'core:select-all',
  13. selector: '.editor, .platform-test'
  14. },
  15. {
  16. source: keySource,
  17. keystrokes: 'ctrl-u',
  18. command: 'core:undo',
  19. selector: ".platform-test"
  20. },
  21. {
  22. source: keySource,
  23. keystrokes: 'ctrl-u',
  24. command: 'core:undo',
  25. selector: ".platform-a, .platform-b"
  26. },
  27. {
  28. source: keySource,
  29. keystrokes: 'shift-\\ \\',
  30. command: 'core:undo',
  31. selector: '.editor'
  32. },
  33. {
  34. source: keySource,
  35. keystrokes: 'ctrl-z\'',
  36. command: 'core:toggle',
  37. selector: 'atom-text-editor[data-grammar~=\'css\']'
  38. }
  39. ];
  40. spyOn(atom.keymaps, 'getKeyBindings').andReturn(keyBindings);
  41. return panel = new KeybindingsPanel;
  42. });
  43. it("loads and displays core key bindings", function() {
  44. expect(panel.refs.keybindingRows.children.length).toBe(3);
  45. const row = panel.refs.keybindingRows.children[0];
  46. expect(row.querySelector('.keystroke').textContent).toBe('ctrl-a');
  47. expect(row.querySelector('.command').textContent).toBe('core:select-all');
  48. expect(row.querySelector('.source').textContent).toBe('Core');
  49. expect(row.querySelector('.selector').textContent).toBe('.editor, .platform-test');
  50. });
  51. describe("when a keybinding is copied", function() {
  52. describe("when the keybinding file ends in .cson", () => it("writes a CSON snippet to the clipboard", function() {
  53. spyOn(atom.keymaps, 'getUserKeymapPath').andReturn('keymap.cson');
  54. panel.element.querySelector('.copy-icon').click();
  55. expect(atom.clipboard.read()).toBe(`\
  56. '.editor, .platform-test':
  57. 'ctrl-a': 'core:select-all'\
  58. `
  59. );
  60. }));
  61. describe("when the keybinding file ends in .json", () => it("writes a JSON snippet to the clipboard", function() {
  62. spyOn(atom.keymaps, 'getUserKeymapPath').andReturn('keymap.json');
  63. panel.element.querySelector('.copy-icon').click();
  64. expect(atom.clipboard.read()).toBe(`\
  65. ".editor, .platform-test": {
  66. "ctrl-a": "core:select-all"
  67. }\
  68. `
  69. );
  70. }));
  71. describe("when the keybinding contains special characters", function() {
  72. it("escapes the backslashes before copying", function() {
  73. spyOn(atom.keymaps, 'getUserKeymapPath').andReturn('keymap.cson');
  74. panel.element.querySelectorAll('.copy-icon')[2].click();
  75. expect(atom.clipboard.read()).toBe(`\
  76. '.editor':
  77. 'shift-\\\\ \\\\': 'core:undo'\
  78. `
  79. );
  80. });
  81. it("escapes the single quotes before copying", function() {
  82. spyOn(atom.keymaps, 'getUserKeymapPath').andReturn('keymap.cson');
  83. panel.element.querySelectorAll('.copy-icon')[1].click();
  84. expect(atom.clipboard.read()).toBe(`\
  85. 'atom-text-editor[data-grammar~=\\'css\\']':
  86. 'ctrl-z\\'': 'core:toggle'\
  87. `
  88. );
  89. });
  90. });
  91. });
  92. describe("when the key bindings change", () => it("reloads the key bindings", function() {
  93. keyBindings.push({
  94. source: atom.keymaps.getUserKeymapPath(), keystrokes: 'ctrl-b', command: 'core:undo', selector: '.editor'});
  95. atom.keymaps.emitter.emit('did-reload-keymap');
  96. waitsFor("the new keybinding to show up in the keybinding panel", () => panel.refs.keybindingRows.children.length === 4);
  97. runs(function() {
  98. const row = panel.refs.keybindingRows.children[1];
  99. expect(row.querySelector('.keystroke').textContent).toBe('ctrl-b');
  100. expect(row.querySelector('.command').textContent).toBe('core:undo');
  101. expect(row.querySelector('.source').textContent).toBe('User');
  102. expect(row.querySelector('.selector').textContent).toBe('.editor');
  103. });
  104. }));
  105. describe("when searching key bindings", function() {
  106. it("find case-insensitive results", function() {
  107. keyBindings.push({
  108. source: `${atom.getLoadSettings().resourcePath}${path.sep}keymaps`, keystrokes: 'F11', command: 'window:toggle-full-screen', selector: 'body'});
  109. atom.keymaps.emitter.emit('did-reload-keymap');
  110. panel.filterKeyBindings(keyBindings, 'f11');
  111. expect(panel.refs.keybindingRows.children.length).toBe(1);
  112. const row = panel.refs.keybindingRows.children[0];
  113. expect(row.querySelector('.keystroke').textContent).toBe('F11');
  114. expect(row.querySelector('.command').textContent).toBe('window:toggle-full-screen');
  115. expect(row.querySelector('.source').textContent).toBe('Core');
  116. expect(row.querySelector('.selector').textContent).toBe('body');
  117. });
  118. it("perform a fuzzy match for each keyword", function() {
  119. panel.filterKeyBindings(keyBindings, 'core ctrl-a');
  120. expect(panel.refs.keybindingRows.children.length).toBe(1);
  121. const row = panel.refs.keybindingRows.children[0];
  122. expect(row.querySelector('.keystroke').textContent).toBe('ctrl-a');
  123. expect(row.querySelector('.command').textContent).toBe('core:select-all');
  124. expect(row.querySelector('.source').textContent).toBe('Core');
  125. expect(row.querySelector('.selector').textContent).toBe('.editor, .platform-test');
  126. });
  127. });
  128. });