describe("correct behavior", () => {
    test("basic functionality", () => {
        class A {
            static get x() {
                return 10;
            }
        }

        expect(A.x).toBe(10);
        expect(new A()).not.toHaveProperty("x");
    });

    test("name", () => {
        class A {
            static get x() {}
        }

        const d = Object.getOwnPropertyDescriptor(A, "x");
        expect(d.get.name).toBe("get x");
    });

    test("extended name syntax", () => {
        const s = Symbol("foo");

        class A {
            static get "method with space"() {
                return 1;
            }

            static get 12() {
                return 2;
            }

            static get [`he${"llo"}`]() {
                return 3;
            }

            static get [s]() {
                return 4;
            }
        }

        expect(A["method with space"]).toBe(1);
        expect(A[12]).toBe(2);
        expect(A.hello).toBe(3);
        expect(A[s]).toBe(4);
    });

    test("inherited static getter", () => {
        class Parent {
            static get x() {
                return 3;
            }
        }

        class Child extends Parent {}

        expect(Parent.x).toBe(3);
        expect(Child.x).toBe(3);
    });

    test("inherited static getter overriding", () => {
        class Parent {
            static get x() {
                return 3;
            }
        }

        class Child extends Parent {
            static get x() {
                return 10;
            }
        }

        expect(Parent.x).toBe(3);
        expect(Child.x).toBe(10);
    });
});

describe("errors", () => {
    test('"get static" is a syntax error', () => {
        expect(`
    class A {
      get static foo() {}
    }`).not.toEval();
    });
});