1import * as Schema from "effect/Schema"
2import * as SchemaParser from "effect/SchemaParser"
3import assert from "node:assert/strict"
4
5const effectCase = (schema, input, success) => () => {
6 const run = SchemaParser.decodeUnknownExit(schema)
7 return {
8 run: () => run(input),
9 validate: (result) => {
10 assert.equal(result._tag, success ? "Success" : "Failure")
11 if (success) assert.deepEqual(result.value, input)
12 }
13 }
14}
15
16const makeObjectInput = (size) =>
17 Object.fromEntries(Array.from({ length: size }, (_, index) => [`field${index}`, `value${index}`]))
18
19const makeInvalidLastObjectInput = (size) => ({
20 ...makeObjectInput(size),
21 [`field${size - 1}`]: 1
22})
23
24const object32 = makeObjectInput(32)
25const object32InvalidLast = makeInvalidLastObjectInput(32)
26const effectObject32 = Schema.Struct(
27 Object.fromEntries(Array.from({ length: 32 }, (_, index) => [`field${index}`, Schema.String]))
28)
29
30export const effectObject32Valid = effectCase(effectObject32, object32, true)
31export const effectObject32InvalidLast = effectCase(effectObject32, object32InvalidLast, false)
32
33const array32 = Array.from({ length: 32 }, (_, index) => `value${index}`)
34const array32InvalidLast = array32.slice()
35array32InvalidLast[array32InvalidLast.length - 1] = 1
36const effectArray32 = Schema.Array(Schema.String)
37
38export const effectArray32Valid = effectCase(effectArray32, array32, true)
39export const effectArray32InvalidLast = effectCase(effectArray32, array32InvalidLast, false)
40
41const record32 = makeObjectInput(32)
42const record32InvalidLast = makeInvalidLastObjectInput(32)
43const effectRecord32 = Schema.Record(Schema.String, Schema.String)
44
45export const effectRecord32Valid = effectCase(effectRecord32, record32, true)
46export const effectRecord32InvalidLast = effectCase(effectRecord32, record32InvalidLast, false)
47
48const literalValues = Array.from({ length: 100 }, (_, index) => `value${index}`)
49const effectLiteral100 = Schema.Literals(literalValues)
50
51export const effectLiteral100ValidLast = effectCase(effectLiteral100, "value99", true)
52export const effectLiteral100Invalid = effectCase(effectLiteral100, "missing", false)
53
54const makeEffectTaggedMember = (index) =>
55 Schema.Struct({
56 kind: Schema.Literal(`kind${index}`),
57 a: Schema.String,
58 b: Schema.Number,
59 c: Schema.Boolean
60 })
61
62const taggedInput = { kind: "kind99", a: "a", b: 1, c: true }
63const taggedInvalidSelected = { kind: "kind99", a: "a", b: 1, c: "invalid" }
64const taggedInvalidTag = { kind: "missing", a: "a", b: 1, c: true }
65const effectTagged100 = Schema.Union(
66 Array.from({ length: 100 }, (_, index) => makeEffectTaggedMember(index))
67)
68
69export const effectTagged100ValidLast = effectCase(effectTagged100, taggedInput, true)
70export const effectTagged100InvalidSelected = effectCase(effectTagged100, taggedInvalidSelected, false)
71export const effectTagged100InvalidTag = effectCase(effectTagged100, taggedInvalidTag, false)
72
73const makeEffectMultiSentinelMember = (index) =>
74 Schema.Struct({
75 kind: Schema.Literal("shared"),
76 variant: Schema.Literal(`variant${index}`),
77 value: Schema.String
78 })
79
80const effectMultiSentinel100 = Schema.Union(
81 Array.from({ length: 100 }, (_, index) => makeEffectMultiSentinelMember(index))
82)
83const multiSentinelValidFirst = { kind: "shared", variant: "variant0", value: "value" }
84const multiSentinelInvalidVariant = { kind: "shared", variant: "missing", value: "value" }
85
86export const effectMultiSentinel100ValidFirst = effectCase(effectMultiSentinel100, multiSentinelValidFirst, true)
87export const effectMultiSentinel100InvalidVariant = effectCase(
88 effectMultiSentinel100,
89 multiSentinelInvalidVariant,
90 false
91)