mirror of
https://gerrit.wikimedia.org/r/mediawiki/extensions/VisualEditor
synced 2024-09-27 12:16:51 +00:00
Merge "ve.ce.Surface.handleEnter tests"
This commit is contained in:
commit
76e3d9ec89
|
@ -16,7 +16,9 @@ ve.test.utils.runSurfaceHandleSpecialKeyTest = function ( assert, html, range, o
|
||||||
'backspace': [ 'handleDelete', {}, true ],
|
'backspace': [ 'handleDelete', {}, true ],
|
||||||
'delete': [ 'handleDelete', {}, false ],
|
'delete': [ 'handleDelete', {}, false ],
|
||||||
'modifiedBackspace': [ 'handleDelete', { 'ctrlKey': true }, true ],
|
'modifiedBackspace': [ 'handleDelete', { 'ctrlKey': true }, true ],
|
||||||
'modifiedDelete': [ 'handleDelete', { 'ctrlKey': true }, false ]
|
'modifiedDelete': [ 'handleDelete', { 'ctrlKey': true }, false ],
|
||||||
|
'enter': [ 'handleEnter', {}, true ],
|
||||||
|
'modifiedEnter': [ 'handleEnter', { 'shiftKey': true }, false ]
|
||||||
},
|
},
|
||||||
surface = ve.test.utils.createSurfaceFromHtml( html || ve.dm.example.html ),
|
surface = ve.test.utils.createSurfaceFromHtml( html || ve.dm.example.html ),
|
||||||
view = surface.getView(),
|
view = surface.getView(),
|
||||||
|
@ -145,6 +147,184 @@ QUnit.test( 'handleDelete', function ( assert ) {
|
||||||
}
|
}
|
||||||
} );
|
} );
|
||||||
|
|
||||||
|
QUnit.test( 'handleEnter', function ( assert ) {
|
||||||
|
var i,
|
||||||
|
emptyList = '<ul><li><p></p></li></ul>',
|
||||||
|
cases = [
|
||||||
|
{
|
||||||
|
'range': new ve.Range( 57 ),
|
||||||
|
'operations': ['enter'],
|
||||||
|
'expectedData': function ( data ) {
|
||||||
|
data.splice(
|
||||||
|
57, 0,
|
||||||
|
{ 'type': '/paragraph' },
|
||||||
|
{ 'type': 'paragraph' }
|
||||||
|
);
|
||||||
|
},
|
||||||
|
'expectedRange': new ve.Range( 59 ),
|
||||||
|
'msg': 'End of paragraph split by enter'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
'range': new ve.Range( 57 ),
|
||||||
|
'operations': ['modifiedEnter'],
|
||||||
|
'expectedData': function ( data ) {
|
||||||
|
data.splice(
|
||||||
|
57, 0,
|
||||||
|
{ 'type': '/paragraph' },
|
||||||
|
{ 'type': 'paragraph' }
|
||||||
|
);
|
||||||
|
},
|
||||||
|
'expectedRange': new ve.Range( 59 ),
|
||||||
|
'msg': 'End of paragraph split by modified enter'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
'range': new ve.Range( 56 ),
|
||||||
|
'operations': ['enter'],
|
||||||
|
'expectedData': function ( data ) {
|
||||||
|
data.splice(
|
||||||
|
56, 0,
|
||||||
|
{ 'type': '/paragraph' },
|
||||||
|
{ 'type': 'paragraph' }
|
||||||
|
);
|
||||||
|
},
|
||||||
|
'expectedRange': new ve.Range( 58 ),
|
||||||
|
'msg': 'Start of paragraph split by enter'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
'range': new ve.Range( 3 ),
|
||||||
|
'operations': ['enter'],
|
||||||
|
'expectedData': function ( data ) {
|
||||||
|
data.splice(
|
||||||
|
3, 0,
|
||||||
|
{ 'type': '/heading' },
|
||||||
|
{ 'type': 'heading', 'attributes': { 'level': 1 } }
|
||||||
|
);
|
||||||
|
},
|
||||||
|
'expectedRange': new ve.Range( 5 ),
|
||||||
|
'msg': 'Heading split by enter'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
'range': new ve.Range( 2, 3 ),
|
||||||
|
'operations': ['enter'],
|
||||||
|
'expectedData': function ( data ) {
|
||||||
|
data.splice(
|
||||||
|
2, 1,
|
||||||
|
{ 'type': '/heading' },
|
||||||
|
{ 'type': 'heading', 'attributes': { 'level': 1 } }
|
||||||
|
);
|
||||||
|
},
|
||||||
|
'expectedRange': new ve.Range( 4 ),
|
||||||
|
'msg': 'Selection in heading removed, then split by enter'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
'range': new ve.Range( 1 ),
|
||||||
|
'operations': ['enter'],
|
||||||
|
'expectedData': function ( data ) {
|
||||||
|
data.splice(
|
||||||
|
0, 0,
|
||||||
|
{ 'type': 'paragraph' },
|
||||||
|
{ 'type': '/paragraph' }
|
||||||
|
);
|
||||||
|
},
|
||||||
|
'expectedRange': new ve.Range( 3 ),
|
||||||
|
'msg': 'Start of heading split into a plain paragraph'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
'range': new ve.Range( 4 ),
|
||||||
|
'operations': ['enter'],
|
||||||
|
'expectedData': function ( data ) {
|
||||||
|
data.splice(
|
||||||
|
5, 0,
|
||||||
|
{ 'type': 'paragraph' },
|
||||||
|
{ 'type': '/paragraph' }
|
||||||
|
);
|
||||||
|
},
|
||||||
|
'expectedRange': new ve.Range( 6 ),
|
||||||
|
'msg': 'End of heading split into a plain paragraph'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
'range': new ve.Range( 16 ),
|
||||||
|
'operations': ['enter'],
|
||||||
|
'expectedData': function ( data ) {
|
||||||
|
data.splice(
|
||||||
|
16, 0,
|
||||||
|
{ 'type': '/paragraph' },
|
||||||
|
{ 'type': '/listItem' },
|
||||||
|
{ 'type': 'listItem' },
|
||||||
|
{ 'type': 'paragraph' }
|
||||||
|
);
|
||||||
|
},
|
||||||
|
'expectedRange': new ve.Range( 20 ),
|
||||||
|
'msg': 'List item split by enter'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
'range': new ve.Range( 16 ),
|
||||||
|
'operations': ['modifiedEnter'],
|
||||||
|
'expectedData': function ( data ) {
|
||||||
|
data.splice(
|
||||||
|
16, 0,
|
||||||
|
{ 'type': '/paragraph' },
|
||||||
|
{ 'type': 'paragraph' }
|
||||||
|
);
|
||||||
|
},
|
||||||
|
'expectedRange': new ve.Range( 18 ),
|
||||||
|
'msg': 'List item not split by modified enter'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
'range': new ve.Range( 21 ),
|
||||||
|
'operations': ['enter', 'enter'],
|
||||||
|
'expectedData': function ( data ) {
|
||||||
|
data.splice(
|
||||||
|
24, 0,
|
||||||
|
{ 'type': 'paragraph' },
|
||||||
|
{ 'type': '/paragraph' }
|
||||||
|
);
|
||||||
|
},
|
||||||
|
'expectedRange': new ve.Range( 25 ),
|
||||||
|
'msg': 'Two enters breaks out of a list and starts a new paragraph'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
'html': '<p>foo</p>' + emptyList + '<p>bar</p>',
|
||||||
|
'range': new ve.Range( 8 ),
|
||||||
|
'operations': ['enter'],
|
||||||
|
'expectedData': function ( data ) {
|
||||||
|
data.splice( 5, 6 );
|
||||||
|
},
|
||||||
|
'expectedRange': new ve.Range( 6 ),
|
||||||
|
'msg': 'Enter in an empty list destroys it and moves to next paragraph'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
'html': '<p>foo</p>' + emptyList,
|
||||||
|
'range': new ve.Range( 8 ),
|
||||||
|
'operations': ['enter'],
|
||||||
|
'expectedData': function ( data ) {
|
||||||
|
data.splice( 5, 6 );
|
||||||
|
},
|
||||||
|
'expectedRange': new ve.Range( 4 ),
|
||||||
|
'msg': 'Enter in an empty list at end of document destroys it and moves to previous paragraph'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
'html': emptyList + '<p>bar</p>',
|
||||||
|
'range': new ve.Range( 3 ),
|
||||||
|
'operations': ['enter'],
|
||||||
|
'expectedData': function ( data ) {
|
||||||
|
data.splice( 0, 6 );
|
||||||
|
},
|
||||||
|
'expectedRange': new ve.Range( 1 ),
|
||||||
|
'msg': 'Enter in an empty list at start of document destroys it and moves to next paragraph'
|
||||||
|
}
|
||||||
|
];
|
||||||
|
|
||||||
|
QUnit.expect( cases.length * 2 );
|
||||||
|
|
||||||
|
for ( i = 0; i < cases.length; i++ ) {
|
||||||
|
ve.test.utils.runSurfaceHandleSpecialKeyTest(
|
||||||
|
assert, cases[i].html, cases[i].range, cases[i].operations,
|
||||||
|
cases[i].expectedData, cases[i].expectedRange, cases[i].msg
|
||||||
|
);
|
||||||
|
}
|
||||||
|
} );
|
||||||
|
|
||||||
QUnit.test( 'onContentChange', function ( assert ) {
|
QUnit.test( 'onContentChange', function ( assert ) {
|
||||||
var i,
|
var i,
|
||||||
cases = [
|
cases = [
|
||||||
|
@ -604,7 +784,6 @@ QUnit.test( 'beforePaste/afterPaste', function ( assert ) {
|
||||||
// TODO: ve.ce.Surface#handleLeftOrRightArrowKey
|
// TODO: ve.ce.Surface#handleLeftOrRightArrowKey
|
||||||
// TODO: ve.ce.Surface#handleUpOrDownArrowKey
|
// TODO: ve.ce.Surface#handleUpOrDownArrowKey
|
||||||
// TODO: ve.ce.Surface#handleInsertion
|
// TODO: ve.ce.Surface#handleInsertion
|
||||||
// TODO: ve.ce.Surface#handleEnter
|
|
||||||
// TODO: ve.ce.Surface#showSelection
|
// TODO: ve.ce.Surface#showSelection
|
||||||
// TODO: ve.ce.Surface#replacePhantoms
|
// TODO: ve.ce.Surface#replacePhantoms
|
||||||
// TODO: ve.ce.Surface#replaceHighlight
|
// TODO: ve.ce.Surface#replaceHighlight
|
||||||
|
|
|
@ -12,6 +12,11 @@
|
||||||
*/
|
*/
|
||||||
ve.test = { 'utils': {} };
|
ve.test = { 'utils': {} };
|
||||||
|
|
||||||
|
// TODO: this is a hack to make normal heading/preformatted
|
||||||
|
// nodes the most recently registered, instead of the MW versions
|
||||||
|
ve.dm.modelRegistry.register( ve.dm.HeadingNode );
|
||||||
|
ve.dm.modelRegistry.register( ve.dm.PreformattedNode );
|
||||||
|
|
||||||
ve.test.utils.runIsolateTest = function ( assert, type, range, expected, label ) {
|
ve.test.utils.runIsolateTest = function ( assert, type, range, expected, label ) {
|
||||||
var doc = ve.dm.example.createExampleDocument( 'isolationData' ),
|
var doc = ve.dm.example.createExampleDocument( 'isolationData' ),
|
||||||
surface = new ve.dm.Surface( doc ),
|
surface = new ve.dm.Surface( doc ),
|
||||||
|
@ -50,11 +55,6 @@ ve.test.utils.runFormatConverterTest = function ( assert, range, type, attribute
|
||||||
ve.test.utils.runGetDataFromDomTests = function( assert, cases ) {
|
ve.test.utils.runGetDataFromDomTests = function( assert, cases ) {
|
||||||
var msg, doc, store, i, length, hash, data, html, n = 0;
|
var msg, doc, store, i, length, hash, data, html, n = 0;
|
||||||
|
|
||||||
// TODO: this is a hack to make normal heading/preformatted
|
|
||||||
// nodes the most recently registered, instead of the MW versions
|
|
||||||
ve.dm.modelRegistry.register( ve.dm.HeadingNode );
|
|
||||||
ve.dm.modelRegistry.register( ve.dm.PreformattedNode );
|
|
||||||
|
|
||||||
for ( msg in cases ) {
|
for ( msg in cases ) {
|
||||||
if ( cases[msg].head !== undefined || cases[msg].body !== undefined ) {
|
if ( cases[msg].head !== undefined || cases[msg].body !== undefined ) {
|
||||||
n += 2;
|
n += 2;
|
||||||
|
|
Loading…
Reference in a new issue