v
Зеркало из https://github.com/vlang/v
1import x.json2 as json
2import strings
3import time
4
5struct StructType[T] {
6mut:
7val T
8}
9
10fn test_json_string_characters() {
11assert json.encode([u8(`/`)].bytestr()).bytes() == r'"\/"'.bytes()
12assert json.encode([u8(`\\`)].bytestr()).bytes() == r'"\\"'.bytes()
13assert json.encode([u8(`"`)].bytestr()).bytes() == r'"\""'.bytes()
14assert json.encode([u8(`\n`)].bytestr()).bytes() == r'"\n"'.bytes()
15assert json.encode(r'\n\r') == r'"\\n\\r"'
16assert json.encode('\\n') == r'"\\n"'
17assert json.encode(r'\n\r\b') == r'"\\n\\r\\b"'
18assert json.encode(r'\"/').bytes() == r'"\\\"\/"'.bytes()
19
20assert json.encode(r'\n\r\b\f\t\\\"\/') == r'"\\n\\r\\b\\f\\t\\\\\\\"\\\/"'
21
22text := json.raw_decode(r'"\n\r\b\f\t\\\"\/"') or { '' }
23assert text.json_str() == '"\\n\\r\\b\\f\\t\\\\\\"\\/"'
24
25assert json.encode("fn main(){nprintln('Hello World! Helo \$a')\n}") == '"fn main(){nprintln(\'Hello World! Helo \$a\')\\n}"'
26assert json.encode(' And when "\'s are in the string, along with # "') == '" And when \\"\'s are in the string, along with # \\""'
27assert json.encode('a \\\nb') == r'"a \\\nb"'
28assert json.encode('Name\tJosé\nLocation\tSF.') == '"Name\\tJosé\\nLocation\\tSF."'
29}
30
31fn test_json_escape_low_chars() {
32esc := '\u001b'
33assert esc.len == 1
34text := json.Any(esc)
35assert text.json_str() == r'"\u001b"'
36
37assert json.encode('\u000f') == r'"\u000f"'
38assert json.encode('\u0020') == r'" "'
39assert json.encode('\u0000') == r'"\u0000"'
40}
41
42fn test_json_string() {
43text := json.Any('te✔st')
44
45assert text.json_str() == r'"te\u2714st"'
46assert json.encode('te✔st') == r'"te\u2714st"'
47
48boolean := json.Any(true)
49assert boolean.json_str() == 'true'
50integer := json.Any(int(-5))
51assert integer.json_str() == '-5'
52u64integer := json.Any(u64(5000))
53assert u64integer.json_str() == '5000'
54i64integer := json.Any(i64(-17))
55assert i64integer.json_str() == '-17'
56}
57
58fn test_json_string_emoji() {
59text := json.Any('🐈')
60assert text.json_str() == r'"🐈"'
61assert json.Any('💀').json_str() == r'"💀"'
62
63assert json.encode('🐈') == r'"🐈"'
64assert json.encode('💀') == r'"💀"'
65// assert json.encode('🐈💀') == r'"🐈💀"'
66}
67
68fn test_json_string_non_ascii() {
69text := json.Any('ひらがな')
70assert text.json_str() == r'"\u3072\u3089\u304c\u306a"'
71
72assert json.encode('ひらがな') == r'"\u3072\u3089\u304c\u306a"'
73}
74
75fn test_utf8_strings_are_not_modified() {
76original := '{"s":"Schilddrüsenerkrankungen"}'
77deresult := json.raw_decode(original)!
78assert deresult.str() == original
79
80assert json.encode('ü') == '"ü"'
81assert json.encode('Schilddrüsenerkrankungen') == '"Schilddrüsenerkrankungen"'
82}
83
84fn test_encoder_unescaped_utf32() ! {
85jap_text := json.Any('ひらがな')
86enc := json.Encoder{
87escape_unicode: false
88}
89
90mut sb := strings.new_builder(20)
91defer {
92unsafe { sb.free() }
93}
94
95enc.encode_value(jap_text, mut sb)!
96
97assert sb.str() == '"${jap_text}"'
98sb.go_back_to(0)
99
100emoji_text := json.Any('🐈')
101enc.encode_value(emoji_text, mut sb)!
102assert sb.str() == '"${emoji_text}"'
103
104mut buf := []u8{cap: 14}
105
106enc.encode_value('ひらがな', mut buf)!
107
108assert buf.len == 14
109assert buf.bytestr() == '"ひらがな"'
110}
111
112fn test_encoder_prettify() {
113obj := {
114'hello': json.Any('world')
115'arr': [json.Any('im a string'), [json.Any('3rd level')]]
116'obj': {
117'map': json.Any('map inside a map')
118}
119}
120enc := json.Encoder{
121newline: `\n`
122newline_spaces_count: 2
123}
124mut sb := strings.new_builder(20)
125defer {
126unsafe { sb.free() }
127}
128enc.encode_value(obj, mut sb)!
129assert sb.str() == '{
130"hello": "world",
131"arr": [
132"im a string",
133[
134"3rd level"
135]
136],
137"obj": {
138"map": "map inside a map"
139}
140}'
141}
142
143pub struct Test {
144val string
145}
146
147fn test_encode_struct() {
148enc := json.encode(Test{'hello!'})
149assert enc == '{"val":"hello!"}'
150}
151
152pub struct Uri {
153protocol string
154path string
155}
156
157pub fn (u Uri) json_str() string {
158return '"${u.protocol}://${u.path}"'
159}
160
161fn test_encode_encodable() {
162assert json.encode(Uri{'file', 'path/to/file'}) == '"file://path/to/file"'
163}
164
165fn test_encode_array() {
166array_of_struct := [StructType[[]bool]{
167val: [false, true]
168}, StructType[[]bool]{
169val: [true, false]
170}]
171
172assert json.encode([1, 2, 3]) == '[1,2,3]'
173
174assert json.encode(array_of_struct) == '[{"val":[false,true]},{"val":[true,false]}]'
175}
176
177fn test_encode_simple() {
178assert json.encode('hello!') == '"hello!"'
179assert json.encode(1) == '1'
180}
181
182fn test_encode_value() {
183json_enc := json.Encoder{
184newline: `\n`
185newline_spaces_count: 2
186escape_unicode: false
187}
188
189mut manifest := map[string]json.Any{}
190
191manifest['server_path'] = json.Any('new_path')
192manifest['last_updated'] = json.Any('timestamp.format_ss()')
193manifest['from_source'] = json.Any('from_source')
194
195mut sb := strings.new_builder(64)
196mut buffer := []u8{}
197json_enc.encode_value(manifest, mut buffer)!
198
199assert buffer.len > 0
200assert buffer == [u8(123), 10, 32, 32, 34, 115, 101, 114, 118, 101, 114, 95, 112, 97, 116,
201104, 34, 58, 32, 34, 110, 101, 119, 95, 112, 97, 116, 104, 34, 44, 10, 32, 32, 34, 108,
20297, 115, 116, 95, 117, 112, 100, 97, 116, 101, 100, 34, 58, 32, 34, 116, 105, 109, 101,
203115, 116, 97, 109, 112, 46, 102, 111, 114, 109, 97, 116, 95, 115, 115, 40, 41, 34, 44,
20410, 32, 32, 34, 102, 114, 111, 109, 95, 115, 111, 117, 114, 99, 101, 34, 58, 32, 34, 102,
205114, 111, 109, 95, 115, 111, 117, 114, 99, 101, 34, 10, 125]
206
207sb.write(buffer)!
208
209unsafe { buffer.free() }
210
211assert sb.str() == r'{
212"server_path": "new_path",
213"last_updated": "timestamp.format_ss()",
214"from_source": "from_source"
215}'
216}
217
218fn test_encode_time() {
219assert json.encode({
220'bro': json.Any(time.Time{})
221}) == '{"bro":"0000-00-00T00:00:00.000Z"}'
222
223assert json.encode({
224'bro': time.Time{}
225}) == '{"bro":"0000-00-00T00:00:00.000Z"}'
226
227assert json.encode(time.Time{}) == '"0000-00-00T00:00:00.000Z"'
228}
229