v
Зеркало из https://github.com/vlang/v
1import x.json2 as json
2import time
3
4const fixed_time = time.new(
5year: 2022
6month: 3
7day: 11
8hour: 13
9minute: 54
10second: 25
11)
12
13type StringAlias = string
14type BoolAlias = bool
15type IntAlias = int
16type TimeAlias = time.Time
17type StructAlias = StructType[int]
18type EnumAlias = Enumerates
19
20type SumTypes = StructType[string] | []SumTypes | []string | bool | int | string | time.Time
21
22enum Enumerates {
23a
24b
25c
26d
27e = 99
28f
29}
30
31struct StructType[T] {
32mut:
33val T
34}
35
36struct StructTypeOption[T] {
37mut:
38val ?T
39}
40
41struct StructTypePointer[T] {
42mut:
43val &T
44}
45
46fn test_types() {
47assert json.encode(StructType[string]{}) == '{"val":""}'
48assert json.encode(StructType[string]{ val: '' }) == '{"val":""}'
49assert json.encode(StructType[string]{ val: 'a' }) == '{"val":"a"}'
50
51assert json.encode(StructType[bool]{}) == '{"val":false}'
52assert json.encode(StructType[bool]{ val: false }) == '{"val":false}'
53assert json.encode(StructType[bool]{ val: true }) == '{"val":true}'
54
55assert json.encode(StructType[int]{}) == '{"val":0}'
56assert json.encode(StructType[int]{ val: 0 }) == '{"val":0}'
57assert json.encode(StructType[int]{ val: 1 }) == '{"val":1}'
58
59assert json.encode(StructType[time.Time]{}) == '{"val":"0000-00-00T00:00:00.000Z"}'
60assert json.encode(StructType[time.Time]{ val: fixed_time }) == '{"val":"2022-03-11T13:54:25.000Z"}'
61
62assert json.encode(StructType[StructType[int]]{
63val: StructType[int]{
64val: 1
65}
66}) == '{"val":{"val":1}}'
67
68assert json.encode(StructType[Enumerates]{}) == '{"val":0}'
69assert json.encode(StructType[Enumerates]{ val: Enumerates.a }) == '{"val":0}'
70assert json.encode(StructType[Enumerates]{ val: Enumerates.d }) == '{"val":3}'
71assert json.encode(StructType[Enumerates]{ val: Enumerates.e }) == '{"val":99}'
72assert json.encode(StructType[Enumerates]{ val: Enumerates.f }) == '{"val":100}'
73}
74
75fn test_option_types() {
76assert json.encode(StructTypeOption[string]{ val: none }) == '{}'
77assert json.encode(StructTypeOption[string]{}) == '{}'
78assert json.encode(StructTypeOption[string]{ val: '' }) == '{"val":""}'
79assert json.encode(StructTypeOption[string]{ val: 'a' }) == '{"val":"a"}'
80
81assert json.encode(StructTypeOption[bool]{ val: none }) == '{}'
82assert json.encode(StructTypeOption[bool]{}) == '{}'
83assert json.encode(StructTypeOption[bool]{ val: false }) == '{"val":false}'
84assert json.encode(StructTypeOption[bool]{ val: true }) == '{"val":true}'
85
86assert json.encode(StructTypeOption[int]{ val: none }) == '{}'
87assert json.encode(StructTypeOption[int]{}) == '{}'
88assert json.encode(StructTypeOption[int]{ val: 0 }) == '{"val":0}'
89assert json.encode(StructTypeOption[int]{ val: 1 }) == '{"val":1}'
90
91assert json.encode(StructTypeOption[time.Time]{}) == '{}'
92assert json.encode(StructTypeOption[time.Time]{ val: time.Time{} }) == '{"val":"0000-00-00T00:00:00.000Z"}'
93assert json.encode(StructTypeOption[time.Time]{ val: fixed_time }) == '{"val":"2022-03-11T13:54:25.000Z"}'
94
95assert json.encode(StructTypeOption[StructType[int]]{
96val: StructType[int]{
97val: 1
98}
99}) == '{"val":{"val":1}}'
100
101assert json.encode(StructTypeOption[Enumerates]{}) == '{}'
102}
103
104fn test_array() {
105assert json.encode(StructType[[]string]{}) == '{"val":[]}'
106assert json.encode(StructType[[]string]{ val: [] }) == '{"val":[]}'
107assert json.encode(StructType[[]string]{ val: ['0'] }) == '{"val":["0"]}'
108assert json.encode(StructType[[]string]{ val: ['1'] }) == '{"val":["1"]}'
109
110assert json.encode(StructType[[]int]{}) == '{"val":[]}'
111assert json.encode(StructType[[]int]{ val: [] }) == '{"val":[]}'
112assert json.encode(StructType[[]int]{ val: [0] }) == '{"val":[0]}'
113assert json.encode(StructType[[]int]{ val: [1] }) == '{"val":[1]}'
114assert json.encode(StructType[[]int]{ val: [0, 1, 0, 2, 3, 2, 5, 1] }) == '{"val":[0,1,0,2,3,2,5,1]}'
115
116assert json.encode(StructType[[]u8]{}) == '{"val":[]}'
117assert json.encode(StructType[[]u8]{ val: [] }) == '{"val":[]}'
118assert json.encode(StructType[[]u8]{ val: [u8(0)] }) == '{"val":[0]}'
119assert json.encode(StructType[[]u8]{ val: [u8(1)] }) == '{"val":[1]}'
120assert json.encode(StructType[[]u8]{ val: [u8(0), 1, 0, 2, 3, 2, 5, 1] }) == '{"val":[0,1,0,2,3,2,5,1]}'
121
122assert json.encode(StructType[[]i64]{}) == '{"val":[]}'
123assert json.encode(StructType[[]i64]{ val: [] }) == '{"val":[]}'
124assert json.encode(StructType[[]i64]{ val: [i64(0)] }) == '{"val":[0]}'
125assert json.encode(StructType[[]i64]{ val: [i64(1)] }) == '{"val":[1]}'
126assert json.encode(StructType[[]i64]{ val: [i64(0), 1, 0, 2, 3, 2, 5, 1] }) == '{"val":[0,1,0,2,3,2,5,1]}'
127
128assert json.encode(StructType[[]u64]{}) == '{"val":[]}'
129assert json.encode(StructType[[]u64]{ val: [] }) == '{"val":[]}'
130assert json.encode(StructType[[]u64]{ val: [u64(0)] }) == '{"val":[0]}'
131assert json.encode(StructType[[]u64]{ val: [u64(1)] }) == '{"val":[1]}'
132assert json.encode(StructType[[]u64]{ val: [u64(0), 1, 0, 2, 3, 2, 5, 1] }) == '{"val":[0,1,0,2,3,2,5,1]}'
133
134assert json.encode(StructType[[]f64]{}) == '{"val":[]}'
135assert json.encode(StructType[[]f64]{ val: [] }) == '{"val":[]}'
136assert json.encode(StructType[[]f64]{ val: [f64(0)] }) == '{"val":[0.0]}'
137assert json.encode(StructType[[]f64]{ val: [f64(1)] }) == '{"val":[1.0]}'
138assert json.encode(StructType[[]f64]{ val: [f64(0), 1, 0, 2, 3, 2, 5, 1] }) == '{"val":[0.0,1.0,0.0,2.0,3.0,2.0,5.0,1.0]}'
139
140assert json.encode(StructType[[]bool]{}) == '{"val":[]}'
141assert json.encode(StructType[[]bool]{ val: [] }) == '{"val":[]}'
142assert json.encode(StructType[[]bool]{ val: [true] }) == '{"val":[true]}'
143assert json.encode(StructType[[]bool]{ val: [false] }) == '{"val":[false]}'
144assert json.encode(StructType[[]bool]{ val: [false, true, false] }) == '{"val":[false,true,false]}'
145
146array_of_struct := [StructType[bool]{
147val: true
148}, StructType[bool]{
149val: false
150}]
151assert json.encode(StructType[[]StructType[bool]]{ val: array_of_struct }) == '{"val":[{"val":true},{"val":false}]}'
152
153assert json.encode(StructType[[][]string]{ val: [['1'], ['2']] }) == '{"val":[["1"],["2"]]}'
154
155// error: cannot use `[][]string` as `[]string` in argument 1 to `x.json2.Encoder.encode_array`
156// assert json.encode(StructType[[][][]string]{ val: [[['1']]] }) == '{"val":[[["1"]]]}'
157}
158
159fn test_option_array() {
160assert json.encode(StructTypeOption[[]string]{}) == '{}'
161assert json.encode(StructTypeOption[[]string]{ val: [] }) == '{"val":[]}'
162assert json.encode(StructTypeOption[[]string]{ val: ['0'] }) == '{"val":["0"]}'
163assert json.encode(StructTypeOption[[]string]{ val: ['1'] }) == '{"val":["1"]}'
164
165assert json.encode(StructTypeOption[[]int]{}) == '{}'
166assert json.encode(StructTypeOption[[]int]{ val: [] }) == '{"val":[]}'
167assert json.encode(StructTypeOption[[]int]{ val: [0] }) == '{"val":[0]}'
168assert json.encode(StructTypeOption[[]int]{ val: [1] }) == '{"val":[1]}'
169assert json.encode(StructTypeOption[[]int]{ val: [0, 1, 0, 2, 3, 2, 5, 1] }) == '{"val":[0,1,0,2,3,2,5,1]}'
170
171assert json.encode(StructTypeOption[[]u8]{}) == '{}'
172assert json.encode(StructTypeOption[[]u8]{ val: [] }) == '{"val":[]}'
173assert json.encode(StructTypeOption[[]u8]{ val: [u8(0)] }) == '{"val":[0]}'
174assert json.encode(StructTypeOption[[]u8]{ val: [u8(1)] }) == '{"val":[1]}'
175assert json.encode(StructTypeOption[[]u8]{ val: [u8(0), 1, 0, 2, 3, 2, 5, 1] }) == '{"val":[0,1,0,2,3,2,5,1]}'
176
177assert json.encode(StructTypeOption[[]i64]{}) == '{}'
178assert json.encode(StructTypeOption[[]i64]{ val: [] }) == '{"val":[]}'
179assert json.encode(StructTypeOption[[]i64]{ val: [i64(0)] }) == '{"val":[0]}'
180assert json.encode(StructTypeOption[[]i64]{ val: [i64(1)] }) == '{"val":[1]}'
181assert json.encode(StructTypeOption[[]i64]{ val: [i64(0), 1, 0, 2, 3, 2, 5, 1] }) == '{"val":[0,1,0,2,3,2,5,1]}'
182
183assert json.encode(StructTypeOption[[]u64]{}) == '{}'
184assert json.encode(StructTypeOption[[]u64]{ val: [] }) == '{"val":[]}'
185assert json.encode(StructTypeOption[[]u64]{ val: [u64(0)] }) == '{"val":[0]}'
186assert json.encode(StructTypeOption[[]u64]{ val: [u64(1)] }) == '{"val":[1]}'
187assert json.encode(StructTypeOption[[]u64]{ val: [u64(0), 1, 0, 2, 3, 2, 5, 1] }) == '{"val":[0,1,0,2,3,2,5,1]}'
188
189assert json.encode(StructTypeOption[[]f64]{}) == '{}'
190assert json.encode(StructTypeOption[[]f64]{ val: [] }) == '{"val":[]}'
191assert json.encode(StructTypeOption[[]f64]{ val: [f64(0)] }) == '{"val":[0.0]}'
192assert json.encode(StructTypeOption[[]f64]{ val: [f64(1)] }) == '{"val":[1.0]}'
193assert json.encode(StructTypeOption[[]f64]{ val: [f64(0), 1, 0, 2, 3, 2, 5, 1] }) == '{"val":[0.0,1.0,0.0,2.0,3.0,2.0,5.0,1.0]}'
194
195assert json.encode(StructTypeOption[[]bool]{}) == '{}'
196assert json.encode(StructTypeOption[[]bool]{ val: [] }) == '{"val":[]}'
197assert json.encode(StructTypeOption[[]bool]{ val: [true] }) == '{"val":[true]}'
198assert json.encode(StructTypeOption[[]bool]{ val: [false] }) == '{"val":[false]}'
199assert json.encode(StructTypeOption[[]bool]{ val: [false, true, false] }) == '{"val":[false,true,false]}'
200
201array_of_struct := [StructType[bool]{
202val: true
203}, StructType[bool]{
204val: false
205}]
206assert json.encode(StructTypeOption[[]StructType[bool]]{ val: array_of_struct }) == '{"val":[{"val":true},{"val":false}]}'
207
208// assert json.encode(StructTypeOption[[][]int]{
209// val: [[0, 1], [0, 2, 3], [2], [5, 1]]
210// }) == '{"val":[[0,1],[0,2,3],[2],[5,1]]}'
211}
212
213fn test_alias() {
214assert json.encode(StructType[StringAlias]{}) == '{"val":""}'
215assert json.encode(StructType[StringAlias]{ val: '' }) == '{"val":""}'
216assert json.encode(StructType[StringAlias]{ val: 'a' }) == '{"val":"a"}'
217
218assert json.encode(StructType[BoolAlias]{}) == '{"val":false}'
219assert json.encode(StructType[BoolAlias]{ val: false }) == '{"val":false}'
220assert json.encode(StructType[BoolAlias]{ val: true }) == '{"val":true}'
221
222assert json.encode(StructType[IntAlias]{}) == '{"val":0}'
223assert json.encode(StructType[IntAlias]{ val: 0 }) == '{"val":0}'
224assert json.encode(StructType[IntAlias]{ val: 1 }) == '{"val":1}'
225
226assert json.encode(StructType[TimeAlias]{}) == '{"val":"0000-00-00T00:00:00.000Z"}'
227assert json.encode(StructType[TimeAlias]{ val: fixed_time }) == '{"val":"2022-03-11T13:54:25.000Z"}'
228
229assert json.encode(StructType[StructAlias]{}) == '{"val":{"val":0}}'
230assert json.encode(StructType[StructAlias]{ val: StructType[int]{0} }) == '{"val":{"val":0}}'
231assert json.encode(StructType[StructAlias]{ val: StructType[int]{1} }) == '{"val":{"val":1}}'
232}
233
234fn test_pointer() {
235mut string_initialized_with_reference := ''
236assert json.encode(StructTypePointer[string]{ val: unsafe { nil } }) == '{}'
237assert json.encode(StructTypePointer[string]{ val: &string_initialized_with_reference }) == '{"val":""}'
238string_initialized_with_reference = 'a'
239assert json.encode(StructTypePointer[string]{ val: &string_initialized_with_reference }) == '{"val":"a"}'
240
241mut bool_initialized_with_reference := false
242assert json.encode(StructTypePointer[bool]{ val: unsafe { nil } }) == '{}'
243assert json.encode(StructTypePointer[bool]{ val: &bool_initialized_with_reference }) == '{"val":false}'
244bool_initialized_with_reference = true
245assert json.encode(StructTypePointer[bool]{ val: &bool_initialized_with_reference }) == '{"val":true}'
246
247mut int_initialized_with_reference := 0
248assert json.encode(StructTypePointer[int]{ val: unsafe { nil } }) == '{}'
249assert json.encode(StructTypePointer[int]{ val: &int_initialized_with_reference }) == '{"val":0}'
250int_initialized_with_reference = 1
251assert json.encode(StructTypePointer[int]{ val: &int_initialized_with_reference }) == '{"val":1}'
252}
253
254fn test_sumtypes() {
255assert json.encode(StructType[SumTypes]{}) == '{"val":{"val":""}}' // is_none := val.$(field.name).str() == 'unknown sum type value'
256assert json.encode(StructType[SumTypes]{ val: '' }) == '{"val":""}'
257assert json.encode(StructType[SumTypes]{ val: 'a' }) == '{"val":"a"}'
258
259assert json.encode(StructType[SumTypes]{ val: false }) == '{"val":false}'
260assert json.encode(StructType[SumTypes]{ val: true }) == '{"val":true}'
261
262assert json.encode(StructType[SumTypes]{ val: 0 }) == '{"val":0}'
263assert json.encode(StructType[SumTypes]{ val: 1 }) == '{"val":1}'
264
265assert json.encode(StructType[SumTypes]{ val: fixed_time }) == '{"val":"2022-03-11T13:54:25.000Z"}'
266
267assert json.encode(StructType[StructType[SumTypes]]{
268val: StructType[SumTypes]{
269val: 1
270}
271}) == '{"val":{"val":1}}'
272
273assert json.encode(StructType[SumTypes]{
274val: StructType[string]{
275val: '111111'
276}
277}) == '{"val":{"val":"111111"}}'
278
279assert json.encode(StructType[StructType[SumTypes]]{
280val: StructType[SumTypes]{
281val: 1
282}
283}) == '{"val":{"val":1}}'
284
285// assert json.encode(StructType{ val: [SumTypes('a')] }) == '{"val":["a"]}'
286// assert json.encode(StructType[SumTypes]{ val: ['a'] }) == '{"val":["a"]}'
287// assert json.encode(StructType[SumTypes]{ val: [SumTypes('a')] }) == '{"val":["a"]}'
288// assert json.encode(StructType[SumTypes]{ val: '' }) == '{"val":""}'
289}
290
291fn test_maps() {
292assert json.encode(StructType[map[string]map[string]int]{}) == '{"val":{}}'
293assert json.encode(StructType[map[string]string]{
294val: {
295'1': '1'
296}
297}) == '{"val":{"1":"1"}}'
298assert json.encode(StructType[map[string]int]{
299val: {
300'1': 1
301}
302}) == '{"val":{"1":1}}'
303assert json.encode(StructType[map[string]map[string]int]{
304val: {
305'a': {
306'1': 1
307}
308}
309}) == '{"val":{"a":{"1":1}}}'
310}
311