mediawiki-extensions-Visual.../modules/ve-mw/tests/dm/ve.dm.MWImageModel.test.js
Roan Kattouw e4d2d4785e ve.dm.MWImageModel: Require parent document
Add a parentDoc parameter to the MWImageModel constructor and use
it to inherit language, direction and HTML document. Remove
getLang(), setLang(), getDir() and setDir() whose only purpose
was to propagate the language and direction from the parent document
in a hacky way.

Also add a parentDoc parameter to newFromImageAttributes(), replacing
the lang and dir parameters. Remove the unused and ill-conceived
caption parameter.

This causes caption documents to always have an HTML document
for URL resolution. Previously, this worked when editing existing
images because a document generated by cloneFromRange() (which
propagates the HTML document) was passed into setCaptionDocument(),
but it didn't work when creating new images.

Bug: T109599
Change-Id: Ida36862092cd779ffc2f04c0ecbc1164f8d71453
2015-08-27 00:09:21 -07:00

232 lines
6 KiB
JavaScript

/*!
* VisualEditor DataModel MWImageModel tests.
*
* @copyright 2011-2015 VisualEditor Team and others; see AUTHORS.txt
* @license The MIT License (MIT); see LICENSE.txt
*/
QUnit.module( 've.dm.MWImageModel', ve.test.utils.mwEnvironment );
/* Tests */
QUnit.test( 'Create and manipulate image nodes', function ( assert ) {
var i, imageType, imageModel, value, result, expected, expectedAlignment, method, dir, dummyDoc,
expect = 0,
imageNode = {},
images = {
mwInlineImage: {
dir: 'ltr',
attrs: {
type: 'frameless',
href: './File:Foo.jpg',
src: 'http://upload.wikimedia.org/wikipedia/commons/thumb/0/06/Foo.jpg/229px-Foo.jpg',
resource: './File:Foo.jpg',
align: 'left',
width: '100',
height: '150',
mediaType: 'BITMAP',
defaultSize: true
},
tests: [
{
methods: {
setType: 'thumb',
setAlignment: 'default'
},
results: {
expect: {
getImageNodeType: 'mwBlockImage',
isBorderable: false
},
position: 'oppositeToText'
}
}
]
},
mwBlockImage: {
dir: 'rtl',
attrs: {
href: './File:Foo.jpg',
src: 'http://upload.wikimedia.org/wikipedia/commons/thumb/0/06/Foo.jpg/229px-Foo.jpg',
resource: './File:Foo.jpg',
type: 'thumb',
align: 'default',
width: '100',
height: '150',
mediaType: 'DRAWING',
defaultSize: false
},
tests: [
{
methods: {
setType: 'frameless',
setAlignment: 'none'
},
results: {
expect: {
getImageNodeType: 'mwInlineImage',
getAlignment: 'none'
},
position: 'none'
}
},
{
methods: {
setType: 'none',
setAlignment: 'default',
toggleBorder: true
},
results: {
expect: {
getImageNodeType: 'mwInlineImage',
isBorderable: true,
isDefaultSize: false
},
position: 'none'
}
},
{
methods: {
setType: 'frame',
setAlignment: 'default',
toggleDefaultSize: true
},
results: {
expect: {
getImageNodeType: 'mwBlockImage',
isBorderable: false,
isDefaultSize: true
},
position: 'oppositeToText'
}
},
{
methods: {
setType: 'frame',
setAlignment: 'right'
},
results: {
expect: {
getImageNodeType: 'mwBlockImage'
},
position: 'withText'
}
}
]
}
};
for ( imageType in images ) {
// Type test
expect++;
for ( i = 0; i < images[ imageType ].tests.length; i++ ) {
// Method tests
expect += Object.keys( images[ imageType ].tests[ i ].results.expect ).length;
if ( images[ imageType ].tests[ i ].results.position ) {
// Position test
expect++;
}
}
}
QUnit.expect( expect );
for ( imageType in images ) {
// Create the node
imageNode[ imageType ] = ve.dm.MWImageModel.static.createImageNode(
images[ imageType ].attrs,
imageType
);
// Verify node type
assert.strictEqual(
imageNode[ imageType ].type,
imageType,
'createImageNode node type: ' + imageType
);
// Run tests
for ( i = 0; i < images[ imageType ].tests.length; i++ ) {
dir = images[ imageType ].dir;
dummyDoc = new ve.dm.Document( [], null, null, null, null, 'en', images[ imageType ].dir );
// Start from original details
imageModel = ve.dm.MWImageModel.static.newFromImageAttributes( images[ imageType ].attrs, dummyDoc );
// Run attributes
for ( method in images[ imageType ].tests[ i ].methods ) {
value = images[ imageType ].tests[ i ].methods[ method ];
imageModel[ method ]( value );
}
// Check result
for ( method in images[ imageType ].tests[ i ].results.expect ) {
result = imageModel[ method ]();
expected = images[ imageType ].tests[ i ].results.expect[ method ];
assert.deepEqual(
result,
expected,
method
);
}
// Run language-specific tests
if ( images[ imageType ].tests[ i ].results.position ) {
// Definition:
// * withText (document direction; 'left' for ltr, 'right' for rtl)
// * oppositeToText (opposite the document direction; 'right' for ltr, 'left' for rtl)
// * none (no alignment set)
switch ( images[ imageType ].tests[ i ].results.position ) {
case 'withText':
expectedAlignment = dir === 'ltr' ? 'left' : 'right';
break;
case 'oppositeToText':
expectedAlignment = dir === 'ltr' ? 'right' : 'left';
break;
case 'none':
expectedAlignment = 'none';
break;
}
assert.strictEqual(
imageModel.getAlignment(),
expectedAlignment,
'getAlignment'
);
}
}
}
} );
// TODO: ve.dm.MWImageModel#updateImageNode
// TODO: ve.dm.MWImageModel#insertImageNode
// TODO: ve.dm.MWImageModel#getUpdatedAttributes
// TODO: ve.dm.MWImageModel#onScalableDefaultSizeChange
// TODO: ve.dm.MWImageModel#setMediaNode
// TODO: ve.dm.MWImageModel#getMediaNode
// TODO: ve.dm.MWImageModel#hasBorder
// TODO: ve.dm.MWImageModel#isAligned
// TODO: ve.dm.MWImageModel#isDefaultAligned
// TODO: ve.dm.MWImageModel#getAltText
// TODO: ve.dm.MWImageModel#getType
// TODO: ve.dm.MWImageModel#getSizeType
// TODO: ve.dm.MWImageModel#getMediaType
// TODO: ve.dm.MWImageModel#getVerticalAlignment
// TODO: ve.dm.MWImageModel#getScalable
// TODO: ve.dm.MWImageModel#getCurrentDimensions
// TODO: ve.dm.MWImageModel#getCaptionDocument
// TODO: ve.dm.MWImageModel#toggleBorderable
// TODO: ve.dm.MWImageModel#cacheOriginalImageAttributes
// TODO: ve.dm.MWImageModel#getOriginalImageAttributes
// TODO: ve.dm.MWImageModel#setCurrentDimensions
// TODO: ve.dm.MWImageModel#setAltText
// TODO: ve.dm.MWImageModel#resetDefaultDimensions
// TODO: ve.dm.MWImageModel#getDefaultDimensions
// TODO: ve.dm.MWImageModel#setSizeType
// TODO: ve.dm.MWImageModel#setVerticalAlignment
// TODO: ve.dm.MWImageModel#getDefaultDir
// TODO: ve.dm.MWImageModel#getDir
// TODO: ve.dm.MWImageModel#setDir
// TODO: ve.dm.MWImageModel#setScalable
// TODO: ve.dm.MWImageModel#setCaptionDocument