Merge pull request #170711 from microsoft/connor4312/pr-170339

Connor4312/pr 170339
This commit is contained in:
Connor Peet 2023-01-06 10:41:44 -08:00 committed by GitHub
commit 409b1d8423
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 139 additions and 2 deletions

View file

@ -241,11 +241,31 @@ export class TestProfileService implements ITestProfileService {
/** @inheritdoc */
public setGroupDefaultProfiles(group: TestRunProfileBitset, profiles: ITestRunProfile[]) {
this.preferredDefaults.store({
const next = {
...this.preferredDefaults.get(),
[group]: profiles.map(c => ({ profileId: c.profileId, controllerId: c.controllerId })),
});
};
// When switching a run/debug profile, if the controller has a same-named
// profile in the other group, use that instead of anything else that was selected.
if (group === TestRunProfileBitset.Run || group === TestRunProfileBitset.Debug) {
const otherGroup = group === TestRunProfileBitset.Run ? TestRunProfileBitset.Debug : TestRunProfileBitset.Run;
const previousDefaults = next[otherGroup] || [];
let newDefaults = previousDefaults.slice();
for (const [ctrlId, { profiles: ctrlProfiles }] of this.controllerProfiles) {
const labels = new Set(profiles.filter(p => p.controllerId === ctrlId).map(p => p.label));
const nextByLabels = ctrlProfiles.filter(p => labels.has(p.label) && p.group === otherGroup);
if (nextByLabels.length) {
newDefaults = newDefaults.filter(p => p.controllerId !== ctrlId);
newDefaults.push(...nextByLabels.map(p => ({ profileId: p.profileId, controllerId: p.controllerId })));
}
}
next[otherGroup] = newDefaults;
}
this.preferredDefaults.store(next);
this.changeEmitter.fire();
}

View file

@ -0,0 +1,117 @@
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
import * as assert from 'assert';
import { MockContextKeyService } from 'vs/platform/keybinding/test/common/mockKeybindingService';
import { TestProfileService } from 'vs/workbench/contrib/testing/common/testProfileService';
import { ITestRunProfile, TestRunProfileBitset } from 'vs/workbench/contrib/testing/common/testTypes';
import { TestStorageService } from 'vs/workbench/test/common/workbenchTestServices';
suite('Workbench - TestProfileService', () => {
let t: TestProfileService;
let idCounter = 0;
setup(() => {
idCounter = 0;
t = new TestProfileService(
new MockContextKeyService(),
new TestStorageService(),
);
});
const addProfile = (profile: Partial<ITestRunProfile>) => {
const p: ITestRunProfile = {
controllerId: 'ctrlId',
group: TestRunProfileBitset.Run,
isDefault: true,
label: 'profile',
profileId: idCounter++,
hasConfigurationHandler: false,
tag: null,
...profile,
};
t.addProfile(null as any, p);
return p;
};
const expectProfiles = (expected: ITestRunProfile[], actual: string[]) => {
const e = expected.map(e => e.label).sort();
const a = actual.sort();
assert.deepStrictEqual(e, a);
};
test('getGroupDefaultProfiles', () => {
addProfile({ isDefault: true, group: TestRunProfileBitset.Debug, label: 'a' });
addProfile({ isDefault: false, group: TestRunProfileBitset.Debug, label: 'b' });
addProfile({ isDefault: true, group: TestRunProfileBitset.Run, label: 'c' });
addProfile({ isDefault: true, group: TestRunProfileBitset.Run, label: 'd', controllerId: '2' });
addProfile({ isDefault: false, group: TestRunProfileBitset.Run, label: 'e', controllerId: '2' });
expectProfiles(t.getGroupDefaultProfiles(TestRunProfileBitset.Run), ['c', 'd']);
expectProfiles(t.getGroupDefaultProfiles(TestRunProfileBitset.Debug), ['a']);
});
suite('setGroupDefaultProfiles', () => {
test('applies simple changes', () => {
const p1 = addProfile({ isDefault: false, group: TestRunProfileBitset.Debug, label: 'a' });
addProfile({ isDefault: false, group: TestRunProfileBitset.Debug, label: 'b' });
const p3 = addProfile({ isDefault: false, group: TestRunProfileBitset.Run, label: 'c' });
addProfile({ isDefault: false, group: TestRunProfileBitset.Run, label: 'd' });
t.setGroupDefaultProfiles(TestRunProfileBitset.Run, [p3]);
assert.deepStrictEqual(t.getGroupDefaultProfiles(TestRunProfileBitset.Run), [p3]);
assert.deepStrictEqual(t.getGroupDefaultProfiles(TestRunProfileBitset.Debug), [p1]);
});
test('syncs labels if same', () => {
const p1 = addProfile({ isDefault: false, group: TestRunProfileBitset.Debug, label: 'a' });
const p2 = addProfile({ isDefault: false, group: TestRunProfileBitset.Debug, label: 'b' });
const p3 = addProfile({ isDefault: false, group: TestRunProfileBitset.Run, label: 'a' });
const p4 = addProfile({ isDefault: false, group: TestRunProfileBitset.Run, label: 'b' });
t.setGroupDefaultProfiles(TestRunProfileBitset.Run, [p3]);
assert.deepStrictEqual(t.getGroupDefaultProfiles(TestRunProfileBitset.Run), [p3]);
assert.deepStrictEqual(t.getGroupDefaultProfiles(TestRunProfileBitset.Debug), [p1]);
t.setGroupDefaultProfiles(TestRunProfileBitset.Debug, [p2]);
assert.deepStrictEqual(t.getGroupDefaultProfiles(TestRunProfileBitset.Run), [p4]);
assert.deepStrictEqual(t.getGroupDefaultProfiles(TestRunProfileBitset.Debug), [p2]);
});
test('does not mess up sync for multiple controllers', () => {
// ctrl a and b both of have their own labels. ctrl c does not and should be unaffected
const p1 = addProfile({ isDefault: false, controllerId: 'a', group: TestRunProfileBitset.Debug, label: 'a' });
const p2 = addProfile({ isDefault: false, controllerId: 'b', group: TestRunProfileBitset.Debug, label: 'b1' });
const p3 = addProfile({ isDefault: false, controllerId: 'b', group: TestRunProfileBitset.Debug, label: 'b2' });
const p4 = addProfile({ isDefault: false, controllerId: 'c', group: TestRunProfileBitset.Debug, label: 'c1' });
const p5 = addProfile({ isDefault: false, controllerId: 'a', group: TestRunProfileBitset.Run, label: 'a' });
const p6 = addProfile({ isDefault: false, controllerId: 'b', group: TestRunProfileBitset.Run, label: 'b1' });
const p7 = addProfile({ isDefault: false, controllerId: 'b', group: TestRunProfileBitset.Run, label: 'b2' });
const p8 = addProfile({ isDefault: false, controllerId: 'b', group: TestRunProfileBitset.Run, label: 'b3' });
// same profile on both
t.setGroupDefaultProfiles(TestRunProfileBitset.Debug, [p3]);
assert.deepStrictEqual(t.getGroupDefaultProfiles(TestRunProfileBitset.Run), [p7]);
assert.deepStrictEqual(t.getGroupDefaultProfiles(TestRunProfileBitset.Debug), [p3]);
// different profile, other should be unaffected
t.setGroupDefaultProfiles(TestRunProfileBitset.Run, [p8]);
assert.deepStrictEqual(t.getGroupDefaultProfiles(TestRunProfileBitset.Run), [p8]);
assert.deepStrictEqual(t.getGroupDefaultProfiles(TestRunProfileBitset.Debug), [p3]);
// multiple changes in one go, with unmatched c
t.setGroupDefaultProfiles(TestRunProfileBitset.Debug, [p1, p2, p4]);
assert.deepStrictEqual(t.getGroupDefaultProfiles(TestRunProfileBitset.Run), [p5, p6]);
assert.deepStrictEqual(t.getGroupDefaultProfiles(TestRunProfileBitset.Debug), [p1, p2, p4]);
// identity
t.setGroupDefaultProfiles(TestRunProfileBitset.Run, [p5, p8]);
assert.deepStrictEqual(t.getGroupDefaultProfiles(TestRunProfileBitset.Run), [p5, p8]);
assert.deepStrictEqual(t.getGroupDefaultProfiles(TestRunProfileBitset.Debug), [p2, p4, p1]);
});
});
});