v2 / vlib / x / json2 / tests / decoder_test.v
121 lines · 104 sloc · 2.77 KB · e9a39321b12d20089f2b5642b5543717b425938a
Raw
1import x.json2 as json
2
3fn test_raw_decode_string() {
4 str := json.decode[json.Any]('"Hello!"')!
5 assert str.str() == 'Hello!'
6}
7
8fn test_raw_decode_string_escape() {
9 jstr := json.decode[json.Any]('"\\u001b"')!
10 str := jstr.str()
11 assert str.len == 1
12 assert str[0] == 27
13}
14
15fn test_raw_decode_number() {
16 num := json.decode[json.Any]('123')!
17 assert num.int() == 123
18}
19
20fn test_raw_decode_array() {
21 raw_arr := json.decode[json.Any]('["Foo", 1]')!
22 arr := raw_arr.as_array()
23 assert arr[0] or { 0 }.str() == 'Foo'
24 assert arr[1] or { 0 }.int() == 1
25}
26
27fn test_raw_decode_bool() {
28 bol := json.decode[json.Any]('false')!
29 assert bol.bool() == false
30}
31
32fn test_raw_decode_map() {
33 raw_mp := json.decode[json.Any]('{"name":"Bob","age":20}')!
34 mp := raw_mp.as_map()
35 assert mp['name'] or { 0 }.str() == 'Bob'
36 assert mp['age'] or { 0 }.int() == 20
37}
38
39fn test_raw_decode_invalid() {
40 json.decode[json.Any]('1z') or {
41 assert err.msg().contains('1:2: Invalid json: Syntax: invalid value. Unexpected character after number end')
42 return
43 }
44 assert false
45}
46
47fn test_raw_decode_string_with_dollarsign() {
48 str := json.decode[json.Any](r'"Hello $world"')!
49 assert str.str() == r'Hello $world'
50}
51
52fn test_raw_decode_map_with_escaped_backslashes_before_string_end() {
53 content := r'{"some_name": "some_value \n [ ] { } ( ) , ; ? * = ! \\@ \\"}'
54 raw_mp := json.decode[json.Any](content)!
55 mp := raw_mp.as_map()
56 assert mp['some_name'] or { 0 }.str() == 'some_value \n [ ] { } ( ) , ; ? * = ! \\@ \\'
57}
58
59fn test_raw_decode_map_with_whitespaces() {
60 raw_mp := json.decode[json.Any](' \n\t{"name":"Bob","age":20}\n\t')!
61 mp := raw_mp.as_map()
62 assert mp['name'] or { 0 }.str() == 'Bob'
63 assert mp['age'] or { 0 }.int() == 20
64}
65
66fn test_raw_decode_map_invalid() {
67 json.decode[json.Any]('{"name","Bob","age":20}') or {
68 assert err.msg().contains('1:8: Invalid json: Syntax: expected `:`, got `,`')
69 return
70 }
71 assert false
72}
73
74fn test_raw_decode_array_invalid() {
75 json.decode[json.Any]('["Foo", 1,}') or {
76 assert err.msg().contains('1:11: Invalid json: Syntax: unknown value kind')
77 return
78 }
79 assert false
80}
81
82struct Foo {
83 int []int
84 str []string
85 f32 []f32
86 oint []?int
87}
88
89// fn test_decode_array_fields() {
90// input := '{"int":[0, 1], "str":["2", "3"], "f32": [4.0, 5.0], "oint": [6, null]}'
91// foo := json.decode[Foo](input)!
92// assert foo.int == [0, 1]
93// assert foo.str == ['2', '3']
94// assert foo.f32 == [f32(4.0), 5.0]
95// a, b := foo.oint[0], foo.oint[1]
96// assert a? == 6
97// assert b? == 0
98//}
99
100struct ContactItem {
101 description string
102 telnr string
103}
104
105struct User {
106 name string
107 age int
108 contact ContactItem
109}
110
111fn test_decode_missing_comma() {
112 data := '{
113 "name": "Frodo",
114 "age": 25
115 "contact": {
116 "description": "descr",
117 "telnr": "+32333"
118 }
119 }'
120 user := json.decode[User](data) or { return }
121}
122