in src/controller/testController.ts [330:381]
function mergeTestMethods(testItems: TestItem[]): TestItem[][] {
// tslint:disable-next-line: typedef
const classMapping: Map<string, TestItem> = testItems.reduce((map, i) => {
const testLevel: TestLevel | undefined = dataCache.get(i)?.testLevel;
if (testLevel === undefined) {
return map;
}
if (testLevel === TestLevel.Class) {
map.set(i.id, i);
}
return map;
}, new Map());
// tslint:disable-next-line: typedef
const testMapping: Map<TestItem, Set<TestItem>> = testItems.reduce((map, i) => {
const testLevel: TestLevel | undefined = dataCache.get(i)?.testLevel;
if (testLevel === undefined) {
return map;
}
if (testLevel !== TestLevel.Method) {
return map;
}
// skip the method if it's contained in test classes
if (classMapping.has(i.parent?.id || '')) {
return map;
}
const value: Set<TestItem> | undefined = map.get(i.parent);
if (value) {
value.add(i as TestItem);
} else {
map.set(i.parent, new Set([i]));
}
return map;
}, new Map());
const testMethods: TestItem[][] = [];
for (const [key, value] of testMapping) {
if (key.children.size === value.size) {
classMapping.set(key.id, key);
} else {
for (const method of value.values()) {
testMethods.push([method]);
}
}
}
return [[...classMapping.values()], ...testMethods];
}