import Keyboard from '../Keyboard'; import TestUtility from '../../tests/TestUtility'; let testUtil = new TestUtility(); it('Keyboard will not render without target element', () => { try { new Keyboard(); expect(true).toBe(false); } catch (e) { expect(e.message).toBe("KEYBOARD_DOM_ERROR"); } }); it('Keyboard will run without options', () => { // Prepare target DOM element testUtil.setDOM(); // No options new Keyboard(); }); it('Keyboard will run with empty options', () => { // Prepare target DOM element testUtil.setDOM(); // No options new Keyboard({}); }); it('Keyboard will run with custom DOM target', () => { testUtil.setDOM("myTestDiv"); new Keyboard(".myTestDiv"); expect(document.body.querySelector(".myTestDiv")).toBeDefined(); }); it('Keyboard will run with debug option set', () => { testUtil.setDOM(); let keyboard = new Keyboard({ debug: true }); expect(keyboard.options.debug).toBeTruthy(); }); it('Keyboard standard buttons will work', () => { testUtil.setDOM(); let keyboard = new Keyboard({ maxLength: { "default": 10 } }); testUtil.testLayoutStdButtons(keyboard); }); it('Keyboard shift buttons will work', () => { testUtil.setDOM(); let keyboard = new Keyboard(); keyboard.setOptions({ layoutName: "shift", maxLength: 42 }); testUtil.testLayoutStdButtons(keyboard); }); it('Keyboard setOptions will work without a param', () => { testUtil.setDOM(); let keyboard = new Keyboard(); keyboard.setOptions(); }); it('Keyboard empty buttons wont do anything as expected', () => { testUtil.setDOM(); let keyboard = new Keyboard({ layout: { default: [ "{//} {button} d", "a b c d e f g h i j", ] } }); keyboard.getButtonElement("{//}").onclick(); }); it('Keyboard onKeyPress will work', () => { testUtil.setDOM(); let pressed = false; let keyboard = new Keyboard({ onKeyPress: () => { pressed = true; }, debug: true }); keyboard.getButtonElement("q").onclick(); expect(pressed).toBeTruthy(); }); it('Keyboard standard function buttons will not change input', () => { testUtil.setDOM(); let keyboard = new Keyboard(); testUtil.iterateButtons((button) => { if(button.getAttribute("data-skbtn") === "{shift}"){ button.onclick(); } }); expect(keyboard.getInput()).toBeFalsy(); }); it('Keyboard syncInstanceInputs will work', () => { testUtil.clear(); document.body.innerHTML = `
`; let sharedOptions = { syncInstanceInputs: true }; let keyboard1 = new Keyboard(".keyboard1", sharedOptions); let keyboard2 = new Keyboard(".keyboard2", sharedOptions); keyboard1.getButtonElement("q").onclick(); expect(keyboard2.getInput()).toBe("q"); }); it('Keyboard onChange will work', () => { testUtil.setDOM(); let output = false; let keyboard = new Keyboard({ onChange: (input) => { output = input; } }); keyboard.getButtonElement("q").onclick(); expect(output).toBe("q"); }); it('Keyboard clearInput will work', () => { testUtil.setDOM(); let keyboard = new Keyboard(); keyboard.input = { "default": "hello" }; keyboard.clearInput(); expect(keyboard.getInput()).toBeFalsy(); }); it('Keyboard clearInput will work', () => { testUtil.setDOM(); let keyboard = new Keyboard(); /** * Avoid setInput for this test */ keyboard.input = { "default": "hello" }; keyboard.clearInput(); expect(keyboard.getInput()).toBeFalsy(); }); it('Keyboard clearInput will work with syncInstanceInputs', () => { testUtil.clear(); document.body.innerHTML = ` `; let sharedOptions = { syncInstanceInputs: true }; let keyboard1 = new Keyboard(".keyboard1", sharedOptions); let keyboard2 = new Keyboard(".keyboard2", sharedOptions); /** * Avoid setInput for this test */ keyboard1.input = { "default": "hello" }; keyboard2.clearInput(); expect(keyboard1.getInput()).toBeFalsy(); }); it('Keyboard setInput will work', () => { testUtil.setDOM(); let keyboard = new Keyboard(); keyboard.setInput("hello"); expect(keyboard.getInput()).toBe("hello"); }); it('Keyboard setInput will work with syncInstanceInputs', () => { testUtil.clear(); document.body.innerHTML = ` `; let sharedOptions = { syncInstanceInputs: true }; let keyboard1 = new Keyboard(".keyboard1", sharedOptions); let keyboard2 = new Keyboard(".keyboard2", sharedOptions); keyboard1.setInput("hello"); expect(keyboard2.getInput()).toBe("hello"); }); it('Keyboard dispatch will work', () => { testUtil.setDOM(); document.body.innerHTML = ` `; let keyboard1 = new Keyboard(".keyboard1"); let keyboard2 = new Keyboard(".keyboard2"); keyboard1.dispatch(instance => { instance.setOptions({ buttonTheme: [ { class: "myCustomClass", buttons: "Q" } ] }) }); expect(keyboard2.options.buttonTheme[0].class).toBe("myCustomClass"); }); it('Keyboard dispatch will not work without SimpleKeyboardInstances', () => { testUtil.setDOM(); document.body.innerHTML = ` `; let keyboard1 = new Keyboard(".keyboard1"); let keyboard2 = new Keyboard(".keyboard2"); window['SimpleKeyboardInstances'] = null; try { keyboard1.dispatch(instance => { instance.setOptions({ buttonTheme: [ { class: "myCustomClass", buttons: "Q" } ] }) }); expect(true).toBe(false); } catch (e) { expect(e.message).toBe("INSTANCES_VAR_ERROR"); } }); it('Keyboard addButtonTheme will work', () => { testUtil.setDOM(); let keyboard = new Keyboard(); let returnVal = keyboard.addButtonTheme("q", "test"); expect(keyboard.options.buttonTheme[0].class).toBe("test"); }); it('Keyboard addButtonTheme will not work without params', () => { testUtil.setDOM(); let keyboard = new Keyboard(); let returnVal = keyboard.addButtonTheme(); expect(returnVal).toBeFalsy(); }); it('Keyboard addButtonTheme will amend a buttonTheme', () => { testUtil.setDOM(); let keyboard = new Keyboard({ buttonTheme: [ { class: "test", buttons: "s" } ] }); keyboard.addButtonTheme("q", "test"); expect(keyboard.options.buttonTheme[0].class).toBe("test"); }); it('Keyboard addButtonTheme will create a buttonTheme', () => { testUtil.setDOM(); let keyboard = new Keyboard({ buttonTheme: [ { class: "blurb", buttons: "s" } ] }); keyboard.addButtonTheme("q", "test"); expect(keyboard.options.buttonTheme[1].class).toBe("test"); }); it('Keyboard addButtonTheme will ignore a repeated buttonTheme', () => { testUtil.setDOM(); let keyboard = new Keyboard({ buttonTheme: [ { class: "test", buttons: "s a" } ] }); keyboard.addButtonTheme("a", "test"); expect(keyboard.options.buttonTheme[0].buttons).toBe("s a"); }); it('Keyboard addButtonTheme will amend a buttonTheme', () => { testUtil.setDOM(); let keyboard = new Keyboard({ buttonTheme: [ { class: "test", buttons: "s" } ] }); keyboard.addButtonTheme("q", "test"); expect(keyboard.options.buttonTheme[0].buttons).toBe("s q"); }); it('Keyboard removeButtonTheme without params will remove all button themes', () => { testUtil.setDOM(); let keyboard = new Keyboard({ buttonTheme: [ { class: "test", buttons: "s" } ] }); keyboard.removeButtonTheme(); expect(keyboard.options.buttonTheme.length).toBe(0); }); it('Keyboard removeButtonTheme will work', () => { testUtil.setDOM(); let keyboard = new Keyboard({ buttonTheme: [ { class: "test", buttons: "s" } ] }); keyboard.removeButtonTheme("s", "test"); expect(keyboard.options.buttonTheme.length).toBe(0); }); it('Keyboard removeButtonTheme will work wihtout a class', () => { testUtil.setDOM(); let keyboard = new Keyboard({ buttonTheme: [ { class: "test", buttons: "s" } ] }); keyboard.removeButtonTheme("s"); expect(keyboard.options.buttonTheme.length).toBe(0); }); it('Keyboard removeButtonTheme will do nothing without a button param', () => { testUtil.setDOM(); let keyboard = new Keyboard({ buttonTheme: [ { class: "test", buttons: "s" } ] }); keyboard.removeButtonTheme(null, "test"); expect(keyboard.options.buttonTheme.length).toBe(1); }); it('Keyboard removeButtonTheme does nothing if req button doesnt have a buttonTheme', () => { testUtil.setDOM(); let keyboard = new Keyboard({ buttonTheme: [ { class: "test", buttons: "a" } ] }); keyboard.removeButtonTheme("s", "test"); expect(keyboard.options.buttonTheme.length).toBe(1); }); it('Keyboard removeButtonTheme does nothing if buttonTheme class does not exist', () => { testUtil.setDOM(); let keyboard = new Keyboard({ buttonTheme: [ { class: "testy", buttons: "a" } ] }); keyboard.removeButtonTheme("a", "test"); expect(keyboard.options.buttonTheme.length).toBe(1); }); it('Keyboard removeButtonTheme does nothing if buttonTheme doesnt have the requested buttons', () => { testUtil.setDOM(); let keyboard = new Keyboard({ buttonTheme: [ { class: "test", buttons: "a b c d e f" } ] }); keyboard.removeButtonTheme("g", "test"); expect(keyboard.options.buttonTheme[0].buttons).toBe("a b c d e f"); }); it('Keyboard getButtonElement will not return anything if empty match', () => { testUtil.setDOM(); let keyboard = new Keyboard({ layout: { default: [ "{//} {button} d", "a b c d e f g h i j", ] } }); expect(keyboard.getButtonElement("{waldo}")).toBeFalsy(); }); it('Keyboard getButtonElement will return multiple matched buttons', () => { testUtil.setDOM(); let keyboard = new Keyboard(); expect(keyboard.getButtonElement("{shift}").length).toBe(2); }); it('Keyboard will receive physical keyboard events', () => { testUtil.setDOM(); new Keyboard({ debug: true, physicalKeyboardHighlight: true }); document.dispatchEvent(new KeyboardEvent('keyup', { charCode: 0, code: "KeyF", key: "f", which: 70, target: { tagName: "input" } })); }); it('Keyboard caretEventHandler will detect input, textarea focus', () => { testUtil.setDOM(); let keyboard = new Keyboard(); keyboard.caretEventHandler({ charCode: 0, code: "KeyF", key: "f", which: 70, target: { tagName: "input", selectionStart: 3 } }); expect(keyboard.caretPosition).toBe(3); }); it('Keyboard caretEventHandler ignore positioning if input, textarea is blur', () => { testUtil.setDOM(); let keyboard = new Keyboard(); keyboard.caretEventHandler({ charCode: 0, code: "KeyF", key: "f", which: 70, target: { tagName: "div", selectionStart: 4 } }); expect(keyboard.caretPosition).toBeFalsy(); }); it('Keyboard caretEventHandler will work with debug', () => { testUtil.setDOM(); let keyboard = new Keyboard({ debug: true }); keyboard.caretEventHandler({ charCode: 0, code: "KeyF", key: "f", which: 70, target: { tagName: "input", selectionStart: 3 } }); expect(keyboard.caretPosition).toBe(3); }); it('Keyboard onInit will work', () => { testUtil.setDOM(); let passed = false; let keyboard = new Keyboard({ onInit: () => { passed = true } }); expect(passed).toBeTruthy(); }); it('Keyboard onRender will work', () => { testUtil.setDOM(); let passed = false; let keyboard = new Keyboard({ onRender: () => { passed = true } }); expect(passed).toBeTruthy(); }); it('Keyboard buttonTheme that is invalid will be ignored and not throw', () => { testUtil.setDOM(); let keyboard = new Keyboard({ buttonTheme: [ { class: null, buttons: null } ] }); }); it('Keyboard buttonTheme buttons that are invalid will be ignored and not throw', () => { testUtil.setDOM(); let keyboard = new Keyboard({ buttonTheme: [ { class: null, buttons: undefined } ] }); }); it('Keyboard buttonTheme will be ignored if buttons param not a string', () => { testUtil.setDOM(); new Keyboard({ buttonTheme: [ { class: "test", buttons: { wrong: true } } ] }); }); it('Keyboard buttonTheme will be ignored if already added', () => { testUtil.setDOM(); let keyboard = new Keyboard({ buttonTheme: [ { class: "test", buttons: "a b c" }, { class: "test", buttons: "c" }, { class: "anotherclass", buttons: "c" }, { class: "yetAnotherclass", buttons: "c" }, { class: "anotherclass", buttons: "c" }, ] }); }); it('Keyboard can set a module', () => { testUtil.setDOM(); let keyboard = new Keyboard(); keyboard.registerModule( "test", (module) => { module.foo = "bar"; } ); expect(keyboard.getModuleProp("test", "foo")).toBe("bar"); }); it('Keyboard can set a module by amending the modules tree', () => { testUtil.setDOM(); let keyboard = new Keyboard(); keyboard.modules = { testman: { foo: "baz" } }; keyboard.registerModule( "test", (module) => { module.foo = "bar"; } ); expect(keyboard.getModuleProp("test", "foo")).toBe("bar"); }); it('Keyboard will not retrieve an option for an inexistent module', () => { testUtil.setDOM(); let keyboard = new Keyboard(); expect(keyboard.getModuleProp("test", "foo")).toBeFalsy(); }); it('Keyboard will get a list of modules', () => { testUtil.setDOM(); let keyboard = new Keyboard(); keyboard.registerModule( "test", (module) => { module.foo = "bar"; } ); expect(keyboard.getModulesList()).toBe(["test"]); });