7e28c723102317431533845f11c8facc2c768c62
1 module( 'jquery.byteLimit' );
3 test( '-- Initial check', function() {
5 ok( $.fn
.byteLimit
, 'jQuery.fn.byteLimit defined' );
8 // Basic sendkey-implementation
9 $.addChars = function( $input
, charstr
) {
10 var len
= charstr
.length
;
11 for ( var i
= 0; i
< len
; i
++ ) {
12 // Keep track of the previous value
13 var prevVal
= $input
.val();
16 var code
= charstr
.charCodeAt(i
);
18 // Trigger event and undo if prevented
19 var event
= new jQuery
.Event( 'keypress', { keyCode
: code
, which
: code
, charCode
: code
} );
20 $input
.trigger( event
);
21 if ( !event
.isDefaultPrevented() ) {
22 $input
.val( prevVal
+ charstr
.charAt(i
) );
28 * Test factory for $.fn.byteLimit
30 * @param $input {jQuery} jQuery object in an input element
31 * @param hasLimit {Boolean} Wether a limit should apply at all
32 * @param limit {Number} Limit (if used) otherwise undefined
33 * The limit should be less than 20 (the sample data's length)
35 var byteLimitTest = function( options
) {
45 test( opt
.description
, function() {
47 opt
.$input
.appendTo( 'body' );
49 // Simulate pressing keys for each of the sample characters
50 $.addChars( opt
.$input
, opt
.sample
);
51 var rawVal
= opt
.$input
.val(),
52 fn
= opt
.$input
.data( 'byteLimit-callback' ),
53 newVal
= $.isFunction( fn
) ? fn( rawVal
) : rawVal
;
58 ltOrEq( $.byteLength( newVal
), opt
.limit
, 'Prevent keypresses after byteLimit was reached, length never exceeded the limit' );
59 equal( $.byteLength( rawVal
), $.byteLength( opt
.expected
), 'Not preventing keypresses too early, length has reached the expected length' );
60 equal( rawVal
, opt
.expected
, 'New value matches the expected string' );
64 equal( newVal
, opt
.expected
, 'New value matches the expected string' );
65 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
) {
160 // Return without namespace prefix
161 return new mw
.Title( '' + val
).getMain();
163 sample
: 'User:Sample',
165 limit
: 6, // 'Sample' length
166 expected
: 'User:Sample'
170 description
: 'Limit using the maxlength attribute and pass a callback as input filter',
171 $input
: $( '<input>' )
172 .attr( 'type', 'text' )
173 .prop( 'maxLength', '6' )
174 .byteLimit( function( val
) {
182 // Return without namespace prefix
183 return new mw
.Title( '' + val
).getMain();
185 sample
: 'User:Sample',
187 limit
: 6, // 'Sample' length
188 expected
: 'User:Sample'