1
1
import { describe , expect , test } from 'vitest'
2
2
import {
3
3
parseAsArrayOf ,
4
+ parseAsBoolean ,
4
5
parseAsFloat ,
5
6
parseAsHex ,
6
7
parseAsIndex ,
7
8
parseAsInteger ,
8
9
parseAsIsoDate ,
9
10
parseAsIsoDateTime ,
11
+ parseAsNumberLiteral ,
10
12
parseAsString ,
13
+ parseAsStringEnum ,
14
+ parseAsStringLiteral ,
11
15
parseAsTimestamp
12
16
} from './parsers'
17
+ import { testParseThenSerialize , testSerializeThenParse } from './testing'
13
18
14
19
describe ( 'parsers' , ( ) => {
20
+ test ( 'parseAsString' , ( ) => {
21
+ expect ( parseAsString . parse ( '' ) ) . toBe ( '' )
22
+ expect ( parseAsString . parse ( 'foo' ) ) . toBe ( 'foo' )
23
+ testParseThenSerialize ( parseAsString , 'foo' )
24
+ testSerializeThenParse ( parseAsString , 'foo' )
25
+ } )
15
26
test ( 'parseAsInteger' , ( ) => {
16
27
expect ( parseAsInteger . parse ( '' ) ) . toBeNull ( )
17
28
expect ( parseAsInteger . parse ( '1' ) ) . toBe ( 1 )
18
29
expect ( parseAsInteger . parse ( '3.14' ) ) . toBe ( 3 )
19
30
expect ( parseAsInteger . parse ( '3,14' ) ) . toBe ( 3 )
20
31
expect ( parseAsInteger . serialize ( 3.14 ) ) . toBe ( '3' )
32
+ testParseThenSerialize ( parseAsInteger , '3' )
33
+ testSerializeThenParse ( parseAsInteger , 3 )
34
+ expect ( ( ) => testParseThenSerialize ( parseAsInteger , '3.14' ) ) . toThrow ( )
35
+ expect ( ( ) => testSerializeThenParse ( parseAsInteger , 3.14 ) ) . toThrow ( )
36
+ } )
37
+ test ( 'parseAsHex' , ( ) => {
38
+ expect ( parseAsHex . parse ( '' ) ) . toBeNull ( )
39
+ expect ( parseAsHex . parse ( '1' ) ) . toBe ( 1 )
40
+ expect ( parseAsHex . parse ( 'a' ) ) . toBe ( 0xa )
41
+ expect ( parseAsHex . parse ( 'g' ) ) . toBeNull ( )
42
+ expect ( parseAsHex . serialize ( 0xa ) ) . toBe ( '0a' )
43
+ for ( let i = 0 ; i < 256 ; i ++ ) {
44
+ const hex = i . toString ( 16 ) . padStart ( 2 , '0' )
45
+ testParseThenSerialize ( parseAsHex , hex )
46
+ testSerializeThenParse ( parseAsHex , i )
47
+ }
21
48
} )
22
49
test ( 'parseAsFloat' , ( ) => {
23
50
expect ( parseAsFloat . parse ( '' ) ) . toBeNull ( )
@@ -27,6 +54,8 @@ describe('parsers', () => {
27
54
expect ( parseAsFloat . serialize ( 3.14 ) ) . toBe ( '3.14' )
28
55
// https://0.30000000000000004.com/
29
56
expect ( parseAsFloat . serialize ( 0.1 + 0.2 ) ) . toBe ( '0.30000000000000004' )
57
+ testParseThenSerialize ( parseAsFloat , '3.14' )
58
+ testSerializeThenParse ( parseAsFloat , 3.14 )
30
59
} )
31
60
test ( 'parseAsIndex' , ( ) => {
32
61
expect ( parseAsIndex . parse ( '' ) ) . toBeNull ( )
@@ -37,6 +66,10 @@ describe('parsers', () => {
37
66
expect ( parseAsIndex . parse ( '-1' ) ) . toBe ( - 2 )
38
67
expect ( parseAsIndex . serialize ( 0 ) ) . toBe ( '1' )
39
68
expect ( parseAsIndex . serialize ( 3.14 ) ) . toBe ( '4' )
69
+ testParseThenSerialize ( parseAsIndex , '0' )
70
+ testParseThenSerialize ( parseAsIndex , '1' )
71
+ testSerializeThenParse ( parseAsIndex , 0 )
72
+ testSerializeThenParse ( parseAsIndex , 1 )
40
73
} )
41
74
test ( 'parseAsHex' , ( ) => {
42
75
expect ( parseAsHex . parse ( '' ) ) . toBeNull ( )
@@ -45,9 +78,28 @@ describe('parsers', () => {
45
78
expect ( parseAsHex . parse ( 'g' ) ) . toBeNull ( )
46
79
expect ( parseAsHex . serialize ( 0xa ) ) . toBe ( '0a' )
47
80
} )
81
+ test ( 'parseAsBoolean' , ( ) => {
82
+ expect ( parseAsBoolean . parse ( '' ) ) . toBe ( false )
83
+ // In only triggers on 'true', everything else is false
84
+ expect ( parseAsBoolean . parse ( 'true' ) ) . toBe ( true )
85
+ expect ( parseAsBoolean . parse ( 'false' ) ) . toBe ( false )
86
+ expect ( parseAsBoolean . parse ( '0' ) ) . toBe ( false )
87
+ expect ( parseAsBoolean . parse ( '1' ) ) . toBe ( false )
88
+ expect ( parseAsBoolean . parse ( 'yes' ) ) . toBe ( false )
89
+ expect ( parseAsBoolean . parse ( 'no' ) ) . toBe ( false )
90
+ expect ( parseAsBoolean . serialize ( true ) ) . toBe ( 'true' )
91
+ expect ( parseAsBoolean . serialize ( false ) ) . toBe ( 'false' )
92
+ testParseThenSerialize ( parseAsBoolean , 'true' )
93
+ testSerializeThenParse ( parseAsBoolean , true )
94
+ testParseThenSerialize ( parseAsBoolean , 'false' )
95
+ testSerializeThenParse ( parseAsBoolean , false )
96
+ } )
97
+
48
98
test ( 'parseAsTimestamp' , ( ) => {
49
99
expect ( parseAsTimestamp . parse ( '' ) ) . toBeNull ( )
50
100
expect ( parseAsTimestamp . parse ( '0' ) ) . toStrictEqual ( new Date ( 0 ) )
101
+ testParseThenSerialize ( parseAsTimestamp , '0' )
102
+ testSerializeThenParse ( parseAsTimestamp , new Date ( 1234567890 ) )
51
103
} )
52
104
test ( 'parseAsIsoDateTime' , ( ) => {
53
105
expect ( parseAsIsoDateTime . parse ( '' ) ) . toBeNull ( )
@@ -59,6 +111,8 @@ describe('parsers', () => {
59
111
expect ( parseAsIsoDateTime . parse ( moment . slice ( 0 , 16 ) + 'Z' ) ) . toStrictEqual (
60
112
ref
61
113
)
114
+ testParseThenSerialize ( parseAsIsoDateTime , moment )
115
+ testSerializeThenParse ( parseAsIsoDateTime , ref )
62
116
} )
63
117
test ( 'parseAsIsoDate' , ( ) => {
64
118
expect ( parseAsIsoDate . parse ( '' ) ) . toBeNull ( )
@@ -67,12 +121,61 @@ describe('parsers', () => {
67
121
const ref = new Date ( moment )
68
122
expect ( parseAsIsoDate . parse ( moment ) ) . toStrictEqual ( ref )
69
123
expect ( parseAsIsoDate . serialize ( ref ) ) . toEqual ( moment )
124
+ testParseThenSerialize ( parseAsIsoDate , moment )
125
+ testSerializeThenParse ( parseAsIsoDate , ref )
126
+ } )
127
+ test ( 'parseAsStringEnum' , ( ) => {
128
+ enum Test {
129
+ A = 'a' ,
130
+ B = 'b' ,
131
+ C = 'c'
132
+ }
133
+ const parser = parseAsStringEnum < Test > ( Object . values ( Test ) )
134
+ expect ( parser . parse ( '' ) ) . toBeNull ( )
135
+ expect ( parser . parse ( 'a' ) ) . toBe ( 'a' )
136
+ expect ( parser . parse ( 'b' ) ) . toBe ( 'b' )
137
+ expect ( parser . parse ( 'c' ) ) . toBe ( 'c' )
138
+ expect ( parser . parse ( 'd' ) ) . toBeNull ( )
139
+ expect ( parser . serialize ( Test . A ) ) . toBe ( 'a' )
140
+ expect ( parser . serialize ( Test . B ) ) . toBe ( 'b' )
141
+ expect ( parser . serialize ( Test . C ) ) . toBe ( 'c' )
142
+ testParseThenSerialize ( parser , 'a' )
143
+ testSerializeThenParse ( parser , Test . A )
144
+ } )
145
+ test ( 'parseAsStringLiteral' , ( ) => {
146
+ const parser = parseAsStringLiteral ( [ 'a' , 'b' , 'c' ] as const )
147
+ expect ( parser . parse ( '' ) ) . toBeNull ( )
148
+ expect ( parser . parse ( 'a' ) ) . toBe ( 'a' )
149
+ expect ( parser . parse ( 'b' ) ) . toBe ( 'b' )
150
+ expect ( parser . parse ( 'c' ) ) . toBe ( 'c' )
151
+ expect ( parser . parse ( 'd' ) ) . toBeNull ( )
152
+ expect ( parser . serialize ( 'a' ) ) . toBe ( 'a' )
153
+ expect ( parser . serialize ( 'b' ) ) . toBe ( 'b' )
154
+ expect ( parser . serialize ( 'c' ) ) . toBe ( 'c' )
155
+ testParseThenSerialize ( parser , 'a' )
156
+ testSerializeThenParse ( parser , 'a' )
70
157
} )
158
+ test ( 'parseAsNumberLiteral' , ( ) => {
159
+ const parser = parseAsNumberLiteral ( [ 1 , 2 , 3 ] as const )
160
+ expect ( parser . parse ( '' ) ) . toBeNull ( )
161
+ expect ( parser . parse ( '1' ) ) . toBe ( 1 )
162
+ expect ( parser . parse ( '2' ) ) . toBe ( 2 )
163
+ expect ( parser . parse ( '3' ) ) . toBe ( 3 )
164
+ expect ( parser . parse ( '4' ) ) . toBeNull ( )
165
+ expect ( parser . serialize ( 1 ) ) . toBe ( '1' )
166
+ expect ( parser . serialize ( 2 ) ) . toBe ( '2' )
167
+ expect ( parser . serialize ( 3 ) ) . toBe ( '3' )
168
+ testParseThenSerialize ( parser , '1' )
169
+ testSerializeThenParse ( parser , 1 )
170
+ } )
171
+
71
172
test ( 'parseAsArrayOf' , ( ) => {
72
173
const parser = parseAsArrayOf ( parseAsString )
73
174
expect ( parser . serialize ( [ ] ) ) . toBe ( '' )
74
175
// It encodes its separator
75
176
expect ( parser . serialize ( [ 'a' , ',' , 'b' ] ) ) . toBe ( 'a,%2C,b' )
177
+ testParseThenSerialize ( parser , 'a,b' )
178
+ testSerializeThenParse ( parser , [ 'a' , 'b' ] )
76
179
} )
77
180
78
181
test ( 'parseServerSide with default (#384)' , ( ) => {
0 commit comments