v2 / vlib / x / json2 / tests / json2_tests / decode_struct_test.v
211 lines · 184 sloc · 6.35 KB · 2d33a7f2819dd5fc1f4aa3b3ca0bcc660810d7af
Raw
1import x.json2 as json
2import time
3
4const fixed_time = time.new(
5 year: 2022
6 month: 3
7 day: 11
8 hour: 13
9 minute: 54
10 second: 25
11)
12
13type StringAlias = string
14type BoolAlias = bool
15type IntAlias = int
16
17type SumTypes = bool | int | string
18
19enum Enumerates {
20 a
21 b
22 c
23 d
24 e = 99
25 f
26}
27
28struct StructType[T] {
29mut:
30 val T
31}
32
33struct StructTypeSub {
34 test string
35}
36
37struct StructTypeOption[T] {
38mut:
39 val ?T
40}
41
42struct StructTypePointer[T] {
43mut:
44 val &T
45}
46
47struct StructTypeSkippedFields[T] {
48mut:
49 val T @[json: '-']
50 val1 T
51 val2 T @[json: '-']
52 val3 T
53}
54
55struct StructTypeSkippedFields2[T] {
56mut:
57 val T
58 val1 T @[json: '-']
59 val2 T
60 val3 T @[json: '-']
61}
62
63struct StructTypeSkippedFields3[T] {
64mut:
65 val T @[json: '-']
66 val1 T @[json: '-']
67 val2 T @[json: '-']
68 val3 T @[json: '-']
69}
70
71struct StructTypeSkippedField4 {
72mut:
73 val map[string]string @[json: '-']
74}
75
76struct StructTypeSkippedFields5[T] {
77mut:
78 val T @[skip]
79 val1 T @[skip]
80 val2 T @[skip]
81 val3 T @[skip]
82}
83
84struct StructTypeSkippedFields6[T] {
85mut:
86 val T
87 val1 T @[skip]
88 val2 T
89 val3 T @[skip]
90}
91
92fn test_types() {
93 assert json.decode[StructType[string]]('{"val": ""}')!.val == ''
94 assert json.decode[StructType[string]]('{"val": "0"}')!.val == '0'
95 assert json.decode[StructType[string]]('{"val": "1"}')!.val == '1'
96 assert json.decode[StructType[string]]('{"val": "2"}')!.val == '2'
97 // assert json.decode[StructType[string]]('{"val": 0}')!.val == '0' // This should be a error
98 // assert json.decode[StructType[string]]('{"val": 1}')!.val == '1' // This should be a error
99 // assert json.decode[StructType[string]]('{"val": 2}')!.val == '2' // This should be a error
100 assert json.decode[StructType[string]]('{"val": "true"}')!.val == 'true'
101 assert json.decode[StructType[string]]('{"val": "false"}')!.val == 'false'
102 // assert json.decode[StructType[string]]('{"val": true}')!.val == 'true' // This should be a error
103 // assert json.decode[StructType[string]]('{"val": false}')!.val == 'false' // This should be a error
104
105 // assert json.decode[StructType[bool]]('{"val": ""}')!.val == false // This should be a error
106 // assert json.decode[StructType[bool]]('{"val": "0"}')!.val == false // This should be a error
107 // assert json.decode[StructType[bool]]('{"val": "1"}')!.val == true // This should be a error
108 // assert json.decode[StructType[bool]]('{"val": "2"}')!.val == true // This should be a error
109 // assert json.decode[StructType[bool]]('{"val": 0}')!.val == false // This should be a error
110 // assert json.decode[StructType[bool]]('{"val": 1}')!.val == true // This should be a error
111 // assert json.decode[StructType[bool]]('{"val": 2}')!.val == true // This should be a error
112 // assert json.decode[StructType[bool]]('{"val": "true"}')!.val == true // This should be a error
113 // assert json.decode[StructType[bool]]('{"val": "false"}')!.val == false // This should be a error
114 assert json.decode[StructType[bool]]('{"val": true}')!.val == true
115 assert json.decode[StructType[bool]]('{"val": false}')!.val == false
116
117 // assert json.decode[StructType[int]]('{"val": ""}')!.val == 0 // This should be a error
118 // assert json.decode[StructType[int]]('{"val": "0"}')!.val == 0 // This should be a error
119 // assert json.decode[StructType[int]]('{"val": "1"}')!.val == 1 // This should be a error
120 // assert json.decode[StructType[int]]('{"val": "2"}')!.val == 2 // This should be a error
121 assert json.decode[StructType[int]]('{"val": 0}')!.val == 0
122 assert json.decode[StructType[int]]('{"val": 1}')!.val == 1
123 assert json.decode[StructType[int]]('{"val": 2}')!.val == 2
124 // assert json.decode[StructType[int]]('{"val": "true"}')!.val == 0 // This should be a error
125 // assert json.decode[StructType[int]]('{"val": "false"}')!.val == 0 // This should be a error
126 // assert json.decode[StructType[int]]('{"val": true}')!.val == 1 // This should be a error
127 // assert json.decode[StructType[int]]('{"val": false}')!.val == 0 // This should be a error
128
129 assert json.decode[StructType[time.Time]]('{"val": "2022-03-11T13:54:25.000Z"}')!.val == fixed_time
130 assert json.decode[StructType[time.Time]]('{"val": "2001-01-05"}')!.val.year == 2001
131 assert json.decode[StructType[time.Time]]('{"val": "2001-01-05"}')!.val.month == 1
132 assert json.decode[StructType[time.Time]]('{"val": "2001-01-05"}')!.val.day == 5
133 assert json.decode[StructType[time.Time]]('{"val": "2001-01-05"}')!.val.hour == 0
134 assert json.decode[StructType[time.Time]]('{"val": "2001-01-05"}')!.val.minute == 0
135 assert json.decode[StructType[time.Time]]('{"val": "2001-01-05"}')!.val.second == 0
136
137 assert json.decode[StructType[StructTypeSub]]('{"val": {"test": "test"}}')!.val.test == 'test'
138
139 assert json.decode[StructType[Enumerates]]('{"val": 0}')!.val == .a
140 assert json.decode[StructType[Enumerates]]('{"val": 1}')!.val == .b
141 assert json.decode[StructType[Enumerates]]('{"val": 99}')!.val == .e
142 assert json.decode[StructType[Enumerates]]('{}')!.val == .a
143
144 if x := json.decode[StructTypeOption[Enumerates]]('{"val": 0}')!.val {
145 assert x == .a
146 }
147 if x := json.decode[StructTypeOption[Enumerates]]('{"val": 1}')!.val {
148 assert x == .b
149 }
150 if x := json.decode[StructTypeOption[Enumerates]]('{"val": 99}')!.val {
151 assert x == .e
152 }
153 if x := json.decode[StructTypeOption[Enumerates]]('{}')!.val {
154 assert false
155 } else {
156 assert true
157 }
158}
159
160fn test_skipped_fields() {
161 if x := json.decode[StructTypeSkippedFields[int]]('{"val":10,"val1":10,"val2":10,"val3":10}') {
162 assert x.val == 0
163 assert x.val1 == 10
164 assert x.val2 == 0
165 assert x.val3 == 10
166 } else {
167 assert false
168 }
169
170 if x := json.decode[StructTypeSkippedFields2[int]]('{"val":10,"val1":10,"val2":10,"val3":10}') {
171 assert x.val == 10
172 assert x.val1 == 0
173 assert x.val2 == 10
174 assert x.val3 == 0
175 } else {
176 assert false
177 }
178
179 if x := json.decode[StructTypeSkippedFields3[int]]('{"val":10,"val1":10,"val2":10,"val3":10}') {
180 assert x.val == 0
181 assert x.val1 == 0
182 assert x.val2 == 0
183 assert x.val3 == 0
184 } else {
185 assert false
186 }
187
188 if x := json.decode[StructTypeSkippedField4]('{"val":{"a":"b"}}') {
189 assert x.val.len == 0
190 } else {
191 assert false
192 }
193
194 if x := json.decode[StructTypeSkippedFields5[int]]('{"val":10,"val1":10,"val2":10,"val3":10}') {
195 assert x.val == 0
196 assert x.val1 == 0
197 assert x.val2 == 0
198 assert x.val3 == 0
199 } else {
200 assert false
201 }
202
203 if x := json.decode[StructTypeSkippedFields6[int]]('{"val":10,"val1":10,"val2":10,"val3":10}') {
204 assert x.val == 10
205 assert x.val1 == 0
206 assert x.val2 == 10
207 assert x.val3 == 0
208 } else {
209 assert false
210 }
211}
212