Path: blob/main/src/vs/workbench/contrib/bulkEdit/test/browser/bulkEditPreview.test.ts
3296 views
/*---------------------------------------------------------------------------------------------1* Copyright (c) Microsoft Corporation. All rights reserved.2* Licensed under the MIT License. See License.txt in the project root for license information.3*--------------------------------------------------------------------------------------------*/45import assert from 'assert';6import { Event } from '../../../../../base/common/event.js';7import { IFileService } from '../../../../../platform/files/common/files.js';8import { mock } from '../../../../test/common/workbenchTestServices.js';9import { InstantiationService } from '../../../../../platform/instantiation/common/instantiationService.js';10import { ServiceCollection } from '../../../../../platform/instantiation/common/serviceCollection.js';11import { IInstantiationService } from '../../../../../platform/instantiation/common/instantiation.js';12import { IModelService } from '../../../../../editor/common/services/model.js';13import { URI } from '../../../../../base/common/uri.js';14import { BulkFileOperations } from '../../browser/preview/bulkEditPreview.js';15import { Range } from '../../../../../editor/common/core/range.js';16import { ResourceFileEdit, ResourceTextEdit } from '../../../../../editor/browser/services/bulkEditService.js';17import { ensureNoDisposablesAreLeakedInTestSuite } from '../../../../../base/test/common/utils.js';1819suite('BulkEditPreview', function () {2021const store = ensureNoDisposablesAreLeakedInTestSuite();2223let instaService: IInstantiationService;2425setup(function () {2627const fileService: IFileService = new class extends mock<IFileService>() {28override onDidFilesChange = Event.None;29override async exists() {30return true;31}32};3334const modelService: IModelService = new class extends mock<IModelService>() {35override getModel() {36return null;37}38override getModels() {39return [];40}41};4243instaService = new InstantiationService(new ServiceCollection(44[IFileService, fileService],45[IModelService, modelService],46));47});4849test('one needsConfirmation unchecks all of file', async function () {5051const edits = [52new ResourceFileEdit(undefined, URI.parse('some:///uri1'), undefined, { label: 'cat1', needsConfirmation: true }),53new ResourceFileEdit(URI.parse('some:///uri1'), URI.parse('some:///uri2'), undefined, { label: 'cat2', needsConfirmation: false }),54];5556const ops = await instaService.invokeFunction(BulkFileOperations.create, edits);57store.add(ops);58assert.strictEqual(ops.fileOperations.length, 1);59assert.strictEqual(ops.checked.isChecked(edits[0]), false);60});6162test('has categories', async function () {6364const edits = [65new ResourceFileEdit(undefined, URI.parse('some:///uri1'), undefined, { label: 'uri1', needsConfirmation: true }),66new ResourceFileEdit(undefined, URI.parse('some:///uri2'), undefined, { label: 'uri2', needsConfirmation: false }),67];686970const ops = await instaService.invokeFunction(BulkFileOperations.create, edits);71store.add(ops);72assert.strictEqual(ops.categories.length, 2);73assert.strictEqual(ops.categories[0].metadata.label, 'uri1'); // unconfirmed!74assert.strictEqual(ops.categories[1].metadata.label, 'uri2');75});7677test('has not categories', async function () {7879const edits = [80new ResourceFileEdit(undefined, URI.parse('some:///uri1'), undefined, { label: 'uri1', needsConfirmation: true }),81new ResourceFileEdit(undefined, URI.parse('some:///uri2'), undefined, { label: 'uri1', needsConfirmation: false }),82];8384const ops = await instaService.invokeFunction(BulkFileOperations.create, edits);85store.add(ops);86assert.strictEqual(ops.categories.length, 1);87assert.strictEqual(ops.categories[0].metadata.label, 'uri1'); // unconfirmed!88assert.strictEqual(ops.categories[0].metadata.label, 'uri1');89});9091test('category selection', async function () {9293const edits = [94new ResourceFileEdit(undefined, URI.parse('some:///uri1'), undefined, { label: 'C1', needsConfirmation: false }),95new ResourceTextEdit(URI.parse('some:///uri2'), { text: 'foo', range: new Range(1, 1, 1, 1) }, undefined, { label: 'C2', needsConfirmation: false }),96];979899const ops = await instaService.invokeFunction(BulkFileOperations.create, edits);100store.add(ops);101102assert.strictEqual(ops.checked.isChecked(edits[0]), true);103assert.strictEqual(ops.checked.isChecked(edits[1]), true);104105assert.ok(edits === ops.getWorkspaceEdit());106107// NOT taking to create, but the invalid text edit will108// go through109ops.checked.updateChecked(edits[0], false);110const newEdits = ops.getWorkspaceEdit();111assert.ok(edits !== newEdits);112113assert.strictEqual(edits.length, 2);114assert.strictEqual(newEdits.length, 1);115});116117test('fix bad metadata', async function () {118119// bogous edit that wants creation to be confirmed, but not it's textedit-child...120121const edits = [122new ResourceFileEdit(undefined, URI.parse('some:///uri1'), undefined, { label: 'C1', needsConfirmation: true }),123new ResourceTextEdit(URI.parse('some:///uri1'), { text: 'foo', range: new Range(1, 1, 1, 1) }, undefined, { label: 'C2', needsConfirmation: false })124];125126const ops = await instaService.invokeFunction(BulkFileOperations.create, edits);127store.add(ops);128129assert.strictEqual(ops.checked.isChecked(edits[0]), false);130assert.strictEqual(ops.checked.isChecked(edits[1]), false);131});132});133134135