diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 08:50:31 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 08:50:31 +0000 |
commit | aed8ce9da277f5ecffe968b324f242c41c3b752a (patch) | |
tree | d2e538394cb7a8a7c42a4aac6ccf1a8e3256999b /src/json_test.c | |
parent | Initial commit. (diff) | |
download | vim-upstream.tar.xz vim-upstream.zip |
Adding upstream version 2:9.0.1378.upstream/2%9.0.1378upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'src/json_test.c')
-rw-r--r-- | src/json_test.c | 203 |
1 files changed, 203 insertions, 0 deletions
diff --git a/src/json_test.c b/src/json_test.c new file mode 100644 index 0000000..5fb772e --- /dev/null +++ b/src/json_test.c @@ -0,0 +1,203 @@ +/* vi:set ts=8 sts=4 sw=4 noet: + * + * VIM - Vi IMproved by Bram Moolenaar + * + * Do ":help uganda" in Vim to read copying and usage conditions. + * Do ":help credits" in Vim to see a list of people who contributed. + * See README.txt for an overview of the Vim source code. + */ + +/* + * json_test.c: Unittests for json.c + */ + +#undef NDEBUG +#include <assert.h> + +// Must include main.c because it contains much more than just main() +#define NO_VIM_MAIN +#include "main.c" + +// This file has to be included because the tested functions are static +#include "json.c" + +#if defined(FEAT_EVAL) +/* + * Test json_find_end() with incomplete items. + */ + static void +test_decode_find_end(void) +{ + js_read_T reader; + + reader.js_fill = NULL; + reader.js_used = 0; + + // string and incomplete string + reader.js_buf = (char_u *)"\"hello\""; + assert(json_find_end(&reader, 0) == OK); + reader.js_buf = (char_u *)" \"hello\" "; + assert(json_find_end(&reader, 0) == OK); + reader.js_buf = (char_u *)"\"hello"; + assert(json_find_end(&reader, 0) == MAYBE); + + // number and dash (incomplete number) + reader.js_buf = (char_u *)"123"; + assert(json_find_end(&reader, 0) == OK); + reader.js_buf = (char_u *)"-"; + assert(json_find_end(&reader, 0) == MAYBE); + + // false, true and null, also incomplete + reader.js_buf = (char_u *)"false"; + assert(json_find_end(&reader, 0) == OK); + reader.js_buf = (char_u *)"f"; + assert(json_find_end(&reader, 0) == MAYBE); + reader.js_buf = (char_u *)"fa"; + assert(json_find_end(&reader, 0) == MAYBE); + reader.js_buf = (char_u *)"fal"; + assert(json_find_end(&reader, 0) == MAYBE); + reader.js_buf = (char_u *)"fals"; + assert(json_find_end(&reader, 0) == MAYBE); + + reader.js_buf = (char_u *)"true"; + assert(json_find_end(&reader, 0) == OK); + reader.js_buf = (char_u *)"t"; + assert(json_find_end(&reader, 0) == MAYBE); + reader.js_buf = (char_u *)"tr"; + assert(json_find_end(&reader, 0) == MAYBE); + reader.js_buf = (char_u *)"tru"; + assert(json_find_end(&reader, 0) == MAYBE); + + reader.js_buf = (char_u *)"null"; + assert(json_find_end(&reader, 0) == OK); + reader.js_buf = (char_u *)"n"; + assert(json_find_end(&reader, 0) == MAYBE); + reader.js_buf = (char_u *)"nu"; + assert(json_find_end(&reader, 0) == MAYBE); + reader.js_buf = (char_u *)"nul"; + assert(json_find_end(&reader, 0) == MAYBE); + + // object without white space + reader.js_buf = (char_u *)"{\"a\":123}"; + assert(json_find_end(&reader, 0) == OK); + reader.js_buf = (char_u *)"{\"a\":123"; + assert(json_find_end(&reader, 0) == MAYBE); + reader.js_buf = (char_u *)"{\"a\":"; + assert(json_find_end(&reader, 0) == MAYBE); + reader.js_buf = (char_u *)"{\"a\""; + assert(json_find_end(&reader, 0) == MAYBE); + reader.js_buf = (char_u *)"{\"a"; + assert(json_find_end(&reader, 0) == MAYBE); + reader.js_buf = (char_u *)"{\""; + assert(json_find_end(&reader, 0) == MAYBE); + reader.js_buf = (char_u *)"{"; + assert(json_find_end(&reader, 0) == MAYBE); + + // object with white space + reader.js_buf = (char_u *)" { \"a\" : 123 } "; + assert(json_find_end(&reader, 0) == OK); + reader.js_buf = (char_u *)" { \"a\" : 123 "; + assert(json_find_end(&reader, 0) == MAYBE); + reader.js_buf = (char_u *)" { \"a\" : "; + assert(json_find_end(&reader, 0) == MAYBE); + reader.js_buf = (char_u *)" { \"a\" "; + assert(json_find_end(&reader, 0) == MAYBE); + reader.js_buf = (char_u *)" { \"a "; + assert(json_find_end(&reader, 0) == MAYBE); + reader.js_buf = (char_u *)" { "; + assert(json_find_end(&reader, 0) == MAYBE); + + // JS object with white space + reader.js_buf = (char_u *)" { a : 123 } "; + assert(json_find_end(&reader, JSON_JS) == OK); + reader.js_buf = (char_u *)" { a : "; + assert(json_find_end(&reader, JSON_JS) == MAYBE); + + // array without white space + reader.js_buf = (char_u *)"[\"a\",123]"; + assert(json_find_end(&reader, 0) == OK); + reader.js_buf = (char_u *)"[\"a\",123"; + assert(json_find_end(&reader, 0) == MAYBE); + reader.js_buf = (char_u *)"[\"a\","; + assert(json_find_end(&reader, 0) == MAYBE); + reader.js_buf = (char_u *)"[\"a\""; + assert(json_find_end(&reader, 0) == MAYBE); + reader.js_buf = (char_u *)"[\"a"; + assert(json_find_end(&reader, 0) == MAYBE); + reader.js_buf = (char_u *)"[\""; + assert(json_find_end(&reader, 0) == MAYBE); + reader.js_buf = (char_u *)"["; + assert(json_find_end(&reader, 0) == MAYBE); + + // array with white space + reader.js_buf = (char_u *)" [ \"a\" , 123 ] "; + assert(json_find_end(&reader, 0) == OK); + reader.js_buf = (char_u *)" [ \"a\" , 123 "; + assert(json_find_end(&reader, 0) == MAYBE); + reader.js_buf = (char_u *)" [ \"a\" , "; + assert(json_find_end(&reader, 0) == MAYBE); + reader.js_buf = (char_u *)" [ \"a\" "; + assert(json_find_end(&reader, 0) == MAYBE); + reader.js_buf = (char_u *)" [ \"a "; + assert(json_find_end(&reader, 0) == MAYBE); + reader.js_buf = (char_u *)" [ "; + assert(json_find_end(&reader, 0) == MAYBE); +} + + static int +fill_from_cookie(js_read_T *reader) +{ + reader->js_buf = reader->js_cookie; + return TRUE; +} + +/* + * Test json_find_end with an incomplete array, calling the fill function. + */ + static void +test_fill_called_on_find_end(void) +{ + js_read_T reader; + + reader.js_fill = fill_from_cookie; + reader.js_used = 0; + reader.js_buf = (char_u *)" [ \"a\" , 123 "; + reader.js_cookie = " [ \"a\" , 123 ] "; + assert(json_find_end(&reader, 0) == OK); + reader.js_buf = (char_u *)" [ \"a\" , "; + assert(json_find_end(&reader, 0) == OK); + reader.js_buf = (char_u *)" [ \"a\" "; + assert(json_find_end(&reader, 0) == OK); + reader.js_buf = (char_u *)" [ \"a"; + assert(json_find_end(&reader, 0) == OK); + reader.js_buf = (char_u *)" [ "; + assert(json_find_end(&reader, 0) == OK); +} + +/* + * Test json_find_end with an incomplete string, calling the fill function. + */ + static void +test_fill_called_on_string(void) +{ + js_read_T reader; + + reader.js_fill = fill_from_cookie; + reader.js_used = 0; + reader.js_buf = (char_u *)" \"foo"; + reader.js_end = reader.js_buf + STRLEN(reader.js_buf); + reader.js_cookie = " \"foobar\" "; + assert(json_decode_string(&reader, NULL, '"') == OK); +} +#endif + + int +main(void) +{ +#if defined(FEAT_EVAL) + test_decode_find_end(); + test_fill_called_on_find_end(); + test_fill_called_on_string(); +#endif + return 0; +} |