LibJS: Implement Temporal.ZonedDateTime.prototype.add/subtract/equals

This commit is contained in:
Timothy Flynn 2024-11-25 12:34:35 -05:00 committed by Andreas Kling
commit 336efa5e3f
Notes: github-actions[bot] 2024-11-26 10:03:47 +00:00
9 changed files with 271 additions and 0 deletions

View file

@ -0,0 +1,58 @@
describe("correct behavior", () => {
test("length is 1", () => {
expect(Temporal.ZonedDateTime.prototype.add).toHaveLength(1);
});
test("basic functionality", () => {
const plainDateTime = new Temporal.PlainDateTime(2021, 11, 12, 0, 22, 30, 100, 200, 300);
const zonedDateTime = plainDateTime.toZonedDateTime("UTC");
const dayDuration = new Temporal.Duration(0, 0, 0, 1);
const result = zonedDateTime.add(dayDuration);
expect(zonedDateTime.day).toBe(12);
expect(zonedDateTime.epochNanoseconds).toBe(1636676550100200300n);
expect(result.day).toBe(13);
expect(result.epochNanoseconds).toBe(1636762950100200300n);
});
test("duration-like object", () => {
const plainDateTime = new Temporal.PlainDateTime(2021, 11, 12, 0, 22, 30, 100, 200, 300);
const zonedDateTime = plainDateTime.toZonedDateTime("UTC");
const dayDuration = { days: 1 };
const result = zonedDateTime.add(dayDuration);
expect(zonedDateTime.day).toBe(12);
expect(zonedDateTime.epochNanoseconds).toBe(1636676550100200300n);
expect(result.day).toBe(13);
expect(result.epochNanoseconds).toBe(1636762950100200300n);
});
test("duration string", () => {
const plainDateTime = new Temporal.PlainDateTime(2021, 11, 12, 0, 22, 30, 100, 200, 300);
const zonedDateTime = plainDateTime.toZonedDateTime("UTC");
const dayDuration = "P1D";
const result = zonedDateTime.add(dayDuration);
expect(zonedDateTime.day).toBe(12);
expect(zonedDateTime.epochNanoseconds).toBe(1636676550100200300n);
expect(result.day).toBe(13);
expect(result.epochNanoseconds).toBe(1636762950100200300n);
});
});
describe("errors", () => {
test("this value must be a Temporal.ZonedDateTime object", () => {
expect(() => {
Temporal.ZonedDateTime.prototype.add.call("foo");
}).toThrowWithMessage(TypeError, "Not an object of type Temporal.ZonedDateTime");
});
test("invalid duration-like object", () => {
expect(() => {
new Temporal.ZonedDateTime(1n, "UTC").add({});
}).toThrowWithMessage(TypeError, "Invalid duration-like object");
});
});

View file

@ -0,0 +1,23 @@
describe("correct behavior", () => {
test("length is 1", () => {
expect(Temporal.ZonedDateTime.prototype.equals).toHaveLength(1);
});
test("basic functionality", () => {
const zonedDateTimeOne = new Temporal.ZonedDateTime(1n, "UTC");
const zonedDateTimeTwo = new Temporal.ZonedDateTime(2n, "UTC");
expect(zonedDateTimeOne.equals(zonedDateTimeOne)).toBeTrue();
expect(zonedDateTimeTwo.equals(zonedDateTimeTwo)).toBeTrue();
expect(zonedDateTimeOne.equals(zonedDateTimeTwo)).toBeFalse();
expect(zonedDateTimeTwo.equals(zonedDateTimeOne)).toBeFalse();
});
});
describe("errors", () => {
test("this value must be a Temporal.ZonedDateTime object", () => {
expect(() => {
Temporal.ZonedDateTime.prototype.equals.call("foo");
}).toThrowWithMessage(TypeError, "Not an object of type Temporal.ZonedDateTime");
});
});

View file

@ -0,0 +1,58 @@
describe("correct behavior", () => {
test("length is 1", () => {
expect(Temporal.ZonedDateTime.prototype.subtract).toHaveLength(1);
});
test("basic functionality", () => {
const plainDateTime = new Temporal.PlainDateTime(2021, 11, 12, 0, 22, 30, 100, 200, 300);
const zonedDateTime = plainDateTime.toZonedDateTime("UTC");
const dayDuration = new Temporal.Duration(0, 0, 0, 1);
const result = zonedDateTime.subtract(dayDuration);
expect(zonedDateTime.day).toBe(12);
expect(zonedDateTime.epochNanoseconds).toBe(1636676550100200300n);
expect(result.day).toBe(11);
expect(result.epochNanoseconds).toBe(1636590150100200300n);
});
test("duration-like object", () => {
const plainDateTime = new Temporal.PlainDateTime(2021, 11, 12, 0, 22, 30, 100, 200, 300);
const zonedDateTime = plainDateTime.toZonedDateTime("UTC");
const dayDuration = { days: 1 };
const result = zonedDateTime.subtract(dayDuration);
expect(zonedDateTime.day).toBe(12);
expect(zonedDateTime.epochNanoseconds).toBe(1636676550100200300n);
expect(result.day).toBe(11);
expect(result.epochNanoseconds).toBe(1636590150100200300n);
});
test("duration string", () => {
const plainDateTime = new Temporal.PlainDateTime(2021, 11, 12, 0, 22, 30, 100, 200, 300);
const zonedDateTime = plainDateTime.toZonedDateTime("UTC");
const dayDuration = "P1D";
const result = zonedDateTime.subtract(dayDuration);
expect(zonedDateTime.day).toBe(12);
expect(zonedDateTime.epochNanoseconds).toBe(1636676550100200300n);
expect(result.day).toBe(11);
expect(result.epochNanoseconds).toBe(1636590150100200300n);
});
});
describe("errors", () => {
test("this value must be a Temporal.ZonedDateTime object", () => {
expect(() => {
Temporal.ZonedDateTime.prototype.subtract.call("foo");
}).toThrowWithMessage(TypeError, "Not an object of type Temporal.ZonedDateTime");
});
test("invalid duration-like object", () => {
expect(() => {
new Temporal.ZonedDateTime(1n, "UTC").subtract({});
}).toThrowWithMessage(TypeError, "Invalid duration-like object");
});
});