UNPKG

@jony_starc/rostime

Version:

ROS (Robot Operating System) Time and Duration primitives and helper methods

518 lines (468 loc) 21.4 kB
import * as rostime from "."; import { Time } from "."; describe("isTime", () => { it("works", () => { expect(rostime.isTime(undefined)).toEqual(false); expect(rostime.isTime(false)).toEqual(false); expect(rostime.isTime(true)).toEqual(false); expect(rostime.isTime({})).toEqual(false); expect(rostime.isTime({ sec: 1 })).toEqual(false); expect(rostime.isTime({ nsec: 1 })).toEqual(false); expect(rostime.isTime({ sec: 1, nsec: 1, other: undefined })).toEqual(false); expect(rostime.isTime({ sec: 1, nsec: 1, other: 0 })).toEqual(false); expect(rostime.isTime({ sec: 0, nsec: 0 })).toEqual(true); expect(rostime.isTime({ sec: 1, nsec: 0 })).toEqual(true); expect(rostime.isTime({ sec: 1624947142, nsec: 42 })).toEqual(true); }); }); describe("toRFC3339String", () => { it("formats whole values correctly", () => { expect(rostime.toRFC3339String({ sec: 1, nsec: 0 })).toEqual("1970-01-01T00:00:01.000000000Z"); }); it("formats partial nanos", () => { expect(rostime.toRFC3339String({ sec: 102, nsec: 304 })).toEqual( "1970-01-01T00:01:42.000000304Z", ); expect(rostime.toRFC3339String({ sec: 102, nsec: 99900000 })).toEqual( "1970-01-01T00:01:42.099900000Z", ); }); it("formats max nanos", () => { expect(rostime.toRFC3339String({ sec: 102, nsec: 999999999 })).toEqual( "1970-01-01T00:01:42.999999999Z", ); }); it("does not format negative times", () => { expect(() => rostime.toRFC3339String({ sec: -1, nsec: 0 })).toThrow(); }); it("interoperates with Date.parse", () => { const date = new Date(Date.UTC(2021, 8, 29, 18, 12, 8, 123)); expect(Date.parse(rostime.toRFC3339String(rostime.fromDate(date)))).toEqual(+date); }); }); describe("fromRFC3339String", () => { it("parses nanosecond precision", () => { expect(rostime.fromRFC3339String("1970-01-01T00:00:00.0000000Z")).toEqual({ sec: 0, nsec: 0, }); expect(rostime.fromRFC3339String("1970-01-01T00:00:00.000000001Z")).toEqual({ sec: 0, nsec: 1, }); expect(rostime.fromRFC3339String("1970-01-01T00:00:00.0000000001Z")).toEqual({ sec: 0, nsec: 0, }); expect(rostime.fromRFC3339String("1970-01-01T00:00:00.100000000Z")).toEqual({ sec: 0, nsec: 100_000_000, }); expect(rostime.fromRFC3339String("1970-01-01T00:00:00.0123Z")).toEqual({ sec: 0, nsec: 12_300_000, }); expect(rostime.fromRFC3339String("1970-01-01T00:00:00.012345678Z")).toEqual({ sec: 0, nsec: 12_345_678, }); }); it("rounds to nearest nanosecond", () => { expect(rostime.fromRFC3339String("1970-01-01T00:00:00.0123456789Z")).toEqual({ sec: 0, nsec: 12_345_679, }); expect(rostime.fromRFC3339String("1970-01-01T00:00:00.9999999991Z")).toEqual({ sec: 0, nsec: 999_999_999, }); expect(rostime.fromRFC3339String("1970-01-01T00:00:00.9999999995Z")).toEqual({ sec: 1, nsec: 0, }); expect(rostime.fromRFC3339String("1970-01-01T00:00:01.9999999995Z")).toEqual({ sec: 2, nsec: 0, }); }); it("handles time zone offsets", () => { expect(rostime.fromRFC3339String("2021-09-29T18:12:08.123456789+00:00")).toEqual({ sec: 1632939128, nsec: 123_456_789, }); expect(rostime.fromRFC3339String("2021-09-29T18:12:08.123456789-00:00")).toEqual({ sec: 1632939128, nsec: 123_456_789, }); expect(rostime.fromRFC3339String("2021-09-29T18:12:08.123456789+00:01")).toEqual({ sec: 1632939128 - 60, nsec: 123_456_789, }); expect(rostime.fromRFC3339String("2021-09-29T18:12:08.123456789-00:01")).toEqual({ sec: 1632939128 + 60, nsec: 123_456_789, }); expect(rostime.fromRFC3339String("2021-09-29T18:12:08.123456789+10:09")).toEqual({ sec: 1632939128 - (10 * 60 + 9) * 60, nsec: 123_456_789, }); expect(rostime.fromRFC3339String("2021-09-29T18:12:08.123456789-10:09")).toEqual({ sec: 1632939128 + (10 * 60 + 9) * 60, nsec: 123_456_789, }); }); it("interoperates with Date.toISOString", () => { const date = new Date(Date.UTC(2021, 8, 29, 18, 12, 8, 123)); expect(rostime.fromRFC3339String(date.toISOString())).toEqual({ sec: 1632939128, nsec: 123_000_000, }); }); }); describe("toString", () => { it("formats whole values correctly", () => { expect(rostime.toString({ sec: 1, nsec: 0 })).toEqual("1.000000000"); }); it("formats partial nanos", () => { expect(rostime.toString({ sec: 102, nsec: 304 })).toEqual("102.000000304"); expect(rostime.toString({ sec: 102, nsec: 99900000 })).toEqual("102.099900000"); }); it("formats max nanos", () => { expect(rostime.toString({ sec: 102, nsec: 999000000 })).toEqual("102.999000000"); }); it("does not format negative times", () => { expect(() => rostime.toString({ sec: -1, nsec: 0 })).toThrow(); }); }); describe("fromString", () => { it("converts from nanoseconds to time", () => { const nanos1 = "1508410740.582458241"; expect(rostime.fromString(nanos1)).toEqual({ sec: 1508410740, nsec: 582458241 }); const nanos2 = "1508428043.155306000"; expect(rostime.fromString(nanos2)).toEqual({ sec: 1508428043, nsec: 155306000 }); expect(rostime.fromString("5001")).toEqual({ sec: 5001, nsec: 0 }); const nanos3 = `${1e10 + 1}`; expect(rostime.fromString(nanos3)).toEqual({ sec: 1e10 + 1, nsec: 0 }); expect(rostime.fromString("0")).toEqual({ sec: 0, nsec: 0 }); expect(rostime.fromString("1000.000")).toEqual({ sec: 1000, nsec: 0 }); }); it("does not convert invalid times", () => { expect(rostime.fromString("1000x00")).toBeUndefined(); expect(rostime.fromString("1000 00")).toBeUndefined(); expect(rostime.fromString("")).toBeUndefined(); expect(rostime.fromString("-1")).toBeUndefined(); }); it("returns undefined if the input string is formatted incorrectly", () => { expect(rostime.fromString("")).toEqual(undefined); expect(rostime.fromString(".12121")).toEqual(undefined); expect(rostime.fromString(".")).toEqual(undefined); }); it("returns the correct time", () => { expect(rostime.fromString("12121.")).toEqual({ sec: 12121, nsec: 0 }); expect(rostime.fromString("1")).toEqual({ sec: 1, nsec: 0 }); expect(rostime.fromString("1.")).toEqual({ sec: 1, nsec: 0 }); expect(rostime.fromString("1.12")).toEqual({ sec: 1, nsec: 0.12e9 }); expect(rostime.fromString("100.100")).toEqual({ sec: 100, nsec: 0.1e9 }); expect(rostime.fromString("100")).toEqual({ sec: 100, nsec: 0 }); // Full nanosecond timestamp expect(rostime.fromString("1.123456789")).toEqual({ sec: 1, nsec: 0.123456789e9 }); // Too much precision expect(rostime.fromString("1.0123456789")).toEqual({ sec: 1, nsec: 0.012345679e9 }); // Too much precision, round seconds up. expect(rostime.fromString("1.999999999999")).toEqual({ sec: 2, nsec: 0 }); }); }); describe("toDate & fromDate", () => { it("converts to date and from date", () => { const totalSeconds = Math.round(Date.now() / 1000); const stamp = { sec: totalSeconds, nsec: 1000 }; const now = new Date(totalSeconds * 1000); expect(rostime.toDate(stamp)).toEqual(now); expect(rostime.fromDate(now)).toEqual({ sec: totalSeconds, nsec: 0 }); const nowPlus1ms = new Date(totalSeconds * 1000 + 1); expect(rostime.toDate({ sec: totalSeconds, nsec: 1 * 1e6 })).toEqual(nowPlus1ms); expect(rostime.fromDate(nowPlus1ms)).toEqual({ sec: totalSeconds, nsec: 1000000, }); }); it("can be created from a date", () => { const date = new Date(1511798097280); const time = rostime.fromDate(date); expect(time.sec).toBe(Math.floor(1511798097280 / 1000)); expect(time.nsec).toBe(280000000); }); it("can convert to a date", () => { const date = new Date(1511798097280); const time = { sec: 1511798097, nsec: 280000000 }; expect(rostime.toDate(time)).toEqual(date); }); }); describe("percentOf", () => { it("gives percentages correctly", () => { const start = { sec: 0, nsec: 0 }; const end = { sec: 10, nsec: 0 }; expect(rostime.percentOf(start, end, { sec: 5, nsec: 0 })).toEqual(0.5); expect(rostime.percentOf(start, end, { sec: 1, nsec: 0 })).toEqual(0.1); expect(rostime.percentOf(start, end, { sec: 0, nsec: 1e9 })).toEqual(0.1); expect(rostime.percentOf(start, end, { sec: 0, nsec: 1e7 })).toEqual(0.001); expect(rostime.percentOf(start, end, { sec: -1, nsec: 0 })).toEqual(-0.1); }); }); describe("interpolate", () => { it("works for zero-duration spans", () => { const t = { sec: 0, nsec: 0 }; expect(rostime.interpolate(t, t, 0)).toEqual(t); expect(rostime.interpolate(t, t, -1)).toEqual(t); expect(rostime.interpolate(t, t, 1)).toEqual(t); }); it("works for non-zero spans", () => { const start = { sec: 0, nsec: 0 }; const end = { sec: 5, nsec: 0 }; expect(rostime.interpolate(start, end, 0)).toEqual(start); expect(rostime.interpolate(start, end, 1)).toEqual(end); expect(rostime.interpolate(start, end, 0.5)).toEqual({ sec: 2, nsec: 5e8 }); expect(rostime.interpolate(start, end, 2)).toEqual({ sec: 10, nsec: 0 }); }); }); describe("fixTime", () => { it("works", () => { expect(rostime.fixTime({ sec: 0, nsec: 0 }, false)).toEqual({ sec: 0, nsec: 0 }); expect(rostime.fixTime({ sec: 0, nsec: 1 }, false)).toEqual({ sec: 0, nsec: 1 }); expect(rostime.fixTime({ sec: 0, nsec: 1e9 - 1 }, false)).toEqual({ sec: 0, nsec: 1e9 - 1 }); expect(rostime.fixTime({ sec: 0, nsec: 1e9 }, false)).toEqual({ sec: 1, nsec: 0 }); expect(rostime.fixTime({ sec: 0, nsec: 1e9 + 1 }, false)).toEqual({ sec: 1, nsec: 1 }); expect(rostime.fixTime({ sec: 0, nsec: 2e9 }, false)).toEqual({ sec: 2, nsec: 0 }); expect(rostime.fixTime({ sec: 0, nsec: 2e9 + 1 }, false)).toEqual({ sec: 2, nsec: 1 }); expect(rostime.fixTime({ sec: 1, nsec: 3e9 + 5 }, false)).toEqual({ sec: 4, nsec: 5 }); expect(rostime.fixTime({ sec: 0, nsec: 0 }, true)).toEqual({ sec: 0, nsec: 0 }); expect(rostime.fixTime({ sec: 1, nsec: 3e9 + 5 }, true)).toEqual({ sec: 4, nsec: 5 }); expect(rostime.fixTime({ sec: 0, nsec: -1 }, true)).toEqual({ sec: -1, nsec: 999999999 }); expect(rostime.fixTime({ sec: 1, nsec: -1 }, true)).toEqual({ sec: 0, nsec: 999999999 }); expect(rostime.fixTime({ sec: -1, nsec: 0 }, true)).toEqual({ sec: -1, nsec: 0 }); expect(rostime.fixTime({ sec: -1, nsec: -1 }, true)).toEqual({ sec: -2, nsec: 999999999 }); expect(rostime.fixTime({ sec: -2, nsec: 0 }, true)).toEqual({ sec: -2, nsec: 0 }); expect(rostime.fixTime({ sec: -2, nsec: 1 }, true)).toEqual({ sec: -2, nsec: 1 }); expect(rostime.fixTime({ sec: -2, nsec: -1 }, true)).toEqual({ sec: -3, nsec: 999999999 }); }); }); describe("add", () => { const testAddition = (left: Time, right: Time, expected: Time) => { expect(rostime.add(left, right)).toEqual(expected); expect(rostime.add(right, left)).toEqual(expected); }; // eslint-disable-next-line jest/expect-expect it("can add two times together", () => { testAddition({ sec: 0, nsec: 0 }, { sec: 0, nsec: 0 }, { sec: 0, nsec: 0 }); testAddition({ sec: 1, nsec: 100 }, { sec: 2, nsec: 200 }, { sec: 3, nsec: 300 }); testAddition({ sec: 0, nsec: 1e9 - 1 }, { sec: 0, nsec: 1 }, { sec: 1, nsec: 0 }); testAddition({ sec: 0, nsec: 1e9 - 1 }, { sec: 0, nsec: 101 }, { sec: 1, nsec: 100 }); testAddition({ sec: 3, nsec: 0 }, { sec: 0, nsec: 2 * -1e9 }, { sec: 1, nsec: 0 }); testAddition({ sec: 1, nsec: 1 }, { sec: 0, nsec: -2 }, { sec: 0, nsec: 1e9 - 1 }); testAddition({ sec: 1, nsec: 1 }, { sec: 0, nsec: -2 }, { sec: 0, nsec: 1e9 - 1 }); testAddition({ sec: 3, nsec: 1 }, { sec: -2, nsec: -2 }, { sec: 0, nsec: 1e9 - 1 }); testAddition({ sec: 1, nsec: 0 }, { sec: 0, nsec: -1e9 }, { sec: 0, nsec: 0 }); testAddition({ sec: 3, nsec: 1 }, { sec: 1, nsec: -2 }, { sec: 3, nsec: 1e9 - 1 }); testAddition({ sec: 3, nsec: 0 }, { sec: 0, nsec: -(2 * 1e9) + 1 }, { sec: 1, nsec: 1 }); testAddition({ sec: 10, nsec: 0 }, { sec: 10, nsec: 10 * 1e9 }, { sec: 30, nsec: 0 }); testAddition({ sec: 10, nsec: 0 }, { sec: 10, nsec: -10 * 1e9 }, { sec: 10, nsec: 0 }); testAddition({ sec: 0, nsec: 0 }, { sec: 10, nsec: -10 * 1e9 }, { sec: 0, nsec: 0 }); }); it("throws when addition results in negative time", () => { expect(() => rostime.add({ sec: 0, nsec: 0 }, { sec: -1, nsec: 0 })).toThrow(); expect(() => rostime.add({ sec: 0, nsec: 0 }, { sec: 0, nsec: -1 })).toThrow(); }); }); describe("subtractTimes", () => { it("subtracts times", () => { expect(rostime.subtract({ sec: 1, nsec: 1 }, { sec: 1, nsec: 1 })).toEqual({ sec: 0, nsec: 0 }); expect(rostime.subtract({ sec: 1, nsec: 2 }, { sec: 2, nsec: 1 })).toEqual({ sec: -1, nsec: 1, }); expect(rostime.subtract({ sec: 5, nsec: 100 }, { sec: 2, nsec: 10 })).toEqual({ sec: 3, nsec: 90, }); expect(rostime.subtract({ sec: 1, nsec: 1e8 }, { sec: 0, nsec: 5e8 })).toEqual({ sec: 0, nsec: 600000000, }); expect(rostime.subtract({ sec: 1, nsec: 0 }, { sec: 0, nsec: 1e9 - 1 })).toEqual({ sec: 0, nsec: 1, }); expect(rostime.subtract({ sec: 0, nsec: 0 }, { sec: 0, nsec: 1 })).toEqual({ sec: -1, nsec: 1e9 - 1, }); }); }); describe("toNanoSec", () => { it("works", () => { expect(rostime.toNanoSec({ sec: 0, nsec: 1 })).toEqual(1n); expect(rostime.toNanoSec({ sec: 1, nsec: 0 })).toEqual(BigInt(1e9)); expect(rostime.toNanoSec({ sec: 1, nsec: 1 })).toEqual(BigInt(1e9) + 1n); expect(rostime.toNanoSec({ sec: 2, nsec: 0 })).toEqual(BigInt(2e9)); expect(rostime.toNanoSec({ sec: 2, nsec: 1 })).toEqual(BigInt(2e9) + 1n); }); }); describe("toMicroSec", () => { it("works", () => { expect(rostime.toMicroSec({ sec: 0, nsec: 1 })).toEqual(0.001); expect(rostime.toMicroSec({ sec: 0, nsec: 999 })).toEqual(0.999); expect(rostime.toMicroSec({ sec: 0, nsec: 1000 })).toEqual(1); expect(rostime.toMicroSec({ sec: 1, nsec: 0 })).toEqual(1e6); expect(rostime.toMicroSec({ sec: 1, nsec: 1 })).toEqual(1000000.001); expect(rostime.toMicroSec({ sec: 2, nsec: 0 })).toEqual(2e6); expect(rostime.toMicroSec({ sec: 2, nsec: 1 })).toEqual(2000000.001); }); }); describe("toSec", () => { it("works", () => { expect(rostime.toSec({ sec: 1, nsec: 0 })).toBe(1); expect(rostime.toSec({ sec: 1, nsec: 1 })).toBe(1.000000001); expect(rostime.toSec({ sec: 1, nsec: 999999999 })).toBe(1.999999999); expect(rostime.toSec({ sec: 1, nsec: 1000000000 })).toBe(2); }); }); describe("fromSec", () => { it("handles positive values", () => { expect(rostime.fromSec(1)).toEqual({ sec: 1, nsec: 0 }); expect(rostime.fromSec(1.000000001)).toEqual({ sec: 1, nsec: 1 }); expect(rostime.fromSec(1.999999999)).toEqual({ sec: 1, nsec: 999999999 }); expect(rostime.fromSec(1.9999999994)).toEqual({ sec: 1, nsec: 999999999 }); expect(rostime.fromSec(1.999999999999)).toEqual({ sec: 2, nsec: 0 }); expect(rostime.fromSec(2)).toEqual({ sec: 2, nsec: 0 }); }); it("handles negative values", () => { expect(rostime.fromSec(-1)).toEqual({ sec: -1, nsec: 0 }); expect(rostime.fromSec(-1.000000001)).toEqual({ sec: -1, nsec: -1 }); expect(rostime.fromSec(-1.999999999)).toEqual({ sec: -1, nsec: -999999999 }); expect(rostime.fromSec(-1.9999999994)).toEqual({ sec: -1, nsec: -999999999 }); expect(rostime.fromSec(-1.999999999999)).toEqual({ sec: -2, nsec: -0 }); expect(rostime.fromSec(-2)).toEqual({ sec: -2, nsec: 0 }); }); }); describe("fromNanoSec", () => { it("works", () => { expect(rostime.fromNanoSec(0n)).toEqual({ sec: 0, nsec: 0 }); expect(rostime.fromNanoSec(1n)).toEqual({ sec: 0, nsec: 1 }); expect(rostime.fromNanoSec(10n)).toEqual({ sec: 0, nsec: 10 }); expect(rostime.fromNanoSec(BigInt(1e9))).toEqual({ sec: 1, nsec: 0 }); expect(rostime.fromNanoSec(BigInt(1e9) + 1n)).toEqual({ sec: 1, nsec: 1 }); expect(rostime.fromNanoSec(BigInt(2e9))).toEqual({ sec: 2, nsec: 0 }); expect(rostime.fromNanoSec(BigInt(2e9) + 1n)).toEqual({ sec: 2, nsec: 1 }); }); }); describe("toMillis", () => { it("works", () => { expect(rostime.toMillis({ sec: 0, nsec: 0 }, false)).toEqual(0); expect(rostime.toMillis({ sec: 0, nsec: 0 }, true)).toEqual(0); expect(rostime.toMillis({ sec: 0, nsec: 1 }, false)).toEqual(0); expect(rostime.toMillis({ sec: 0, nsec: 1 }, true)).toEqual(1); expect(rostime.toMillis({ sec: 0, nsec: 1e6 - 1 }, false)).toEqual(0); expect(rostime.toMillis({ sec: 0, nsec: 1e6 - 1 }, true)).toEqual(1); expect(rostime.toMillis({ sec: 0, nsec: 1e6 }, false)).toEqual(1); expect(rostime.toMillis({ sec: 0, nsec: 1e6 }, true)).toEqual(1); expect(rostime.toMillis({ sec: 1, nsec: 0 }, false)).toEqual(1000); expect(rostime.toMillis({ sec: 1, nsec: 0 }, true)).toEqual(1000); expect(rostime.toMillis({ sec: 1, nsec: 1 }, false)).toEqual(1000); expect(rostime.toMillis({ sec: 1, nsec: 1 }, true)).toEqual(1001); expect(rostime.toMillis({ sec: 2, nsec: 0 }, false)).toEqual(2000); expect(rostime.toMillis({ sec: 2, nsec: 0 }, true)).toEqual(2000); expect(rostime.toMillis({ sec: 2, nsec: 1 }, false)).toEqual(2000); expect(rostime.toMillis({ sec: 2, nsec: 1 }, true)).toEqual(2001); }); }); describe("fromMillis", () => { it("handles positive values", () => { expect(rostime.fromMillis(1)).toEqual({ sec: 0, nsec: 1000000 }); expect(rostime.fromMillis(1000)).toEqual({ sec: 1, nsec: 0 }); expect(rostime.fromMillis(2000000000005)).toEqual({ sec: 2000000000, nsec: 5000000 }); }); it("handles negative values", () => { expect(rostime.fromMillis(-1)).toEqual({ sec: -0, nsec: -1000000 }); expect(rostime.fromMillis(-1000)).toEqual({ sec: -1, nsec: 0 }); }); }); describe("fromMicros", () => { it("handles positive values", () => { expect(rostime.fromMicros(1)).toEqual({ sec: 0, nsec: 1000 }); expect(rostime.fromMicros(1000)).toEqual({ sec: 0, nsec: 1000000 }); expect(rostime.fromMicros(1000000)).toEqual({ sec: 1, nsec: 0 }); expect(rostime.fromMicros(2000000000000005)).toEqual({ sec: 2000000000, nsec: 5000 }); }); it("handles negative values", () => { expect(rostime.fromMicros(-1)).toEqual({ sec: -0, nsec: -1000 }); expect(rostime.fromMicros(-1000)).toEqual({ sec: -0, nsec: -1000000 }); expect(rostime.fromMicros(-1000000)).toEqual({ sec: -1, nsec: 0 }); }); }); describe("clampTime", () => { const start = { sec: 0, nsec: 100 }; const end = { sec: 100, nsec: 100 }; it("returns the clamped time", () => { expect(rostime.clampTime({ sec: 0, nsec: 99 }, start, end)).toEqual(start); expect(rostime.clampTime({ sec: 0, nsec: 101 }, start, end)).toEqual({ sec: 0, nsec: 101 }); expect(rostime.clampTime({ sec: 100, nsec: 102 }, start, end)).toEqual(end); }); }); describe("isTimeInRangeInclusive", () => { const start = { sec: 0, nsec: 100 }; const end = { sec: 100, nsec: 100 }; it("returns whether time is between start and end, inclusive", () => { expect(rostime.isTimeInRangeInclusive(start, start, end)).toEqual(true); expect(rostime.isTimeInRangeInclusive(end, start, end)).toEqual(true); expect(rostime.isTimeInRangeInclusive({ sec: 50, nsec: 50 }, start, end)).toEqual(true); expect(rostime.isTimeInRangeInclusive({ sec: 0, nsec: 99 }, start, end)).toEqual(false); expect(rostime.isTimeInRangeInclusive({ sec: 100, nsec: 101 }, start, end)).toEqual(false); }); }); describe("comparison", () => { it("can sort by compare", () => { const times = [ { sec: 1, nsec: 1 }, { sec: 0, nsec: 0 }, { sec: 1, nsec: 0 }, { sec: 0, nsec: 1 }, ]; times.sort(rostime.compare); expect(times).toEqual([ { sec: 0, nsec: 0 }, { sec: 0, nsec: 1 }, { sec: 1, nsec: 0 }, { sec: 1, nsec: 1 }, ]); }); it("has lessThan functionality", () => { const min = { sec: 0, nsec: 0 }; const oneNano = { sec: 0, nsec: 1 }; const max = { sec: 1, nsec: 1 }; expect(rostime.isLessThan(min, min)).toBe(false); expect(rostime.isLessThan(max, min)).toBe(false); expect(rostime.isLessThan(oneNano, min)).toBe(false); expect(rostime.isLessThan(min, oneNano)).toBe(true); expect(rostime.isLessThan(min, max)).toBe(true); }); it("has greaterThan functionality", () => { const min = { sec: 0, nsec: 0 }; const oneNano = { sec: 0, nsec: 1 }; const max = { sec: 1, nsec: 1 }; expect(rostime.isGreaterThan(min, min)).toBe(false); expect(rostime.isGreaterThan(max, min)).toBe(true); expect(rostime.isGreaterThan(oneNano, min)).toBe(true); expect(rostime.isGreaterThan(min, oneNano)).toBe(false); expect(rostime.isGreaterThan(min, max)).toBe(false); }); }); describe("areEqual", () => { it("tests for sameness", () => { const min = { sec: 0, nsec: 0 }; const min2 = { sec: 0, nsec: 0 }; const oneNano = { sec: 0, nsec: 1 }; expect(min === min2).toBe(false); expect(rostime.areEqual(min, min2)).toBe(true); expect(rostime.areEqual(min, oneNano)).toBe(false); }); });