function runAll(data, scope = globalScope) {
    // Stop the clocks
    // TestBench will now take over clock toggling
    changeClockEnable(false);

    const { inputs, outputs, reset } = bindIO(data, scope);
    let totalCases = 0;
    let passedCases = 0;

    data.groups.forEach((group) => {
        // for (const output of group.outputs) output.results = [];
        group.outputs.forEach((output) => output.results = []);
        for (let case_i = 0; case_i < group.n; case_i++) {
            totalCases++;
            // Set and propagate the inputs
            setInputValues(inputs, group, case_i, scope);
            // If sequential, trigger clock now
            if (data.type === 'seq') tickClock(scope);
            // Get output values
            const caseResult = getOutputValues(data, outputs);
            // Put the results in the data

            let casePassed = true; // Tracks if current case passed or failed

            caseResult.forEach((_, outName) => {
                // TODO: find() is not the best idea because of O(n)
                const output = group.outputs.find((dataOutput) => dataOutput.label.trim() === outName);
                output.results.push(caseResult.get(outName));

                if (output.values[case_i] !== caseResult.get(outName)) casePassed = false;
            });

            // If current case passed, then increment passedCases
            if (casePassed) passedCases++;
        }

        // If sequential, trigger reset at the end of group (set)
        if (data.type === 'seq') triggerReset(reset);
    });

    // Tests done, restart the clocks
    changeClockEnable(true);

    // Return results
    const results = {};
    results.detailed = data;
    results.summary = { passed: passedCases, total: totalCases };
    // console.log(JSON.stringify(results.detailed));
    return results;
}
Run all the tests automatically. Called by runTestBench()
@param {Object} data - Object containing Test Data
@param {Scope=} scope - the circuit