function mergeTestMethods()

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];
}