mediawiki-extensions-Visual.../modules/ve/test/ve.test.utils.js
Roan Kattouw 1bf58252ce Implement ve.dm.Surface.prototype.undo() and redo() in terms of change()
...or really changeInternal(), so we can avoid adding undo transactions
to the undo stack.

Also get rid of the pattern where undo() and redo() return a selection
which the caller then has to restore, and instead just restore the
selection.

Bug: 53224
Change-Id: If5a3b4d4162e9f0713ee9cd26e79a66efe52770f
2013-10-25 18:29:48 +01:00

132 lines
4.2 KiB
JavaScript

/*!
* VisualEditor test utilities.
*
* @copyright 2011-2013 VisualEditor Team and others; see AUTHORS.txt
* @license The MIT License (MIT); see LICENSE.txt
*/
/**
* @class
* @singleton
* @ignore
*/
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.copy( 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 surface = ve.test.utils.createSurfaceFromHtml( ve.dm.example.isolationHtml ),
formatAction = new ve.ui.FormatAction( surface ),
data = ve.copy( surface.getModel().getDocument().getFullData() ),
originalData = ve.copy( 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' );
surface.getModel().undo();
assert.deepEqual( surface.getModel().getDocument().getFullData(), originalData, msg + ' (undo): data models match' );
assert.deepEqual( surface.getModel().getSelection(), 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 !== undefined ) {
n++;
if ( cases[msg].storeItems ) {
n += cases[msg].storeItems.length;
}
}
}
QUnit.expect( n );
for ( msg in cases ) {
if ( cases[msg].html !== undefined ) {
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 || OO.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.copy( 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)' );
}
};
/**
* Create a UI surface from some HTML
*
* @param {string} html Document HTML
* @returns {ve.ui.Surface} UI surface
*/
ve.test.utils.createSurfaceFromHtml = function ( html ) {
var target = new ve.init.sa.Target( $( '#qunit-fixture' ), ve.createDocumentFromHtml( html ) );
return target.surface;
};