/** * @author Nandan V * Sunday, 26 July 2020 8:33 AM * @description Singleton class that handles the timing of tests and * specs.
The class is singleton as javascript does not support * multiple timer instances. */ class IntervalTimer { /** * @description Constructor for Timer. * @param interval Sets the interval for running the timer. * @param callBack The callback function to be executed. * @return {IntervalTimer} If exists, the existing object. */ constructor(interval = 10, callBack = () => {}) { this.prevInterval = 0 if (this.instance == null) { this.interval = interval this.callBack = callBack this.instance = this } else { return this.instance } } /** * @description Starts the timer. */ startTimer() { this.timer = setInterval(this.callBack, this.interval) } /** * @description Resets the timer. * @return {number} Elapsed time in milliseconds. */ resetTimer() { clearInterval(this.timer) this.callBack = () => {} return this.getElapsedTime() } /** * @return {number} Elapsed time in milliseconds since reset. */ getElapsedTime(offset = 0) { this.timeElapsed = this.timer - this.prevInterval this.prevInterval = this.timer return this.timeElapsed - offset } /** * @return {number} Elapsed time since start. */ getRunTime() { return this.timer } } /** * @author Nandan V * Saturday, 01 August 2020 8:33 AM * @description Example usage */ const ExampleIntervalTimer = function (output = (v) => console.log(v)) { /** * Create am object with default settings. * @type {IntervalTimer} Used to get timing information. */ const timer = new IntervalTimer() timer.startTimer() // ... Initialization code ... // I generally use it for timing tests in Jasmine JS. /** * Gets the runtime till this point. * Can be subtracted from ElapsedTime to offset timing of initialization code. */ const initOffset = timer.getRunTime() // ... A test ... // The time taken to run the test. output(timer.getElapsedTime(initOffset)) /** * Returns the elapsed time and resets the timer to 0. */ output(timer.resetTimer()) } export { IntervalTimer, ExampleIntervalTimer }