UNPKG

malwoden

Version:

![alt text](./coverage/badge-lines.svg) ![alt text](./coverage/badge-statements.svg) ![alt text](./coverage/badge-functions.svg) ![alt text](./coverage/badge-branches.svg)

284 lines 13.9 kB
"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; var __generator = (this && this.__generator) || function (thisArg, body) { var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; function verb(n) { return function (v) { return step([n, v]); }; } function step(op) { if (f) throw new TypeError("Generator is already executing."); while (_) try { if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; if (y = 0, t) op = [op[0] & 2, t.value]; switch (op[0]) { case 0: case 1: t = op; break; case 4: _.label++; return { value: op[1], done: false }; case 5: _.label++; y = op[1]; op = [0]; continue; case 7: op = _.ops.pop(); _.trys.pop(); continue; default: if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } if (t[2]) _.ops.pop(); _.trys.pop(); continue; } op = body.call(thisArg, _); } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; } }; Object.defineProperty(exports, "__esModule", { value: true }); var jsdom_1 = require("jsdom"); var keyboard_1 = require("./keyboard"); var keycode_1 = require("./keycode"); function keyEventFromKey(event, key) { return { key: key, ctrlKey: false, metaKey: false, repeat: false, shiftKey: false, event: event, }; } describe("KeyboardHandler", function () { beforeEach(function () { var dom = new jsdom_1.JSDOM(); //@ts-ignore global.document = dom.window.document; //@ts-ignore global.window = dom.window; //@ts-ignore global.KeyboardEvent = dom.window.KeyboardEvent; }); it("Will listen to keyboard events", function () { var h = new keyboard_1.KeyboardHandler(); var c = new keyboard_1.KeyboardContext(); var down = 0; var up = 0; c.onDown(keycode_1.KeyCode.A, function () { down++; }); c.onUp(keycode_1.KeyCode.A, function () { up++; }); h.setContext(c); var event = new KeyboardEvent("keydown", { keyCode: keycode_1.KeyCode.A }); document.dispatchEvent(event); expect(down).toEqual(1); expect(up).toEqual(0); var event = new KeyboardEvent("keyup", { keyCode: keycode_1.KeyCode.A }); document.dispatchEvent(event); expect(down).toEqual(1); expect(up).toEqual(1); }); it("Can set a context", function () { var h = new keyboard_1.KeyboardHandler(); var c = new keyboard_1.KeyboardContext(); h.setContext(c); expect(h["_context"]).toBe(c); }); it("Can clear a context", function () { var h = new keyboard_1.KeyboardHandler(); var c = new keyboard_1.KeyboardContext(); h.setContext(c); expect(h["_context"]).toBe(c); h.clearContext(); expect(h["_context"]).toBeUndefined(); }); it("Can check if a key is down", function () { var h = new keyboard_1.KeyboardHandler(); var _isDown = h["_isDown"]; expect(h["_isDown"].has(keycode_1.KeyCode.A)).toBeFalsy(); expect(h.isKeyDown(keycode_1.KeyCode.A)).toBeFalsy(); h["onKeyDownEvent"](new KeyboardEvent("keydown", { keyCode: keycode_1.KeyCode.A })); expect(h["_isDown"].has(keycode_1.KeyCode.A)).toBeTruthy(); expect(h.isKeyDown(keycode_1.KeyCode.A)).toBeTruthy(); h["onKeyUpEvent"](new KeyboardEvent("keyup", { keyCode: keycode_1.KeyCode.A })); expect(h["_isDown"].has(keycode_1.KeyCode.A)).toBeFalsy(); expect(h.isKeyDown(keycode_1.KeyCode.A)).toBeFalsy(); }); it("Can fire onDown", function () { var c = new keyboard_1.KeyboardContext(); var count = 0; c.onDown(keycode_1.KeyCode.A, function () { return count++; }); c.callOnDown(keyEventFromKey("keydown", keycode_1.KeyCode.A)); c.callOnDown(keyEventFromKey("keydown", keycode_1.KeyCode.A)); c.callOnDown(keyEventFromKey("keydown", keycode_1.KeyCode.A)); expect(count).toEqual(3); }); it("Can fire onUp", function () { var c = new keyboard_1.KeyboardContext(); var count = 0; c.onUp(keycode_1.KeyCode.A, function () { return count++; }); c.callOnUp(keyEventFromKey("keyup", keycode_1.KeyCode.A)); c.callOnUp(keyEventFromKey("keyup", keycode_1.KeyCode.A)); c.callOnUp(keyEventFromKey("keyup", keycode_1.KeyCode.A)); expect(count).toEqual(3); }); it("Won't error on unregistered keys", function () { var c = new keyboard_1.KeyboardContext(); c.callOnUp(keyEventFromKey("keyup", keycode_1.KeyCode.A)); c.callOnDown(keyEventFromKey("keydown", keycode_1.KeyCode.A)); }); it("Can wait for a keyDown", function () { return __awaiter(void 0, void 0, void 0, function () { var k, promise, keyDown, promise2, keyDown2; return __generator(this, function (_a) { switch (_a.label) { case 0: k = new keyboard_1.KeyboardHandler(); promise = k.waitForKeyDown(); document.dispatchEvent(new KeyboardEvent("keydown", { keyCode: keycode_1.KeyCode.A })); document.dispatchEvent(new KeyboardEvent("keydown", { keyCode: keycode_1.KeyCode.B })); document.dispatchEvent(new KeyboardEvent("keydown", { keyCode: keycode_1.KeyCode.C })); return [4 /*yield*/, promise]; case 1: keyDown = _a.sent(); expect(keyDown).toEqual(keycode_1.KeyCode.A); promise2 = k.waitForKeyDown(keycode_1.KeyCode.B); document.dispatchEvent(new KeyboardEvent("keydown", { keyCode: keycode_1.KeyCode.A })); document.dispatchEvent(new KeyboardEvent("keydown", { keyCode: keycode_1.KeyCode.B })); return [4 /*yield*/, promise2]; case 2: keyDown2 = _a.sent(); expect(keyDown2).toEqual(keycode_1.KeyCode.B); return [2 /*return*/]; } }); }); }); it("Can wait for a keyUp", function () { return __awaiter(void 0, void 0, void 0, function () { var k, promise, keyDown, promise2, keyDown2; return __generator(this, function (_a) { switch (_a.label) { case 0: k = new keyboard_1.KeyboardHandler(); promise = k.waitForKeyUp(); document.dispatchEvent(new KeyboardEvent("keydown", { keyCode: keycode_1.KeyCode.B })); document.dispatchEvent(new KeyboardEvent("keydown", { keyCode: keycode_1.KeyCode.C })); document.dispatchEvent(new KeyboardEvent("keyup", { keyCode: keycode_1.KeyCode.A })); document.dispatchEvent(new KeyboardEvent("keyup", { keyCode: keycode_1.KeyCode.B })); document.dispatchEvent(new KeyboardEvent("keyup", { keyCode: keycode_1.KeyCode.C })); return [4 /*yield*/, promise]; case 1: keyDown = _a.sent(); expect(keyDown).toEqual(keycode_1.KeyCode.A); promise2 = k.waitForKeyUp(keycode_1.KeyCode.B); document.dispatchEvent(new KeyboardEvent("keyup", { keyCode: keycode_1.KeyCode.A })); document.dispatchEvent(new KeyboardEvent("keyup", { keyCode: keycode_1.KeyCode.B })); return [4 /*yield*/, promise2]; case 2: keyDown2 = _a.sent(); expect(keyDown2).toEqual(keycode_1.KeyCode.B); return [2 /*return*/]; } }); }); }); it("Will call 'any' callbacks before specific callbacks", function () { var state = { downAny: "init", upAny: "init", down: "init", up: "init", }; var c = new keyboard_1.KeyboardContext() .onAnyUp(function () { return (state.upAny = "any"); }) .onAnyDown(function () { return (state.downAny = "any"); }) .onDown(keycode_1.KeyCode.A, function () { return (state.down = "specific"); }) .onUp(keycode_1.KeyCode.A, function () { return (state.up = "specific"); }); c.callOnDown(keyEventFromKey("keydown", keycode_1.KeyCode.A)); expect(state).toEqual({ downAny: "any", upAny: "init", down: "specific", up: "init", }); c.callOnUp(keyEventFromKey("keyup", keycode_1.KeyCode.A)); expect(state).toEqual({ downAny: "any", upAny: "any", down: "specific", up: "specific", }); }); it("can be configured to stop propagation", function () { var h = new keyboard_1.KeyboardHandler({ stopPropagation: true }); var h2 = new keyboard_1.KeyboardHandler({ stopPropagation: false }); expect(h["_checkPropagation"](new KeyboardEvent("keydown"))).toEqual(true); expect(h2["_checkPropagation"](new KeyboardEvent("keydown"))).toEqual(false); }); it("can add multiple callbacks - onDown", function () { var c = new keyboard_1.KeyboardContext(); var callbackA = function () { }; var callbackB = function () { }; c["_addOnDown"]("any", callbackA); c["_addOnDown"]("any", callbackB); c["_addOnDown"](keycode_1.KeyCode.A, callbackA); c["_addOnDown"](keycode_1.KeyCode.A, callbackB); expect(c["_onDown"].get("any")).toEqual([callbackA, callbackB]); expect(c["_onDown"].get(keycode_1.KeyCode.A)).toEqual([callbackA, callbackB]); expect(c["_onDown"].get(keycode_1.KeyCode.B)).toBeUndefined(); }); it("can add multiple callbacks - onUp", function () { var c = new keyboard_1.KeyboardContext(); var callbackA = function () { }; var callbackB = function () { }; c["_addOnUp"]("any", callbackA); c["_addOnUp"]("any", callbackB); c["_addOnUp"](keycode_1.KeyCode.A, callbackA); c["_addOnUp"](keycode_1.KeyCode.A, callbackB); expect(c["_onUp"].get("any")).toEqual([callbackA, callbackB]); expect(c["_onUp"].get(keycode_1.KeyCode.A)).toEqual([callbackA, callbackB]); expect(c["_onUp"].get(keycode_1.KeyCode.B)).toBeUndefined(); }); it("can clear callbacks for specific keys", function () { var c = new keyboard_1.KeyboardContext(); var f1 = function () { }; var f2 = function () { }; var f3 = function () { }; var f4 = function () { }; c.onDown(keycode_1.KeyCode.A, f1); c.onDown(keycode_1.KeyCode.A, f2); c.onUp(keycode_1.KeyCode.B, f3); c.onUp(keycode_1.KeyCode.B, f4); expect(c["_onDown"].get(keycode_1.KeyCode.A)).toEqual([f1, f2]); expect(c["_onUp"].get(keycode_1.KeyCode.B)).toEqual([f3, f4]); c.clearOnDown(keycode_1.KeyCode.A, f1); c.clearOnUp(keycode_1.KeyCode.B, f3); expect(c["_onDown"].get(keycode_1.KeyCode.A)).toEqual([f2]); expect(c["_onUp"].get(keycode_1.KeyCode.B)).toEqual([f4]); c.clearOnDown(keycode_1.KeyCode.A); c.clearOnUp(keycode_1.KeyCode.B); expect(c["_onDown"].get(keycode_1.KeyCode.A)).toEqual([]); expect(c["_onUp"].get(keycode_1.KeyCode.B)).toEqual([]); }); it("can clear callbacks for 'any' keys", function () { var c = new keyboard_1.KeyboardContext(); var f1 = function () { }; var f2 = function () { }; var f3 = function () { }; var f4 = function () { }; c.onAnyDown(f1); c.onAnyDown(f2); c.onAnyUp(f3); c.onAnyUp(f4); expect(c["_onDown"].get("any")).toEqual([f1, f2]); expect(c["_onUp"].get("any")).toEqual([f3, f4]); c.clearOnAnyDown(f1); c.clearOnAnyUp(f3); expect(c["_onDown"].get("any")).toEqual([f2]); expect(c["_onUp"].get("any")).toEqual([f4]); c.clearOnAnyDown(); c.clearOnAnyUp(); expect(c["_onDown"].get("any")).toEqual([]); expect(c["_onUp"].get("any")).toEqual([]); }); }); //# sourceMappingURL=keyboard.spec.js.map