summaryrefslogtreecommitdiff
path: root/tests/qunit/suites/resources/jquery/jquery.byteLimit.js
diff options
context:
space:
mode:
Diffstat (limited to 'tests/qunit/suites/resources/jquery/jquery.byteLimit.js')
-rw-r--r--tests/qunit/suites/resources/jquery/jquery.byteLimit.js155
1 files changed, 155 insertions, 0 deletions
diff --git a/tests/qunit/suites/resources/jquery/jquery.byteLimit.js b/tests/qunit/suites/resources/jquery/jquery.byteLimit.js
new file mode 100644
index 00000000..461ea49b
--- /dev/null
+++ b/tests/qunit/suites/resources/jquery/jquery.byteLimit.js
@@ -0,0 +1,155 @@
+module( 'jquery.byteLimit.js' );
+
+test( '-- Initial check', function() {
+ expect(1);
+ ok( $.fn.byteLimit, 'jQuery.fn.byteLimit defined' );
+} );
+
+// Basic sendkey-implementation
+$.addChars = function( $input, charstr ) {
+ var len = charstr.length;
+ for ( var i = 0; i < len; i++ ) {
+ // Keep track of the previous value
+ var prevVal = $input.val();
+
+ // Get the key code
+ var code = charstr.charCodeAt(i);
+
+ // Trigger event and undo if prevented
+ var event = new jQuery.Event( 'keypress', { keyCode: code, which: code, charCode: code } );
+ $input.trigger( event );
+ if ( !event.isDefaultPrevented() ) {
+ $input.val( prevVal + charstr.charAt(i) );
+ }
+ }
+};
+var blti = 0;
+/**
+ * Test factory for $.fn.byteLimit
+ *
+ * @param $input {jQuery} jQuery object in an input element
+ * @param useLimit {Boolean} Wether a limit should apply at all
+ * @param limit {Number} Limit (if used) otherwise undefined
+ * The limit should be less than 20 (the sample data's length)
+ */
+var byteLimitTest = function( options ) {
+ var opt = $.extend({
+ description: '',
+ $input: null,
+ sample: '',
+ useLimit: false,
+ expected: 0,
+ limit: null
+ }, options);
+ var i = blti++;
+
+ test( opt.description, function() {
+
+ opt.$input.appendTo( 'body' );
+
+ // Simulate pressing keys for each of the sample characters
+ $.addChars( opt.$input, opt.sample );
+ var newVal = opt.$input.val();
+
+ if ( opt.useLimit ) {
+ expect(2);
+
+ ltOrEq( $.byteLength( newVal ), opt.limit, 'Prevent keypresses after byteLimit was reached, length never exceeded the limit' );
+ equal( $.byteLength( newVal ), opt.expected, 'Not preventing keypresses too early, length has reached the expected length' );
+
+ } else {
+ expect(1);
+ equal( $.byteLength( newVal ), opt.expected, 'Unlimited scenarios are not affected, expected length reached' );
+ }
+
+ opt.$input.remove();
+ } );
+};
+
+var
+ // Simple sample (20 chars, 20 bytes)
+ simpleSample = '12345678901234567890',
+
+ // 3 bytes (euro-symbol)
+ U_20AC = '\u20AC',
+
+ // Multi-byte sample (22 chars, 26 bytes)
+ mbSample = '1234567890' + U_20AC + '1234567890' + U_20AC;
+
+byteLimitTest({
+ description: 'Plain text input',
+ $input: $( '<input>' )
+ .attr( {
+ 'type': 'text'
+ }),
+ sample: simpleSample,
+ useLimit: false,
+ expected: $.byteLength( simpleSample )
+});
+
+byteLimitTest({
+ description: 'Limit using the maxlength attribute',
+ $input: $( '<input>' )
+ .attr( {
+ 'type': 'text',
+ 'maxlength': '10'
+ })
+ .byteLimit(),
+ sample: simpleSample,
+ useLimit: true,
+ limit: 10,
+ expected: 10
+});
+
+byteLimitTest({
+ description: 'Limit using a custom value',
+ $input: $( '<input>' )
+ .attr( {
+ 'type': 'text'
+ })
+ .byteLimit( 10 ),
+ sample: simpleSample,
+ useLimit: true,
+ limit: 10,
+ expected: 10
+});
+
+byteLimitTest({
+ description: 'Limit using a custom value, overriding maxlength attribute',
+ $input: $( '<input>' )
+ .attr( {
+ 'type': 'text',
+ 'maxLength': '10'
+ })
+ .byteLimit( 15 ),
+ sample: simpleSample,
+ useLimit: true,
+ limit: 15,
+ expected: 15
+});
+
+byteLimitTest({
+ description: 'Limit using a custom value (multibyte)',
+ $input: $( '<input>' )
+ .attr( {
+ 'type': 'text'
+ })
+ .byteLimit( 14 ),
+ sample: mbSample,
+ useLimit: true,
+ limit: 14,
+ expected: 14 // (10 x 1-byte char) + (1 x 3-byte char) + (1 x 1-byte char)
+});
+
+byteLimitTest({
+ description: 'Limit using a custom value (multibyte) overlapping a byte',
+ $input: $( '<input>' )
+ .attr( {
+ 'type': 'text'
+ })
+ .byteLimit( 12 ),
+ sample: mbSample,
+ useLimit: true,
+ limit: 12,
+ expected: 12 // 10 x 1-byte char. The next 3-byte char exceeds limit of 12, but 2 more 1-byte chars come in after.
+});