v
Зеркало из https://github.com/vlang/v
1import x.json2 as json
2
3fn test_raw_decode_string() {
4str := json.raw_decode('"Hello!"')!
5assert str.str() == 'Hello!'
6}
7
8fn test_raw_decode_string_escape() {
9jstr := json.raw_decode('"\u001b"')!
10str := jstr.str()
11assert str.len == 1
12assert str[0] == 27
13}
14
15fn test_raw_decode_number() {
16num := json.raw_decode('123')!
17assert num.int() == 123
18}
19
20fn test_raw_decode_array() {
21raw_arr := json.raw_decode('["Foo", 1]')!
22arr := raw_arr.arr()
23assert arr[0] or { 0 }.str() == 'Foo'
24assert arr[1] or { 0 }.int() == 1
25}
26
27fn test_raw_decode_bool() {
28bol := json.raw_decode('false')!
29assert bol.bool() == false
30}
31
32fn test_raw_decode_map() {
33raw_mp := json.raw_decode('{"name":"Bob","age":20}')!
34mp := raw_mp.as_map()
35assert mp['name'] or { 0 }.str() == 'Bob'
36assert mp['age'] or { 0 }.int() == 20
37}
38
39fn test_raw_decode_null() {
40nul := json.raw_decode('null')!
41assert nul is json.Null
42}
43
44fn test_raw_decode_invalid() {
45json.raw_decode('1z') or {
46assert err.msg() == '[x.json2] invalid token `z` (0:17)'
47return
48}
49assert false
50}
51
52fn test_raw_decode_string_with_dollarsign() {
53str := json.raw_decode(r'"Hello $world"')!
54assert str.str() == r'Hello $world'
55}
56
57fn test_raw_decode_map_with_whitespaces() {
58raw_mp := json.raw_decode(' \n\t{"name":"Bob","age":20}\n\t')!
59mp := raw_mp.as_map()
60assert mp['name'] or { 0 }.str() == 'Bob'
61assert mp['age'] or { 0 }.int() == 20
62}
63
64fn test_nested_array_object() {
65mut parser := json.new_parser(r'[[[[[],[],[]]]],{"Test":{}},[[]]]', false)
66decoded := parser.decode()!
67assert parser.n_level == 0
68}
69
70fn test_raw_decode_map_invalid() {
71json.raw_decode('{"name","Bob","age":20}') or {
72assert err.msg() == '[x.json2] invalid token `comma`, expecting `colon` (0:5)'
73return
74}
75assert false
76}
77
78fn test_raw_decode_array_invalid() {
79json.raw_decode('["Foo", 1,}') or {
80assert err.msg() == '[x.json2] invalid token `rcbr` (0:5)'
81return
82}
83assert false
84}
85
86struct Foo {
87int []int
88str []string
89f32 []f32
90oint []?int
91}
92
93fn test_decode_array_fields() {
94input := '{"int":[0, 1], "str":["2", "3"], "f32": [4.0, 5.0], "oint": [6, null]}'
95foo := json.decode[Foo](input)!
96assert foo.int == [0, 1]
97assert foo.str == ['2', '3']
98assert foo.f32 == [f32(4.0), 5.0]
99a, b := foo.oint[0], foo.oint[1]
100assert a? == 6
101assert b? == 0
102}
103
104struct ContactItem {
105description string
106telnr string
107}
108
109struct User {
110name string
111age int
112contact ContactItem
113}
114
115fn test_decode_missing_comma() {
116data := '{
117"name": "Frodo",
118"age": 25
119"contact": {
120"description": "descr",
121"telnr": "+32333"
122}
123}'
124user := json.decode[User](data) or {
125assert err.msg().contains('invalid token')
126return
127}
128}
129