| 1 | import { Exit, Option } from "effect" |
| 2 | import { describe, expect, it, vi } from "vitest" |
| 3 | |
| 4 | const SCHEMA_MODULE_PATH = "../../src/Schema.ts" |
| 5 | |
| 6 | describe("HMR", () => { |
| 7 | it("sanity check: reload produces distinct constructors", async () => { |
| 8 | const PATH = "./fixtures/HMR-sanity-check.ts" |
| 9 | const mod1: any = await vi.importActual(PATH) |
| 10 | vi.resetModules() |
| 11 | const mod2: any = await vi.importActual(PATH) |
| 12 | |
| 13 | const a = new mod1.A("a") |
| 14 | expect(a instanceof mod1.A).toBe(true) |
| 15 | |
| 16 | expect(a instanceof mod2.A).toBe(false) |
| 17 | }) |
| 18 | |
| 19 | it("isAST", async () => { |
| 20 | const SCHEMA_AST_MODULE_PATH = "../../src/SchemaAST.ts" |
| 21 | const mod1: any = await vi.importActual(SCHEMA_AST_MODULE_PATH) |
| 22 | vi.resetModules() |
| 23 | const mod2: any = await vi.importActual(SCHEMA_AST_MODULE_PATH) |
| 24 | |
| 25 | const isAST = mod1.isAST |
| 26 | |
| 27 | const b = mod2.unknown |
| 28 | |
| 29 | expect(isAST(b)).toBe(true) |
| 30 | }) |
| 31 | |
| 32 | it("isSchema", async () => { |
| 33 | const mod1: any = await vi.importActual(SCHEMA_MODULE_PATH) |
| 34 | vi.resetModules() |
| 35 | const mod2: any = await vi.importActual(SCHEMA_MODULE_PATH) |
| 36 | |
| 37 | const isSchema = mod1.isSchema |
| 38 | |
| 39 | const schema = mod2.Unknown |
| 40 | |
| 41 | expect(isSchema(schema)).toBe(true) |
| 42 | }) |
| 43 | |
| 44 | it("isSchemaError", async () => { |
| 45 | const mod1: any = await vi.importActual(SCHEMA_MODULE_PATH) |
| 46 | vi.resetModules() |
| 47 | const mod2: any = await vi.importActual(SCHEMA_MODULE_PATH) |
| 48 | |
| 49 | const exit = mod1.decodeUnknownExit(mod1.String)(null) |
| 50 | expect(Exit.isFailure(exit)).toBe(true) |
| 51 | const o: any = Exit.findErrorOption(exit) |
| 52 | expect(Option.isSome(o)).toBe(true) |
| 53 | const schemaError = o.value |
| 54 | expect(mod2.isSchemaError(schemaError)).toBe(true) |
| 55 | }) |
| 56 | |
| 57 | it("Schema.Class", async () => { |
| 58 | const PATH = "./fixtures/HMR-Class.ts" |
| 59 | const mod1: any = await vi.importActual(PATH) |
| 60 | vi.resetModules() |
| 61 | const mod2: any = await vi.importActual(PATH) |
| 62 | const schema: any = await vi.importActual(SCHEMA_MODULE_PATH) |
| 63 | |
| 64 | const a = new mod1.A({ a: "a" }) |
| 65 | expect(a instanceof mod1.A).toBe(true) |
| 66 | |
| 67 | const b = new mod2.A({ a: "a" }) |
| 68 | |
| 69 | expect(b instanceof mod1.A).toBe(false) |
| 70 | expect(String(schema.encodeUnknownExit(mod1.A)(b))).toBe(`Success({"a":"a"})`) |
| 71 | |
| 72 | const nested = schema.Struct({ rows: schema.Array(mod1.A) }) |
| 73 | expect(nested.make({ rows: [b] }).rows[0]).toBe(b) |
| 74 | }) |
| 75 | }) |