mirror of
https://github.com/piskelapp/piskel.git
synced 2023-08-10 21:12:52 +03:00
Issue #287 : Shortcuts now rely on Shortcut instances. Shortcut key can be changed dynamically.
This commit is contained in:
275
test/js/service/keyboard/ShortcutServiceTest.js
Normal file
275
test/js/service/keyboard/ShortcutServiceTest.js
Normal file
@ -0,0 +1,275 @@
|
||||
describe("ShortcutService test suite", function() {
|
||||
|
||||
var A_KEY = 'A';
|
||||
var B_KEY = 'B';
|
||||
var A_KEYCODE = 65;
|
||||
var B_KEYCODE = 66;
|
||||
|
||||
var service;
|
||||
|
||||
beforeEach(function() {
|
||||
service = new pskl.service.keyboard.ShortcutService();
|
||||
});
|
||||
|
||||
var createEvent = function (keycode) {
|
||||
return {
|
||||
which : keycode,
|
||||
altKey : false,
|
||||
withAltKey : function () {
|
||||
this.altKey = true;
|
||||
return this;
|
||||
},
|
||||
ctrlKey : false,
|
||||
withCtrlKey : function () {
|
||||
this.ctrlKey = true;
|
||||
return this;
|
||||
},
|
||||
shiftKey : false,
|
||||
withShiftKey : function () {
|
||||
this.shiftKey = true;
|
||||
return this;
|
||||
},
|
||||
preventDefaultCalled : false,
|
||||
preventDefault : function () {
|
||||
this.preventDefaultCalled = true;
|
||||
},
|
||||
target : {
|
||||
nodeName : 'div'
|
||||
},
|
||||
setNodeName : function (nodeName) {
|
||||
this.target.nodeName = nodeName;
|
||||
return this;
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
var setTargetName = function (evt, targetName) {
|
||||
evt.target = {
|
||||
nodeName : targetName
|
||||
};
|
||||
};
|
||||
|
||||
it("accepts only shortcut instances", function() {
|
||||
console.log('[ShortcutService] accepts only shortcut instances');
|
||||
|
||||
console.log('[ShortcutService] ... fails for missing shortcut');
|
||||
expect(function () {
|
||||
service.registerShortcut();
|
||||
}).toThrow('Invalid shortcut argument, please use instances of pskl.service.keyboard.Shortcut');
|
||||
|
||||
console.log('[ShortcutService] ... fails for shortcut as empty object');
|
||||
expect(function () {
|
||||
service.registerShortcut({});
|
||||
}).toThrow('Invalid shortcut argument, please use instances of pskl.service.keyboard.Shortcut');
|
||||
|
||||
console.log('[ShortcutService] ... fails for shortcut as a string');
|
||||
expect(function () {
|
||||
service.registerShortcut('alt+F4');
|
||||
}).toThrow('Invalid shortcut argument, please use instances of pskl.service.keyboard.Shortcut');
|
||||
|
||||
var shortcut = new pskl.service.keyboard.Shortcut('shortcut-id', '', A_KEY);
|
||||
|
||||
console.log('[ShortcutService] ... fails for missing callback');
|
||||
expect(function () {
|
||||
service.registerShortcut(shortcut);
|
||||
}).toThrow('Invalid callback argument, please provide a function');
|
||||
|
||||
console.log('[ShortcutService] ... fails for invalid callback');
|
||||
expect(function () {
|
||||
service.registerShortcut(shortcut, {callback : function () {}});
|
||||
}).toThrow('Invalid callback argument, please provide a function');
|
||||
|
||||
console.log('[ShortcutService] ... is ok for valid arguments');
|
||||
service.registerShortcut(shortcut, function () {});
|
||||
});
|
||||
|
||||
it ("triggers shortcut", function () {
|
||||
console.log('[ShortcutService] triggers shortcut');
|
||||
var callbackCalled = false;
|
||||
|
||||
console.log('[ShortcutService] ... register shortcut for A');
|
||||
var shortcutA = new pskl.service.keyboard.Shortcut('shortcut-a', '', A_KEY);
|
||||
service.registerShortcut(shortcutA, function () {
|
||||
callbackCalled = true;
|
||||
});
|
||||
|
||||
console.log('[ShortcutService] ... verify shortcut is called');
|
||||
service.onKeyUp_(createEvent(A_KEYCODE));
|
||||
expect(callbackCalled).toBe(true);
|
||||
});
|
||||
|
||||
it ("triggers shortcuts independently", function () {
|
||||
console.log('[ShortcutService] registers shortcuts');
|
||||
|
||||
var shortcutA = new pskl.service.keyboard.Shortcut('shortcut-a', '', A_KEY);
|
||||
var shortcutB = new pskl.service.keyboard.Shortcut('shortcut-b', '', B_KEY);
|
||||
var shortcutA_B = new pskl.service.keyboard.Shortcut('shortcut-a&b', '', [A_KEY, B_KEY]);
|
||||
|
||||
var counters = {
|
||||
a : 0,
|
||||
b : 0,
|
||||
a_b : 0
|
||||
};
|
||||
|
||||
console.log('[ShortcutService] ... register separate shortcuts for A and B');
|
||||
service.registerShortcut(shortcutA, function () {
|
||||
counters.a++;
|
||||
});
|
||||
service.registerShortcut(shortcutB, function () {
|
||||
counters.b++;
|
||||
});
|
||||
service.registerShortcut(shortcutA_B, function () {
|
||||
counters.a_b++;
|
||||
});
|
||||
|
||||
console.log('[ShortcutService] ... trigger A, expect counter A at 1, B at 0, A_B at 1');
|
||||
service.onKeyUp_(createEvent(A_KEYCODE));
|
||||
expect(counters.a).toBe(1);
|
||||
expect(counters.b).toBe(0);
|
||||
expect(counters.a_b).toBe(1);
|
||||
|
||||
console.log('[ShortcutService] ... trigger A, expect counter A at 1, B at 1, A_B at 2');
|
||||
service.onKeyUp_(createEvent(B_KEYCODE));
|
||||
expect(counters.a).toBe(1);
|
||||
expect(counters.b).toBe(1);
|
||||
expect(counters.a_b).toBe(2);
|
||||
});
|
||||
|
||||
it ("unregisters shortcut", function () {
|
||||
console.log('[ShortcutService] unregisters shortcut');
|
||||
var callbackCalled = false;
|
||||
|
||||
console.log('[ShortcutService] ... register shortcut for A');
|
||||
var shortcutA = new pskl.service.keyboard.Shortcut('shortcut-a', '', A_KEY);
|
||||
service.registerShortcut(shortcutA, function () {
|
||||
callbackCalled = true;
|
||||
});
|
||||
|
||||
console.log('[ShortcutService] ... unregister shortcut A');
|
||||
service.unregisterShortcut(shortcutA);
|
||||
|
||||
console.log('[ShortcutService] ... verify shortcut callback is not called');
|
||||
service.onKeyUp_(createEvent(A_KEYCODE));
|
||||
expect(callbackCalled).toBe(false);
|
||||
});
|
||||
|
||||
it ("unregisters shortcut without removing other shortcuts", function () {
|
||||
console.log('[ShortcutService] unregisters shortcut');
|
||||
var callbackCalled = false;
|
||||
|
||||
console.log('[ShortcutService] ... register shortcut for A & B');
|
||||
var shortcutA = new pskl.service.keyboard.Shortcut('shortcut-a', '', A_KEY);
|
||||
var shortcutB = new pskl.service.keyboard.Shortcut('shortcut-b', '', B_KEY);
|
||||
service.registerShortcut(shortcutA, function () {});
|
||||
service.registerShortcut(shortcutB, function () {
|
||||
callbackCalled = true;
|
||||
});
|
||||
|
||||
console.log('[ShortcutService] ... unregister shortcut A');
|
||||
service.unregisterShortcut(shortcutA);
|
||||
|
||||
console.log('[ShortcutService] ... verify shortcut callback for B can still be called');
|
||||
service.onKeyUp_(createEvent(B_KEYCODE));
|
||||
expect(callbackCalled).toBe(true);
|
||||
});
|
||||
|
||||
it ("supports unregistering unknown shortcuts", function () {
|
||||
console.log('[ShortcutService] unregisters shortcut');
|
||||
var callbackCalled = false;
|
||||
|
||||
console.log('[ShortcutService] ... register shortcut for A');
|
||||
var shortcutA = new pskl.service.keyboard.Shortcut('shortcut-a', '', A_KEY);
|
||||
service.registerShortcut(shortcutA, function () {
|
||||
callbackCalled = true;
|
||||
});
|
||||
|
||||
console.log('[ShortcutService] ... unregister shortcut B, which was not registered in the first place');
|
||||
var shortcutB = new pskl.service.keyboard.Shortcut('shortcut-b', '', B_KEY);
|
||||
service.unregisterShortcut(shortcutB);
|
||||
|
||||
console.log('[ShortcutService] ... verify shortcut callback for A can still be called');
|
||||
callbackCalled = false;
|
||||
service.onKeyUp_(createEvent(A_KEYCODE));
|
||||
expect(callbackCalled).toBe(true);
|
||||
});
|
||||
|
||||
it ("does not trigger shortcuts from INPUT or TEXTAREA", function () {
|
||||
console.log('[ShortcutService] triggers shortcut');
|
||||
var callbackCalled = false;
|
||||
|
||||
console.log('[ShortcutService] ... register shortcut for A');
|
||||
var shortcutA = new pskl.service.keyboard.Shortcut('shortcut-a', '', A_KEY);
|
||||
service.registerShortcut(shortcutA, function () {
|
||||
callbackCalled = true;
|
||||
});
|
||||
|
||||
console.log('[ShortcutService] ... verify shortcut is not called from event on INPUT');
|
||||
service.onKeyUp_(createEvent(A_KEYCODE).setNodeName('INPUT'));
|
||||
expect(callbackCalled).toBe(false);
|
||||
|
||||
console.log('[ShortcutService] ... verify shortcut is not called from event on TEXTAREA');
|
||||
service.onKeyUp_(createEvent(A_KEYCODE).setNodeName('TEXTAREA'));
|
||||
expect(callbackCalled).toBe(false);
|
||||
|
||||
console.log('[ShortcutService] ... verify shortcut is called from event on LINK');
|
||||
service.onKeyUp_(createEvent(A_KEYCODE).setNodeName('A'));
|
||||
expect(callbackCalled).toBe(true);
|
||||
});
|
||||
|
||||
it ("supports meta modifiers", function () {
|
||||
console.log('[ShortcutService] triggers shortcut');
|
||||
var callbackCalled = false;
|
||||
|
||||
console.log('[ShortcutService] ... create various A shortcuts with modifiers');
|
||||
var shortcuts = [
|
||||
new pskl.service.keyboard.Shortcut('a', '', A_KEY),
|
||||
new pskl.service.keyboard.Shortcut('a_ctrl', '', 'ctrl+' + A_KEY),
|
||||
new pskl.service.keyboard.Shortcut('a_ctrl_shift', '', 'ctrl+shift+' + A_KEY),
|
||||
new pskl.service.keyboard.Shortcut('a_ctrl_shift_alt', '', 'ctrl+shift+alt+' + A_KEY),
|
||||
new pskl.service.keyboard.Shortcut('a_alt', '', 'alt+' + A_KEY)
|
||||
];
|
||||
|
||||
var counters = {
|
||||
a : 0,
|
||||
a_ctrl : 0,
|
||||
a_ctrl_shift : 0,
|
||||
a_ctrl_shift_alt : 0,
|
||||
a_alt : 0,
|
||||
};
|
||||
|
||||
shortcuts.forEach(function (shortcut) {
|
||||
service.registerShortcut(shortcut, function () {
|
||||
counters[shortcut.getId()]++;
|
||||
});
|
||||
});
|
||||
|
||||
var verifyCounters = function (a, a_c, a_cs, a_csa, a_a) {
|
||||
expect(counters.a).toBe(a);
|
||||
expect(counters.a_ctrl).toBe(a_c);
|
||||
expect(counters.a_ctrl_shift).toBe(a_cs);
|
||||
expect(counters.a_ctrl_shift_alt).toBe(a_csa);
|
||||
expect(counters.a_alt).toBe(a_a);
|
||||
};
|
||||
|
||||
console.log('[ShortcutService] ... trigger A, expect counters CTRL+A, CTRL+SHIFT+A, CTRL+SHIFT+ALT+A, ALT+A to remain at 0');
|
||||
service.onKeyUp_(createEvent(A_KEYCODE));
|
||||
verifyCounters(1,0,0,0,0);
|
||||
|
||||
console.log('[ShortcutService] ... trigger CTRL+A, expect counters CTRL+SHIFT+A, CTRL+SHIFT+ALT+A, ALT+A to remain at 0');
|
||||
service.onKeyUp_(createEvent(A_KEYCODE).withCtrlKey());
|
||||
verifyCounters(1,1,0,0,0);
|
||||
|
||||
console.log('[ShortcutService] ... trigger CTRL+A, expect counters CTRL+SHIFT+ALT+A, ALT+A to remain at 0');
|
||||
service.onKeyUp_(createEvent(A_KEYCODE).withCtrlKey().withShiftKey());
|
||||
verifyCounters(1,1,1,0,0);
|
||||
|
||||
console.log('[ShortcutService] ... trigger CTRL+A, expect counter ALT+A to remain at 0');
|
||||
service.onKeyUp_(createEvent(A_KEYCODE).withCtrlKey().withShiftKey().withAltKey());
|
||||
verifyCounters(1,1,1,1,0);
|
||||
|
||||
console.log('[ShortcutService] ... trigger CTRL+A, expect all counters at 1');
|
||||
service.onKeyUp_(createEvent(A_KEYCODE).withAltKey());
|
||||
verifyCounters(1,1,1,1,1);
|
||||
});
|
||||
|
||||
});
|
Reference in New Issue
Block a user