mediawiki-extensions-Visual.../modules/ve-mw/tests/ui/widgets/ve.ui.MWTransclusionOutlineWidget.test.js
Thiemo Kreuz fd669a4d16 Remove obsolete performance bottleneck from TransclusionModel
This sorting algorithm was introduced via Ic6bc348 (T274544). Note
there is no index parameter in the .onReplacePart() handler at this
point. When a part was moved, it was removed and simply appended
to the end. The additional sorting was needed to move it back to the
correct position.

This changed a few days later via Iafe29f1. There is now an index
parameter. The .onReplacePart() handler does the same as before, but
puts the part at the correct position right away. The additional
sorting is pointless since then.

The removed code alone is responsible for 1/3 of the total blocking
time when the template dialog opens.

Bug: T296335
Change-Id: I6c3fa70b532d34cd29d59c3b48ab81ebf608d548
2021-12-06 17:36:53 +00:00

91 lines
3.5 KiB
JavaScript

QUnit.module( 've.ui.MWTransclusionOutlineWidget' );
QUnit.test( 'Constructor', ( assert ) => {
const widget = new ve.ui.MWTransclusionOutlineWidget();
// eslint-disable-next-line no-jquery/no-class-state
assert.true( widget.$element.hasClass( 've-ui-mwTransclusionOutlineWidget' ) );
assert.deepEqual( widget.partWidgets, {} );
} );
QUnit.test( 'Supports all ve.dm.MWTransclusionPartModel subclasses', ( assert ) => {
const transclusion = new ve.dm.MWTransclusionModel(),
widget = new ve.ui.MWTransclusionOutlineWidget();
widget.onReplacePart( null, new ve.dm.MWTemplateModel( transclusion, { wt: '' } ) );
widget.onReplacePart( null, new ve.dm.MWTemplatePlaceholderModel( transclusion ) );
widget.onReplacePart( null, new ve.dm.MWTransclusionContentModel( transclusion ) );
assert.true( widget.partWidgets.part_0 instanceof ve.ui.MWTransclusionOutlineTemplateWidget );
assert.true( widget.partWidgets.part_1 instanceof ve.ui.MWTransclusionOutlinePlaceholderWidget );
assert.true( widget.partWidgets.part_2 instanceof ve.ui.MWTransclusionOutlineWikitextWidget );
} );
QUnit.test( 'Basic functionality', ( assert ) => {
const transclusion = new ve.dm.MWTransclusionModel(),
part0 = new ve.dm.MWTransclusionContentModel( transclusion ),
part1 = new ve.dm.MWTransclusionContentModel( transclusion ),
widget = new ve.ui.MWTransclusionOutlineWidget();
widget.onReplacePart();
assert.deepEqual( widget.partWidgets, {} );
widget.onReplacePart( null, part0 );
widget.onReplacePart( null, part1 );
assert.deepEqual( Object.keys( widget.partWidgets ), [ 'part_0', 'part_1' ] );
widget.onReplacePart( part0 );
assert.deepEqual( Object.keys( widget.partWidgets ), [ 'part_1' ] );
widget.clear();
assert.deepEqual( widget.partWidgets, {} );
} );
QUnit.test( 'Adding and moving parts to specific positions', ( assert ) => {
const transclusion = new ve.dm.MWTransclusionModel(),
part0 = new ve.dm.MWTransclusionContentModel( transclusion ),
part1 = new ve.dm.MWTransclusionContentModel( transclusion ),
part2 = new ve.dm.MWTransclusionContentModel( transclusion ),
widget = new ve.ui.MWTransclusionOutlineWidget();
// This adds the parts at an invalid position, at the start, and in the middle
widget.onReplacePart( null, part0, 666 );
widget.onReplacePart( null, part1, 0 );
widget.onReplacePart( null, part2, 1 );
// Note this is just a map and doesn't reflect the order in the UI
assert.deepEqual( Object.keys( widget.partWidgets ), [ 'part_0', 'part_1', 'part_2' ] );
const $items = widget.$element.children();
assert.true( $items.eq( 0 ).is( widget.partWidgets.part_1.$element ) );
assert.true( $items.eq( 1 ).is( widget.partWidgets.part_2.$element ) );
assert.true( $items.eq( 2 ).is( widget.partWidgets.part_0.$element ) );
} );
[
[ '', null ],
[ 'part_0', null ],
[ 'part_0/', '' ],
[ 'part_0/foo', 'foo' ],
[ 'part_1/foo', null ],
[ 'part_0/foo/bar', 'foo/bar' ]
].forEach( ( [ pageName, expected ] ) =>
QUnit.test( 'setSelectionByPageName: ' + pageName, ( assert ) => {
const transclusion = new ve.dm.MWTransclusionModel(),
template = new ve.dm.MWTemplateModel( transclusion, { wt: '' } ),
partWidget = new ve.ui.MWTransclusionOutlineTemplateWidget( template ),
widget = new ve.ui.MWTransclusionOutlineWidget();
// eslint-disable-next-line camelcase
widget.partWidgets.part_0 = partWidget;
let actual = null;
partWidget.highlightParameter = ( paramName ) => {
actual = paramName;
};
widget.setSelectionByPageName( pageName );
assert.strictEqual( actual, expected );
} )
);