diff --git a/src/vs/sessions/contrib/layout/test/browser/desktopSessionLayoutController.test.ts b/src/vs/sessions/contrib/layout/test/browser/desktopSessionLayoutController.test.ts index 5536bdcb62c..8ad28e0e4de 100644 --- a/src/vs/sessions/contrib/layout/test/browser/desktopSessionLayoutController.test.ts +++ b/src/vs/sessions/contrib/layout/test/browser/desktopSessionLayoutController.test.ts @@ -2955,6 +2955,53 @@ suite('LayoutController (desktop)', () => { }); }); + test('[managed tabs / session switch] stops queued Changes replacement when working-set restore starts', async () => { + const controller = createSinglePaneController({ activateAux: true }); + await settle(); + + const sessionA = makeSession(URI.parse('session:a')); + const sessionB = makeSession(URI.parse('session:b')); + harness.activeSessionObs.set(sessionA, undefined); + await settle(); + harness.activeSessionObs.set(sessionB, undefined); + await settle(); + + const sessionBChanges = harness.activeGroupEditors.find(editor => !(editor instanceof EmptyFileEditorInput))!; + const sessionAChangesResource = harness.sessionChangesService.getChangesEditorResource(sessionA.resource); + const staleSessionAChanges = store.add(new TestStubEditorInput(sessionAChangesResource)); + harness.activeGroupEditors.splice(harness.activeGroupEditors.indexOf(sessionBChanges), 1, staleSessionAChanges); + + let replacements = 0; + harness.onReplaceEditors = () => { + replacements++; + }; + + harness.onDidRevealSidePane.fire(); + let releaseRestore!: () => void; + const restoreGate = new Promise(resolve => releaseRestore = resolve); + controller.runWithRestore(() => restoreGate); + await settle(); + + const replacementsDuringRestore = replacements; + const changesDuringRestore = harness.activeGroupEditors.find(editor => !(editor instanceof EmptyFileEditorInput))?.resource; + + releaseRestore(); + await settle(); + + const changesAfterRestore = harness.activeGroupEditors.find(editor => !(editor instanceof EmptyFileEditorInput))?.resource; + assert.deepStrictEqual({ + replacementsDuringRestore, + changesDuringRestore: changesDuringRestore?.toString(), + replacementsAfterRestore: replacements, + changesAfterRestore: changesAfterRestore?.toString(), + }, { + replacementsDuringRestore: 0, + changesDuringRestore: sessionAChangesResource.toString(), + replacementsAfterRestore: 1, + changesAfterRestore: harness.sessionChangesService.getChangesEditorResource(sessionB.resource).toString(), + }); + }); + test('[managed tabs / session switch] does not publish workspace from a superseded reconcile', async () => { createSinglePaneController({ activateAux: true }); await settle();