v2 / vlib / x / json2 / tests / decode_embed_reference_test.v
98 lines · 75 sloc · 2.49 KB · b469eb9fa3b7b06a5b47a2d1203296fea8ef479a
Raw
1import json as stdjson
2import x.json2
3
4struct Issue24950GateRecord {
5 exit string
6}
7
8struct Issue24950RecordBase {
9 gate &Issue24950GateRecord = unsafe { nil } @[omitempty]
10}
11
12struct Issue24950Record {
13 Issue24950RecordBase
14}
15
16struct Issue24950Wrapper {
17 gate &Issue24950GateRecord = unsafe { nil }
18}
19
20struct Issue25614Node {
21mut:
22 value int
23 children []&Issue25614Node
24}
25
26struct OptionalPointerRegressionMessage {
27mut:
28 id int
29 text string
30 reply_to ?&OptionalPointerRegressionMessage
31}
32
33fn test_decode_struct_with_reference_field() {
34 decoded := json2.decode[Issue24950Wrapper]('{"gate":{"exit":"north"}}')!
35
36 assert decoded.gate != unsafe { nil }
37 assert decoded.gate.exit == 'north'
38}
39
40fn test_decode_embedded_struct_with_reference_field() {
41 empty_std := stdjson.decode(Issue24950Record, '{}')!
42 empty_json2 := json2.decode[Issue24950Record]('{}')!
43
44 assert empty_std.Issue24950RecordBase.gate == unsafe { nil }
45 assert empty_json2.Issue24950RecordBase.gate == unsafe { nil }
46
47 populated_std := stdjson.decode(Issue24950Record, '{"gate":{"exit":"north"}}')!
48 populated_json2 := json2.decode[Issue24950Record]('{"gate":{"exit":"north"}}')!
49
50 assert populated_std.Issue24950RecordBase.gate != unsafe { nil }
51 assert populated_json2.Issue24950RecordBase.gate != unsafe { nil }
52 assert populated_std.Issue24950RecordBase.gate.exit == 'north'
53 assert populated_json2.Issue24950RecordBase.gate.exit == 'north'
54}
55
56fn test_decode_top_level_reference_to_primitive() {
57 decoded := json2.decode[&int]('1')!
58
59 assert decoded != unsafe { nil }
60 assert *decoded == 1
61}
62
63fn test_decode_top_level_reference_to_primitive_null() {
64 decoded := json2.decode[&int]('null')!
65
66 assert decoded == unsafe { nil }
67}
68
69fn test_decode_top_level_reference_to_struct() {
70 decoded := json2.decode[&Issue25614Node]('{"value":1}')!
71
72 assert decoded != unsafe { nil }
73 assert decoded.value == 1
74}
75
76fn test_decode_struct_with_array_of_references() {
77 decoded := json2.decode[Issue25614Node]('{"children":[{"value":1},{"value":2}]}')!
78
79 assert decoded.children.len == 2
80 assert decoded.children[0] != unsafe { nil }
81 assert decoded.children[1] != unsafe { nil }
82 assert decoded.children[0].value == 1
83 assert decoded.children[1].value == 2
84}
85
86fn test_decode_optional_reference_field() {
87 message :=
88 json2.decode[OptionalPointerRegressionMessage]('{"id":1,"text":"Hello","reply_to":{"id":2,"text":"Hi","reply_to":null}}')!
89
90 reply := message.reply_to or {
91 assert false
92 return
93 }
94
95 assert reply.id == 2
96 assert reply.text == 'Hi'
97 assert reply.reply_to == none
98}
99