Path: blob/main/extensions/copilot/test/simulation/workbench/stores/simulationTestsProvider.ts
13399 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 mobx from 'mobx';6import { Disposable } from '../../../../src/util/vs/base/common/lifecycle';7import { IBaselineTestSummary } from '../../shared/sharedTypes';8import { EvaluationError } from './amlResults';9import { AMLProvider } from './amlSimulations';10import { BaselineJSONProvider } from './baselineJSONProvider';11import { DetectedTests } from './detectedTests';12import { NesExternalOptions } from './nesExternalOptions';13import { ResolvedAMLRun } from './resolvedAMLRun';14import { ResolvedSimulationRun } from './resolvedSimulationRun';15import { RunnerTestStatus } from './runnerTestStatus';16import { SimulationRunsProvider } from './simulationBaseline';17import { SimulationRunner, TestRuns } from './simulationRunner';18import { TestSource, TestSourceValue } from './testSource';1920export interface ISimulationTest {21name: string;22suiteName: string;23baselineJSON: IBaselineTestSummary | undefined;24baseline: TestRuns | undefined;25/** `runnerStatus` is undefined when the test hasn't been run */26runnerStatus: RunnerTestStatus | undefined;27activeEditorLangId?: string;28errorsOnlyInBefore?: EvaluationError[];29errorsOnlyInAfter?: EvaluationError[];30simulationInputPath?: string;31}3233export class SimulationTestsProvider extends Disposable {3435private readonly detectedTests: DetectedTests;36private readonly nesDetectedTests: DetectedTests;37private readonly resolvedBaseline: ResolvedSimulationRun;38private readonly resolvedAMLRun: ResolvedAMLRun;3940readonly baselineJSONProvider: BaselineJSONProvider;4142@mobx.observable43public comparedBaselineJSON: 'workingTreeBaselineJSON' | 'beforeRunBaselineJSON' = 'workingTreeBaselineJSON';4445@mobx.computed46public get allLanguageIds(): readonly string[] {47const res = new Set<string>();48for (const test of this.tests) {49if (test.activeEditorLangId) {50res.add(test.activeEditorLangId);51}52}53return [...res];54}5556@mobx.computed57public get tests(): readonly ISimulationTest[] {58switch (this.testSource.value) {59case TestSource.External: {60const runs = this.resolvedAMLRun.tests;61const compareAgainstRun = this.resolvedAMLRun.testsToCompareAgainst;6263const compareAgainstRunMap = new Map<string /* test name */, TestRuns>();64compareAgainstRun.value.forEach(testRun => compareAgainstRunMap.set(testRun.name, testRun));6566return runs.value.map((el): ISimulationTest => {67const runnerStatus = new RunnerTestStatus(el.name, el.runs.length, el.runs, 0);68return {69name: el.name,70suiteName: '',71baselineJSON: undefined,72baseline: compareAgainstRunMap.get(el.name),73runnerStatus,74activeEditorLangId: el.activeEditorLanguageId,75errorsOnlyInBefore: el.runs[el.runs.length - 1].errorsOnlyInBefore,76errorsOnlyInAfter: el.runs[el.runs.length - 1].errorsOnlyInAfter,77simulationInputPath: el.simulationInputPath78};79});80}81case TestSource.NesExternal: {82const nesTests = this.nesDetectedTests.tests;83const baselineRunsArr = this.resolvedBaseline.runs.value;84const statusArr = this.runner.testStatus;8586const baselineRunsMap = new Map<string, TestRuns>();87for (const el of baselineRunsArr) {88baselineRunsMap.set(el.name, el);89}9091const statusMap = new Map<string, RunnerTestStatus>();92for (const el of statusArr) {93statusMap.set(el.name, el);94}9596return nesTests.map((el): ISimulationTest => ({97name: el.name,98suiteName: el.suiteName,99baselineJSON: undefined,100baseline: baselineRunsMap.get(el.name),101runnerStatus: statusMap.get(el.name),102}));103}104case TestSource.Local: {105const detectedTests = this.detectedTests.tests;106const baselineJSONArr = this.comparedBaselineJSON === 'beforeRunBaselineJSON'107? this.baselineJSONProvider.baselineJSONBeforeCurrentRun108: this.baselineJSONProvider.workingTreeBaselineJSON;109const baselineRunsArr = this.resolvedBaseline.runs.value;110const statusArr = this.runner.testStatus;111112const baselineJSONMap = new Map<string, IBaselineTestSummary>();113for (const el of baselineJSONArr) {114baselineJSONMap.set(el.name, el);115}116117const baselineRunsMap = new Map<string, TestRuns>();118for (const el of baselineRunsArr) {119baselineRunsMap.set(el.name, el);120}121122const statusMap = new Map<string, RunnerTestStatus>();123for (const el of statusArr) {124statusMap.set(el.name, el);125}126127return detectedTests.map((el): ISimulationTest => ({128name: el.name,129suiteName: el.suiteName,130baselineJSON: baselineJSONMap.get(el.name),131baseline: baselineRunsMap.get(el.name),132runnerStatus: statusMap.get(el.name),133}));134}135}136}137138constructor(139public readonly testSource: TestSourceValue,140private readonly runner: SimulationRunner,141baselineProvider: SimulationRunsProvider,142amlProvider: AMLProvider,143nesExternalOptions: NesExternalOptions,144) {145super();146147mobx.makeObservable(this);148149this.detectedTests = this._register(new DetectedTests());150this.nesDetectedTests = this._register(new DetectedTests(() => {151const scenariosPath = nesExternalOptions.externalScenariosPath.value;152if (!scenariosPath) {153return [];154}155const devNull = process.platform === 'win32' ? 'NUL' : '/dev/null';156return ['--nes=external', `--external-scenarios=${scenariosPath}`, `--output=${devNull}`];157}));158this.baselineJSONProvider = this._register(new BaselineJSONProvider(runner));159this.resolvedBaseline = new ResolvedSimulationRun(baselineProvider);160this.resolvedAMLRun = new ResolvedAMLRun(amlProvider);161}162}163164165