blob: 74463f3d2bbaae8ec9e243429b5896c2e29e09e4 [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
110 /* array without white space */
111 reader.js_buf = (char_u *)"[\"a\",123]";
Bram Moolenaar595e64e2016-02-07 19:19:53 +0100112 assert(json_find_end(&reader, 0) == OK);
Bram Moolenaar56ead342016-02-02 18:20:08 +0100113 reader.js_buf = (char_u *)"[\"a\",123";
Bram Moolenaar595e64e2016-02-07 19:19:53 +0100114 assert(json_find_end(&reader, 0) == MAYBE);
Bram Moolenaar56ead342016-02-02 18:20:08 +0100115 reader.js_buf = (char_u *)"[\"a\",";
Bram Moolenaar595e64e2016-02-07 19:19:53 +0100116 assert(json_find_end(&reader, 0) == MAYBE);
Bram Moolenaar56ead342016-02-02 18:20:08 +0100117 reader.js_buf = (char_u *)"[\"a\"";
Bram Moolenaar595e64e2016-02-07 19:19:53 +0100118 assert(json_find_end(&reader, 0) == MAYBE);
Bram Moolenaar56ead342016-02-02 18:20:08 +0100119 reader.js_buf = (char_u *)"[\"a";
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 *)"[\"";
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 *)"[";
Bram Moolenaar595e64e2016-02-07 19:19:53 +0100124 assert(json_find_end(&reader, 0) == MAYBE);
Bram Moolenaar56ead342016-02-02 18:20:08 +0100125
126 /* array with white space */
127 reader.js_buf = (char_u *)" [ \"a\" , 123 ] ";
Bram Moolenaar595e64e2016-02-07 19:19:53 +0100128 assert(json_find_end(&reader, 0) == OK);
Bram Moolenaar56ead342016-02-02 18:20:08 +0100129 reader.js_buf = (char_u *)" [ \"a\" , 123 ";
Bram Moolenaar595e64e2016-02-07 19:19:53 +0100130 assert(json_find_end(&reader, 0) == MAYBE);
Bram Moolenaar56ead342016-02-02 18:20:08 +0100131 reader.js_buf = (char_u *)" [ \"a\" , ";
Bram Moolenaar595e64e2016-02-07 19:19:53 +0100132 assert(json_find_end(&reader, 0) == MAYBE);
Bram Moolenaar56ead342016-02-02 18:20:08 +0100133 reader.js_buf = (char_u *)" [ \"a\" ";
Bram Moolenaar595e64e2016-02-07 19:19:53 +0100134 assert(json_find_end(&reader, 0) == MAYBE);
Bram Moolenaar56ead342016-02-02 18:20:08 +0100135 reader.js_buf = (char_u *)" [ \"a ";
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 *)" [ ";
Bram Moolenaar595e64e2016-02-07 19:19:53 +0100138 assert(json_find_end(&reader, 0) == MAYBE);
Bram Moolenaar56ead342016-02-02 18:20:08 +0100139}
140
141 static int
142fill_from_cookie(js_read_T *reader)
143{
144 reader->js_buf = reader->js_cookie;
145 return TRUE;
146}
147
148/*
149 * Test json_find_end with an incomplete array, calling the fill function.
150 */
151 static void
152test_fill_called_on_find_end(void)
153{
154 js_read_T reader;
155
156 reader.js_fill = fill_from_cookie;
157 reader.js_used = 0;
158 reader.js_buf = (char_u *)" [ \"a\" , 123 ";
159 reader.js_cookie = " [ \"a\" , 123 ] ";
Bram Moolenaar595e64e2016-02-07 19:19:53 +0100160 assert(json_find_end(&reader, 0) == OK);
Bram Moolenaar56ead342016-02-02 18:20:08 +0100161 reader.js_buf = (char_u *)" [ \"a\" , ";
Bram Moolenaar595e64e2016-02-07 19:19:53 +0100162 assert(json_find_end(&reader, 0) == OK);
Bram Moolenaar56ead342016-02-02 18:20:08 +0100163 reader.js_buf = (char_u *)" [ \"a\" ";
Bram Moolenaar595e64e2016-02-07 19:19:53 +0100164 assert(json_find_end(&reader, 0) == OK);
Bram Moolenaar56ead342016-02-02 18:20:08 +0100165 reader.js_buf = (char_u *)" [ \"a";
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 *)" [ ";
Bram Moolenaar595e64e2016-02-07 19:19:53 +0100168 assert(json_find_end(&reader, 0) == OK);
Bram Moolenaar56ead342016-02-02 18:20:08 +0100169}
170
171/*
172 * Test json_find_end with an incomplete string, calling the fill function.
173 */
174 static void
175test_fill_called_on_string(void)
176{
177 js_read_T reader;
178
179 reader.js_fill = fill_from_cookie;
180 reader.js_used = 0;
181 reader.js_buf = (char_u *)" \"foo";
182 reader.js_end = reader.js_buf + STRLEN(reader.js_buf);
183 reader.js_cookie = " \"foobar\" ";
Bram Moolenaaree142ad2017-01-11 21:50:08 +0100184 assert(json_decode_string(&reader, NULL, '"') == OK);
Bram Moolenaar56ead342016-02-02 18:20:08 +0100185}
Bram Moolenaar8d8c5092016-02-02 19:15:38 +0100186#endif
Bram Moolenaar56ead342016-02-02 18:20:08 +0100187
188 int
189main(void)
190{
Bram Moolenaar8d8c5092016-02-02 19:15:38 +0100191#if defined(FEAT_EVAL)
Bram Moolenaar56ead342016-02-02 18:20:08 +0100192 test_decode_find_end();
193 test_fill_called_on_find_end();
194 test_fill_called_on_string();
Bram Moolenaar8d8c5092016-02-02 19:15:38 +0100195#endif
Bram Moolenaar56ead342016-02-02 18:20:08 +0100196 return 0;
197}