summaryrefslogtreecommitdiff
path: root/tests/qunit/suites/resources/jquery/jquery.byteLimit.test.js
diff options
context:
space:
mode:
Diffstat (limited to 'tests/qunit/suites/resources/jquery/jquery.byteLimit.test.js')
-rw-r--r--tests/qunit/suites/resources/jquery/jquery.byteLimit.test.js187
1 files changed, 187 insertions, 0 deletions
diff --git a/tests/qunit/suites/resources/jquery/jquery.byteLimit.test.js b/tests/qunit/suites/resources/jquery/jquery.byteLimit.test.js
new file mode 100644
index 00000000..3346c2d5
--- /dev/null
+++ b/tests/qunit/suites/resources/jquery/jquery.byteLimit.test.js
@@ -0,0 +1,187 @@
+( function () {
+
+module( 'jquery.byteLimit', QUnit.newMwEnvironment() );
+
+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) );
+ }
+ }
+};
+
+/**
+ * Test factory for $.fn.byteLimit
+ *
+ * @param $input {jQuery} jQuery object in an input element
+ * @param hasLimit {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: '',
+ hasLimit: false,
+ expected: '',
+ limit: null
+ }, options);
+
+ test( opt.description, function() {
+
+ opt.$input.appendTo( '#qunit-fixture' );
+
+ // Simulate pressing keys for each of the sample characters
+ $.addChars( opt.$input, opt.sample );
+ var rawVal = opt.$input.val(),
+ fn = opt.$input.data( 'byteLimit-callback' ),
+ newVal = $.isFunction( fn ) ? fn( rawVal ) : rawVal;
+
+ if ( opt.hasLimit ) {
+ expect(3);
+
+ ltOrEq( $.byteLength( newVal ), opt.limit, 'Prevent keypresses after byteLimit was reached, length never exceeded the limit' );
+ equal( $.byteLength( rawVal ), $.byteLength( opt.expected ), 'Not preventing keypresses too early, length has reached the expected length' );
+ equal( rawVal, opt.expected, 'New value matches the expected string' );
+
+ } else {
+ expect(2);
+ equal( newVal, opt.expected, 'New value matches the expected string' );
+ equal( $.byteLength( newVal ), $.byteLength( opt.expected ), 'Unlimited scenarios are not affected, expected length reached' );
+ }
+ } );
+};
+
+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,
+ hasLimit: false,
+ expected: simpleSample
+});
+
+byteLimitTest({
+ description: 'Limit using the maxlength attribute',
+ $input: $( '<input>' )
+ .attr( 'type', 'text' )
+ .prop( 'maxLength', '10' )
+ .byteLimit(),
+ sample: simpleSample,
+ hasLimit: true,
+ limit: 10,
+ expected: '1234567890'
+});
+
+byteLimitTest({
+ description: 'Limit using a custom value',
+ $input: $( '<input>' )
+ .attr( 'type', 'text' )
+ .byteLimit( 10 ),
+ sample: simpleSample,
+ hasLimit: true,
+ limit: 10,
+ expected: '1234567890'
+});
+
+byteLimitTest({
+ description: 'Limit using a custom value, overriding maxlength attribute',
+ $input: $( '<input>' )
+ .attr( 'type', 'text' )
+ .prop( 'maxLength', '10' )
+ .byteLimit( 15 ),
+ sample: simpleSample,
+ hasLimit: true,
+ limit: 15,
+ expected: '123456789012345'
+});
+
+byteLimitTest({
+ description: 'Limit using a custom value (multibyte)',
+ $input: $( '<input>' )
+ .attr( 'type', 'text' )
+ .byteLimit( 14 ),
+ sample: mbSample,
+ hasLimit: true,
+ limit: 14,
+ expected: '1234567890' + U_20AC + '1'
+});
+
+byteLimitTest({
+ description: 'Limit using a custom value (multibyte) overlapping a byte',
+ $input: $( '<input>' )
+ .attr( 'type', 'text' )
+ .byteLimit( 12 ),
+ sample: mbSample,
+ hasLimit: true,
+ limit: 12,
+ expected: '1234567890' + '12'
+});
+
+byteLimitTest({
+ description: 'Pass the limit and a callback as input filter',
+ $input: $( '<input>' )
+ .attr( 'type', 'text' )
+ .byteLimit( 6, function( val ) {
+ // Invalid title
+ if ( val == '' ) {
+ return '';
+ }
+
+ // Return without namespace prefix
+ return new mw.Title( '' + val ).getMain();
+ } ),
+ sample: 'User:Sample',
+ hasLimit: true,
+ limit: 6, // 'Sample' length
+ expected: 'User:Sample'
+});
+
+byteLimitTest({
+ description: 'Limit using the maxlength attribute and pass a callback as input filter',
+ $input: $( '<input>' )
+ .attr( 'type', 'text' )
+ .prop( 'maxLength', '6' )
+ .byteLimit( function( val ) {
+ // Invalid title
+ if ( val === '' ) {
+ return '';
+ }
+
+ // Return without namespace prefix
+ return new mw.Title( '' + val ).getMain();
+ } ),
+ sample: 'User:Sample',
+ hasLimit: true,
+ limit: 6, // 'Sample' length
+ expected: 'User:Sample'
+});
+
+}() ); \ No newline at end of file