comparison src/json_test.c @ 7883:98a96e0ca73b v7.4.1238

commit https://github.com/vim/vim/commit/56ead341a75e1a0395eee94a3280c67e2278a57e Author: Bram Moolenaar <Bram@vim.org> Date: Tue Feb 2 18:20:08 2016 +0100 patch 7.4.1238 Problem: Can't handle two messages right after each other. Solution: Find the end of the JSON. Read more when incomplete. Add a C test for the JSON decoding.
author Christian Brabandt <cb@256bit.org>
date Tue, 02 Feb 2016 18:30:04 +0100
parents
children d14cf20b44dc
comparison
equal deleted inserted replaced
7882:a3d3ab0f7b27 7883:98a96e0ca73b
1 /* vi:set ts=8 sts=4 sw=4:
2 *
3 * VIM - Vi IMproved by Bram Moolenaar
4 *
5 * Do ":help uganda" in Vim to read copying and usage conditions.
6 * Do ":help credits" in Vim to see a list of people who contributed.
7 * See README.txt for an overview of the Vim source code.
8 */
9
10 /*
11 * json_test.c: Unittests for json.c
12 */
13
14 #undef NDEBUG
15 #include <assert.h>
16
17 /* Must include main.c because it contains much more than just main() */
18 #define NO_VIM_MAIN
19 #include "main.c"
20
21 /* This file has to be included because the tested functions are static */
22 #include "json.c"
23
24 /*
25 * Test json_find_end() with imcomplete items.
26 */
27 static void
28 test_decode_find_end(void)
29 {
30 js_read_T reader;
31
32 reader.js_fill = NULL;
33 reader.js_used = 0;
34
35 /* string and incomplete string */
36 reader.js_buf = (char_u *)"\"hello\"";
37 assert(json_find_end(&reader) == OK);
38 reader.js_buf = (char_u *)" \"hello\" ";
39 assert(json_find_end(&reader) == OK);
40 reader.js_buf = (char_u *)"\"hello";
41 assert(json_find_end(&reader) == MAYBE);
42
43 /* number and dash (incomplete number) */
44 reader.js_buf = (char_u *)"123";
45 assert(json_find_end(&reader) == OK);
46 reader.js_buf = (char_u *)"-";
47 assert(json_find_end(&reader) == MAYBE);
48
49 /* false, true and null, also incomplete */
50 reader.js_buf = (char_u *)"false";
51 assert(json_find_end(&reader) == OK);
52 reader.js_buf = (char_u *)"f";
53 assert(json_find_end(&reader) == MAYBE);
54 reader.js_buf = (char_u *)"fa";
55 assert(json_find_end(&reader) == MAYBE);
56 reader.js_buf = (char_u *)"fal";
57 assert(json_find_end(&reader) == MAYBE);
58 reader.js_buf = (char_u *)"fals";
59 assert(json_find_end(&reader) == MAYBE);
60
61 reader.js_buf = (char_u *)"true";
62 assert(json_find_end(&reader) == OK);
63 reader.js_buf = (char_u *)"t";
64 assert(json_find_end(&reader) == MAYBE);
65 reader.js_buf = (char_u *)"tr";
66 assert(json_find_end(&reader) == MAYBE);
67 reader.js_buf = (char_u *)"tru";
68 assert(json_find_end(&reader) == MAYBE);
69
70 reader.js_buf = (char_u *)"null";
71 assert(json_find_end(&reader) == OK);
72 reader.js_buf = (char_u *)"n";
73 assert(json_find_end(&reader) == MAYBE);
74 reader.js_buf = (char_u *)"nu";
75 assert(json_find_end(&reader) == MAYBE);
76 reader.js_buf = (char_u *)"nul";
77 assert(json_find_end(&reader) == MAYBE);
78
79 /* object without white space */
80 reader.js_buf = (char_u *)"{\"a\":123}";
81 assert(json_find_end(&reader) == OK);
82 reader.js_buf = (char_u *)"{\"a\":123";
83 assert(json_find_end(&reader) == MAYBE);
84 reader.js_buf = (char_u *)"{\"a\":";
85 assert(json_find_end(&reader) == MAYBE);
86 reader.js_buf = (char_u *)"{\"a\"";
87 assert(json_find_end(&reader) == MAYBE);
88 reader.js_buf = (char_u *)"{\"a";
89 assert(json_find_end(&reader) == MAYBE);
90 reader.js_buf = (char_u *)"{\"";
91 assert(json_find_end(&reader) == MAYBE);
92 reader.js_buf = (char_u *)"{";
93 assert(json_find_end(&reader) == MAYBE);
94
95 /* object with white space */
96 reader.js_buf = (char_u *)" { \"a\" : 123 } ";
97 assert(json_find_end(&reader) == OK);
98 reader.js_buf = (char_u *)" { \"a\" : 123 ";
99 assert(json_find_end(&reader) == MAYBE);
100 reader.js_buf = (char_u *)" { \"a\" : ";
101 assert(json_find_end(&reader) == MAYBE);
102 reader.js_buf = (char_u *)" { \"a\" ";
103 assert(json_find_end(&reader) == MAYBE);
104 reader.js_buf = (char_u *)" { \"a ";
105 assert(json_find_end(&reader) == MAYBE);
106 reader.js_buf = (char_u *)" { ";
107 assert(json_find_end(&reader) == MAYBE);
108
109 /* array without white space */
110 reader.js_buf = (char_u *)"[\"a\",123]";
111 assert(json_find_end(&reader) == OK);
112 reader.js_buf = (char_u *)"[\"a\",123";
113 assert(json_find_end(&reader) == MAYBE);
114 reader.js_buf = (char_u *)"[\"a\",";
115 assert(json_find_end(&reader) == MAYBE);
116 reader.js_buf = (char_u *)"[\"a\"";
117 assert(json_find_end(&reader) == MAYBE);
118 reader.js_buf = (char_u *)"[\"a";
119 assert(json_find_end(&reader) == MAYBE);
120 reader.js_buf = (char_u *)"[\"";
121 assert(json_find_end(&reader) == MAYBE);
122 reader.js_buf = (char_u *)"[";
123 assert(json_find_end(&reader) == MAYBE);
124
125 /* array with white space */
126 reader.js_buf = (char_u *)" [ \"a\" , 123 ] ";
127 assert(json_find_end(&reader) == OK);
128 reader.js_buf = (char_u *)" [ \"a\" , 123 ";
129 assert(json_find_end(&reader) == MAYBE);
130 reader.js_buf = (char_u *)" [ \"a\" , ";
131 assert(json_find_end(&reader) == MAYBE);
132 reader.js_buf = (char_u *)" [ \"a\" ";
133 assert(json_find_end(&reader) == MAYBE);
134 reader.js_buf = (char_u *)" [ \"a ";
135 assert(json_find_end(&reader) == MAYBE);
136 reader.js_buf = (char_u *)" [ ";
137 assert(json_find_end(&reader) == MAYBE);
138 }
139
140 static int
141 fill_from_cookie(js_read_T *reader)
142 {
143 reader->js_buf = reader->js_cookie;
144 return TRUE;
145 }
146
147 /*
148 * Test json_find_end with an incomplete array, calling the fill function.
149 */
150 static void
151 test_fill_called_on_find_end(void)
152 {
153 js_read_T reader;
154
155 reader.js_fill = fill_from_cookie;
156 reader.js_used = 0;
157 reader.js_buf = (char_u *)" [ \"a\" , 123 ";
158 reader.js_cookie = " [ \"a\" , 123 ] ";
159 assert(json_find_end(&reader) == OK);
160 reader.js_buf = (char_u *)" [ \"a\" , ";
161 assert(json_find_end(&reader) == OK);
162 reader.js_buf = (char_u *)" [ \"a\" ";
163 assert(json_find_end(&reader) == OK);
164 reader.js_buf = (char_u *)" [ \"a";
165 assert(json_find_end(&reader) == OK);
166 reader.js_buf = (char_u *)" [ ";
167 assert(json_find_end(&reader) == OK);
168 }
169
170 /*
171 * Test json_find_end with an incomplete string, calling the fill function.
172 */
173 static void
174 test_fill_called_on_string(void)
175 {
176 js_read_T reader;
177
178 reader.js_fill = fill_from_cookie;
179 reader.js_used = 0;
180 reader.js_buf = (char_u *)" \"foo";
181 reader.js_end = reader.js_buf + STRLEN(reader.js_buf);
182 reader.js_cookie = " \"foobar\" ";
183 assert(json_decode_string(&reader, NULL) == OK);
184 }
185
186 int
187 main(void)
188 {
189 test_decode_find_end();
190 test_fill_called_on_find_end();
191 test_fill_called_on_string();
192 return 0;
193 }