Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/src/vs/workbench/test/browser/componentFixtures/chat/chatProgressContentPart.fixture.ts
13405 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 * as dom from '../../../../../base/browser/dom.js';
7
import { MarkdownString } from '../../../../../base/common/htmlContent.js';
8
import { Event } from '../../../../../base/common/event.js';
9
import { observableValue } from '../../../../../base/common/observable.js';
10
import { Codicon } from '../../../../../base/common/codicons.js';
11
import { ThemeIcon } from '../../../../../base/common/themables.js';
12
import { mock, upcastPartial } from '../../../../../base/test/common/mock.js';
13
import { IMarkdownRendererService, MarkdownRendererService } from '../../../../../platform/markdown/browser/markdownRenderer.js';
14
import { ChatProgressContentPart } from '../../../../contrib/chat/browser/widget/chatContentParts/chatProgressContentPart.js';
15
import { ChatContentMarkdownRenderer } from '../../../../contrib/chat/browser/widget/chatContentMarkdownRenderer.js';
16
import { IChatContentPartRenderContext, InlineTextModelCollection } from '../../../../contrib/chat/browser/widget/chatContentParts/chatContentParts.js';
17
import { IChatMarkdownAnchorService } from '../../../../contrib/chat/browser/widget/chatContentParts/chatMarkdownAnchorService.js';
18
import { IChatProgressMessage } from '../../../../contrib/chat/common/chatService/chatService.js';
19
import { IChatResponseViewModel } from '../../../../contrib/chat/common/model/chatViewModel.js';
20
import { ComponentFixtureContext, createEditorServices, defineComponentFixture, defineThemedFixtureGroup } from '../fixtureUtils.js';
21
22
import '../../../../contrib/chat/browser/widget/media/chat.css';
23
24
function createMockContext(opts?: { isComplete?: boolean; hasFollowingContent?: boolean }): IChatContentPartRenderContext {
25
const element = new class extends mock<IChatResponseViewModel>() {
26
override readonly isComplete = opts?.isComplete ?? false;
27
}();
28
return {
29
element,
30
inlineTextModels: upcastPartial<InlineTextModelCollection>({}),
31
elementIndex: 0,
32
container: document.createElement('div'),
33
content: opts?.hasFollowingContent ? [{ kind: 'progressMessage', content: new MarkdownString('test') }] : [],
34
contentIndex: 0,
35
editorPool: undefined!,
36
codeBlockStartIndex: 0,
37
treeStartIndex: 0,
38
diffEditorPool: undefined!,
39
currentWidth: observableValue('currentWidth', 400),
40
onDidChangeVisibility: Event.None,
41
};
42
}
43
44
function createProgressMessage(text: string): IChatProgressMessage {
45
return {
46
kind: 'progressMessage',
47
content: new MarkdownString(text),
48
};
49
}
50
51
function renderProgressPart(
52
context: ComponentFixtureContext,
53
message: IChatProgressMessage,
54
renderContext: IChatContentPartRenderContext,
55
opts?: {
56
forceShowSpinner?: boolean;
57
forceShowMessage?: boolean;
58
icon?: ThemeIcon;
59
shimmer?: boolean;
60
},
61
): void {
62
const { container, disposableStore } = context;
63
64
const mockAnchorService = new class extends mock<IChatMarkdownAnchorService>() {
65
override register() { return { dispose() { } }; }
66
}();
67
68
const instantiationService = createEditorServices(disposableStore, {
69
colorTheme: context.theme,
70
additionalServices: (reg) => {
71
reg.define(IMarkdownRendererService, MarkdownRendererService);
72
reg.defineInstance(IChatMarkdownAnchorService, mockAnchorService);
73
},
74
});
75
76
const markdownRenderer = instantiationService.createInstance(ChatContentMarkdownRenderer);
77
78
const part = disposableStore.add(
79
instantiationService.createInstance(
80
ChatProgressContentPart,
81
message,
82
markdownRenderer,
83
renderContext,
84
opts?.forceShowSpinner,
85
opts?.forceShowMessage,
86
opts?.icon,
87
undefined, // toolInvocation
88
opts?.shimmer,
89
)
90
);
91
92
// .interactive-session provides CSS custom properties (--vscode-chat-font-size-body-s, etc.)
93
// .interactive-item-container .progress-container is the selector for layout styles
94
container.style.width = '400px';
95
container.style.padding = '8px';
96
container.classList.add('interactive-session');
97
98
const itemContainer = dom.$('.interactive-item-container');
99
itemContainer.appendChild(part.domNode);
100
container.appendChild(itemContainer);
101
}
102
103
export default defineThemedFixtureGroup({ path: 'chat/' }, {
104
WithSpinner: defineComponentFixture({
105
labels: { kind: 'animated' },
106
render: (ctx) => renderProgressPart(
107
ctx,
108
createProgressMessage('Searching workspace for relevant files...'),
109
createMockContext({ isComplete: false }),
110
{ forceShowSpinner: true, forceShowMessage: true, shimmer: false },
111
),
112
}),
113
114
Completed: defineComponentFixture({
115
labels: { kind: 'screenshot' },
116
render: (ctx) => renderProgressPart(
117
ctx,
118
createProgressMessage('Found 12 relevant files'),
119
createMockContext({ isComplete: true }),
120
{ forceShowSpinner: false, forceShowMessage: true },
121
),
122
}),
123
124
WithCustomIcon: defineComponentFixture({
125
labels: { kind: 'screenshot' },
126
render: (ctx) => renderProgressPart(
127
ctx,
128
createProgressMessage('Running tests...'),
129
createMockContext({ isComplete: false }),
130
{ forceShowSpinner: true, forceShowMessage: true, icon: Codicon.beaker },
131
),
132
}),
133
134
WithInlineCode: defineComponentFixture({
135
labels: { kind: 'animated' },
136
render: (ctx) => renderProgressPart(
137
ctx,
138
createProgressMessage('Reading `src/vs/workbench/contrib/chat/browser/chatWidget.ts`'),
139
createMockContext({ isComplete: false }),
140
{ forceShowSpinner: true, forceShowMessage: true, shimmer: false },
141
),
142
}),
143
144
LongMessage: defineComponentFixture({
145
labels: { kind: 'animated' },
146
render: (ctx) => renderProgressPart(
147
ctx,
148
createProgressMessage('Searching across multiple workspace folders for TypeScript files matching the pattern you described, including test files and configuration'),
149
createMockContext({ isComplete: false }),
150
{ forceShowSpinner: true, forceShowMessage: true, shimmer: false },
151
),
152
}),
153
});
154
155