1import { Exit, Option } from "effect"
2import { describe, expect, it, vi } from "vitest"
3
4const SCHEMA_MODULE_PATH = "../../src/Schema.ts"
5
6describe("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})