UNPKG

@serenity-js/core

Version:

The core Serenity/JS framework, providing the Screenplay Pattern interfaces, as well as the test reporting and integration infrastructure

66 lines 2.88 kB
import { ensure, isGreaterThanOrEqualTo, isInteger, TinyType } from 'tiny-types'; /** * Represents a duration in milliseconds between two [timestamps](https://serenity-js.org/api/core/class/Timestamp/). * * @group Time */ export class Duration extends TinyType { milliseconds; static msPerSecond = 1000; static msPerMinute = Duration.msPerSecond * 60; static msPerHour = Duration.msPerMinute * 60; static msPerDay = Duration.msPerHour * 24; static msPerYear = Duration.msPerDay * 365; static ofMilliseconds = (milliseconds) => new Duration(milliseconds); static ofSeconds = (seconds) => Duration.ofMilliseconds(seconds * Duration.msPerSecond); static ofMinutes = (minutes) => Duration.ofMilliseconds(minutes * Duration.msPerMinute); static ofHours = (hours) => Duration.ofMilliseconds(hours * Duration.msPerHour); static ofDays = (days) => Duration.ofMilliseconds(days * Duration.msPerDay); static ofYears = (years) => Duration.ofMilliseconds(years * Duration.msPerYear); static fromJSON({ milliseconds }) { return Duration.ofMilliseconds(milliseconds); } constructor(milliseconds) { super(); this.milliseconds = milliseconds; ensure('duration', milliseconds, isInteger(), isGreaterThanOrEqualTo(0)); } isLessThan(another) { return this.milliseconds < another.milliseconds; } isLessThanOrEqualTo(another) { return this.milliseconds <= another.milliseconds; } isGreaterThan(another) { return this.milliseconds > another.milliseconds; } isGreaterThanOrEqualTo(another) { return this.milliseconds >= another.milliseconds; } plus(another) { return new Duration(this.milliseconds + another.milliseconds); } inMilliseconds() { return this.milliseconds; } toString() { const ms = this.milliseconds; const levels = [ [Math.floor(ms / Duration.msPerYear), 'y'], [Math.floor((ms % Duration.msPerYear) / Duration.msPerDay), 'd'], [Math.floor(((ms % Duration.msPerYear) % Duration.msPerDay) / Duration.msPerHour), 'h'], [Math.floor((((ms % Duration.msPerYear) % Duration.msPerDay) % Duration.msPerHour) / Duration.msPerMinute), 'm'], [Math.floor((((ms % Duration.msPerYear) % Duration.msPerDay) % Duration.msPerHour) % Duration.msPerMinute / Duration.msPerSecond), 's'], [(((ms % Duration.msPerYear) % Duration.msPerDay) % Duration.msPerHour) % Duration.msPerMinute % Duration.msPerSecond, 'ms'], ]; return levels.reduce((acc, l, i) => l[0] > 0 || i === levels.length ? `${acc} ${l[0]}${l[1]}` : acc, '').trim() || '0ms'; } toJSON() { return { milliseconds: this.milliseconds, }; } } //# sourceMappingURL=Duration.js.map