Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/extensions/copilot/test/simulation/workbench/stores/simulationTestsProvider.ts
13399 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 mobx from 'mobx';
7
import { Disposable } from '../../../../src/util/vs/base/common/lifecycle';
8
import { IBaselineTestSummary } from '../../shared/sharedTypes';
9
import { EvaluationError } from './amlResults';
10
import { AMLProvider } from './amlSimulations';
11
import { BaselineJSONProvider } from './baselineJSONProvider';
12
import { DetectedTests } from './detectedTests';
13
import { NesExternalOptions } from './nesExternalOptions';
14
import { ResolvedAMLRun } from './resolvedAMLRun';
15
import { ResolvedSimulationRun } from './resolvedSimulationRun';
16
import { RunnerTestStatus } from './runnerTestStatus';
17
import { SimulationRunsProvider } from './simulationBaseline';
18
import { SimulationRunner, TestRuns } from './simulationRunner';
19
import { TestSource, TestSourceValue } from './testSource';
20
21
export interface ISimulationTest {
22
name: string;
23
suiteName: string;
24
baselineJSON: IBaselineTestSummary | undefined;
25
baseline: TestRuns | undefined;
26
/** `runnerStatus` is undefined when the test hasn't been run */
27
runnerStatus: RunnerTestStatus | undefined;
28
activeEditorLangId?: string;
29
errorsOnlyInBefore?: EvaluationError[];
30
errorsOnlyInAfter?: EvaluationError[];
31
simulationInputPath?: string;
32
}
33
34
export class SimulationTestsProvider extends Disposable {
35
36
private readonly detectedTests: DetectedTests;
37
private readonly nesDetectedTests: DetectedTests;
38
private readonly resolvedBaseline: ResolvedSimulationRun;
39
private readonly resolvedAMLRun: ResolvedAMLRun;
40
41
readonly baselineJSONProvider: BaselineJSONProvider;
42
43
@mobx.observable
44
public comparedBaselineJSON: 'workingTreeBaselineJSON' | 'beforeRunBaselineJSON' = 'workingTreeBaselineJSON';
45
46
@mobx.computed
47
public get allLanguageIds(): readonly string[] {
48
const res = new Set<string>();
49
for (const test of this.tests) {
50
if (test.activeEditorLangId) {
51
res.add(test.activeEditorLangId);
52
}
53
}
54
return [...res];
55
}
56
57
@mobx.computed
58
public get tests(): readonly ISimulationTest[] {
59
switch (this.testSource.value) {
60
case TestSource.External: {
61
const runs = this.resolvedAMLRun.tests;
62
const compareAgainstRun = this.resolvedAMLRun.testsToCompareAgainst;
63
64
const compareAgainstRunMap = new Map<string /* test name */, TestRuns>();
65
compareAgainstRun.value.forEach(testRun => compareAgainstRunMap.set(testRun.name, testRun));
66
67
return runs.value.map((el): ISimulationTest => {
68
const runnerStatus = new RunnerTestStatus(el.name, el.runs.length, el.runs, 0);
69
return {
70
name: el.name,
71
suiteName: '',
72
baselineJSON: undefined,
73
baseline: compareAgainstRunMap.get(el.name),
74
runnerStatus,
75
activeEditorLangId: el.activeEditorLanguageId,
76
errorsOnlyInBefore: el.runs[el.runs.length - 1].errorsOnlyInBefore,
77
errorsOnlyInAfter: el.runs[el.runs.length - 1].errorsOnlyInAfter,
78
simulationInputPath: el.simulationInputPath
79
};
80
});
81
}
82
case TestSource.NesExternal: {
83
const nesTests = this.nesDetectedTests.tests;
84
const baselineRunsArr = this.resolvedBaseline.runs.value;
85
const statusArr = this.runner.testStatus;
86
87
const baselineRunsMap = new Map<string, TestRuns>();
88
for (const el of baselineRunsArr) {
89
baselineRunsMap.set(el.name, el);
90
}
91
92
const statusMap = new Map<string, RunnerTestStatus>();
93
for (const el of statusArr) {
94
statusMap.set(el.name, el);
95
}
96
97
return nesTests.map((el): ISimulationTest => ({
98
name: el.name,
99
suiteName: el.suiteName,
100
baselineJSON: undefined,
101
baseline: baselineRunsMap.get(el.name),
102
runnerStatus: statusMap.get(el.name),
103
}));
104
}
105
case TestSource.Local: {
106
const detectedTests = this.detectedTests.tests;
107
const baselineJSONArr = this.comparedBaselineJSON === 'beforeRunBaselineJSON'
108
? this.baselineJSONProvider.baselineJSONBeforeCurrentRun
109
: this.baselineJSONProvider.workingTreeBaselineJSON;
110
const baselineRunsArr = this.resolvedBaseline.runs.value;
111
const statusArr = this.runner.testStatus;
112
113
const baselineJSONMap = new Map<string, IBaselineTestSummary>();
114
for (const el of baselineJSONArr) {
115
baselineJSONMap.set(el.name, el);
116
}
117
118
const baselineRunsMap = new Map<string, TestRuns>();
119
for (const el of baselineRunsArr) {
120
baselineRunsMap.set(el.name, el);
121
}
122
123
const statusMap = new Map<string, RunnerTestStatus>();
124
for (const el of statusArr) {
125
statusMap.set(el.name, el);
126
}
127
128
return detectedTests.map((el): ISimulationTest => ({
129
name: el.name,
130
suiteName: el.suiteName,
131
baselineJSON: baselineJSONMap.get(el.name),
132
baseline: baselineRunsMap.get(el.name),
133
runnerStatus: statusMap.get(el.name),
134
}));
135
}
136
}
137
}
138
139
constructor(
140
public readonly testSource: TestSourceValue,
141
private readonly runner: SimulationRunner,
142
baselineProvider: SimulationRunsProvider,
143
amlProvider: AMLProvider,
144
nesExternalOptions: NesExternalOptions,
145
) {
146
super();
147
148
mobx.makeObservable(this);
149
150
this.detectedTests = this._register(new DetectedTests());
151
this.nesDetectedTests = this._register(new DetectedTests(() => {
152
const scenariosPath = nesExternalOptions.externalScenariosPath.value;
153
if (!scenariosPath) {
154
return [];
155
}
156
const devNull = process.platform === 'win32' ? 'NUL' : '/dev/null';
157
return ['--nes=external', `--external-scenarios=${scenariosPath}`, `--output=${devNull}`];
158
}));
159
this.baselineJSONProvider = this._register(new BaselineJSONProvider(runner));
160
this.resolvedBaseline = new ResolvedSimulationRun(baselineProvider);
161
this.resolvedAMLRun = new ResolvedAMLRun(amlProvider);
162
}
163
}
164
165