Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/src/vs/workbench/test/browser/part.test.ts
5237 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 { Part } from '../../browser/part.js';
8
import { isEmptyObject } from '../../../base/common/types.js';
9
import { TestThemeService } from '../../../platform/theme/test/common/testThemeService.js';
10
import { append, $, hide } from '../../../base/browser/dom.js';
11
import { TestLayoutService } from './workbenchTestServices.js';
12
import { StorageScope, StorageTarget } from '../../../platform/storage/common/storage.js';
13
import { TestStorageService } from '../common/workbenchTestServices.js';
14
import { ensureNoDisposablesAreLeakedInTestSuite } from '../../../base/test/common/utils.js';
15
import { DisposableStore } from '../../../base/common/lifecycle.js';
16
import { mainWindow } from '../../../base/browser/window.js';
17
18
suite('Workbench parts', () => {
19
20
const disposables = new DisposableStore();
21
22
class SimplePart extends Part {
23
24
minimumWidth: number = 50;
25
maximumWidth: number = 50;
26
minimumHeight: number = 50;
27
maximumHeight: number = 50;
28
29
override layout(width: number, height: number): void {
30
throw new Error('Method not implemented.');
31
}
32
33
toJSON(): object {
34
throw new Error('Method not implemented.');
35
}
36
}
37
38
class MyPart extends SimplePart {
39
40
constructor(private expectedParent: HTMLElement) {
41
super('myPart', { hasTitle: true }, new TestThemeService(), disposables.add(new TestStorageService()), new TestLayoutService());
42
}
43
44
protected override createTitleArea(parent: HTMLElement): HTMLElement {
45
assert.strictEqual(parent, this.expectedParent);
46
return super.createTitleArea(parent)!;
47
}
48
49
protected override createContentArea(parent: HTMLElement): HTMLElement {
50
assert.strictEqual(parent, this.expectedParent);
51
return super.createContentArea(parent)!;
52
}
53
54
testGetMemento(scope: StorageScope, target: StorageTarget) {
55
return super.getMemento(scope, target);
56
}
57
58
testSaveState(): void {
59
return super.saveState();
60
}
61
}
62
63
class MyPart2 extends SimplePart {
64
65
constructor() {
66
super('myPart2', { hasTitle: true }, new TestThemeService(), disposables.add(new TestStorageService()), new TestLayoutService());
67
}
68
69
protected override createTitleArea(parent: HTMLElement): HTMLElement {
70
const titleContainer = append(parent, $('div'));
71
const titleLabel = append(titleContainer, $('span'));
72
titleLabel.id = 'myPart.title';
73
titleLabel.innerText = 'Title';
74
75
return titleContainer;
76
}
77
78
protected override createContentArea(parent: HTMLElement): HTMLElement {
79
const contentContainer = append(parent, $('div'));
80
const contentSpan = append(contentContainer, $('span'));
81
contentSpan.id = 'myPart.content';
82
contentSpan.innerText = 'Content';
83
84
return contentContainer;
85
}
86
}
87
88
class MyPart3 extends SimplePart {
89
90
constructor() {
91
super('myPart2', { hasTitle: false }, new TestThemeService(), disposables.add(new TestStorageService()), new TestLayoutService());
92
}
93
94
protected override createTitleArea(parent: HTMLElement): HTMLElement {
95
return null!;
96
}
97
98
protected override createContentArea(parent: HTMLElement): HTMLElement {
99
const contentContainer = append(parent, $('div'));
100
const contentSpan = append(contentContainer, $('span'));
101
contentSpan.id = 'myPart.content';
102
contentSpan.innerText = 'Content';
103
104
return contentContainer;
105
}
106
}
107
108
let fixture: HTMLElement;
109
const fixtureId = 'workbench-part-fixture';
110
111
setup(() => {
112
fixture = document.createElement('div');
113
fixture.id = fixtureId;
114
mainWindow.document.body.appendChild(fixture);
115
});
116
117
teardown(() => {
118
fixture.remove();
119
disposables.clear();
120
});
121
122
test('Creation', () => {
123
const b = document.createElement('div');
124
mainWindow.document.getElementById(fixtureId)!.appendChild(b);
125
hide(b);
126
127
let part = disposables.add(new MyPart(b));
128
part.create(b);
129
130
assert.strictEqual(part.getId(), 'myPart');
131
132
// Memento
133
// eslint-disable-next-line local/code-no-any-casts
134
let memento = part.testGetMemento(StorageScope.PROFILE, StorageTarget.MACHINE) as any;
135
assert(memento);
136
memento.foo = 'bar';
137
memento.bar = [1, 2, 3];
138
139
part.testSaveState();
140
141
// Re-Create to assert memento contents
142
part = disposables.add(new MyPart(b));
143
144
memento = part.testGetMemento(StorageScope.PROFILE, StorageTarget.MACHINE);
145
assert(memento);
146
assert.strictEqual(memento.foo, 'bar');
147
assert.strictEqual(memento.bar.length, 3);
148
149
// Empty Memento stores empty object
150
delete memento.foo;
151
delete memento.bar;
152
153
part.testSaveState();
154
part = disposables.add(new MyPart(b));
155
memento = part.testGetMemento(StorageScope.PROFILE, StorageTarget.MACHINE);
156
assert(memento);
157
assert.strictEqual(isEmptyObject(memento), true);
158
});
159
160
test('Part Layout with Title and Content', function () {
161
const b = document.createElement('div');
162
mainWindow.document.getElementById(fixtureId)!.appendChild(b);
163
hide(b);
164
165
const part = disposables.add(new MyPart2());
166
part.create(b);
167
168
assert(mainWindow.document.getElementById('myPart.title'));
169
assert(mainWindow.document.getElementById('myPart.content'));
170
});
171
172
test('Part Layout with Content only', function () {
173
const b = document.createElement('div');
174
mainWindow.document.getElementById(fixtureId)!.appendChild(b);
175
hide(b);
176
177
const part = disposables.add(new MyPart3());
178
part.create(b);
179
180
assert(!mainWindow.document.getElementById('myPart.title'));
181
assert(mainWindow.document.getElementById('myPart.content'));
182
});
183
184
ensureNoDisposablesAreLeakedInTestSuite();
185
});
186
187