describe("errors", () => {
    test("called without new", () => {
        expect(() => {
            Temporal.ZonedDateTime();
        }).toThrowWithMessage(TypeError, "Temporal.ZonedDateTime constructor must be called with 'new'");
    });

    test("invalid time zone name", () => {
        expect(() => {
            new Temporal.ZonedDateTime(0n, "ACT");
        }).toThrowWithMessage(RangeError, "Invalid time zone name 'ACT'");

        expect(() => {
            new Temporal.ZonedDateTime(0n, "Etc/GMT-24");
        }).toThrowWithMessage(RangeError, "Invalid time zone name 'Etc/GMT-24'");
    });

    test("out-of-range epoch nanoseconds value", () => {
        expect(() => {
            new Temporal.ZonedDateTime(8_640_000_000_000_000_000_001n);
        }).toThrowWithMessage(
            RangeError,
            "Invalid epoch nanoseconds value, must be in range -86400 * 10^17 to 86400 * 10^17"
        );
        expect(() => {
            new Temporal.ZonedDateTime(-8_640_000_000_000_000_000_001n);
        }).toThrowWithMessage(
            RangeError,
            "Invalid epoch nanoseconds value, must be in range -86400 * 10^17 to 86400 * 10^17"
        );
    });
});

describe("normal behavior", () => {
    test("length is 2", () => {
        expect(Temporal.ZonedDateTime).toHaveLength(2);
    });

    test("basic functionality", () => {
        const timeZone = "UTC";
        const zonedDateTime = new Temporal.ZonedDateTime(0n, timeZone);
        expect(typeof zonedDateTime).toBe("object");
        expect(zonedDateTime).toBeInstanceOf(Temporal.ZonedDateTime);
        expect(Object.getPrototypeOf(zonedDateTime)).toBe(Temporal.ZonedDateTime.prototype);
    });
});
