Path: blob/main/src/vs/workbench/test/browser/componentFixtures/aiStats.fixture.ts
13401 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 { observableValue } from '../../../../base/common/observable.js';6import { createAiStatsHover, IAiStatsHoverData } from '../../../contrib/editTelemetry/browser/editStats/aiStatsStatusBar.js';7import { ISessionData } from '../../../contrib/editTelemetry/browser/editStats/aiStatsChart.js';8import { Random } from '../../../../editor/test/common/core/random.js';9import { ComponentFixtureContext, defineComponentFixture, defineThemedFixtureGroup } from './fixtureUtils.js';1011export default defineThemedFixtureGroup({ path: 'chat/' }, {12AiStatsHover: defineComponentFixture({13labels: { kind: 'screenshot' },14render: (context) => renderAiStatsHover({ ...context, data: createSampleDataWithSessions() }),15}),1617AiStatsHoverNoData: defineComponentFixture({18labels: { kind: 'screenshot' },19render: (context) => renderAiStatsHover({ ...context, data: createEmptyData() }),20}),21});2223function createSampleDataWithSessions(): IAiStatsHoverData {24const random = Random.create(42);2526// Use a fixed base time for determinism (Jan 1, 2025, 12:00:00 UTC)27const baseTime = 1735732800000;28const dayMs = 24 * 60 * 60 * 1000;29const sessionLengthMs = 5 * 60 * 1000;3031// Generate fake session data for the last 7 days32const fakeSessions: ISessionData[] = [];33for (let day = 6; day >= 0; day--) {34const dayStart = baseTime - day * dayMs;35const sessionsPerDay = random.nextIntRange(3, 9);36for (let s = 0; s < sessionsPerDay; s++) {37const sessionTime = dayStart + s * sessionLengthMs * 2;38fakeSessions.push({39startTime: sessionTime,40typedCharacters: random.nextIntRange(100, 600),41aiCharacters: random.nextIntRange(200, 1000),42acceptedInlineSuggestions: random.nextIntRange(1, 16),43chatEditCount: random.nextIntRange(0, 5),44});45}46}4748const totalAi = fakeSessions.reduce((sum, s) => sum + s.aiCharacters, 0);49const totalTyped = fakeSessions.reduce((sum, s) => sum + s.typedCharacters, 0);50const aiRate = totalAi / (totalAi + totalTyped);5152// "Today" for the fixture is the baseTime day53const startOfToday = baseTime - (baseTime % dayMs);54const todaySessions = fakeSessions.filter(s => s.startTime >= startOfToday);55const acceptedToday = todaySessions.reduce((sum, s) => sum + (s.acceptedInlineSuggestions ?? 0), 0);5657return {58aiRate: observableValue('aiRate', aiRate),59acceptedInlineSuggestionsToday: observableValue('acceptedToday', acceptedToday),60sessions: observableValue('sessions', fakeSessions),61};62}6364function createEmptyData(): IAiStatsHoverData {65return {66aiRate: observableValue('aiRate', 0),67acceptedInlineSuggestionsToday: observableValue('acceptedToday', 0),68sessions: observableValue('sessions', []),69};70}7172interface RenderAiStatsOptions extends ComponentFixtureContext {73data: IAiStatsHoverData;74}7576function renderAiStatsHover({ container, disposableStore, data }: RenderAiStatsOptions): void {77container.style.width = '320px';78container.style.padding = '8px';79container.style.backgroundColor = 'var(--vscode-editorHoverWidget-background)';80container.style.border = '1px solid var(--vscode-editorHoverWidget-border)';81container.style.borderRadius = '4px';82container.style.color = 'var(--vscode-editorHoverWidget-foreground)';8384const hover = createAiStatsHover({85data,86onOpenSettings: () => console.log('Open settings clicked'),87});8889const elem = hover.keepUpdated(disposableStore).element;90container.appendChild(elem);91}929394