node-red-contrib-snap4city-user
Version:
Nodes for Snap4city project, targeted to standard user (no developer)
978 lines (906 loc) • 19.8 kB
JavaScript
/*jshint camelcase:true, plusplus:true, forin:true, noarg:true, noempty:true, eqeqeq:true, bitwise:true, strict:true, undef:true, unused:true, curly:true, browser:true, devel:true, maxerr:100, white:false, onevar:false */
/*global jQuery:true $:true */
(function ($, undefined) {
"use strict";
$(document).ready(function () {
module("key-sequence", {
setup: function () {
tests.testSetup();
$(document).on("simulate-keySequence", '#qunit-fixture', tests.assertExpectedEvent);
},
teardown: function () {
$(document).off("simulate-keySequence", '#qunit-fixture');
tests.testTearDown();
}
});
//####### Test Functions #######
test("simple sequence", function () {
var $testElement = $('#textInput');
var testSequence = "fO0BaR1";
tests.expectedEvents = [
/* f */
{
type: "keydown",
keyCode: 70
}, {
type: "keypress",
which: "f".charCodeAt(0)
}, {
type: "keyup",
keyCode: 70
},
/* O */
{
type: "keydown",
keyCode: 79
}, {
type: "keypress",
which: "O".charCodeAt(0)
}, {
type: "keyup",
keyCode: 79
},
/* 0 */
{
type: "keydown",
keyCode: 48
}, {
type: "keypress",
which: "0".charCodeAt(0)
}, {
type: "keyup",
keyCode: 48
},
/* B */
{
type: "keydown",
keyCode: 66
}, {
type: "keypress",
which: "B".charCodeAt(0)
}, {
type: "keyup",
keyCode: 66
},
/* a */
{
type: "keydown",
keyCode: 65
}, {
type: "keypress",
which: "a".charCodeAt(0)
}, {
type: "keyup",
keyCode: 65
},
/* R */
{
type: "keydown",
keyCode: 82
}, {
type: "keypress",
which: "R".charCodeAt(0)
}, {
type: "keyup",
keyCode: 82
},
/* 1 */
{
type: "keydown",
keyCode: 49
}, {
type: "keypress",
which: "1".charCodeAt(0)
}, {
type: "keyup",
keyCode: 49
},
{
type: "simulate-keySequence",
sequence: testSequence
}
];
$testElement.simulate("key-sequence", {
sequence: testSequence
});
strictEqual($testElement.val(), testSequence, "Verify result of sequence");
});
test("sequence callback", function () {
var $testElement = $('#textInput');
var testSequence = "test";
tests.expectedEvents = [
/* t */
{
type: "keydown",
keyCode: 84
}, {
type: "keypress",
which: "t".charCodeAt(0)
}, {
type: "keyup",
keyCode: 84
},
/* e */
{
type: "keydown",
keyCode: 69
}, {
type: "keypress",
which: "e".charCodeAt(0)
}, {
type: "keyup",
keyCode: 69
},
/* s */
{
type: "keydown",
keyCode: 83
}, {
type: "keypress",
which: "s".charCodeAt(0)
}, {
type: "keyup",
keyCode: 83
},
/* t */
{
type: "keydown",
keyCode: 84
}, {
type: "keypress",
which: "t".charCodeAt(0)
}, {
type: "keyup",
keyCode: 84
},
{
type: "simulate-keySequence",
sequence: testSequence
},
{
type: "callback"
}
];
$testElement.simulate("key-sequence", {
sequence: testSequence,
callback: function () {
tests.assertExpectedEvent({
type: "callback"
});
}
});
});
test("no events", function () {
var $testElement = $('#textInput');
var testSequence = "fO0BaR1";
tests.expectedEvents = [{
type: "simulate-keySequence",
sequence: testSequence
}];
$testElement.simulate("key-sequence", {
sequence: testSequence,
triggerKeyEvents: false
});
strictEqual($testElement.val(), testSequence, "Verify result of sequence");
});
test("special characters", function () {
var $testElement = $('#textInput');
var testSequence = "_-.,;:+!?";
tests.expectedEvents = [
/* _ */
{
type: "keydown",
keyCode: 189
}, {
type: "keypress",
which: "_".charCodeAt(0)
}, {
type: "keyup",
keyCode: 189
},
/* - */
{
type: "keydown",
keyCode: 189
}, {
type: "keypress",
which: "-".charCodeAt(0)
}, {
type: "keyup",
keyCode: 189
},
/* . */
{
type: "keydown",
keyCode: 190
}, {
type: "keypress",
which: ".".charCodeAt(0)
}, {
type: "keyup",
keyCode: 190
},
/* , */
{
type: "keydown",
keyCode: 188
}, {
type: "keypress",
which: ",".charCodeAt(0)
}, {
type: "keyup",
keyCode: 188
},
/* ; */
{
type: "keydown",
keyCode: 186
}, {
type: "keypress",
which: ";".charCodeAt(0)
}, {
type: "keyup",
keyCode: 186
},
/* : */
{
type: "keydown",
keyCode: 186
}, {
type: "keypress",
which: ":".charCodeAt(0)
}, {
type: "keyup",
keyCode: 186
},
/* + */
{
type: "keydown",
keyCode: 187
}, {
type: "keypress",
which: "+".charCodeAt(0)
}, {
type: "keyup",
keyCode: 187
},
/* ! */
{
type: "keydown",
keyCode: 49
}, {
type: "keypress",
which: "!".charCodeAt(0)
}, {
type: "keyup",
keyCode: 49
},
/* ? */
{
type: "keydown",
keyCode: 191
}, {
type: "keypress",
which: "?".charCodeAt(0)
}, {
type: "keyup",
keyCode: 191
},
{
type: "simulate-keySequence",
sequence: testSequence
}
];
$testElement.simulate("key-sequence", {
sequence: testSequence
});
});
test("special sequences", function () {
var $testElement = $('#textInput');
var testSequence = "as{selectall}{del}f{leftarrow}{{}b{rightarrow}{backspace}";
tests.expectedEvents = [
/* a */
{
type: "keydown",
keyCode: 65
}, {
type: "keypress",
which: "a".charCodeAt(0)
}, {
type: "keyup",
keyCode: 65
},
/* s */
{
type: "keydown",
keyCode: 83
}, {
type: "keypress",
which: "s".charCodeAt(0)
}, {
type: "keyup",
keyCode: 83
},
/* {del} */
{
type: "keydown",
keyCode: 46
}, {
type: "keyup",
keyCode: 46
},
/* f */
{
type: "keydown",
keyCode: 70
}, {
type: "keypress",
which: "f".charCodeAt(0)
}, {
type: "keyup",
keyCode: 70
},
/* {leftarrow} */
{
type: "keydown",
keyCode: 37
}, {
type: "keyup",
keyCode: 37
},
/* { */
{
type: "keydown",
keyCode: 219
}, {
type: "keypress",
which: "{".charCodeAt(0)
}, {
type: "keyup",
keyCode: 219
},
/* b */
{
type: "keydown",
keyCode: 66
}, {
type: "keypress",
which: "b".charCodeAt(0)
}, {
type: "keyup",
keyCode: 66
},
/* {rightarrow} */
{
type: "keydown",
keyCode: 39
}, {
type: "keyup",
keyCode: 39
},
/* {backspace} */
{
type: "keydown",
keyCode: 8
}, {
type: "keyup",
keyCode: 8
},
{
type: "simulate-keySequence",
sequence: testSequence
}
];
$testElement.simulate("key-sequence", {
sequence: testSequence
});
strictEqual($testElement.val(), "{b", "Verify result of sequence (this is known to fail in IE)");
});
test("line break", function () {
var $testElement = $('#textInput');
var testSequence = "foo{enter}bar";
tests.expectedEvents = [
/* f */
{
type: "keydown",
keyCode: 70
}, {
type: "keypress",
which: "f".charCodeAt(0)
}, {
type: "keyup",
keyCode: 70
},
/* o */
{
type: "keydown",
keyCode: 79
}, {
type: "keypress",
which: "o".charCodeAt(0)
}, {
type: "keyup",
keyCode: 79
},
/* o */
{
type: "keydown",
keyCode: 79
}, {
type: "keypress",
which: "o".charCodeAt(0)
}, {
type: "keyup",
keyCode: 79
},
/* {enter} */
{
type: "keydown",
keyCode: 13
}, {
type: "keypress",
which: 13
}, {
type: "keyup",
keyCode: 13
},
/* b */
{
type: "keydown",
keyCode: 66
}, {
type: "keypress",
which: "b".charCodeAt(0)
}, {
type: "keyup",
keyCode: 66
},
/* a */
{
type: "keydown",
keyCode: 65
}, {
type: "keypress",
which: "a".charCodeAt(0)
}, {
type: "keyup",
keyCode: 65
},
/* r */
{
type: "keydown",
keyCode: 82
}, {
type: "keypress",
which: "r".charCodeAt(0)
}, {
type: "keyup",
keyCode: 82
},
{
type: "simulate-keySequence",
sequence: testSequence
}
];
$testElement.simulate("key-sequence", {
sequence: testSequence
});
strictEqual($testElement.val(), "foo\nbar", "Verify result of sequence (this is known to fail in Opera on Windows)");
});
test("delay", function () {
var $testElement = $('#textInput');
var keyDelay = 100,
testSequence = "test",
lastEventOccurrence;
tests.expectedEvents = [
/* t */
{
type: "keydown",
keyCode: 84
}, {
type: "keypress",
which: "t".charCodeAt(0)
}, {
type: "keyup",
keyCode: 84
},
/* e */
{
type: "keydown",
keyCode: 69
}, {
type: "keypress",
which: "e".charCodeAt(0)
}, {
type: "keyup",
keyCode: 69
},
/* s */
{
type: "keydown",
keyCode: 83
}, {
type: "keypress",
which: "s".charCodeAt(0)
}, {
type: "keyup",
keyCode: 83
},
/* t */
{
type: "keydown",
keyCode: 84
}, {
type: "keypress",
which: "t".charCodeAt(0)
}, {
type: "keyup",
keyCode: 84
},
{
type: "simulate-keySequence",
sequence: testSequence
}
];
// Unbind "normal" assertExpectedEvent function and replace with a fuzzy variant of it
function assertExpectedEventDelay(event) {
var delay = Date.now() - lastEventOccurrence;
ok(delay >= keyDelay - 10, "Verify events occur delayed (delay: " + delay + ")"); // keyDelay-10 means tolerance of 10ms
for (var prop in tests.expectedEvents[0]) {
if (tests.expectedEvents[0].hasOwnProperty(prop)) {
strictEqual(event[prop], tests.expectedEvents[0][prop], "Comparing " + prop + " (expected: " + tests.expectedEvents[0][prop] + ")");
}
}
if (event.type === tests.expectedEvents[0].type) {
tests.expectedEvents.shift();
}
lastEventOccurrence = Date.now();
}
$(document).off("keydown", "#qunit-fixture", tests.assertExpectedEvent).on("keydown", "#qunit-fixture", assertExpectedEventDelay);
stop();
lastEventOccurrence = Date.now() - keyDelay; // The first key simulated without delay
$testElement.simulate("key-sequence", {
sequence: testSequence,
delay: keyDelay
});
setTimeout(function () {
start();
}, (testSequence.length + 2) * keyDelay);
});
test("simple sequence with eventProps", function () {
var $testElement = $('#textInput');
var testSequence = "test",
customProp = "test!";
tests.expectedEvents = [
/* t */
{
type: "keydown",
keyCode: 84,
myCustomProp: customProp
},
{
type: "keypress",
which: "t".charCodeAt(0),
myCustomProp: customProp
},
{
type: "keyup",
keyCode: 84,
myCustomProp: customProp
},
/* e */
{
type: "keydown",
keyCode: 69,
myCustomProp: customProp
},
{
type: "keypress",
which: "e".charCodeAt(0),
myCustomProp: customProp
},
{
type: "keyup",
keyCode: 69,
myCustomProp: customProp
},
/* s */
{
type: "keydown",
keyCode: 83,
myCustomProp: customProp
},
{
type: "keypress",
which: "s".charCodeAt(0),
myCustomProp: customProp
},
{
type: "keyup",
keyCode: 83,
myCustomProp: customProp
},
/* t */
{
type: "keydown",
keyCode: 84,
myCustomProp: customProp
},
{
type: "keypress",
which: "t".charCodeAt(0),
myCustomProp: customProp
},
{
type: "keyup",
keyCode: 84,
myCustomProp: customProp
},
{
type: "simulate-keySequence",
sequence: testSequence
}
];
$testElement.simulate("key-sequence", {
sequence: testSequence,
eventProps: {
jQueryTrigger: true,
myCustomProp: customProp
}
});
strictEqual($testElement.val(), testSequence, "Verify result of sequence");
});
test("simple sequence with eventProps without jQueryTrigger", function () {
var $testElement = $('#textInput');
var testSequence = "test",
customProp = "test!";
tests.expectedEvents = [
/* t */
{
type: "keydown",
keyCode: 84,
myCustomProp: undefined
},
{
type: "keypress",
which: "t".charCodeAt(0),
myCustomProp: undefined
},
{
type: "keyup",
keyCode: 84,
myCustomProp: undefined
},
/* e */
{
type: "keydown",
keyCode: 69,
myCustomProp: undefined
},
{
type: "keypress",
which: "e".charCodeAt(0),
myCustomProp: undefined
},
{
type: "keyup",
keyCode: 69,
myCustomProp: undefined
},
/* s */
{
type: "keydown",
keyCode: 83,
myCustomProp: undefined
},
{
type: "keypress",
which: "s".charCodeAt(0),
myCustomProp: undefined
},
{
type: "keyup",
keyCode: 83,
myCustomProp: undefined
},
/* t */
{
type: "keydown",
keyCode: 84,
myCustomProp: undefined
},
{
type: "keypress",
which: "t".charCodeAt(0),
myCustomProp: undefined
},
{
type: "keyup",
keyCode: 84,
myCustomProp: undefined
},
{
type: "simulate-keySequence",
sequence: testSequence
}
];
$testElement.simulate("key-sequence", {
sequence: testSequence,
eventProps: {
jQueryTrigger: false,
myCustomProp: customProp
}
});
strictEqual($testElement.val(), testSequence, "Verify result of sequence");
});
// See issue #6 (https://github.com/j-ulrich/jquery-simulate-ext/issues/6)
test("delay, spaces in sequence, non-input element", function () {
var $testElement = $('#emptyDiv');
var keyDelay = 5,
testSequence = "a b c";
tests.expectedEvents = [
/* a */
{
type: "keydown",
keyCode: 65
}, {
type: "keypress",
which: "a".charCodeAt(0)
}, {
type: "keyup",
keyCode: 65
},
/* */
{
type: "keydown",
keyCode: 32
}, {
type: "keypress",
which: " ".charCodeAt(0)
}, {
type: "keyup",
keyCode: 32
},
/* b */
{
type: "keydown",
keyCode: 66
}, {
type: "keypress",
which: "b".charCodeAt(0)
}, {
type: "keyup",
keyCode: 66
},
/* */
{
type: "keydown",
keyCode: 32
}, {
type: "keypress",
which: " ".charCodeAt(0)
}, {
type: "keyup",
keyCode: 32
},
/* c */
{
type: "keydown",
keyCode: 67
}, {
type: "keypress",
which: "c".charCodeAt(0)
}, {
type: "keyup",
keyCode: 67
},
{
type: "simulate-keySequence",
sequence: testSequence
}
];
stop();
$testElement.simulate("key-sequence", {
sequence: testSequence,
delay: keyDelay,
callback: function () {
strictEqual($testElement.text(), testSequence, "Verify result of sequence");
start();
}
});
});
//####### Quirk Detection Tests #######
module("quirk-detection", {
});
asyncTest("quirk detection", 1, function () {
setTimeout(function () {
var iFrameWin = window.frames[0],
iFrameDoc = iFrameWin.document,
scriptLoadTimeout = 100;
$.Deferred(function (dfd) {
var jquery = iFrameDoc.createElement('script');
jquery.src = "../bower_components/jquery/dist/jquery.min.js";
iFrameDoc.body.appendChild(jquery);
setTimeout(dfd.resolve, scriptLoadTimeout);
}).pipe(function () {
return $.Deferred(function (dfd) {
var bililiteRange = iFrameDoc.createElement('script');
bililiteRange.src = "../libs/bililiteRange.js";
iFrameDoc.body.appendChild(bililiteRange);
setTimeout(dfd.resolve, scriptLoadTimeout);
});
}).pipe(function () {
return $.Deferred(function (dfd) {
var jquerySimulate = iFrameDoc.createElement('script');
jquerySimulate.src = "../libs/jquery.simulate.js";
iFrameDoc.body.appendChild(jquerySimulate);
setTimeout(dfd.resolve, scriptLoadTimeout);
});
}).pipe(function () {
return $.Deferred(function (dfd) {
var simulateExt = iFrameDoc.createElement('script');
simulateExt.src = "../src/jquery.simulate.ext.js";
iFrameDoc.body.appendChild(simulateExt);
setTimeout(dfd.resolve, scriptLoadTimeout);
});
}).pipe(function () {
return $.Deferred(function (dfd) {
var simulateExtKeySequence = iFrameDoc.createElement('script');
simulateExtKeySequence.src = "../src/jquery.simulate.key-sequence.js";
iFrameDoc.body.appendChild(simulateExtKeySequence);
setTimeout(dfd.resolve, scriptLoadTimeout);
});
}).pipe(function () {
notStrictEqual(window.frames[0].jQuery.simulate.prototype.quirks.delayedSpacesInNonInputGlitchToEnd, undefined, "Quirk detection was executed");
start();
});
}, 1000);
});
// See issue #9 (https://github.com/j-ulrich/jquery-simulate-ext/issues/9)
asyncTest("disable quirk detection", 1, function () {
setTimeout(function () {
var iFrameWin = window.frames[0],
iFrameDoc = iFrameWin.document,
scriptLoadTimeout = 100;
$.Deferred(function (dfd) {
var jquery = iFrameDoc.createElement('script');
jquery.src = "../bower_components/jquery/dist/jquery.min.js";
iFrameDoc.body.appendChild(jquery);
setTimeout(dfd.resolve, scriptLoadTimeout);
}).pipe(function () {
return $.Deferred(function (dfd) {
var bililiteRange = iFrameDoc.createElement('script');
bililiteRange.src = "../libs/bililiteRange.js";
iFrameDoc.body.appendChild(bililiteRange);
setTimeout(dfd.resolve, scriptLoadTimeout);
});
}).pipe(function () {
return $.Deferred(function (dfd) {
var jquerySimulate = iFrameDoc.createElement('script');
jquerySimulate.src = "../libs/jquery.simulate.js";
iFrameDoc.body.appendChild(jquerySimulate);
setTimeout(dfd.resolve, scriptLoadTimeout);
});
}).pipe(function () {
window.frames[0].jQuery.simulate.ext_disableQuirkDetection = true;
return $.Deferred(function (dfd) {
var simulateExt = iFrameDoc.createElement('script');
simulateExt.src = "../src/jquery.simulate.ext.js";
iFrameDoc.body.appendChild(simulateExt);
setTimeout(dfd.resolve, scriptLoadTimeout);
});
}).pipe(function () {
return $.Deferred(function (dfd) {
var simulateExtKeySequence = iFrameDoc.createElement('script');
simulateExtKeySequence.src = "../src/jquery.simulate.key-sequence.js";
iFrameDoc.body.appendChild(simulateExtKeySequence);
setTimeout(dfd.resolve, scriptLoadTimeout);
});
}).pipe(function () {
strictEqual(window.frames[0].jQuery.simulate.prototype.quirks.delayedSpacesInNonInputGlitchToEnd, undefined, "Quirk detection was disabled");
start();
});
}, 1000);
});
});
}(jQuery));