wiki.techinc.nl/tests/qunit/suites/resources/jquery/jquery.textSelection.test.js
Ed Sanders e2c4f1ef0d test: Always use strict equalities
Replace assert.(not)ok/(not)equal with strict equality checks:
assert.true/false/(not)strictEqual.

Will be enforced in upcoming eslint-config-wikimedia release.

Change-Id: I4a9523b72834524a4b4e4339d5b175a8346a646c
2021-11-08 21:41:01 +00:00

266 lines
6.1 KiB
JavaScript

( function () {
var caretSample,
sig = {
pre: '--~~~~'
},
bold = {
pre: '\'\'\'',
peri: 'Bold text',
post: '\'\'\''
},
h2 = {
pre: '== ',
peri: 'Heading 2',
post: ' ==',
regex: /^(\s*)(={1,6})(.*?)\2(\s*)$/,
regexReplace: '$1==$3==$4',
ownline: true
},
ulist = {
pre: '* ',
peri: 'Bulleted list item',
post: '',
ownline: true,
splitlines: true
};
QUnit.module( 'jquery.textSelection', QUnit.newMwEnvironment() );
/**
* Test factory for $.fn.textSelection( 'encapsulateText' )
*
* @param {Object} options Associative configuration array
* @param {string} options.description Description
* @param {string} options.input Input
* @param {string} options.output Output
* @param {number} options.start Starting char for selection
* @param {number} options.end Ending char for selection
* @param {Object} options.params Additional parameters for $().textSelection( 'encapsulateText' )
*/
function encapsulateTest( options ) {
var opt = $.extend( {
description: '',
before: {},
after: {},
replace: {}
}, options );
opt.before = $.extend( {
text: '',
start: 0,
end: 0
}, opt.before );
opt.after = $.extend( {
text: '',
selected: null
}, opt.after );
QUnit.test( opt.description, function ( assert ) {
var $textarea, start, end, opts, text, selected;
$textarea = $( '<textarea>' );
$( '#qunit-fixture' ).append( $textarea );
$textarea.textSelection( 'setContents', opt.before.text );
start = opt.before.start;
end = opt.before.end;
// Clone opt.replace
opts = $.extend( {}, opt.replace );
opts.selectionStart = start;
opts.selectionEnd = end;
$textarea.textSelection( 'encapsulateSelection', opts );
text = $textarea.textSelection( 'getContents' ).replace( /\r\n/g, '\n' );
assert.strictEqual( text, opt.after.text, 'Checking full text after encapsulation' );
if ( opt.after.selected !== null ) {
selected = $textarea.textSelection( 'getSelection' );
assert.strictEqual( selected, opt.after.selected, 'Checking selected text after encapsulation.' );
}
} );
}
encapsulateTest( {
description: 'Adding sig to end of text',
before: {
text: 'Wikilove dude! ',
start: 15,
end: 15
},
after: {
text: 'Wikilove dude! --~~~~',
selected: ''
},
replace: sig
} );
encapsulateTest( {
description: 'Adding bold to empty',
before: {
text: '',
start: 0,
end: 0
},
after: {
text: '\'\'\'Bold text\'\'\'',
selected: 'Bold text' // selected because it's the default
},
replace: bold
} );
encapsulateTest( {
description: 'Adding bold to existing text',
before: {
text: 'Now is the time for all good men to come to the aid of their country',
start: 20,
end: 32
},
after: {
text: 'Now is the time for \'\'\'all good men\'\'\' to come to the aid of their country',
selected: '' // empty because it's not the default'
},
replace: bold
} );
encapsulateTest( {
description: 'ownline option: adding new h2',
before: {
text: 'Before\nAfter',
start: 7,
end: 7
},
after: {
text: 'Before\n== Heading 2 ==\nAfter',
selected: 'Heading 2'
},
replace: h2
} );
encapsulateTest( {
description: 'ownline option: turn a whole line into new h2',
before: {
text: 'Before\nMy heading\nAfter',
start: 7,
end: 17
},
after: {
text: 'Before\n== My heading ==\nAfter',
selected: ''
},
replace: h2
} );
encapsulateTest( {
description: 'ownline option: turn a partial line into new h2',
before: {
text: 'BeforeMy headingAfter',
start: 6,
end: 16
},
after: {
text: 'Before\n== My heading ==\nAfter',
selected: ''
},
replace: h2
} );
encapsulateTest( {
description: 'splitlines option: no selection, insert new list item',
before: {
text: 'Before\nAfter',
start: 7,
end: 7
},
after: {
text: 'Before\n* Bulleted list item\nAfter'
},
replace: ulist
} );
encapsulateTest( {
description: 'splitlines option: single partial line selection, insert new list item',
before: {
text: 'BeforeMy List ItemAfter',
start: 6,
end: 18
},
after: {
text: 'Before\n* My List Item\nAfter'
},
replace: ulist
} );
encapsulateTest( {
description: 'splitlines option: multiple lines',
before: {
text: 'Before\nFirst\nSecond\nThird\nAfter',
start: 7,
end: 25
},
after: {
text: 'Before\n* First\n* Second\n* Third\nAfter'
},
replace: ulist
} );
function caretTest( options ) {
QUnit.test( options.description, function ( assert ) {
var pos,
$textarea = $( '<textarea>' ).text( options.text );
$( '#qunit-fixture' ).append( $textarea );
if ( options.mode === 'set' ) {
$textarea.textSelection( 'setSelection', {
start: options.start,
end: options.end
} );
}
function among( actual, expected, message ) {
if ( Array.isArray( expected ) ) {
assert.true( expected.indexOf( actual ) !== -1, message + ' (got ' + actual + '; expected one of ' + expected.join( ', ' ) + ')' );
} else {
assert.strictEqual( actual, expected, message );
}
}
pos = $textarea.textSelection( 'getCaretPosition', { startAndEnd: true } );
among( pos[ 0 ], options.start, 'Caret start should be where we set it.' );
among( pos[ 1 ], options.end, 'Caret end should be where we set it.' );
} );
}
caretSample = 'Some big text that we like to work with. Nothing fancy... you know what I mean?';
/* @broken: Disabled per T36820
caretTest({
description: 'getCaretPosition with original/empty selection - T33847 with IE 6/7/8',
text: caretSample,
start: [0, caretSample.length], // Opera and Firefox (prior to FF 6.0) default caret to the end of the box (caretSample.length)
end: [0, caretSample.length], // Other browsers default it to the beginning (0), so check both.
mode: 'get'
});
*/
caretTest( {
description: 'set/getCaretPosition with forced empty selection',
text: caretSample,
start: 7,
end: 7,
mode: 'set'
} );
caretTest( {
description: 'set/getCaretPosition with small selection',
text: caretSample,
start: 6,
end: 11,
mode: 'set'
} );
}() );