v

Зеркало из https://github.com/vlang/v
Форк
0
/x
/
encode_struct_test.v 
310 строк · 13.0 Кб
1
import x.json2 as json
2
import time
3

4
const fixed_time = time.new(
5
	year:   2022
6
	month:  3
7
	day:    11
8
	hour:   13
9
	minute: 54
10
	second: 25
11
)
12

13
type StringAlias = string
14
type BoolAlias = bool
15
type IntAlias = int
16
type TimeAlias = time.Time
17
type StructAlias = StructType[int]
18
type EnumAlias = Enumerates
19

20
type SumTypes = StructType[string] | []SumTypes | []string | bool | int | string | time.Time
21

22
enum Enumerates {
23
	a
24
	b
25
	c
26
	d
27
	e = 99
28
	f
29
}
30

31
struct StructType[T] {
32
mut:
33
	val T
34
}
35

36
struct StructTypeOption[T] {
37
mut:
38
	val ?T
39
}
40

41
struct StructTypePointer[T] {
42
mut:
43
	val &T
44
}
45

46
fn test_types() {
47
	assert json.encode(StructType[string]{}) == '{"val":""}'
48
	assert json.encode(StructType[string]{ val: '' }) == '{"val":""}'
49
	assert json.encode(StructType[string]{ val: 'a' }) == '{"val":"a"}'
50

51
	assert json.encode(StructType[bool]{}) == '{"val":false}'
52
	assert json.encode(StructType[bool]{ val: false }) == '{"val":false}'
53
	assert json.encode(StructType[bool]{ val: true }) == '{"val":true}'
54

55
	assert json.encode(StructType[int]{}) == '{"val":0}'
56
	assert json.encode(StructType[int]{ val: 0 }) == '{"val":0}'
57
	assert json.encode(StructType[int]{ val: 1 }) == '{"val":1}'
58

59
	assert json.encode(StructType[time.Time]{}) == '{"val":"0000-00-00T00:00:00.000Z"}'
60
	assert json.encode(StructType[time.Time]{ val: fixed_time }) == '{"val":"2022-03-11T13:54:25.000Z"}'
61

62
	assert json.encode(StructType[StructType[int]]{
63
		val: StructType[int]{
64
			val: 1
65
		}
66
	}) == '{"val":{"val":1}}'
67

68
	assert json.encode(StructType[Enumerates]{}) == '{"val":0}'
69
	assert json.encode(StructType[Enumerates]{ val: Enumerates.a }) == '{"val":0}'
70
	assert json.encode(StructType[Enumerates]{ val: Enumerates.d }) == '{"val":3}'
71
	assert json.encode(StructType[Enumerates]{ val: Enumerates.e }) == '{"val":99}'
72
	assert json.encode(StructType[Enumerates]{ val: Enumerates.f }) == '{"val":100}'
73
}
74

75
fn test_option_types() {
76
	assert json.encode(StructTypeOption[string]{ val: none }) == '{}'
77
	assert json.encode(StructTypeOption[string]{}) == '{}'
78
	assert json.encode(StructTypeOption[string]{ val: '' }) == '{"val":""}'
79
	assert json.encode(StructTypeOption[string]{ val: 'a' }) == '{"val":"a"}'
80

81
	assert json.encode(StructTypeOption[bool]{ val: none }) == '{}'
82
	assert json.encode(StructTypeOption[bool]{}) == '{}'
83
	assert json.encode(StructTypeOption[bool]{ val: false }) == '{"val":false}'
84
	assert json.encode(StructTypeOption[bool]{ val: true }) == '{"val":true}'
85

86
	assert json.encode(StructTypeOption[int]{ val: none }) == '{}'
87
	assert json.encode(StructTypeOption[int]{}) == '{}'
88
	assert json.encode(StructTypeOption[int]{ val: 0 }) == '{"val":0}'
89
	assert json.encode(StructTypeOption[int]{ val: 1 }) == '{"val":1}'
90

91
	assert json.encode(StructTypeOption[time.Time]{}) == '{}'
92
	assert json.encode(StructTypeOption[time.Time]{ val: time.Time{} }) == '{"val":"0000-00-00T00:00:00.000Z"}'
93
	assert json.encode(StructTypeOption[time.Time]{ val: fixed_time }) == '{"val":"2022-03-11T13:54:25.000Z"}'
94

95
	assert json.encode(StructTypeOption[StructType[int]]{
96
		val: StructType[int]{
97
			val: 1
98
		}
99
	}) == '{"val":{"val":1}}'
100

101
	assert json.encode(StructTypeOption[Enumerates]{}) == '{}'
102
}
103

104
fn test_array() {
105
	assert json.encode(StructType[[]string]{}) == '{"val":[]}'
106
	assert json.encode(StructType[[]string]{ val: [] }) == '{"val":[]}'
107
	assert json.encode(StructType[[]string]{ val: ['0'] }) == '{"val":["0"]}'
108
	assert json.encode(StructType[[]string]{ val: ['1'] }) == '{"val":["1"]}'
109

110
	assert json.encode(StructType[[]int]{}) == '{"val":[]}'
111
	assert json.encode(StructType[[]int]{ val: [] }) == '{"val":[]}'
112
	assert json.encode(StructType[[]int]{ val: [0] }) == '{"val":[0]}'
113
	assert json.encode(StructType[[]int]{ val: [1] }) == '{"val":[1]}'
114
	assert json.encode(StructType[[]int]{ val: [0, 1, 0, 2, 3, 2, 5, 1] }) == '{"val":[0,1,0,2,3,2,5,1]}'
115

116
	assert json.encode(StructType[[]u8]{}) == '{"val":[]}'
117
	assert json.encode(StructType[[]u8]{ val: [] }) == '{"val":[]}'
118
	assert json.encode(StructType[[]u8]{ val: [u8(0)] }) == '{"val":[0]}'
119
	assert json.encode(StructType[[]u8]{ val: [u8(1)] }) == '{"val":[1]}'
120
	assert json.encode(StructType[[]u8]{ val: [u8(0), 1, 0, 2, 3, 2, 5, 1] }) == '{"val":[0,1,0,2,3,2,5,1]}'
121

122
	assert json.encode(StructType[[]i64]{}) == '{"val":[]}'
123
	assert json.encode(StructType[[]i64]{ val: [] }) == '{"val":[]}'
124
	assert json.encode(StructType[[]i64]{ val: [i64(0)] }) == '{"val":[0]}'
125
	assert json.encode(StructType[[]i64]{ val: [i64(1)] }) == '{"val":[1]}'
126
	assert json.encode(StructType[[]i64]{ val: [i64(0), 1, 0, 2, 3, 2, 5, 1] }) == '{"val":[0,1,0,2,3,2,5,1]}'
127

128
	assert json.encode(StructType[[]u64]{}) == '{"val":[]}'
129
	assert json.encode(StructType[[]u64]{ val: [] }) == '{"val":[]}'
130
	assert json.encode(StructType[[]u64]{ val: [u64(0)] }) == '{"val":[0]}'
131
	assert json.encode(StructType[[]u64]{ val: [u64(1)] }) == '{"val":[1]}'
132
	assert json.encode(StructType[[]u64]{ val: [u64(0), 1, 0, 2, 3, 2, 5, 1] }) == '{"val":[0,1,0,2,3,2,5,1]}'
133

134
	assert json.encode(StructType[[]f64]{}) == '{"val":[]}'
135
	assert json.encode(StructType[[]f64]{ val: [] }) == '{"val":[]}'
136
	assert json.encode(StructType[[]f64]{ val: [f64(0)] }) == '{"val":[0.0]}'
137
	assert json.encode(StructType[[]f64]{ val: [f64(1)] }) == '{"val":[1.0]}'
138
	assert 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

140
	assert json.encode(StructType[[]bool]{}) == '{"val":[]}'
141
	assert json.encode(StructType[[]bool]{ val: [] }) == '{"val":[]}'
142
	assert json.encode(StructType[[]bool]{ val: [true] }) == '{"val":[true]}'
143
	assert json.encode(StructType[[]bool]{ val: [false] }) == '{"val":[false]}'
144
	assert json.encode(StructType[[]bool]{ val: [false, true, false] }) == '{"val":[false,true,false]}'
145

146
	array_of_struct := [StructType[bool]{
147
		val: true
148
	}, StructType[bool]{
149
		val: false
150
	}]
151
	assert json.encode(StructType[[]StructType[bool]]{ val: array_of_struct }) == '{"val":[{"val":true},{"val":false}]}'
152

153
	assert 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

159
fn test_option_array() {
160
	assert json.encode(StructTypeOption[[]string]{}) == '{}'
161
	assert json.encode(StructTypeOption[[]string]{ val: [] }) == '{"val":[]}'
162
	assert json.encode(StructTypeOption[[]string]{ val: ['0'] }) == '{"val":["0"]}'
163
	assert json.encode(StructTypeOption[[]string]{ val: ['1'] }) == '{"val":["1"]}'
164

165
	assert json.encode(StructTypeOption[[]int]{}) == '{}'
166
	assert json.encode(StructTypeOption[[]int]{ val: [] }) == '{"val":[]}'
167
	assert json.encode(StructTypeOption[[]int]{ val: [0] }) == '{"val":[0]}'
168
	assert json.encode(StructTypeOption[[]int]{ val: [1] }) == '{"val":[1]}'
169
	assert json.encode(StructTypeOption[[]int]{ val: [0, 1, 0, 2, 3, 2, 5, 1] }) == '{"val":[0,1,0,2,3,2,5,1]}'
170

171
	assert json.encode(StructTypeOption[[]u8]{}) == '{}'
172
	assert json.encode(StructTypeOption[[]u8]{ val: [] }) == '{"val":[]}'
173
	assert json.encode(StructTypeOption[[]u8]{ val: [u8(0)] }) == '{"val":[0]}'
174
	assert json.encode(StructTypeOption[[]u8]{ val: [u8(1)] }) == '{"val":[1]}'
175
	assert json.encode(StructTypeOption[[]u8]{ val: [u8(0), 1, 0, 2, 3, 2, 5, 1] }) == '{"val":[0,1,0,2,3,2,5,1]}'
176

177
	assert json.encode(StructTypeOption[[]i64]{}) == '{}'
178
	assert json.encode(StructTypeOption[[]i64]{ val: [] }) == '{"val":[]}'
179
	assert json.encode(StructTypeOption[[]i64]{ val: [i64(0)] }) == '{"val":[0]}'
180
	assert json.encode(StructTypeOption[[]i64]{ val: [i64(1)] }) == '{"val":[1]}'
181
	assert json.encode(StructTypeOption[[]i64]{ val: [i64(0), 1, 0, 2, 3, 2, 5, 1] }) == '{"val":[0,1,0,2,3,2,5,1]}'
182

183
	assert json.encode(StructTypeOption[[]u64]{}) == '{}'
184
	assert json.encode(StructTypeOption[[]u64]{ val: [] }) == '{"val":[]}'
185
	assert json.encode(StructTypeOption[[]u64]{ val: [u64(0)] }) == '{"val":[0]}'
186
	assert json.encode(StructTypeOption[[]u64]{ val: [u64(1)] }) == '{"val":[1]}'
187
	assert json.encode(StructTypeOption[[]u64]{ val: [u64(0), 1, 0, 2, 3, 2, 5, 1] }) == '{"val":[0,1,0,2,3,2,5,1]}'
188

189
	assert json.encode(StructTypeOption[[]f64]{}) == '{}'
190
	assert json.encode(StructTypeOption[[]f64]{ val: [] }) == '{"val":[]}'
191
	assert json.encode(StructTypeOption[[]f64]{ val: [f64(0)] }) == '{"val":[0.0]}'
192
	assert json.encode(StructTypeOption[[]f64]{ val: [f64(1)] }) == '{"val":[1.0]}'
193
	assert 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

195
	assert json.encode(StructTypeOption[[]bool]{}) == '{}'
196
	assert json.encode(StructTypeOption[[]bool]{ val: [] }) == '{"val":[]}'
197
	assert json.encode(StructTypeOption[[]bool]{ val: [true] }) == '{"val":[true]}'
198
	assert json.encode(StructTypeOption[[]bool]{ val: [false] }) == '{"val":[false]}'
199
	assert json.encode(StructTypeOption[[]bool]{ val: [false, true, false] }) == '{"val":[false,true,false]}'
200

201
	array_of_struct := [StructType[bool]{
202
		val: true
203
	}, StructType[bool]{
204
		val: false
205
	}]
206
	assert 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

213
fn test_alias() {
214
	assert json.encode(StructType[StringAlias]{}) == '{"val":""}'
215
	assert json.encode(StructType[StringAlias]{ val: '' }) == '{"val":""}'
216
	assert json.encode(StructType[StringAlias]{ val: 'a' }) == '{"val":"a"}'
217

218
	assert json.encode(StructType[BoolAlias]{}) == '{"val":false}'
219
	assert json.encode(StructType[BoolAlias]{ val: false }) == '{"val":false}'
220
	assert json.encode(StructType[BoolAlias]{ val: true }) == '{"val":true}'
221

222
	assert json.encode(StructType[IntAlias]{}) == '{"val":0}'
223
	assert json.encode(StructType[IntAlias]{ val: 0 }) == '{"val":0}'
224
	assert json.encode(StructType[IntAlias]{ val: 1 }) == '{"val":1}'
225

226
	assert json.encode(StructType[TimeAlias]{}) == '{"val":"0000-00-00T00:00:00.000Z"}'
227
	assert json.encode(StructType[TimeAlias]{ val: fixed_time }) == '{"val":"2022-03-11T13:54:25.000Z"}'
228

229
	assert json.encode(StructType[StructAlias]{}) == '{"val":{"val":0}}'
230
	assert json.encode(StructType[StructAlias]{ val: StructType[int]{0} }) == '{"val":{"val":0}}'
231
	assert json.encode(StructType[StructAlias]{ val: StructType[int]{1} }) == '{"val":{"val":1}}'
232
}
233

234
fn test_pointer() {
235
	mut string_initialized_with_reference := ''
236
	assert json.encode(StructTypePointer[string]{ val: unsafe { nil } }) == '{}'
237
	assert json.encode(StructTypePointer[string]{ val: &string_initialized_with_reference }) == '{"val":""}'
238
	string_initialized_with_reference = 'a'
239
	assert json.encode(StructTypePointer[string]{ val: &string_initialized_with_reference }) == '{"val":"a"}'
240

241
	mut bool_initialized_with_reference := false
242
	assert json.encode(StructTypePointer[bool]{ val: unsafe { nil } }) == '{}'
243
	assert json.encode(StructTypePointer[bool]{ val: &bool_initialized_with_reference }) == '{"val":false}'
244
	bool_initialized_with_reference = true
245
	assert json.encode(StructTypePointer[bool]{ val: &bool_initialized_with_reference }) == '{"val":true}'
246

247
	mut int_initialized_with_reference := 0
248
	assert json.encode(StructTypePointer[int]{ val: unsafe { nil } }) == '{}'
249
	assert json.encode(StructTypePointer[int]{ val: &int_initialized_with_reference }) == '{"val":0}'
250
	int_initialized_with_reference = 1
251
	assert json.encode(StructTypePointer[int]{ val: &int_initialized_with_reference }) == '{"val":1}'
252
}
253

254
fn test_sumtypes() {
255
	assert json.encode(StructType[SumTypes]{}) == '{"val":{"val":""}}' // is_none := val.$(field.name).str() == 'unknown sum type value'
256
	assert json.encode(StructType[SumTypes]{ val: '' }) == '{"val":""}'
257
	assert json.encode(StructType[SumTypes]{ val: 'a' }) == '{"val":"a"}'
258

259
	assert json.encode(StructType[SumTypes]{ val: false }) == '{"val":false}'
260
	assert json.encode(StructType[SumTypes]{ val: true }) == '{"val":true}'
261

262
	assert json.encode(StructType[SumTypes]{ val: 0 }) == '{"val":0}'
263
	assert json.encode(StructType[SumTypes]{ val: 1 }) == '{"val":1}'
264

265
	assert json.encode(StructType[SumTypes]{ val: fixed_time }) == '{"val":"2022-03-11T13:54:25.000Z"}'
266

267
	assert json.encode(StructType[StructType[SumTypes]]{
268
		val: StructType[SumTypes]{
269
			val: 1
270
		}
271
	}) == '{"val":{"val":1}}'
272

273
	assert json.encode(StructType[SumTypes]{
274
		val: StructType[string]{
275
			val: '111111'
276
		}
277
	}) == '{"val":{"val":"111111"}}'
278

279
	assert json.encode(StructType[StructType[SumTypes]]{
280
		val: StructType[SumTypes]{
281
			val: 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

291
fn test_maps() {
292
	assert json.encode(StructType[map[string]map[string]int]{}) == '{"val":{}}'
293
	assert json.encode(StructType[map[string]string]{
294
		val: {
295
			'1': '1'
296
		}
297
	}) == '{"val":{"1":"1"}}'
298
	assert json.encode(StructType[map[string]int]{
299
		val: {
300
			'1': 1
301
		}
302
	}) == '{"val":{"1":1}}'
303
	assert json.encode(StructType[map[string]map[string]int]{
304
		val: {
305
			'a': {
306
				'1': 1
307
			}
308
		}
309
	}) == '{"val":{"a":{"1":1}}}'
310
}
311

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.