Merge "Add SVG version of user icon in Vector personal portlet"
[lhc/web/wiklou.git] / tests / qunit / suites / resources / jquery / jquery.textSelection.test.js
1 ( function ( $ ) {
2
3 QUnit.module( 'jquery.textSelection', QUnit.newMwEnvironment() );
4
5 /**
6 * Test factory for $.fn.textSelection( 'encapsulateText' )
7 *
8 * @param options {object} associative array containing:
9 * description {string}
10 * input {string}
11 * output {string}
12 * start {int} starting char for selection
13 * end {int} ending char for selection
14 * params {object} add'l parameters for $().textSelection( 'encapsulateText' )
15 */
16 function encapsulateTest( options ) {
17 var opt = $.extend( {
18 description: '',
19 before: {},
20 after: {},
21 replace: {}
22 }, options );
23
24 opt.before = $.extend( {
25 text: '',
26 start: 0,
27 end: 0
28 }, opt.before );
29 opt.after = $.extend( {
30 text: '',
31 selected: null
32 }, opt.after );
33
34 QUnit.test( opt.description, function ( assert ) {
35 /*jshint onevar: false */
36 var tests = 1;
37 if ( opt.after.selected !== null ) {
38 tests++;
39 }
40 QUnit.expect( tests );
41
42 var $textarea = $( '<textarea>' );
43
44 $( '#qunit-fixture' ).append( $textarea );
45
46 //$textarea.textSelection( 'setContents', opt.before.text); // this method is actually missing atm...
47 $textarea.val( opt.before.text ); // won't work with the WikiEditor iframe?
48
49 var start = opt.before.start,
50 end = opt.before.end;
51
52 var options = $.extend( {}, opt.replace ); // Clone opt.replace
53 options.selectionStart = start;
54 options.selectionEnd = end;
55 $textarea.textSelection( 'encapsulateSelection', options );
56
57 var text = $textarea.textSelection( 'getContents' ).replace( /\r\n/g, '\n' );
58
59 assert.equal( text, opt.after.text, 'Checking full text after encapsulation' );
60
61 if ( opt.after.selected !== null ) {
62 var selected = $textarea.textSelection( 'getSelection' );
63 assert.equal( selected, opt.after.selected, 'Checking selected text after encapsulation.' );
64 }
65
66 } );
67 }
68
69 var caretSample,
70 sig = {
71 pre: '--~~~~'
72 },
73 bold = {
74 pre: '\'\'\'',
75 peri: 'Bold text',
76 post: '\'\'\''
77 },
78 h2 = {
79 pre: '== ',
80 peri: 'Heading 2',
81 post: ' ==',
82 regex: /^(\s*)(={1,6})(.*?)\2(\s*)$/,
83 regexReplace: '$1==$3==$4',
84 ownline: true
85 },
86 ulist = {
87 pre: '* ',
88 peri: 'Bulleted list item',
89 post: '',
90 ownline: true,
91 splitlines: true
92 };
93
94 encapsulateTest( {
95 description: 'Adding sig to end of text',
96 before: {
97 text: 'Wikilove dude! ',
98 start: 15,
99 end: 15
100 },
101 after: {
102 text: 'Wikilove dude! --~~~~',
103 selected: ''
104 },
105 replace: sig
106 } );
107
108 encapsulateTest( {
109 description: 'Adding bold to empty',
110 before: {
111 text: '',
112 start: 0,
113 end: 0
114 },
115 after: {
116 text: '\'\'\'Bold text\'\'\'',
117 selected: 'Bold text' // selected because it's the default
118 },
119 replace: bold
120 } );
121
122 encapsulateTest( {
123 description: 'Adding bold to existing text',
124 before: {
125 text: 'Now is the time for all good men to come to the aid of their country',
126 start: 20,
127 end: 32
128 },
129 after: {
130 text: 'Now is the time for \'\'\'all good men\'\'\' to come to the aid of their country',
131 selected: '' // empty because it's not the default'
132 },
133 replace: bold
134 } );
135
136 encapsulateTest( {
137 description: 'ownline option: adding new h2',
138 before: {
139 text: 'Before\nAfter',
140 start: 7,
141 end: 7
142 },
143 after: {
144 text: 'Before\n== Heading 2 ==\nAfter',
145 selected: 'Heading 2'
146 },
147 replace: h2
148 } );
149
150 encapsulateTest( {
151 description: 'ownline option: turn a whole line into new h2',
152 before: {
153 text: 'Before\nMy heading\nAfter',
154 start: 7,
155 end: 17
156 },
157 after: {
158 text: 'Before\n== My heading ==\nAfter',
159 selected: ''
160 },
161 replace: h2
162 } );
163
164
165 encapsulateTest( {
166 description: 'ownline option: turn a partial line into new h2',
167 before: {
168 text: 'BeforeMy headingAfter',
169 start: 6,
170 end: 16
171 },
172 after: {
173 text: 'Before\n== My heading ==\nAfter',
174 selected: ''
175 },
176 replace: h2
177 } );
178
179
180 encapsulateTest( {
181 description: 'splitlines option: no selection, insert new list item',
182 before: {
183 text: 'Before\nAfter',
184 start: 7,
185 end: 7
186 },
187 after: {
188 text: 'Before\n* Bulleted list item\nAfter'
189 },
190 replace: ulist
191 } );
192
193 encapsulateTest( {
194 description: 'splitlines option: single partial line selection, insert new list item',
195 before: {
196 text: 'BeforeMy List ItemAfter',
197 start: 6,
198 end: 18
199 },
200 after: {
201 text: 'Before\n* My List Item\nAfter'
202 },
203 replace: ulist
204 } );
205
206 encapsulateTest( {
207 description: 'splitlines option: multiple lines',
208 before: {
209 text: 'Before\nFirst\nSecond\nThird\nAfter',
210 start: 7,
211 end: 25
212 },
213 after: {
214 text: 'Before\n* First\n* Second\n* Third\nAfter'
215 },
216 replace: ulist
217 } );
218
219
220 function caretTest( options ) {
221 QUnit.test( options.description, 2, function ( assert ) {
222 var pos, $textarea = $( '<textarea>' ).text( options.text );
223
224 $( '#qunit-fixture' ).append( $textarea );
225
226 if ( options.mode === 'set' ) {
227 $textarea.textSelection( 'setSelection', {
228 start: options.start,
229 end: options.end
230 } );
231 }
232
233 function among( actual, expected, message ) {
234 if ( $.isArray( expected ) ) {
235 assert.ok( $.inArray( actual, expected ) !== -1, message + ' (got ' + actual + '; expected one of ' + expected.join( ', ' ) + ')' );
236 } else {
237 assert.equal( actual, expected, message );
238 }
239 }
240
241 pos = $textarea.textSelection( 'getCaretPosition', { startAndEnd: true } );
242 among( pos[0], options.start, 'Caret start should be where we set it.' );
243 among( pos[1], options.end, 'Caret end should be where we set it.' );
244 } );
245 }
246
247 caretSample = 'Some big text that we like to work with. Nothing fancy... you know what I mean?';
248
249 /*
250 // @broken: Disabled per bug 34820
251 caretTest({
252 description: 'getCaretPosition with original/empty selection - bug 31847 with IE 6/7/8',
253 text: caretSample,
254 start: [0, caretSample.length], // Opera and Firefox (prior to FF 6.0) default caret to the end of the box (caretSample.length)
255 end: [0, caretSample.length], // Other browsers default it to the beginning (0), so check both.
256 mode: 'get'
257 });
258 */
259
260 caretTest( {
261 description: 'set/getCaretPosition with forced empty selection',
262 text: caretSample,
263 start: 7,
264 end: 7,
265 mode: 'set'
266 } );
267
268 caretTest( {
269 description: 'set/getCaretPosition with small selection',
270 text: caretSample,
271 start: 6,
272 end: 11,
273 mode: 'set'
274 } );
275 }( jQuery ) );