blob: c7779b29afbb811df3d0b13c58100c1c085fd56a [file] [log] [blame]
Bram Moolenaaredf3f972016-08-29 22:49:24 +02001/* vi:set ts=8 sts=4 sw=4 noet:
Bram Moolenaar56ead342016-02-02 18:20:08 +01002 *
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
Bram Moolenaar8d8c5092016-02-02 19:15:38 +010024#if defined(FEAT_EVAL)
Bram Moolenaar56ead342016-02-02 18:20:08 +010025/*
26 * Test json_find_end() with imcomplete items.
27 */
28 static void
29test_decode_find_end(void)
30{
31 js_read_T reader;
32
33 reader.js_fill = NULL;
34 reader.js_used = 0;
35
36 /* string and incomplete string */
37 reader.js_buf = (char_u *)"\"hello\"";
Bram Moolenaar595e64e2016-02-07 19:19:53 +010038 assert(json_find_end(&reader, 0) == OK);
Bram Moolenaar56ead342016-02-02 18:20:08 +010039 reader.js_buf = (char_u *)" \"hello\" ";
Bram Moolenaar595e64e2016-02-07 19:19:53 +010040 assert(json_find_end(&reader, 0) == OK);
Bram Moolenaar56ead342016-02-02 18:20:08 +010041 reader.js_buf = (char_u *)"\"hello";
Bram Moolenaar595e64e2016-02-07 19:19:53 +010042 assert(json_find_end(&reader, 0) == MAYBE);
Bram Moolenaar56ead342016-02-02 18:20:08 +010043
44 /* number and dash (incomplete number) */
45 reader.js_buf = (char_u *)"123";
Bram Moolenaar595e64e2016-02-07 19:19:53 +010046 assert(json_find_end(&reader, 0) == OK);
Bram Moolenaar56ead342016-02-02 18:20:08 +010047 reader.js_buf = (char_u *)"-";
Bram Moolenaar595e64e2016-02-07 19:19:53 +010048 assert(json_find_end(&reader, 0) == MAYBE);
Bram Moolenaar56ead342016-02-02 18:20:08 +010049
50 /* false, true and null, also incomplete */
51 reader.js_buf = (char_u *)"false";
Bram Moolenaar595e64e2016-02-07 19:19:53 +010052 assert(json_find_end(&reader, 0) == OK);
Bram Moolenaar56ead342016-02-02 18:20:08 +010053 reader.js_buf = (char_u *)"f";
Bram Moolenaar595e64e2016-02-07 19:19:53 +010054 assert(json_find_end(&reader, 0) == MAYBE);
Bram Moolenaar56ead342016-02-02 18:20:08 +010055 reader.js_buf = (char_u *)"fa";
Bram Moolenaar595e64e2016-02-07 19:19:53 +010056 assert(json_find_end(&reader, 0) == MAYBE);
Bram Moolenaar56ead342016-02-02 18:20:08 +010057 reader.js_buf = (char_u *)"fal";
Bram Moolenaar595e64e2016-02-07 19:19:53 +010058 assert(json_find_end(&reader, 0) == MAYBE);
Bram Moolenaar56ead342016-02-02 18:20:08 +010059 reader.js_buf = (char_u *)"fals";
Bram Moolenaar595e64e2016-02-07 19:19:53 +010060 assert(json_find_end(&reader, 0) == MAYBE);
Bram Moolenaar56ead342016-02-02 18:20:08 +010061
62 reader.js_buf = (char_u *)"true";
Bram Moolenaar595e64e2016-02-07 19:19:53 +010063 assert(json_find_end(&reader, 0) == OK);
Bram Moolenaar56ead342016-02-02 18:20:08 +010064 reader.js_buf = (char_u *)"t";
Bram Moolenaar595e64e2016-02-07 19:19:53 +010065 assert(json_find_end(&reader, 0) == MAYBE);
Bram Moolenaar56ead342016-02-02 18:20:08 +010066 reader.js_buf = (char_u *)"tr";
Bram Moolenaar595e64e2016-02-07 19:19:53 +010067 assert(json_find_end(&reader, 0) == MAYBE);
Bram Moolenaar56ead342016-02-02 18:20:08 +010068 reader.js_buf = (char_u *)"tru";
Bram Moolenaar595e64e2016-02-07 19:19:53 +010069 assert(json_find_end(&reader, 0) == MAYBE);
Bram Moolenaar56ead342016-02-02 18:20:08 +010070
71 reader.js_buf = (char_u *)"null";
Bram Moolenaar595e64e2016-02-07 19:19:53 +010072 assert(json_find_end(&reader, 0) == OK);
Bram Moolenaar56ead342016-02-02 18:20:08 +010073 reader.js_buf = (char_u *)"n";
Bram Moolenaar595e64e2016-02-07 19:19:53 +010074 assert(json_find_end(&reader, 0) == MAYBE);
Bram Moolenaar56ead342016-02-02 18:20:08 +010075 reader.js_buf = (char_u *)"nu";
Bram Moolenaar595e64e2016-02-07 19:19:53 +010076 assert(json_find_end(&reader, 0) == MAYBE);
Bram Moolenaar56ead342016-02-02 18:20:08 +010077 reader.js_buf = (char_u *)"nul";
Bram Moolenaar595e64e2016-02-07 19:19:53 +010078 assert(json_find_end(&reader, 0) == MAYBE);
Bram Moolenaar56ead342016-02-02 18:20:08 +010079
80 /* object without white space */
81 reader.js_buf = (char_u *)"{\"a\":123}";
Bram Moolenaar595e64e2016-02-07 19:19:53 +010082 assert(json_find_end(&reader, 0) == OK);
Bram Moolenaar56ead342016-02-02 18:20:08 +010083 reader.js_buf = (char_u *)"{\"a\":123";
Bram Moolenaar595e64e2016-02-07 19:19:53 +010084 assert(json_find_end(&reader, 0) == MAYBE);
Bram Moolenaar56ead342016-02-02 18:20:08 +010085 reader.js_buf = (char_u *)"{\"a\":";
Bram Moolenaar595e64e2016-02-07 19:19:53 +010086 assert(json_find_end(&reader, 0) == MAYBE);
Bram Moolenaar56ead342016-02-02 18:20:08 +010087 reader.js_buf = (char_u *)"{\"a\"";
Bram Moolenaar595e64e2016-02-07 19:19:53 +010088 assert(json_find_end(&reader, 0) == MAYBE);
Bram Moolenaar56ead342016-02-02 18:20:08 +010089 reader.js_buf = (char_u *)"{\"a";
Bram Moolenaar595e64e2016-02-07 19:19:53 +010090 assert(json_find_end(&reader, 0) == MAYBE);
Bram Moolenaar56ead342016-02-02 18:20:08 +010091 reader.js_buf = (char_u *)"{\"";
Bram Moolenaar595e64e2016-02-07 19:19:53 +010092 assert(json_find_end(&reader, 0) == MAYBE);
Bram Moolenaar56ead342016-02-02 18:20:08 +010093 reader.js_buf = (char_u *)"{";
Bram Moolenaar595e64e2016-02-07 19:19:53 +010094 assert(json_find_end(&reader, 0) == MAYBE);
Bram Moolenaar56ead342016-02-02 18:20:08 +010095
96 /* object with white space */
97 reader.js_buf = (char_u *)" { \"a\" : 123 } ";
Bram Moolenaar595e64e2016-02-07 19:19:53 +010098 assert(json_find_end(&reader, 0) == OK);
Bram Moolenaar56ead342016-02-02 18:20:08 +010099 reader.js_buf = (char_u *)" { \"a\" : 123 ";
Bram Moolenaar595e64e2016-02-07 19:19:53 +0100100 assert(json_find_end(&reader, 0) == MAYBE);
Bram Moolenaar56ead342016-02-02 18:20:08 +0100101 reader.js_buf = (char_u *)" { \"a\" : ";
Bram Moolenaar595e64e2016-02-07 19:19:53 +0100102 assert(json_find_end(&reader, 0) == MAYBE);
Bram Moolenaar56ead342016-02-02 18:20:08 +0100103 reader.js_buf = (char_u *)" { \"a\" ";
Bram Moolenaar595e64e2016-02-07 19:19:53 +0100104 assert(json_find_end(&reader, 0) == MAYBE);
Bram Moolenaar56ead342016-02-02 18:20:08 +0100105 reader.js_buf = (char_u *)" { \"a ";
Bram Moolenaar595e64e2016-02-07 19:19:53 +0100106 assert(json_find_end(&reader, 0) == MAYBE);
Bram Moolenaar56ead342016-02-02 18:20:08 +0100107 reader.js_buf = (char_u *)" { ";
Bram Moolenaar595e64e2016-02-07 19:19:53 +0100108 assert(json_find_end(&reader, 0) == MAYBE);
Bram Moolenaar56ead342016-02-02 18:20:08 +0100109
Bram Moolenaare2c60372017-01-22 15:56:26 +0100110 /* JS object with white space */
111 reader.js_buf = (char_u *)" { a : 123 } ";
112 assert(json_find_end(&reader, JSON_JS) == OK);
113 reader.js_buf = (char_u *)" { a : ";
114 assert(json_find_end(&reader, JSON_JS) == MAYBE);
115
Bram Moolenaar56ead342016-02-02 18:20:08 +0100116 /* array without white space */
117 reader.js_buf = (char_u *)"[\"a\",123]";
Bram Moolenaar595e64e2016-02-07 19:19:53 +0100118 assert(json_find_end(&reader, 0) == OK);
Bram Moolenaar56ead342016-02-02 18:20:08 +0100119 reader.js_buf = (char_u *)"[\"a\",123";
Bram Moolenaar595e64e2016-02-07 19:19:53 +0100120 assert(json_find_end(&reader, 0) == MAYBE);
Bram Moolenaar56ead342016-02-02 18:20:08 +0100121 reader.js_buf = (char_u *)"[\"a\",";
Bram Moolenaar595e64e2016-02-07 19:19:53 +0100122 assert(json_find_end(&reader, 0) == MAYBE);
Bram Moolenaar56ead342016-02-02 18:20:08 +0100123 reader.js_buf = (char_u *)"[\"a\"";
Bram Moolenaar595e64e2016-02-07 19:19:53 +0100124 assert(json_find_end(&reader, 0) == MAYBE);
Bram Moolenaar56ead342016-02-02 18:20:08 +0100125 reader.js_buf = (char_u *)"[\"a";
Bram Moolenaar595e64e2016-02-07 19:19:53 +0100126 assert(json_find_end(&reader, 0) == MAYBE);
Bram Moolenaar56ead342016-02-02 18:20:08 +0100127 reader.js_buf = (char_u *)"[\"";
Bram Moolenaar595e64e2016-02-07 19:19:53 +0100128 assert(json_find_end(&reader, 0) == MAYBE);
Bram Moolenaar56ead342016-02-02 18:20:08 +0100129 reader.js_buf = (char_u *)"[";
Bram Moolenaar595e64e2016-02-07 19:19:53 +0100130 assert(json_find_end(&reader, 0) == MAYBE);
Bram Moolenaar56ead342016-02-02 18:20:08 +0100131
132 /* array with white space */
133 reader.js_buf = (char_u *)" [ \"a\" , 123 ] ";
Bram Moolenaar595e64e2016-02-07 19:19:53 +0100134 assert(json_find_end(&reader, 0) == OK);
Bram Moolenaar56ead342016-02-02 18:20:08 +0100135 reader.js_buf = (char_u *)" [ \"a\" , 123 ";
Bram Moolenaar595e64e2016-02-07 19:19:53 +0100136 assert(json_find_end(&reader, 0) == MAYBE);
Bram Moolenaar56ead342016-02-02 18:20:08 +0100137 reader.js_buf = (char_u *)" [ \"a\" , ";
Bram Moolenaar595e64e2016-02-07 19:19:53 +0100138 assert(json_find_end(&reader, 0) == MAYBE);
Bram Moolenaar56ead342016-02-02 18:20:08 +0100139 reader.js_buf = (char_u *)" [ \"a\" ";
Bram Moolenaar595e64e2016-02-07 19:19:53 +0100140 assert(json_find_end(&reader, 0) == MAYBE);
Bram Moolenaar56ead342016-02-02 18:20:08 +0100141 reader.js_buf = (char_u *)" [ \"a ";
Bram Moolenaar595e64e2016-02-07 19:19:53 +0100142 assert(json_find_end(&reader, 0) == MAYBE);
Bram Moolenaar56ead342016-02-02 18:20:08 +0100143 reader.js_buf = (char_u *)" [ ";
Bram Moolenaar595e64e2016-02-07 19:19:53 +0100144 assert(json_find_end(&reader, 0) == MAYBE);
Bram Moolenaar56ead342016-02-02 18:20:08 +0100145}
146
147 static int
148fill_from_cookie(js_read_T *reader)
149{
150 reader->js_buf = reader->js_cookie;
151 return TRUE;
152}
153
154/*
155 * Test json_find_end with an incomplete array, calling the fill function.
156 */
157 static void
158test_fill_called_on_find_end(void)
159{
160 js_read_T reader;
161
162 reader.js_fill = fill_from_cookie;
163 reader.js_used = 0;
164 reader.js_buf = (char_u *)" [ \"a\" , 123 ";
165 reader.js_cookie = " [ \"a\" , 123 ] ";
Bram Moolenaar595e64e2016-02-07 19:19:53 +0100166 assert(json_find_end(&reader, 0) == OK);
Bram Moolenaar56ead342016-02-02 18:20:08 +0100167 reader.js_buf = (char_u *)" [ \"a\" , ";
Bram Moolenaar595e64e2016-02-07 19:19:53 +0100168 assert(json_find_end(&reader, 0) == OK);
Bram Moolenaar56ead342016-02-02 18:20:08 +0100169 reader.js_buf = (char_u *)" [ \"a\" ";
Bram Moolenaar595e64e2016-02-07 19:19:53 +0100170 assert(json_find_end(&reader, 0) == OK);
Bram Moolenaar56ead342016-02-02 18:20:08 +0100171 reader.js_buf = (char_u *)" [ \"a";
Bram Moolenaar595e64e2016-02-07 19:19:53 +0100172 assert(json_find_end(&reader, 0) == OK);
Bram Moolenaar56ead342016-02-02 18:20:08 +0100173 reader.js_buf = (char_u *)" [ ";
Bram Moolenaar595e64e2016-02-07 19:19:53 +0100174 assert(json_find_end(&reader, 0) == OK);
Bram Moolenaar56ead342016-02-02 18:20:08 +0100175}
176
177/*
178 * Test json_find_end with an incomplete string, calling the fill function.
179 */
180 static void
181test_fill_called_on_string(void)
182{
183 js_read_T reader;
184
185 reader.js_fill = fill_from_cookie;
186 reader.js_used = 0;
187 reader.js_buf = (char_u *)" \"foo";
188 reader.js_end = reader.js_buf + STRLEN(reader.js_buf);
189 reader.js_cookie = " \"foobar\" ";
Bram Moolenaaree142ad2017-01-11 21:50:08 +0100190 assert(json_decode_string(&reader, NULL, '"') == OK);
Bram Moolenaar56ead342016-02-02 18:20:08 +0100191}
Bram Moolenaar8d8c5092016-02-02 19:15:38 +0100192#endif
Bram Moolenaar56ead342016-02-02 18:20:08 +0100193
194 int
195main(void)
196{
Bram Moolenaar8d8c5092016-02-02 19:15:38 +0100197#if defined(FEAT_EVAL)
Bram Moolenaar56ead342016-02-02 18:20:08 +0100198 test_decode_find_end();
199 test_fill_called_on_find_end();
200 test_fill_called_on_string();
Bram Moolenaar8d8c5092016-02-02 19:15:38 +0100201#endif
Bram Moolenaar56ead342016-02-02 18:20:08 +0100202 return 0;
203}