mirror of
https://gerrit.wikimedia.org/r/mediawiki/extensions/VisualEditor
synced 2024-12-03 02:16:51 +00:00
779099e660
In the DomFromData tests, we put the provided storeItems in the store first, then run preprocessAnnotations (which puts annotations in the store). However, in DataFromDom we ran preprocessAnnotations first (which puts annotations in the store), then ran getDataFromDom (which is expected to put the asserted store items in the store). Because the order was reversed between these two tests, it was impossible to write a test for an annotation whose toDataElement function adds to the store. Fix this by reordering the operations in the DataFromDom test, doing the conversion first and only then running preprocessAnnotations on the expected data. This preprocessAnnotations call will not write to the store if the test passes, because all annotations in the expected data should already have been put in the store by the conversion. Change-Id: I8f741d96fe12590fd711542794570fb95b1132d0
120 lines
4 KiB
JavaScript
120 lines
4 KiB
JavaScript
/*!
|
|
* VisualEditor test utilities.
|
|
*
|
|
* @copyright 2011-2013 VisualEditor Team and others; see AUTHORS.txt
|
|
* @license The MIT License (MIT); see LICENSE.txt
|
|
*/
|
|
|
|
ve.test = { 'utils': {} };
|
|
|
|
ve.test.utils.runIsolateTest = function ( assert, type, range, expected, label ) {
|
|
var doc = ve.dm.example.createExampleDocument( 'isolationData' ),
|
|
surface = new ve.dm.Surface( doc ),
|
|
fragment = new ve.dm.SurfaceFragment( surface, range ),
|
|
data;
|
|
|
|
data = ve.copyArray( doc.getFullData() );
|
|
fragment.isolateAndUnwrap( type );
|
|
expected( data );
|
|
|
|
assert.deepEqual( doc.getFullData(), data, label );
|
|
};
|
|
|
|
ve.test.utils.runFormatConverterTest = function ( assert, range, type, attributes, expectedSelection, expectedData, msg ) {
|
|
var selection,
|
|
dom = ve.createDocumentFromHtml( ve.dm.example.isolationHtml ),
|
|
target = new ve.init.sa.Target( $( '#qunit-fixture' ), dom ),
|
|
surface = target.surface,
|
|
formatAction = new ve.ui.FormatAction( surface ),
|
|
data = ve.copyArray( surface.getModel().getDocument().getFullData() ),
|
|
originalData = ve.copyArray( data );
|
|
|
|
expectedData( data );
|
|
|
|
surface.getModel().change( null, range );
|
|
formatAction.convert( type, attributes );
|
|
|
|
assert.deepEqual( surface.getModel().getDocument().getFullData(), data, msg + ': data models match' );
|
|
assert.deepEqual( surface.getModel().getSelection(), expectedSelection, msg + ': selections match' );
|
|
|
|
selection = surface.getModel().undo();
|
|
|
|
assert.deepEqual( surface.getModel().getDocument().getFullData(), originalData, msg + ' (undo): data models match' );
|
|
assert.deepEqual( selection, range, msg + ' (undo): selections match' );
|
|
|
|
surface.destroy();
|
|
};
|
|
|
|
ve.test.utils.runGetDataFromDomTests = function( assert, cases ) {
|
|
var msg, doc, store, internalList, i, length, hash, data, 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 ) {
|
|
if ( cases[msg].html !== null ) {
|
|
n++;
|
|
if ( cases[msg].storeItems ) {
|
|
n += cases[msg].storeItems.length;
|
|
}
|
|
}
|
|
}
|
|
QUnit.expect( n );
|
|
|
|
for ( msg in cases ) {
|
|
if ( cases[msg].html !== null ) {
|
|
doc = new ve.dm.Document( [] );
|
|
store = doc.getStore();
|
|
internalList = doc.getInternalList();
|
|
data = ve.dm.converter.getDataFromDom(
|
|
ve.createDocumentFromHtml( cases[msg].html ), store, internalList
|
|
).getData();
|
|
ve.dm.example.preprocessAnnotations( cases[msg].data, store );
|
|
assert.deepEqualWithDomElements( data, cases[msg].data, msg );
|
|
// check storeItems have been added to store
|
|
if ( cases[msg].storeItems ) {
|
|
for ( i = 0, length = cases[msg].storeItems.length; i < length; i++ ) {
|
|
hash = cases[msg].storeItems[i].hash || ve.getHash( cases[msg].storeItems[i].value );
|
|
assert.deepEqualWithDomElements(
|
|
store.value( store.indexOfHash( hash ) ),
|
|
cases[msg].storeItems[i].value,
|
|
msg + ': store item ' + i + ' found'
|
|
);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
};
|
|
|
|
ve.test.utils.runGetDomFromDataTests = function( assert, cases ) {
|
|
var msg, originalData, doc, store, i, length, n = 0;
|
|
|
|
for ( msg in cases ) {
|
|
n++;
|
|
}
|
|
QUnit.expect( 2*n );
|
|
|
|
for ( msg in cases ) {
|
|
store = new ve.dm.IndexValueStore();
|
|
// Load storeItems into store
|
|
if ( cases[msg].storeItems ) {
|
|
for ( i = 0, length = cases[msg].storeItems.length; i < length; i++ ) {
|
|
store.index( cases[msg].storeItems[i].value, cases[msg].storeItems[i].hash );
|
|
}
|
|
}
|
|
if ( cases[msg].modify ) {
|
|
cases[msg].modify( cases[msg].data );
|
|
}
|
|
doc = new ve.dm.Document( ve.dm.example.preprocessAnnotations( cases[msg].data, store ) );
|
|
originalData = ve.copyArray( doc.getFullData() );
|
|
assert.equalDomElement(
|
|
ve.dm.converter.getDomFromData( doc.getFullData(), doc.getStore(), doc.getInternalList() ),
|
|
ve.createDocumentFromHtml( cases[msg].normalizedHtml || cases[msg].html ),
|
|
msg
|
|
);
|
|
assert.deepEqualWithDomElements( doc.getFullData(), originalData, msg + ' (data hasn\'t changed)' );
|
|
}
|
|
};
|