import { RuleTester } from "./support/RuleTester";
import rule = require("../rules/no-keywords");

const ruleTester = new RuleTester({
    parserOptions: {
        warnOnUnsupportedTypeScriptVersion: false,
    },
    parser: require.resolve("@typescript-eslint/parser"),
});

ruleTester.run("no-keywords", rule, {
    valid: [
        {
            code: `const a = {};`,
        },
        {
            code: `function a() {};`,
        },
        {
            code: `const x = function string() {};`,
        },
        {
            code: `const y = function () {};`,
        },
        {
            code: `const y = () => {};`,
        },
        {
            code: `
class A {
    b = () => {}
    a() {}
    number() {}
}
            `,
        },
        {
            code: `
interface A {
    b(): void;
}
            `,
        },
        {
            code: `
const obj = {
    a: null,
    b() {},
    c: function (c: number) {},
    string: function d (d: string) {},
    e: () => {},
};
            `,
        },
        {
            code: `() => undefined`,
        },
        {
            code: `let a = 2;`,
        },
        {
            code: `let b: any;`,
        },
        {
            code: `function foo(a: any) { }`,
        },
        {
            code: `let [a] = [5];`,
        },
        {
            code: `const { a } = { a: 5 };`,
        },
        {
            code: `
interface Foo {
    number: string;
}
            `,
        }
    ],

    invalid: [
        {
            code: `const number = 1;`,
            errors: [{ messageId: "noKeywordsError" }],
        },
        {
            code: `function x(number: number) {};`,
            errors: [{ messageId: "noKeywordsError" }],
        },
        {
            code: `const y = function (number: number) {};`,
            errors: [{ messageId: "noKeywordsError" }],
        },
        {
            code: `const y = (number: number) => {};`,
            errors: [{ messageId: "noKeywordsError" }],
        },
        {
            code: `
class A {
    b = function (any: any) {};
    a(number: number) {}
}
            `,
            errors: [
                { messageId: "noKeywordsError" },
                { messageId: "noKeywordsError" },
            ],
        },
        {
            code: `
interface A {
    a(number: number): void;
    b: (any: any) => void;
}
            `,
            errors: [
                { messageId: "noKeywordsError" },
                { messageId: "noKeywordsError" },
            ],
        },
        {
            code: `let undefined = 8;`,
            errors: [{ messageId: "noKeywordsError" }],
        },
        {
            code: `let boolean: boolean;`,
            errors: [{ messageId: "noKeywordsError" }],
        },
        {
            code: `function foo(any: any) { }`,
            errors: [{ messageId: "noKeywordsError" }],
        },
        {
            code: `let [number] = [3];`,
            errors: [{ messageId: "noKeywordsError" }],
        },
        {
            code: `let { String } = { String: 1 };`,
            errors: [{ messageId: "noKeywordsError" }],
        },
        {
            code: `let [number, string] = [3, ''];`,
            errors: [
                { messageId: "noKeywordsError" },
                { messageId: "noKeywordsError" }
            ],
        },
        {
            code: `let { String, Boolean } = { String: 1, Boolean: false };`,
            errors: [
                { messageId: "noKeywordsError" },
                { messageId: "noKeywordsError" }
            ],
        },
    ],
});
