mediawiki-extensions-Visual.../modules/ve/test/ce/ve.ce.Document.test.js
Roan Kattouw df97f759b1 Refactor selectNodes tests
* Move them from ve.example.js to ve.dm.example.js
** Also move lookupNode() and createDomElement() there
** Delete ve.example.js because there's nothing left in it
* Make main example document implicit, but allow override
* Specify nodes as arrays and do the lookup later
* Specify range and mode separately rather than calling selectNodes()
  during construction
* Construct statically rather than in a function
* Use expect( cases.length );

Change-Id: I620e949c5e612b32eaa57c5d9b60cc91f9ddbf02
2013-06-17 20:08:08 +01:00

405 lines
8.2 KiB
JavaScript

/*!
* VisualEditor ContentEditable Document tests.
*
* @copyright 2011-2013 VisualEditor Team and others; see AUTHORS.txt
* @license The MIT License (MIT); see LICENSE.txt
*/
QUnit.module( 've.ce.Document' );
/* Tests */
QUnit.test( 'getRelativeOffset', function ( assert ) {
var documentModel = ve.dm.example.createExampleDocument( 'alienData' ),
documentView = new ve.ce.Document( documentModel ),
tests = [
{
direction: 1,
unit: 'character',
cases: [
{ input: 0, output: 3 },
{ input: 3, output: 4 },
{ input: 4, output: 6 },
{ input: 6, output: 7 },
{ input: 7, output: 10 }
]
},
{
direction: 1,
unit: 'word',
cases: [
{ input: 0, output: 3 },
{ input: 3, output: 4 },
{ input: 4, output: 6 },
{ input: 6, output: 7 },
{ input: 7, output: 10 }
]
},
{
direction: -1,
unit: 'character',
cases: [
{ input: 10, output: 7 },
{ input: 7, output: 6 },
{ input: 6, output: 4 },
{ input: 4, output: 3 },
{ input: 3, output: 0 }
]
},
{
direction: -1,
unit: 'word',
cases: [
{ input: 10, output: 7 },
{ input: 7, output: 6 },
{ input: 6, output: 4 },
{ input: 4, output: 3 },
{ input: 3, output: 0 }
]
}
], i, j, expectCount = 0;
for ( i = 0; i < tests.length; i++ ) {
for ( j = 0; j < tests[i].cases.length; j++ ) {
assert.equal(
documentView.getRelativeOffset(
tests[i].cases[j].input,
tests[i].direction,
tests[i].unit
),
tests[i].cases[j].output
);
}
expectCount += tests[i].cases.length;
}
QUnit.expect( expectCount );
} );
QUnit.test( 'getRelativeRange', function ( assert ) {
var documentModel, documentView, i, j, expectCount = 0,
tests = [
{
data: [
/* 0 */ { type: 'mwBlockImage' },
/* 1 */ { type: '/mwBlockImage' }
],
cases: [
{
direction: 1,
expand: false,
given: new ve.Range( 0 ),
expected: new ve.Range( 0, 2 )
},
{
direction: 1,
expand: false,
given: new ve.Range( 0, 2 ),
expected: new ve.Range( 2 )
},
{
direction: 1,
expand: true,
given: new ve.Range( 0 ),
expected: new ve.Range( 0, 2 )
},
{
direction: 1,
expand: true,
given: new ve.Range( 0, 2 ),
expected: new ve.Range( 0, 2 )
},
{
direction: -1,
expand: false,
given: new ve.Range( 2 ),
expected: new ve.Range( 2, 0 )
},
{
direction: -1,
expand: false,
given: new ve.Range( 2, 0 ),
expected: new ve.Range( 0 )
},
{
direction: -1,
expand: false,
given: new ve.Range( 0, 2 ),
expected: new ve.Range( 0 )
},
{
direction: -1,
expand: true,
given: new ve.Range( 2 ),
expected: new ve.Range( 2, 0 )
},
{
direction: -1,
expand: true,
given: new ve.Range( 2, 0 ),
expected: new ve.Range( 2, 0 )
},
{
direction: -1,
expand: true,
given: new ve.Range( 0, 2 ),
expected: new ve.Range( 0 )
}
]
},
{
data: [
/* 0 */ { type: 'mwBlockImage' },
/* 1 */ { type: '/mwBlockImage' },
/* 2 */ { type: 'mwBlockImage' },
/* 3 */ { type: '/mwBlockImage' }
],
cases: [
{
direction: 1,
expand: false,
given: new ve.Range( 0, 2 ),
expected: new ve.Range( 2 )
},
{
direction: 1,
expand: false,
given: new ve.Range( 2, 4 ),
expected: new ve.Range( 4 )
},
{
direction: 1,
expand: true,
given: new ve.Range( 0, 2 ),
expected: new ve.Range( 0, 4 )
},
{
direction: -1,
expand: true,
given: new ve.Range( 4, 2 ),
expected: new ve.Range( 4, 0 )
},
{
direction: -1,
expand: true,
given: new ve.Range( 2, 4 ),
expected: new ve.Range( 2 )
}
]
},
{
data: [
/* 0 */ { type: 'alienBlock' },
/* 1 */ { type: '/alienBlock' },
/* 2 */ { type: 'mwBlockImage' },
/* 3 */ { type: '/mwBlockImage' },
/* 4 */ { type: 'alienBlock' },
/* 5 */ { type: '/alienBlock' }
],
cases: [
{
direction: 1,
expand: false,
given: new ve.Range( 0 ),
expected: new ve.Range( 2 )
},
{
direction: 1,
expand: false,
given: new ve.Range( 2 ),
expected: new ve.Range( 2, 4 )
},
{
direction: 1,
expand: false,
given: new ve.Range( 2, 4 ),
expected: new ve.Range( 4 )
},
{
direction: 1,
expand: false,
given: new ve.Range( 4 ),
expected: new ve.Range( 6 )
},
{
direction: 1,
expand: true,
given: new ve.Range( 0 ),
expected: new ve.Range( 0, 2 )
},
{
direction: 1,
expand: true,
given: new ve.Range( 0, 2 ),
expected: new ve.Range( 0, 4 )
},
{
direction: 1,
expand: true,
given: new ve.Range( 0, 4 ),
expected: new ve.Range( 0, 6 )
}
]
},
{
data: [
/* 0 */ { type: 'paragraph' },
/* 1 */ 'a',
/* 2 */ { type: '/paragraph' },
/* 3 */ { type: 'mwBlockImage' },
/* 4 */ { type: '/mwBlockImage' },
/* 5 */ { type: 'paragraph' },
/* 6 */ 'b',
/* 7 */ { type: '/paragraph' }
],
cases: [
{
direction: 1,
expand: false,
given: new ve.Range( 1 ),
expected: new ve.Range( 2 )
},
{
direction: 1,
expand: false,
given: new ve.Range( 2 ),
expected: new ve.Range( 3, 5 )
},
{
direction: 1,
expand: false,
given: new ve.Range( 3, 5 ),
expected: new ve.Range( 6 )
},
{
direction: 1,
expand: true,
given: new ve.Range( 1 ),
expected: new ve.Range( 1, 2 )
},
{
direction: 1,
expand: true,
given: new ve.Range( 1, 2 ),
expected: new ve.Range( 1, 6 )
}
]
},
{
data: [
/* 0 */ { type: 'paragraph' },
/* 1 */ 'a',
/* 2 */ { type: 'mwInlineImage' },
/* 3 */ { type: '/mwInlineImage' },
/* 4 */ 'b',
/* 5 */ { type: '/paragraph' }
],
cases: [
{
direction: 1,
expand: false,
given: new ve.Range( 1 ),
expected: new ve.Range( 2 )
},
{
direction: 1,
expand: false,
given: new ve.Range( 2 ),
expected: new ve.Range( 2, 4 )
},
{
direction: 1,
expand: false,
given: new ve.Range( 2, 4 ),
expected: new ve.Range( 4 )
},
{
direction: 1,
expand: true,
given: new ve.Range( 1 ),
expected: new ve.Range( 1, 2 )
},
{
direction: 1,
expand: true,
given: new ve.Range( 1, 2 ),
expected: new ve.Range( 1, 4 )
},
{
direction: 1,
expand: true,
given: new ve.Range( 1, 4 ),
expected: new ve.Range( 1, 5 )
}
]
},
{
data: [
/* 0 */ { type: 'paragraph' },
/* 1 */ { type: 'mwInlineImage' },
/* 2 */ { type: '/mwInlineImage' },
/* 3 */ { type: 'mwInlineImage' },
/* 4 */ { type: '/mwInlineImage' },
/* 5 */ { type: '/paragraph' }
],
cases: [
{
direction: 1,
expand: false,
given: new ve.Range( 3 ),
expected: new ve.Range( 3, 5 )
},
{
direction: 1,
expand: true,
given: new ve.Range( 1, 3 ),
expected: new ve.Range( 1, 5 )
}
]
},
{
data: [
/* 0 */ { type: 'paragraph' },
/* 1 */ { type: 'alienInline' },
/* 2 */ { type: '/alienInline' },
/* 3 */ { type: 'mwInlineImage' },
/* 4 */ { type: '/mwInlineImage' },
/* 5 */ { type: 'alienInline' },
/* 6 */ { type: '/alienInline' },
/* 7 */ { type: '/paragraph' }
],
cases: [
{
direction: 1,
expand: false,
given: new ve.Range( 1 ),
expected: new ve.Range( 3 )
},
{
direction: 1,
expand: false,
given: new ve.Range( 5 ),
expected: new ve.Range( 7 )
}
]
}
];
for ( i = 0; i < tests.length; i++ ) {
documentModel = new ve.dm.Document( tests[i].data );
documentView = new ve.ce.Document( documentModel );
for ( j = 0; j < tests[i].cases.length; j++ ) {
expectCount++;
assert.equalRange(
documentView.getRelativeRange(
tests[i].cases[j].given,
tests[i].cases[j].direction,
'character',
tests[i].cases[j].expand
),
tests[i].cases[j].expected,
'i: ' + i + ', j: ' + j
);
}
}
QUnit.expect( expectCount );
});