%PDF- %PDF-
| Direktori : /www/varak.net/wiki.varak.net/extensions/VisualEditor/lib/ve/tests/ce/ |
| Current File : //www/varak.net/wiki.varak.net/extensions/VisualEditor/lib/ve/tests/ce/ve.ce.Document.test.js |
/*!
* VisualEditor ContentEditable Document tests.
*
* @copyright 2011-2016 VisualEditor Team and others; see http://ve.mit-license.org
*/
QUnit.module( 've.ce.Document' );
/* Tests */
QUnit.test( 'Converter tests', function ( assert ) {
var msg, model, view, caseItem, $documentElement,
expected = 0,
cases = ve.dm.example.domToDataCases;
for ( msg in cases ) {
if ( cases[ msg ].ceHtml ) {
expected++;
}
}
QUnit.expect( expected );
for ( msg in cases ) {
if ( cases[ msg ].ceHtml ) {
caseItem = ve.copy( cases[ msg ] );
model = ve.test.utils.getModelFromTestCase( caseItem );
view = new ve.ce.Document( model );
$documentElement = view.getDocumentNode().$element;
// Simplify slugs
$documentElement.find( '.ve-ce-branchNode-slug' ).contents().remove();
assert.equalDomElement(
// Wrap both in plain DIVs as we are only comparing the child nodes
$( '<div>' ).append( $documentElement.contents() )[ 0 ],
$( '<div>' ).append( ve.createDocumentFromHtml( caseItem.ceHtml ).body.childNodes )[ 0 ],
msg
);
}
}
} );
// TODO: getNodeFromOffset
// TODO: getSlugAtOffset
// TODO: getDirectionFromRange
QUnit.test( 'getNodeAndOffset', function ( assert ) {
var tests, i, iLen, test, parts, view, data, ceDoc, rootNode, offsetCount, offset, position,
j, jLen, node;
// Each test below has the following:
// html: an input document
// data: the expected DM content
// positions: the node+offset corresponding to each DM offset, shown by marking pipe
// characters on a modified HTML representation in which text nodes are wrapped in
// <#text>...</#text> tags (and most attributes are omitted)
// dies (optional): a list of DM offsets where getNodeAndOffset is expected to die
/*jscs:disable validateQuoteMarks */
tests = [
{
title: 'Simple para',
html: '<p>x</p>',
data: [ '<paragraph>', 'x', '</paragraph>' ],
positions: "<div class='ve-ce-branchNode ve-ce-documentNode'>|<p class='ve-ce-branchNode ve-ce-contentBranchNode ve-ce-paragraphNode'><#text>|x|</#text></p></div>"
},
{
title: 'Bold',
html: '<p>x<b>y</b>z</p>',
data: [ '<paragraph>', 'x', 'y', 'z', '</paragraph>' ],
positions: "<div class='ve-ce-branchNode ve-ce-documentNode'>|<p class='ve-ce-branchNode ve-ce-contentBranchNode ve-ce-paragraphNode'><#text>|x|</#text><b class='ve-ce-textStyleAnnotation ve-ce-boldAnnotation'><#text>y|</#text></b><#text>z|</#text></p></div>"
},
{
title: 'Nested block nodes',
html: '<div><p>x</p></div>',
data: [ '<div>', '<paragraph>', 'x', '</paragraph>', '</div>' ],
positions: "<div class='ve-ce-branchNode ve-ce-documentNode'>|<div class='ve-ce-branchNode-slug ve-ce-branchNode-blockSlug'></div><div class='ve-ce-branchNode'>|<p class='ve-ce-branchNode ve-ce-contentBranchNode ve-ce-paragraphNode'><#text>|x|</#text></p>|</div><div class='ve-ce-branchNode-slug ve-ce-branchNode-blockSlug'></div></div>"
},
{
title: 'Slugless emptied paragraph',
html: '<p></p>',
replacement: { path: [ 0 ], innerHtml: '' },
data: [ '<paragraph>', '</paragraph>' ],
positions: "<div class='ve-ce-branchNode ve-ce-documentNode'>|<p class='ve-ce-branchNode ve-ce-contentBranchNode ve-ce-paragraphNode'>|</p></div>"
},
{
title: 'Slugless emptied paragraph with raw <br> in DOM only',
html: '<p></p>',
replacement: { path: [ 0 ], innerHtml: '<br>' },
data: [ '<paragraph>', '</paragraph>' ],
positions: "<div class='ve-ce-branchNode ve-ce-documentNode'>|<p class='ve-ce-branchNode ve-ce-contentBranchNode ve-ce-paragraphNode'>|<br></br></p></div>"
},
{
title: 'Paragraph with links',
html: '<p><a href="A">A</a><a href="B">B</a></p>',
data: [ '<paragraph>', 'A', 'B', '</paragraph>' ],
positions: "<div class='ve-ce-branchNode ve-ce-documentNode'>|<p class='ve-ce-branchNode ve-ce-contentBranchNode ve-ce-paragraphNode'>|<img class='ve-ce-nail ve-ce-nail-pre-open'></img><a class='ve-ce-linkAnnotation'><img class='ve-ce-nail ve-ce-nail-post-open'></img><#text>A</#text><img class='ve-ce-nail ve-ce-nail-pre-close'></img></a><img class='ve-ce-nail ve-ce-nail-post-close'></img>|<img class='ve-ce-nail ve-ce-nail-pre-open'></img><a class='ve-ce-linkAnnotation'><img class='ve-ce-nail ve-ce-nail-post-open'></img><#text>B</#text><img class='ve-ce-nail ve-ce-nail-pre-close'></img></a><img class='ve-ce-nail ve-ce-nail-post-close'></img>|</p></div>"
},
{
title: 'Paragraph with links, non-text nodes',
html: '<p><a href="A"><b>A<img></b></a></p>',
data: [ '<paragraph>', 'A', '<inlineImage>', '</inlineImage>', '</paragraph>' ],
positions: "<div class='ve-ce-branchNode ve-ce-documentNode'>|<p class='ve-ce-branchNode ve-ce-contentBranchNode ve-ce-paragraphNode'>|<img class='ve-ce-nail ve-ce-nail-pre-open'></img><a class='ve-ce-linkAnnotation'><img class='ve-ce-nail ve-ce-nail-post-open'></img><b class='ve-ce-textStyleAnnotation ve-ce-boldAnnotation'><#text>A|</#text><img class='ve-ce-leafNode ve-ce-focusableNode ve-ce-imageNode ve-ce-inlineImageNode'></img></b><img class='ve-ce-nail ve-ce-nail-pre-close'></img></a><img class='ve-ce-nail ve-ce-nail-post-close'></img>||<span class='ve-ce-branchNode-slug ve-ce-branchNode-inlineSlug'></span></p></div>"
},
{
title: 'About grouped aliens',
html: "<p><span rel='ve:Alien' about='x'>Foo</span><span rel='ve:Alien' about='x'>Bar</span></p>",
data: [ '<paragraph>', '<alienInline>', '</alienInline>', '</paragraph>' ],
positions: "<div class='ve-ce-branchNode ve-ce-documentNode'>|<p class='ve-ce-branchNode ve-ce-contentBranchNode ve-ce-paragraphNode'>|<span class='ve-ce-branchNode-slug ve-ce-branchNode-inlineSlug'></span><span class='ve-ce-focusableNode ve-ce-leafNode'><#text>|Foo</#text></span><span class='ve-ce-focusableNode ve-ce-leafNode'><#text>Bar</#text></span>|<span class='ve-ce-branchNode-slug ve-ce-branchNode-inlineSlug'></span></p></div>"
},
{
title: 'Non-about grouped aliens',
html: "<p><span rel='ve:Alien' about='x'>Foo</span><span rel='ve:Alien' about='y'>Bar</span></p>",
data: [ '<paragraph>', '<alienInline>', '</alienInline>', '<alienInline>', '</alienInline>', '</paragraph>' ],
positions: "<div class='ve-ce-branchNode ve-ce-documentNode'>|<p class='ve-ce-branchNode ve-ce-contentBranchNode ve-ce-paragraphNode'>|<span class='ve-ce-branchNode-slug ve-ce-branchNode-inlineSlug'></span><span class='ve-ce-focusableNode ve-ce-leafNode'><#text>|Foo</#text></span>|<span class='ve-ce-branchNode-slug ve-ce-branchNode-inlineSlug'></span><span class='ve-ce-focusableNode ve-ce-leafNode'><#text>|Bar</#text></span>|<span class='ve-ce-branchNode-slug ve-ce-branchNode-inlineSlug'></span></p></div>"
}
];
/*jscs:enable validateQuoteMarks */
QUnit.expect( tests.reduce( function ( total, test ) {
return total + test.positions.replace( /[^|]/g, '' ).length + 2;
}, 0 ) );
function showModelItem( item ) {
if ( item.type ) {
return '<' + item.type + '>';
} else if ( Array.isArray( item ) ) {
return item[ 0 ];
} else if ( typeof item === 'string' ) {
return item;
} else {
return '(unexpected: ' + item + ')';
}
}
for ( i = 0, iLen = tests.length; i < iLen; i++ ) {
test = tests[ i ];
parts = test.positions.split( /[|]/ );
view = ve.test.utils.createSurfaceViewFromHtml( test.html );
data = view.getModel().getDocument().data.data
.slice( 0, -2 )
.map( showModelItem );
ceDoc = view.documentView;
rootNode = ceDoc.getDocumentNode().$element.get( 0 );
assert.deepEqual( data, test.data, test.title + ' (data)' );
offsetCount = data.length;
assert.strictEqual(
offsetCount,
test.positions.replace( /[^|]/g, '' ).length,
test.title + ' (offset count)'
);
if ( test.replacement ) {
node = rootNode;
for ( j = 0, jLen = test.replacement.path.length; j < jLen; j++ ) {
node = node.childNodes[ test.replacement.path[ j ] ];
}
$( node ).closest(
'.ve-ce-branchNode,.ve-ce-leafNode'
).data( 'view' ).removeSlugs();
node.innerHTML = test.replacement.innerHtml;
}
for ( offset = 0; offset < offsetCount; offset++ ) {
try {
position = ceDoc.getNodeAndOffset( offset, test.outsideNails );
if ( test.dies && test.dies.indexOf( offset ) !== -1 ) {
assert.ok( false, test.title + ' (' + offset + ') does not die' );
continue;
}
} catch ( ex ) {
assert.ok(
test.dies && test.dies.indexOf( offset ) !== -1,
test.title + ' (' + offset + ') dies'
);
continue;
}
position = ceDoc.getNodeAndOffset( offset, test.outsideNails );
assert.strictEqual(
ve.test.utils.serializePosition(
rootNode,
ceDoc.getNodeAndOffset( offset, test.outsideNails ),
{ ignore: '.ve-ce-branchNode-slug>*' }
),
[].concat(
parts.slice( 0, offset + 1 ),
[ '|' ],
parts.slice( offset + 1 )
).join( '' ),
test.title + ' (' + offset + ')'
);
}
view.destroy();
}
} );