3
module( 'jquery.byteLimit', QUnit.newMwEnvironment() );
5
test( '-- Initial check', function() {
7
ok( $.fn.byteLimit, 'jQuery.fn.byteLimit defined' );
10
// Basic sendkey-implementation
11
$.addChars = function( $input, charstr ) {
12
var len = charstr.length;
13
for ( var i = 0; i < len; i++ ) {
14
// Keep track of the previous value
15
var prevVal = $input.val();
18
var code = charstr.charCodeAt(i);
20
// Trigger event and undo if prevented
21
var event = new jQuery.Event( 'keypress', { keyCode: code, which: code, charCode: code } );
22
$input.trigger( event );
23
if ( !event.isDefaultPrevented() ) {
24
$input.val( prevVal + charstr.charAt(i) );
30
* Test factory for $.fn.byteLimit
32
* @param $input {jQuery} jQuery object in an input element
33
* @param hasLimit {Boolean} Wether a limit should apply at all
34
* @param limit {Number} Limit (if used) otherwise undefined
35
* The limit should be less than 20 (the sample data's length)
37
var byteLimitTest = function( options ) {
47
test( opt.description, function() {
49
opt.$input.appendTo( '#qunit-fixture' );
51
// Simulate pressing keys for each of the sample characters
52
$.addChars( opt.$input, opt.sample );
53
var rawVal = opt.$input.val(),
54
fn = opt.$input.data( 'byteLimit-callback' ),
55
newVal = $.isFunction( fn ) ? fn( rawVal ) : rawVal;
60
ltOrEq( $.byteLength( newVal ), opt.limit, 'Prevent keypresses after byteLimit was reached, length never exceeded the limit' );
61
equal( $.byteLength( rawVal ), $.byteLength( opt.expected ), 'Not preventing keypresses too early, length has reached the expected length' );
62
equal( rawVal, opt.expected, 'New value matches the expected string' );
66
equal( newVal, opt.expected, 'New value matches the expected string' );
67
equal( $.byteLength( newVal ), $.byteLength( opt.expected ), 'Unlimited scenarios are not affected, expected length reached' );
73
// Simple sample (20 chars, 20 bytes)
74
simpleSample = '12345678901234567890',
76
// 3 bytes (euro-symbol)
79
// Multi-byte sample (22 chars, 26 bytes)
80
mbSample = '1234567890' + U_20AC + '1234567890' + U_20AC;
83
description: 'Plain text input',
84
$input: $( '<input>' )
85
.attr( 'type', 'text' ),
88
expected: simpleSample
92
description: 'Limit using the maxlength attribute',
93
$input: $( '<input>' )
94
.attr( 'type', 'text' )
95
.prop( 'maxLength', '10' )
100
expected: '1234567890'
104
description: 'Limit using a custom value',
105
$input: $( '<input>' )
106
.attr( 'type', 'text' )
108
sample: simpleSample,
111
expected: '1234567890'
115
description: 'Limit using a custom value, overriding maxlength attribute',
116
$input: $( '<input>' )
117
.attr( 'type', 'text' )
118
.prop( 'maxLength', '10' )
120
sample: simpleSample,
123
expected: '123456789012345'
127
description: 'Limit using a custom value (multibyte)',
128
$input: $( '<input>' )
129
.attr( 'type', 'text' )
134
expected: '1234567890' + U_20AC + '1'
138
description: 'Limit using a custom value (multibyte) overlapping a byte',
139
$input: $( '<input>' )
140
.attr( 'type', 'text' )
145
expected: '1234567890' + '12'
149
description: 'Pass the limit and a callback as input filter',
150
$input: $( '<input>' )
151
.attr( 'type', 'text' )
152
.byteLimit( 6, function( val ) {
158
// Return without namespace prefix
159
return new mw.Title( '' + val ).getMain();
161
sample: 'User:Sample',
163
limit: 6, // 'Sample' length
164
expected: 'User:Sample'
168
description: 'Limit using the maxlength attribute and pass a callback as input filter',
169
$input: $( '<input>' )
170
.attr( 'type', 'text' )
171
.prop( 'maxLength', '6' )
172
.byteLimit( function( val ) {
178
// Return without namespace prefix
179
return new mw.Title( '' + val ).getMain();
181
sample: 'User:Sample',
183
limit: 6, // 'Sample' length
184
expected: 'User:Sample'
b'\\ No newline at end of file'