All files / sportident/src testUtils.ts

100% Statements 53/53
100% Branches 14/14
100% Functions 12/12
100% Lines 40/40

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 7623x 23x     23x 14x     23x 2x     23x 124x 124x     23x 106x 34x   72x 72x     218x   149x   23x 2564x 39x 39x 39x 2595x 2568x     39x                 23x     71x 71x 13x   71x 71x 10x 61x 32x   71x               23x 5x 5x 5x 5x 5x    
import {jest} from '@jest/globals';
import _ from 'lodash';
import * as siProtocol from './siProtocol';
 
export const useFakeTimers = (): void => {
    jest.useFakeTimers();
};
 
export const runPromises = async (): Promise<void> => {
    await Promise.resolve();
};
 
export const advanceTimersByTime = async (msToRun: number): Promise<void> => {
    jest.advanceTimersByTime(msToRun);
    await Promise.resolve();
};
 
export const nTimesAsync = async (n: number, doThing: () => Promise<unknown>): Promise<void> => {
    if (n <= 0) {
        return;
    }
    await doThing();
    await nTimesAsync(n - 1, doThing);
};
 
export const getRandomInt = (numOptions: number): number => Math.floor(Math.random() * numOptions);
 
export const getRandomByte = (): number => getRandomInt(256);
 
export const getRandomByteExcept = (except: number[]): number => {
    except.sort((a, b) => Number(a) - Number(b));
    const numOptions = 256 - except.length;
    let randomValue = getRandomInt(numOptions);
    except.forEach((exceptedByte) => {
        if (randomValue >= exceptedByte) {
            randomValue += 1;
        }
    });
    return randomValue;
};
 
type GetRandomMessageOptions = {
    command?: number;
    parameters?: number[];
    numParameters?: number;
};
 
export const getRandomMessage = (
    options: GetRandomMessageOptions,
): siProtocol.SiMessageWithoutMode => {
    let command = getRandomByte();
    if (options.command !== undefined) {
        command = options.command;
    }
    let parameters: number[] = [];
    if (options.parameters !== undefined) {
        parameters = options.parameters;
    } else if (options.numParameters !== undefined) {
        parameters = _.range(options.numParameters).map(() => getRandomByte());
    }
    return {command: command, parameters: parameters};
};
 
export interface Mockable<T> {
    counts: {[key: string]: number};
    mocks: {[key: string]: (count: number) => T};
}
 
export const runMock = <T>(that: Mockable<T>, key: string, getDefaultResult: (count: number) => T): T => {
    const count = that.counts[key] || 0;
    const mockFunction = that.mocks[key] || getDefaultResult;
    const result = mockFunction(count);
    that.counts[key] = count + 1;
    return result;
};