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