Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/src/vs/workbench/contrib/bulkEdit/test/browser/bulkEditPreview.test.ts
3296 views
1
/*---------------------------------------------------------------------------------------------
2
* Copyright (c) Microsoft Corporation. All rights reserved.
3
* Licensed under the MIT License. See License.txt in the project root for license information.
4
*--------------------------------------------------------------------------------------------*/
5
6
import assert from 'assert';
7
import { Event } from '../../../../../base/common/event.js';
8
import { IFileService } from '../../../../../platform/files/common/files.js';
9
import { mock } from '../../../../test/common/workbenchTestServices.js';
10
import { InstantiationService } from '../../../../../platform/instantiation/common/instantiationService.js';
11
import { ServiceCollection } from '../../../../../platform/instantiation/common/serviceCollection.js';
12
import { IInstantiationService } from '../../../../../platform/instantiation/common/instantiation.js';
13
import { IModelService } from '../../../../../editor/common/services/model.js';
14
import { URI } from '../../../../../base/common/uri.js';
15
import { BulkFileOperations } from '../../browser/preview/bulkEditPreview.js';
16
import { Range } from '../../../../../editor/common/core/range.js';
17
import { ResourceFileEdit, ResourceTextEdit } from '../../../../../editor/browser/services/bulkEditService.js';
18
import { ensureNoDisposablesAreLeakedInTestSuite } from '../../../../../base/test/common/utils.js';
19
20
suite('BulkEditPreview', function () {
21
22
const store = ensureNoDisposablesAreLeakedInTestSuite();
23
24
let instaService: IInstantiationService;
25
26
setup(function () {
27
28
const fileService: IFileService = new class extends mock<IFileService>() {
29
override onDidFilesChange = Event.None;
30
override async exists() {
31
return true;
32
}
33
};
34
35
const modelService: IModelService = new class extends mock<IModelService>() {
36
override getModel() {
37
return null;
38
}
39
override getModels() {
40
return [];
41
}
42
};
43
44
instaService = new InstantiationService(new ServiceCollection(
45
[IFileService, fileService],
46
[IModelService, modelService],
47
));
48
});
49
50
test('one needsConfirmation unchecks all of file', async function () {
51
52
const edits = [
53
new ResourceFileEdit(undefined, URI.parse('some:///uri1'), undefined, { label: 'cat1', needsConfirmation: true }),
54
new ResourceFileEdit(URI.parse('some:///uri1'), URI.parse('some:///uri2'), undefined, { label: 'cat2', needsConfirmation: false }),
55
];
56
57
const ops = await instaService.invokeFunction(BulkFileOperations.create, edits);
58
store.add(ops);
59
assert.strictEqual(ops.fileOperations.length, 1);
60
assert.strictEqual(ops.checked.isChecked(edits[0]), false);
61
});
62
63
test('has categories', async function () {
64
65
const edits = [
66
new ResourceFileEdit(undefined, URI.parse('some:///uri1'), undefined, { label: 'uri1', needsConfirmation: true }),
67
new ResourceFileEdit(undefined, URI.parse('some:///uri2'), undefined, { label: 'uri2', needsConfirmation: false }),
68
];
69
70
71
const ops = await instaService.invokeFunction(BulkFileOperations.create, edits);
72
store.add(ops);
73
assert.strictEqual(ops.categories.length, 2);
74
assert.strictEqual(ops.categories[0].metadata.label, 'uri1'); // unconfirmed!
75
assert.strictEqual(ops.categories[1].metadata.label, 'uri2');
76
});
77
78
test('has not categories', async function () {
79
80
const edits = [
81
new ResourceFileEdit(undefined, URI.parse('some:///uri1'), undefined, { label: 'uri1', needsConfirmation: true }),
82
new ResourceFileEdit(undefined, URI.parse('some:///uri2'), undefined, { label: 'uri1', needsConfirmation: false }),
83
];
84
85
const ops = await instaService.invokeFunction(BulkFileOperations.create, edits);
86
store.add(ops);
87
assert.strictEqual(ops.categories.length, 1);
88
assert.strictEqual(ops.categories[0].metadata.label, 'uri1'); // unconfirmed!
89
assert.strictEqual(ops.categories[0].metadata.label, 'uri1');
90
});
91
92
test('category selection', async function () {
93
94
const edits = [
95
new ResourceFileEdit(undefined, URI.parse('some:///uri1'), undefined, { label: 'C1', needsConfirmation: false }),
96
new ResourceTextEdit(URI.parse('some:///uri2'), { text: 'foo', range: new Range(1, 1, 1, 1) }, undefined, { label: 'C2', needsConfirmation: false }),
97
];
98
99
100
const ops = await instaService.invokeFunction(BulkFileOperations.create, edits);
101
store.add(ops);
102
103
assert.strictEqual(ops.checked.isChecked(edits[0]), true);
104
assert.strictEqual(ops.checked.isChecked(edits[1]), true);
105
106
assert.ok(edits === ops.getWorkspaceEdit());
107
108
// NOT taking to create, but the invalid text edit will
109
// go through
110
ops.checked.updateChecked(edits[0], false);
111
const newEdits = ops.getWorkspaceEdit();
112
assert.ok(edits !== newEdits);
113
114
assert.strictEqual(edits.length, 2);
115
assert.strictEqual(newEdits.length, 1);
116
});
117
118
test('fix bad metadata', async function () {
119
120
// bogous edit that wants creation to be confirmed, but not it's textedit-child...
121
122
const edits = [
123
new ResourceFileEdit(undefined, URI.parse('some:///uri1'), undefined, { label: 'C1', needsConfirmation: true }),
124
new ResourceTextEdit(URI.parse('some:///uri1'), { text: 'foo', range: new Range(1, 1, 1, 1) }, undefined, { label: 'C2', needsConfirmation: false })
125
];
126
127
const ops = await instaService.invokeFunction(BulkFileOperations.create, edits);
128
store.add(ops);
129
130
assert.strictEqual(ops.checked.isChecked(edits[0]), false);
131
assert.strictEqual(ops.checked.isChecked(edits[1]), false);
132
});
133
});
134
135