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