xref: /vim-8.2.3635/src/json_test.c (revision 4ba37b58)
1edf3f97aSBram Moolenaar /* vi:set ts=8 sts=4 sw=4 noet:
256ead341SBram Moolenaar  *
356ead341SBram Moolenaar  * VIM - Vi IMproved	by Bram Moolenaar
456ead341SBram Moolenaar  *
556ead341SBram Moolenaar  * Do ":help uganda"  in Vim to read copying and usage conditions.
656ead341SBram Moolenaar  * Do ":help credits" in Vim to see a list of people who contributed.
756ead341SBram Moolenaar  * See README.txt for an overview of the Vim source code.
856ead341SBram Moolenaar  */
956ead341SBram Moolenaar 
1056ead341SBram Moolenaar /*
1156ead341SBram Moolenaar  * json_test.c: Unittests for json.c
1256ead341SBram Moolenaar  */
1356ead341SBram Moolenaar 
1456ead341SBram Moolenaar #undef NDEBUG
1556ead341SBram Moolenaar #include <assert.h>
1656ead341SBram Moolenaar 
17*4ba37b58SBram Moolenaar // Must include main.c because it contains much more than just main()
1856ead341SBram Moolenaar #define NO_VIM_MAIN
1956ead341SBram Moolenaar #include "main.c"
2056ead341SBram Moolenaar 
21*4ba37b58SBram Moolenaar // This file has to be included because the tested functions are static
2256ead341SBram Moolenaar #include "json.c"
2356ead341SBram Moolenaar 
248d8c509aSBram Moolenaar #if defined(FEAT_EVAL)
2556ead341SBram Moolenaar /*
26*4ba37b58SBram Moolenaar  * Test json_find_end() with incomplete items.
2756ead341SBram Moolenaar  */
2856ead341SBram Moolenaar     static void
test_decode_find_end(void)2956ead341SBram Moolenaar test_decode_find_end(void)
3056ead341SBram Moolenaar {
3156ead341SBram Moolenaar     js_read_T reader;
3256ead341SBram Moolenaar 
3356ead341SBram Moolenaar     reader.js_fill = NULL;
3456ead341SBram Moolenaar     reader.js_used = 0;
3556ead341SBram Moolenaar 
36*4ba37b58SBram Moolenaar     // string and incomplete string
3756ead341SBram Moolenaar     reader.js_buf = (char_u *)"\"hello\"";
38595e64e2SBram Moolenaar     assert(json_find_end(&reader, 0) == OK);
3956ead341SBram Moolenaar     reader.js_buf = (char_u *)"  \"hello\" ";
40595e64e2SBram Moolenaar     assert(json_find_end(&reader, 0) == OK);
4156ead341SBram Moolenaar     reader.js_buf = (char_u *)"\"hello";
42595e64e2SBram Moolenaar     assert(json_find_end(&reader, 0) == MAYBE);
4356ead341SBram Moolenaar 
44*4ba37b58SBram Moolenaar     // number and dash (incomplete number)
4556ead341SBram Moolenaar     reader.js_buf = (char_u *)"123";
46595e64e2SBram Moolenaar     assert(json_find_end(&reader, 0) == OK);
4756ead341SBram Moolenaar     reader.js_buf = (char_u *)"-";
48595e64e2SBram Moolenaar     assert(json_find_end(&reader, 0) == MAYBE);
4956ead341SBram Moolenaar 
50*4ba37b58SBram Moolenaar     // false, true and null, also incomplete
5156ead341SBram Moolenaar     reader.js_buf = (char_u *)"false";
52595e64e2SBram Moolenaar     assert(json_find_end(&reader, 0) == OK);
5356ead341SBram Moolenaar     reader.js_buf = (char_u *)"f";
54595e64e2SBram Moolenaar     assert(json_find_end(&reader, 0) == MAYBE);
5556ead341SBram Moolenaar     reader.js_buf = (char_u *)"fa";
56595e64e2SBram Moolenaar     assert(json_find_end(&reader, 0) == MAYBE);
5756ead341SBram Moolenaar     reader.js_buf = (char_u *)"fal";
58595e64e2SBram Moolenaar     assert(json_find_end(&reader, 0) == MAYBE);
5956ead341SBram Moolenaar     reader.js_buf = (char_u *)"fals";
60595e64e2SBram Moolenaar     assert(json_find_end(&reader, 0) == MAYBE);
6156ead341SBram Moolenaar 
6256ead341SBram Moolenaar     reader.js_buf = (char_u *)"true";
63595e64e2SBram Moolenaar     assert(json_find_end(&reader, 0) == OK);
6456ead341SBram Moolenaar     reader.js_buf = (char_u *)"t";
65595e64e2SBram Moolenaar     assert(json_find_end(&reader, 0) == MAYBE);
6656ead341SBram Moolenaar     reader.js_buf = (char_u *)"tr";
67595e64e2SBram Moolenaar     assert(json_find_end(&reader, 0) == MAYBE);
6856ead341SBram Moolenaar     reader.js_buf = (char_u *)"tru";
69595e64e2SBram Moolenaar     assert(json_find_end(&reader, 0) == MAYBE);
7056ead341SBram Moolenaar 
7156ead341SBram Moolenaar     reader.js_buf = (char_u *)"null";
72595e64e2SBram Moolenaar     assert(json_find_end(&reader, 0) == OK);
7356ead341SBram Moolenaar     reader.js_buf = (char_u *)"n";
74595e64e2SBram Moolenaar     assert(json_find_end(&reader, 0) == MAYBE);
7556ead341SBram Moolenaar     reader.js_buf = (char_u *)"nu";
76595e64e2SBram Moolenaar     assert(json_find_end(&reader, 0) == MAYBE);
7756ead341SBram Moolenaar     reader.js_buf = (char_u *)"nul";
78595e64e2SBram Moolenaar     assert(json_find_end(&reader, 0) == MAYBE);
7956ead341SBram Moolenaar 
80*4ba37b58SBram Moolenaar     // object without white space
8156ead341SBram Moolenaar     reader.js_buf = (char_u *)"{\"a\":123}";
82595e64e2SBram Moolenaar     assert(json_find_end(&reader, 0) == OK);
8356ead341SBram Moolenaar     reader.js_buf = (char_u *)"{\"a\":123";
84595e64e2SBram Moolenaar     assert(json_find_end(&reader, 0) == MAYBE);
8556ead341SBram Moolenaar     reader.js_buf = (char_u *)"{\"a\":";
86595e64e2SBram Moolenaar     assert(json_find_end(&reader, 0) == MAYBE);
8756ead341SBram Moolenaar     reader.js_buf = (char_u *)"{\"a\"";
88595e64e2SBram Moolenaar     assert(json_find_end(&reader, 0) == MAYBE);
8956ead341SBram Moolenaar     reader.js_buf = (char_u *)"{\"a";
90595e64e2SBram Moolenaar     assert(json_find_end(&reader, 0) == MAYBE);
9156ead341SBram Moolenaar     reader.js_buf = (char_u *)"{\"";
92595e64e2SBram Moolenaar     assert(json_find_end(&reader, 0) == MAYBE);
9356ead341SBram Moolenaar     reader.js_buf = (char_u *)"{";
94595e64e2SBram Moolenaar     assert(json_find_end(&reader, 0) == MAYBE);
9556ead341SBram Moolenaar 
96*4ba37b58SBram Moolenaar     // object with white space
9756ead341SBram Moolenaar     reader.js_buf = (char_u *)"  {  \"a\"  :  123  }  ";
98595e64e2SBram Moolenaar     assert(json_find_end(&reader, 0) == OK);
9956ead341SBram Moolenaar     reader.js_buf = (char_u *)"  {  \"a\"  :  123  ";
100595e64e2SBram Moolenaar     assert(json_find_end(&reader, 0) == MAYBE);
10156ead341SBram Moolenaar     reader.js_buf = (char_u *)"  {  \"a\"  :  ";
102595e64e2SBram Moolenaar     assert(json_find_end(&reader, 0) == MAYBE);
10356ead341SBram Moolenaar     reader.js_buf = (char_u *)"  {  \"a\"  ";
104595e64e2SBram Moolenaar     assert(json_find_end(&reader, 0) == MAYBE);
10556ead341SBram Moolenaar     reader.js_buf = (char_u *)"  {  \"a  ";
106595e64e2SBram Moolenaar     assert(json_find_end(&reader, 0) == MAYBE);
10756ead341SBram Moolenaar     reader.js_buf = (char_u *)"  {   ";
108595e64e2SBram Moolenaar     assert(json_find_end(&reader, 0) == MAYBE);
10956ead341SBram Moolenaar 
110*4ba37b58SBram Moolenaar     // JS object with white space
111e2c6037dSBram Moolenaar     reader.js_buf = (char_u *)"  {  a  :  123  }  ";
112e2c6037dSBram Moolenaar     assert(json_find_end(&reader, JSON_JS) == OK);
113e2c6037dSBram Moolenaar     reader.js_buf = (char_u *)"  {  a  :   ";
114e2c6037dSBram Moolenaar     assert(json_find_end(&reader, JSON_JS) == MAYBE);
115e2c6037dSBram Moolenaar 
116*4ba37b58SBram Moolenaar     // array without white space
11756ead341SBram Moolenaar     reader.js_buf = (char_u *)"[\"a\",123]";
118595e64e2SBram Moolenaar     assert(json_find_end(&reader, 0) == OK);
11956ead341SBram Moolenaar     reader.js_buf = (char_u *)"[\"a\",123";
120595e64e2SBram Moolenaar     assert(json_find_end(&reader, 0) == MAYBE);
12156ead341SBram Moolenaar     reader.js_buf = (char_u *)"[\"a\",";
122595e64e2SBram Moolenaar     assert(json_find_end(&reader, 0) == MAYBE);
12356ead341SBram Moolenaar     reader.js_buf = (char_u *)"[\"a\"";
124595e64e2SBram Moolenaar     assert(json_find_end(&reader, 0) == MAYBE);
12556ead341SBram Moolenaar     reader.js_buf = (char_u *)"[\"a";
126595e64e2SBram Moolenaar     assert(json_find_end(&reader, 0) == MAYBE);
12756ead341SBram Moolenaar     reader.js_buf = (char_u *)"[\"";
128595e64e2SBram Moolenaar     assert(json_find_end(&reader, 0) == MAYBE);
12956ead341SBram Moolenaar     reader.js_buf = (char_u *)"[";
130595e64e2SBram Moolenaar     assert(json_find_end(&reader, 0) == MAYBE);
13156ead341SBram Moolenaar 
132*4ba37b58SBram Moolenaar     // array with white space
13356ead341SBram Moolenaar     reader.js_buf = (char_u *)"  [  \"a\"  ,  123  ]  ";
134595e64e2SBram Moolenaar     assert(json_find_end(&reader, 0) == OK);
13556ead341SBram Moolenaar     reader.js_buf = (char_u *)"  [  \"a\"  ,  123  ";
136595e64e2SBram Moolenaar     assert(json_find_end(&reader, 0) == MAYBE);
13756ead341SBram Moolenaar     reader.js_buf = (char_u *)"  [  \"a\"  ,  ";
138595e64e2SBram Moolenaar     assert(json_find_end(&reader, 0) == MAYBE);
13956ead341SBram Moolenaar     reader.js_buf = (char_u *)"  [  \"a\"  ";
140595e64e2SBram Moolenaar     assert(json_find_end(&reader, 0) == MAYBE);
14156ead341SBram Moolenaar     reader.js_buf = (char_u *)"  [  \"a  ";
142595e64e2SBram Moolenaar     assert(json_find_end(&reader, 0) == MAYBE);
14356ead341SBram Moolenaar     reader.js_buf = (char_u *)"  [  ";
144595e64e2SBram Moolenaar     assert(json_find_end(&reader, 0) == MAYBE);
14556ead341SBram Moolenaar }
14656ead341SBram Moolenaar 
14756ead341SBram Moolenaar     static int
fill_from_cookie(js_read_T * reader)14856ead341SBram Moolenaar fill_from_cookie(js_read_T *reader)
14956ead341SBram Moolenaar {
15056ead341SBram Moolenaar     reader->js_buf = reader->js_cookie;
15156ead341SBram Moolenaar     return TRUE;
15256ead341SBram Moolenaar }
15356ead341SBram Moolenaar 
15456ead341SBram Moolenaar /*
15556ead341SBram Moolenaar  * Test json_find_end with an incomplete array, calling the fill function.
15656ead341SBram Moolenaar  */
15756ead341SBram Moolenaar     static void
test_fill_called_on_find_end(void)15856ead341SBram Moolenaar test_fill_called_on_find_end(void)
15956ead341SBram Moolenaar {
16056ead341SBram Moolenaar     js_read_T reader;
16156ead341SBram Moolenaar 
16256ead341SBram Moolenaar     reader.js_fill = fill_from_cookie;
16356ead341SBram Moolenaar     reader.js_used = 0;
16456ead341SBram Moolenaar     reader.js_buf = (char_u *)"  [  \"a\"  ,  123  ";
16556ead341SBram Moolenaar     reader.js_cookie =	      "  [  \"a\"  ,  123  ]  ";
166595e64e2SBram Moolenaar     assert(json_find_end(&reader, 0) == OK);
16756ead341SBram Moolenaar     reader.js_buf = (char_u *)"  [  \"a\"  ,  ";
168595e64e2SBram Moolenaar     assert(json_find_end(&reader, 0) == OK);
16956ead341SBram Moolenaar     reader.js_buf = (char_u *)"  [  \"a\"  ";
170595e64e2SBram Moolenaar     assert(json_find_end(&reader, 0) == OK);
17156ead341SBram Moolenaar     reader.js_buf = (char_u *)"  [  \"a";
172595e64e2SBram Moolenaar     assert(json_find_end(&reader, 0) == OK);
17356ead341SBram Moolenaar     reader.js_buf = (char_u *)"  [  ";
174595e64e2SBram Moolenaar     assert(json_find_end(&reader, 0) == OK);
17556ead341SBram Moolenaar }
17656ead341SBram Moolenaar 
17756ead341SBram Moolenaar /*
17856ead341SBram Moolenaar  * Test json_find_end with an incomplete string, calling the fill function.
17956ead341SBram Moolenaar  */
18056ead341SBram Moolenaar     static void
test_fill_called_on_string(void)18156ead341SBram Moolenaar test_fill_called_on_string(void)
18256ead341SBram Moolenaar {
18356ead341SBram Moolenaar     js_read_T reader;
18456ead341SBram Moolenaar 
18556ead341SBram Moolenaar     reader.js_fill = fill_from_cookie;
18656ead341SBram Moolenaar     reader.js_used = 0;
18756ead341SBram Moolenaar     reader.js_buf = (char_u *)" \"foo";
18856ead341SBram Moolenaar     reader.js_end = reader.js_buf + STRLEN(reader.js_buf);
18956ead341SBram Moolenaar     reader.js_cookie =	      " \"foobar\"  ";
190ee142addSBram Moolenaar     assert(json_decode_string(&reader, NULL, '"') == OK);
19156ead341SBram Moolenaar }
1928d8c509aSBram Moolenaar #endif
19356ead341SBram Moolenaar 
19456ead341SBram Moolenaar     int
main(void)19556ead341SBram Moolenaar main(void)
19656ead341SBram Moolenaar {
1978d8c509aSBram Moolenaar #if defined(FEAT_EVAL)
19856ead341SBram Moolenaar     test_decode_find_end();
19956ead341SBram Moolenaar     test_fill_called_on_find_end();
20056ead341SBram Moolenaar     test_fill_called_on_string();
2018d8c509aSBram Moolenaar #endif
20256ead341SBram Moolenaar     return 0;
20356ead341SBram Moolenaar }
204