diff --git a/src/vs/editor/contrib/hover/browser/markdownHoverParticipant.ts b/src/vs/editor/contrib/hover/browser/markdownHoverParticipant.ts index 9cd72e14497e45..1fc0761bfb2724 100644 --- a/src/vs/editor/contrib/hover/browser/markdownHoverParticipant.ts +++ b/src/vs/editor/contrib/hover/browser/markdownHoverParticipant.ts @@ -94,7 +94,10 @@ export class MarkdownHoverParticipant implements IEditorHoverParticipant { ); }); }); + + test('issue #320604: Loading message ordinal 0 sorts above action buttons at ordinal 1', () => { + const anchor = new Range(1, 1, 1, 10); + const owner = {}; + + const loading = new MarkdownHover(owner, anchor, [new MarkdownString().appendText('Loading...')], false, 0); + const runScript = new MarkdownHover(owner, anchor, [new MarkdownString().appendText('Run Script')], false, 1); + const debugScript = new MarkdownHover(owner, anchor, [new MarkdownString().appendText('Debug Script')], false, 1); + + // Parts arrive with buttons before loading (simulating fast npm provider, slow description) + const parts = [runScript, debugScript, loading]; + parts.sort(compareBy(hover => hover.ordinal, numberComparator)); + + assert.strictEqual(parts[0], loading, 'Loading (ordinal 0) should sort before buttons (ordinal 1)'); + // Both buttons have ordinal 1; only assert they appear after loading + assert.strictEqual(parts.length, 3); + assert.ok(parts[1] === runScript || parts[1] === debugScript); + assert.ok(parts[2] === runScript || parts[2] === debugScript); + assert.notStrictEqual(parts[1], parts[2]); + }); });