X Tutup
import * as util from "../util"; // TODO: string.toString() const serializeEnum = (identifier: string) => `(() => { const mappedTestEnum: any = {}; for (const key in ${identifier}) { mappedTestEnum[(key as any).toString()] = ${identifier}[key]; } return mappedTestEnum; })()`; describe("initializers", () => { test("string", () => { util.testFunction` enum TestEnum { A = "A", B = "B", } return ${serializeEnum("TestEnum")} `.expectToMatchJsResult(); }); test("expression", () => { util.testFunction` const value = 6; enum TestEnum { A, B = value, } return ${serializeEnum("TestEnum")} `.expectToMatchJsResult(); }); test("expression with side effect", () => { util.testFunction` let value = 0; enum TestEnum { A = value++, B = A, } return ${serializeEnum("TestEnum")} `.expectToMatchJsResult(); }); test("inference", () => { util.testFunction` enum TestEnum { A, B, C, } return ${serializeEnum("TestEnum")} `.expectToMatchJsResult(); }); test("partial inference", () => { util.testFunction` enum TestEnum { A = 3, B, C = 5, } return ${serializeEnum("TestEnum")} `.expectToMatchJsResult(); }); test("member reference", () => { util.testFunction` enum TestEnum { A, B = A, C = B, } return ${serializeEnum("TestEnum")} `.expectToMatchJsResult(); }); test("string literal member reference", () => { util.testFunction` enum TestEnum { ["A"], "B" = A, C = B, } return ${serializeEnum("TestEnum")} `.expectToMatchJsResult(); }); }); describe("const enum", () => { const expectToBeConst: util.TapCallback = builder => expect(builder.getMainLuaCodeChunk()).not.toContain("TestEnum"); test.each(["", "declare "])("%swithout initializer", modifier => { util.testModule` ${modifier} const enum TestEnum { A, B, } export const A = TestEnum.A; ` .tap(expectToBeConst) .expectToMatchJsResult(); }); test("with string initializer", () => { util.testFunction` const enum TestEnum { A = "ONE", B = "TWO", } return TestEnum.A; ` .tap(expectToBeConst) .expectToMatchJsResult(); }); test("access with string literal", () => { util.testFunction` const enum TestEnum { A, B, C, } return TestEnum["C"]; ` .tap(expectToBeConst) .expectToMatchJsResult(); }); }); test("toString", () => { util.testFunction` enum TestEnum { A, B, C, } function foo(value: TestEnum) { return value.toString(); } return foo(TestEnum.A); `.expectToMatchJsResult(); }); test("enum merging", () => { util.testFunction` enum TestEnum { A, B } enum TestEnum { C = 3, D } return ${serializeEnum("TestEnum")} `.expectToMatchJsResult(); }); test("enum merging with overlap", () => { util.testFunction` enum TestEnum { A, B } enum TestEnum { C = 1, D } return ${serializeEnum("TestEnum")} `.expectToMatchJsResult(); }); test("enum merging multiple files", () => { util.testModule` import "./otherfile" enum TestEnum { A, B } export default ${serializeEnum("TestEnum")} ` .addExtraFile( "otherfile.ts", `enum TestEnum { C = 3, D }` ) .expectToMatchJsResult(); }); test("enum nested in namespace", () => { util.testModule` namespace A { export enum TestEnum { B, C } } `.expectLuaToMatchSnapshot(); });
X Tutup