summaryrefslogtreecommitdiffstats
path: root/src/json_test.c
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-07 08:50:31 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-07 08:50:31 +0000
commitaed8ce9da277f5ecffe968b324f242c41c3b752a (patch)
treed2e538394cb7a8a7c42a4aac6ccf1a8e3256999b /src/json_test.c
parentInitial commit. (diff)
downloadvim-aed8ce9da277f5ecffe968b324f242c41c3b752a.tar.xz
vim-aed8ce9da277f5ecffe968b324f242c41c3b752a.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.c203
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;
+}