Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/src/vs/workbench/test/browser/componentFixtures/aiStats.fixture.ts
13401 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 { observableValue } from '../../../../base/common/observable.js';
7
import { createAiStatsHover, IAiStatsHoverData } from '../../../contrib/editTelemetry/browser/editStats/aiStatsStatusBar.js';
8
import { ISessionData } from '../../../contrib/editTelemetry/browser/editStats/aiStatsChart.js';
9
import { Random } from '../../../../editor/test/common/core/random.js';
10
import { ComponentFixtureContext, defineComponentFixture, defineThemedFixtureGroup } from './fixtureUtils.js';
11
12
export default defineThemedFixtureGroup({ path: 'chat/' }, {
13
AiStatsHover: defineComponentFixture({
14
labels: { kind: 'screenshot' },
15
render: (context) => renderAiStatsHover({ ...context, data: createSampleDataWithSessions() }),
16
}),
17
18
AiStatsHoverNoData: defineComponentFixture({
19
labels: { kind: 'screenshot' },
20
render: (context) => renderAiStatsHover({ ...context, data: createEmptyData() }),
21
}),
22
});
23
24
function createSampleDataWithSessions(): IAiStatsHoverData {
25
const random = Random.create(42);
26
27
// Use a fixed base time for determinism (Jan 1, 2025, 12:00:00 UTC)
28
const baseTime = 1735732800000;
29
const dayMs = 24 * 60 * 60 * 1000;
30
const sessionLengthMs = 5 * 60 * 1000;
31
32
// Generate fake session data for the last 7 days
33
const fakeSessions: ISessionData[] = [];
34
for (let day = 6; day >= 0; day--) {
35
const dayStart = baseTime - day * dayMs;
36
const sessionsPerDay = random.nextIntRange(3, 9);
37
for (let s = 0; s < sessionsPerDay; s++) {
38
const sessionTime = dayStart + s * sessionLengthMs * 2;
39
fakeSessions.push({
40
startTime: sessionTime,
41
typedCharacters: random.nextIntRange(100, 600),
42
aiCharacters: random.nextIntRange(200, 1000),
43
acceptedInlineSuggestions: random.nextIntRange(1, 16),
44
chatEditCount: random.nextIntRange(0, 5),
45
});
46
}
47
}
48
49
const totalAi = fakeSessions.reduce((sum, s) => sum + s.aiCharacters, 0);
50
const totalTyped = fakeSessions.reduce((sum, s) => sum + s.typedCharacters, 0);
51
const aiRate = totalAi / (totalAi + totalTyped);
52
53
// "Today" for the fixture is the baseTime day
54
const startOfToday = baseTime - (baseTime % dayMs);
55
const todaySessions = fakeSessions.filter(s => s.startTime >= startOfToday);
56
const acceptedToday = todaySessions.reduce((sum, s) => sum + (s.acceptedInlineSuggestions ?? 0), 0);
57
58
return {
59
aiRate: observableValue('aiRate', aiRate),
60
acceptedInlineSuggestionsToday: observableValue('acceptedToday', acceptedToday),
61
sessions: observableValue('sessions', fakeSessions),
62
};
63
}
64
65
function createEmptyData(): IAiStatsHoverData {
66
return {
67
aiRate: observableValue('aiRate', 0),
68
acceptedInlineSuggestionsToday: observableValue('acceptedToday', 0),
69
sessions: observableValue('sessions', []),
70
};
71
}
72
73
interface RenderAiStatsOptions extends ComponentFixtureContext {
74
data: IAiStatsHoverData;
75
}
76
77
function renderAiStatsHover({ container, disposableStore, data }: RenderAiStatsOptions): void {
78
container.style.width = '320px';
79
container.style.padding = '8px';
80
container.style.backgroundColor = 'var(--vscode-editorHoverWidget-background)';
81
container.style.border = '1px solid var(--vscode-editorHoverWidget-border)';
82
container.style.borderRadius = '4px';
83
container.style.color = 'var(--vscode-editorHoverWidget-foreground)';
84
85
const hover = createAiStatsHover({
86
data,
87
onOpenSettings: () => console.log('Open settings clicked'),
88
});
89
90
const elem = hover.keepUpdated(disposableStore).element;
91
container.appendChild(elem);
92
}
93
94