1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119
|
/*!
* VisualEditor UserInterface Actions LinkAction tests.
*
* @copyright See AUTHORS.txt
*/
QUnit.module( 've.ui.LinkAction' );
/* Tests */
QUnit.test( 'autolink', ( assert ) => {
const cases = [
{
html: '<p>http://example.com xyz</p>',
rangeOrSelection: new ve.Range( 1, 19 ),
method: 'autolinkUrl',
expectedRangeOrSelection: new ve.Range( 19 ),
expectedOriginalRangeOrSelection: new ve.Range( 19 ),
expectedData: function ( data, action ) {
const a = action.getLinkAnnotation( 'http://example.com' );
for ( let i = 1; i < 19; i++ ) {
data[ i ] = [ data[ i ], [ a.element ] ];
}
},
undo: true,
msg: 'Autolink after space'
},
{
html: '<p>http://example.com</p><p>xyz</p>',
rangeOrSelection: new ve.Range( 1, 19 ),
method: 'autolinkUrl',
expectedRangeOrSelection: new ve.Range( 19 ),
expectedOriginalRangeOrSelection: new ve.Range( 19 ),
expectedData: function ( data, action ) {
const a = action.getLinkAnnotation( 'http://example.com' );
for ( let i = 1; i < 19; i++ ) {
data[ i ] = [ data[ i ], [ a.element ] ];
}
},
undo: true,
msg: 'Autolink after newline'
},
{
html: '<p>Http://Example.COm xyz</p>',
rangeOrSelection: new ve.Range( 1, 19 ),
method: 'autolinkUrl',
expectedRangeOrSelection: new ve.Range( 19 ),
expectedOriginalRangeOrSelection: new ve.Range( 19 ),
expectedData: function ( data, action ) {
const a = action.getLinkAnnotation( 'Http://Example.COm' );
for ( let i = 1; i < 19; i++ ) {
data[ i ] = [ data[ i ], [ a.element ] ];
}
},
undo: true,
msg: 'Autolink with mixed case'
},
{
html: '<p>http://example.com.) xyz</p>',
rangeOrSelection: new ve.Range( 1, 21 ),
method: 'autolinkUrl',
expectedRangeOrSelection: new ve.Range( 21 ),
expectedOriginalRangeOrSelection: new ve.Range( 21 ),
expectedData: function ( data, action ) {
const a = action.getLinkAnnotation( 'http://example.com' );
for ( let i = 1; i < 19; i++ ) {
data[ i ] = [ data[ i ], [ a.element ] ];
}
},
undo: true,
msg: 'Strip trailing punctuation'
},
{
html: '<p>"http://example.com" xyz</p>',
rangeOrSelection: new ve.Range( 2, 21 ),
method: 'autolinkUrl',
expectedRangeOrSelection: new ve.Range( 21 ),
expectedOriginalRangeOrSelection: new ve.Range( 21 ),
expectedData: function ( data, action ) {
const a = action.getLinkAnnotation( 'http://example.com' );
for ( let i = 2; i < 20; i++ ) {
data[ i ] = [ data[ i ], [ a.element ] ];
}
},
undo: true,
msg: 'Strip trailing quotes'
},
{
html: '<p>http://example.comFoo bar baz</p>',
rangeOrSelection: new ve.Range( 1, 19 ),
method: 'autolinkUrl',
expectedRangeOrSelection: new ve.Range( 1, 19 ),
expectedData: function () {
// No change, no link
},
msg: 'Don\'t link if followed by word characters'
},
{
html: '<p>http://.) xyz</p>',
rangeOrSelection: new ve.Range( 1, 10 ),
method: 'autolinkUrl',
expectedRangeOrSelection: new ve.Range( 1, 10 ),
expectedData: function () {
// No change, no link
},
msg: 'Don\'t link if stripping leaves bare protocol'
}
];
cases.forEach( ( caseItem ) => {
ve.test.utils.runActionTest(
assert,
{
actionName: 'link',
...caseItem
}
);
} );
} );
|