mirror of
https://github.com/Kir-Antipov/mc-publish.git
synced 2025-01-22 18:14:45 +01:00
Implemented Stopwatch to simplify measurements
This commit is contained in:
parent
4989430f1a
commit
2483a4d02b
2 changed files with 127 additions and 0 deletions
68
src/utils/stopwatch.ts
Normal file
68
src/utils/stopwatch.ts
Normal file
|
@ -0,0 +1,68 @@
|
||||||
|
interface StartCallback {
|
||||||
|
(currentDate: Date, stopwatch: Stopwatch): void;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface StopCallback {
|
||||||
|
(elapsedMilliseconds: number, currentDate: Date, stopwatch: Stopwatch): void;
|
||||||
|
}
|
||||||
|
|
||||||
|
export default class Stopwatch {
|
||||||
|
#initialDate = 0;
|
||||||
|
#isRunning = false;
|
||||||
|
#elapsedMilliseconds = 0;
|
||||||
|
#onStart: StartCallback = null;
|
||||||
|
#onStop: StopCallback = null;
|
||||||
|
|
||||||
|
public constructor(onStart?: StartCallback, onStop?: StopCallback) {
|
||||||
|
this.#onStart = onStart;
|
||||||
|
this.#onStop = onStop;
|
||||||
|
}
|
||||||
|
|
||||||
|
public get elapsedMilliseconds(): number {
|
||||||
|
return this.#isRunning
|
||||||
|
? (this.#elapsedMilliseconds + new Date().valueOf() - this.#initialDate)
|
||||||
|
: this.#elapsedMilliseconds;
|
||||||
|
}
|
||||||
|
|
||||||
|
public get isRunning(): boolean {
|
||||||
|
return this.#isRunning;
|
||||||
|
}
|
||||||
|
|
||||||
|
public start(): boolean {
|
||||||
|
if (!this.#isRunning) {
|
||||||
|
const currentDate = new Date();
|
||||||
|
this.#initialDate = currentDate.valueOf();
|
||||||
|
this.#isRunning = true;
|
||||||
|
this.#onStart?.(currentDate, this);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public stop(): boolean {
|
||||||
|
if (this.#isRunning) {
|
||||||
|
const currentDate = new Date();
|
||||||
|
this.#elapsedMilliseconds += currentDate.valueOf() - this.#initialDate;
|
||||||
|
this.#isRunning = false;
|
||||||
|
this.#onStop?.(this.#elapsedMilliseconds, currentDate, this);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public reset(): void {
|
||||||
|
this.stop();
|
||||||
|
this.#elapsedMilliseconds = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
public restart(): void {
|
||||||
|
this.reset();
|
||||||
|
this.start();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static startNew(onStart?: StartCallback, onStop?: StopCallback): Stopwatch {
|
||||||
|
const stopwatch = new Stopwatch(onStart, onStop);
|
||||||
|
stopwatch.start();
|
||||||
|
return stopwatch;
|
||||||
|
}
|
||||||
|
}
|
59
test/stopwatch.test.ts
Normal file
59
test/stopwatch.test.ts
Normal file
|
@ -0,0 +1,59 @@
|
||||||
|
import { describe, test, expect } from "@jest/globals";
|
||||||
|
import sleep from "../src/utils/sleep";
|
||||||
|
import Stopwatch from "../src/utils/stopwatch";
|
||||||
|
|
||||||
|
describe("Stopwatch", () => {
|
||||||
|
test("base functionality of Stopwatch works", async () => {
|
||||||
|
const stopwatch = new Stopwatch();
|
||||||
|
expect(stopwatch.isRunning).toBe(false);
|
||||||
|
expect(stopwatch.elapsedMilliseconds).toBe(0);
|
||||||
|
expect(stopwatch.start()).toBe(true);
|
||||||
|
await sleep(100);
|
||||||
|
expect(stopwatch.start()).toBe(false);
|
||||||
|
expect(stopwatch.stop()).toBe(true);
|
||||||
|
expect(stopwatch.stop()).toBe(false);
|
||||||
|
expect(stopwatch.elapsedMilliseconds).toBeGreaterThan(50);
|
||||||
|
expect(stopwatch.elapsedMilliseconds).toBeLessThan(200);
|
||||||
|
stopwatch.reset();
|
||||||
|
expect(stopwatch.elapsedMilliseconds).toBe(0);
|
||||||
|
});
|
||||||
|
|
||||||
|
test("Stopwatch executes callbacks on start and end", async () => {
|
||||||
|
let started = 0;
|
||||||
|
let stopped = 0;
|
||||||
|
let ms = 0;
|
||||||
|
|
||||||
|
const stopwatch = new Stopwatch(() => ++started, elapsedMilliseconds => {
|
||||||
|
++stopped;
|
||||||
|
ms = elapsedMilliseconds;
|
||||||
|
});
|
||||||
|
|
||||||
|
expect(stopwatch.isRunning).toBe(false);
|
||||||
|
expect(stopwatch.elapsedMilliseconds).toBe(0);
|
||||||
|
|
||||||
|
expect(stopwatch.start()).toBe(true);
|
||||||
|
expect(started).toBe(1);
|
||||||
|
expect(stopped).toBe(0);
|
||||||
|
|
||||||
|
await sleep(100);
|
||||||
|
|
||||||
|
expect(stopwatch.start()).toBe(false);
|
||||||
|
expect(started).toBe(1);
|
||||||
|
expect(stopped).toBe(0);
|
||||||
|
|
||||||
|
expect(stopwatch.stop()).toBe(true);
|
||||||
|
expect(started).toBe(1);
|
||||||
|
expect(stopped).toBe(1);
|
||||||
|
|
||||||
|
expect(stopwatch.stop()).toBe(false);
|
||||||
|
expect(started).toBe(1);
|
||||||
|
expect(stopped).toBe(1);
|
||||||
|
|
||||||
|
expect(stopwatch.elapsedMilliseconds).toBeGreaterThan(50);
|
||||||
|
expect(stopwatch.elapsedMilliseconds).toBeLessThan(200);
|
||||||
|
expect(stopwatch.elapsedMilliseconds).toBe(ms);
|
||||||
|
|
||||||
|
stopwatch.reset();
|
||||||
|
expect(stopwatch.elapsedMilliseconds).toBe(0);
|
||||||
|
});
|
||||||
|
});
|
Loading…
Reference in a new issue