-
-
Notifications
You must be signed in to change notification settings - Fork 272
/
Copy pathEitherFromUnion.test.ts
144 lines (135 loc) · 6.96 KB
/
EitherFromUnion.test.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
import * as S from "@effect/schema/Schema"
import * as Util from "@effect/schema/test/TestUtils"
import * as E from "effect/Either"
import { describe, expect, it } from "vitest"
describe("EitherFromUnion", () => {
it("property tests", () => {
Util.roundtrip(S.EitherFromUnion({ left: S.String, right: S.Number }))
})
it("decoding success", async () => {
const schema = S.EitherFromUnion({ left: S.DateFromString, right: S.NumberFromString })
await Util.expectDecodeUnknownSuccess(schema, "1970-01-01T00:00:00.000Z", E.left(new Date(0)))
await Util.expectDecodeUnknownSuccess(schema, "1", E.right(1))
expect(E.isEither(S.decodeSync(schema)("1970-01-01T00:00:00.000Z"))).toEqual(true)
expect(E.isEither(S.decodeSync(schema)("1"))).toEqual(true)
})
it("decoding error (Encoded side transformation failure)", async () => {
const schema = S.EitherFromUnion({ left: S.Number, right: S.String })
await Util.expectDecodeUnknownFailure(
schema,
undefined,
`((string <-> RightEncoded<string>) | (number <-> LeftEncoded<number>) <-> Either<string, number>)
└─ Encoded side transformation failure
└─ (string <-> RightEncoded<string>) | (number <-> LeftEncoded<number>)
├─ Union member
│ └─ (string <-> RightEncoded<string>)
│ └─ Encoded side transformation failure
│ └─ Expected a string, actual undefined
└─ Union member
└─ (number <-> LeftEncoded<number>)
└─ Encoded side transformation failure
└─ Expected a number, actual undefined`
)
})
it("decoding error (Transformation process failure)", async () => {
const schema = S.EitherFromUnion({ left: S.Number, right: S.compose(S.Boolean, S.String, { strict: false }) })
await Util.expectDecodeUnknownFailure(
schema,
true,
`(((boolean <-> string) <-> RightEncoded<string>) | (number <-> LeftEncoded<number>) <-> Either<string, number>)
└─ Encoded side transformation failure
└─ ((boolean <-> string) <-> RightEncoded<string>) | (number <-> LeftEncoded<number>)
├─ Union member
│ └─ ((boolean <-> string) <-> RightEncoded<string>)
│ └─ Encoded side transformation failure
│ └─ (boolean <-> string)
│ └─ Type side transformation failure
│ └─ Expected a string, actual true
└─ Union member
└─ (number <-> LeftEncoded<number>)
└─ Encoded side transformation failure
└─ Expected a number, actual true`
)
})
it("decoding prefer right", async () => {
const schema = S.EitherFromUnion({ left: S.NumberFromString, right: S.NumberFromString })
await Util.expectDecodeUnknownSuccess(schema, "1", E.right(1))
})
it("encoding success", async () => {
const schema = S.EitherFromUnion({ left: S.DateFromString, right: S.NumberFromString })
await Util.expectEncodeSuccess(schema, E.left(new Date(0)), "1970-01-01T00:00:00.000Z")
await Util.expectEncodeSuccess(schema, E.right(1), "1")
})
it("encoding error", async () => {
const schema = S.EitherFromUnion({
left: S.compose(S.DateFromString, S.Unknown, { strict: false }),
right: S.compose(S.NumberFromString, S.Unknown, { strict: false })
})
await Util.expectEncodeFailure(
schema,
E.left(undefined),
`(((NumberFromString <-> unknown) <-> RightEncoded<unknown>) | ((DateFromString <-> unknown) <-> LeftEncoded<unknown>) <-> Either<unknown, unknown>)
└─ Encoded side transformation failure
└─ ((NumberFromString <-> unknown) <-> RightEncoded<unknown>) | ((DateFromString <-> unknown) <-> LeftEncoded<unknown>)
└─ Union member
└─ ((DateFromString <-> unknown) <-> LeftEncoded<unknown>)
└─ Encoded side transformation failure
└─ (DateFromString <-> unknown)
└─ Encoded side transformation failure
└─ DateFromString
└─ Type side transformation failure
└─ Expected DateFromSelf (a potentially invalid Date instance), actual undefined`
)
await Util.expectEncodeFailure(
schema,
E.right(undefined),
`(((NumberFromString <-> unknown) <-> RightEncoded<unknown>) | ((DateFromString <-> unknown) <-> LeftEncoded<unknown>) <-> Either<unknown, unknown>)
└─ Encoded side transformation failure
└─ ((NumberFromString <-> unknown) <-> RightEncoded<unknown>) | ((DateFromString <-> unknown) <-> LeftEncoded<unknown>)
└─ Union member
└─ ((NumberFromString <-> unknown) <-> RightEncoded<unknown>)
└─ Encoded side transformation failure
└─ (NumberFromString <-> unknown)
└─ Encoded side transformation failure
└─ NumberFromString
└─ Type side transformation failure
└─ Expected a number, actual undefined`
)
})
it("encoding don't overlap", async () => {
const schema = S.EitherFromUnion({
left: S.compose(S.DateFromString, S.Unknown, { strict: false }),
right: S.compose(S.NumberFromString, S.Unknown, { strict: false })
})
await Util.expectEncodeFailure(
schema,
E.left(1),
`(((NumberFromString <-> unknown) <-> RightEncoded<unknown>) | ((DateFromString <-> unknown) <-> LeftEncoded<unknown>) <-> Either<unknown, unknown>)
└─ Encoded side transformation failure
└─ ((NumberFromString <-> unknown) <-> RightEncoded<unknown>) | ((DateFromString <-> unknown) <-> LeftEncoded<unknown>)
└─ Union member
└─ ((DateFromString <-> unknown) <-> LeftEncoded<unknown>)
└─ Encoded side transformation failure
└─ (DateFromString <-> unknown)
└─ Encoded side transformation failure
└─ DateFromString
└─ Type side transformation failure
└─ Expected DateFromSelf (a potentially invalid Date instance), actual 1`
)
await Util.expectEncodeFailure(
schema,
E.right(new Date(0)),
`(((NumberFromString <-> unknown) <-> RightEncoded<unknown>) | ((DateFromString <-> unknown) <-> LeftEncoded<unknown>) <-> Either<unknown, unknown>)
└─ Encoded side transformation failure
└─ ((NumberFromString <-> unknown) <-> RightEncoded<unknown>) | ((DateFromString <-> unknown) <-> LeftEncoded<unknown>)
└─ Union member
└─ ((NumberFromString <-> unknown) <-> RightEncoded<unknown>)
└─ Encoded side transformation failure
└─ (NumberFromString <-> unknown)
└─ Encoded side transformation failure
└─ NumberFromString
└─ Type side transformation failure
└─ Expected a number, actual ${new Date(0).toString()}`
)
})
})