diff --git a/lib/webfuse_provider/impl/json/node.c b/lib/webfuse_provider/impl/json/node.c index 4708ea9..af668c7 100644 --- a/lib/webfuse_provider/impl/json/node.c +++ b/lib/webfuse_provider/impl/json/node.c @@ -78,13 +78,12 @@ wfp_impl_json_array_get( struct wfp_json const * json, size_t pos) { - struct wfp_json const * result = NULL; if ((WFP_JSON_ARRAY == json->type) && (pos < json->value.a.size)) { return &(json->value.a.items[pos]); } - return result; + return &wfp_json_null; } size_t diff --git a/test/webfuse_provider/json/test_json_parser.cc b/test/webfuse_provider/json/test_json_parser.cc index f785505..4e6e14d 100644 --- a/test/webfuse_provider/json/test_json_parser.cc +++ b/test/webfuse_provider/json/test_json_parser.cc @@ -82,6 +82,30 @@ TEST(json_parser, parse_string) wfp_impl_json_doc_dispose(doc); } +TEST(json_parser, unescape_string) +{ + char text[] = "\"\\\"_\\\\_\\/_\\b_\\f_\\n_\\r_\\t\""; + wfp_json_doc * doc = parse_json(text); + ASSERT_NE(nullptr, doc); + wfp_json const * root = wfp_impl_json_doc_root(doc); + ASSERT_TRUE(wfp_impl_json_is_string(root)); + ASSERT_STREQ("\"_\\_/_\b_\f_\n_\r_\t", wfp_impl_json_string_get(root)); + + wfp_impl_json_doc_dispose(doc); +} + +TEST(json_parser, skip_whitespace) +{ + char text[] = " \t\r\n\"42\""; + wfp_json_doc * doc = parse_json(text); + ASSERT_NE(nullptr, doc); + wfp_json const * root = wfp_impl_json_doc_root(doc); + ASSERT_TRUE(wfp_impl_json_is_string(root)); + ASSERT_STREQ("42", wfp_impl_json_string_get(root)); + + wfp_impl_json_doc_dispose(doc); +} + TEST(json_parser, parse_array) { char text[] = "[true,1,\"foo\",[42]]"; @@ -95,6 +119,19 @@ TEST(json_parser, parse_array) ASSERT_TRUE(wfp_impl_json_is_int(wfp_impl_json_array_get(root, 1))); ASSERT_TRUE(wfp_impl_json_is_string(wfp_impl_json_array_get(root, 2))); ASSERT_TRUE(wfp_impl_json_is_array(wfp_impl_json_array_get(root, 3))); + ASSERT_TRUE(wfp_impl_json_is_null(wfp_impl_json_array_get(root, 4))); + + wfp_impl_json_doc_dispose(doc); +} + +TEST(json_parser, parse_empty_array) +{ + char text[] = "[]"; + wfp_json_doc * doc = parse_json(text); + ASSERT_NE(nullptr, doc); + wfp_json const * root = wfp_impl_json_doc_root(doc); + ASSERT_TRUE(wfp_impl_json_is_array(root)); + ASSERT_EQ(0, wfp_impl_json_array_size(root)); wfp_impl_json_doc_dispose(doc); } @@ -109,14 +146,52 @@ TEST(json_parser, parse_object) ASSERT_EQ(3, wfp_impl_json_object_size(root)); ASSERT_STREQ("method", wfp_impl_json_object_key(root, 0)); + ASSERT_TRUE(wfp_impl_json_is_string(wfp_impl_json_object_value(root, 0))); + ASSERT_STREQ("params", wfp_impl_json_object_key(root, 1)); + ASSERT_TRUE(wfp_impl_json_is_array(wfp_impl_json_object_value(root, 1))); + ASSERT_STREQ("id", wfp_impl_json_object_key(root, 2)); + ASSERT_TRUE(wfp_impl_json_is_int(wfp_impl_json_object_value(root, 2))); + + ASSERT_STREQ("", wfp_impl_json_object_key(root, 3)); + ASSERT_TRUE(wfp_impl_json_is_null(wfp_impl_json_object_value(root, 3))); + wfp_impl_json_doc_dispose(doc); } +TEST(json_parser, default_values) +{ + char text[] = "[true]"; + wfp_json_doc * doc = parse_json(text); + ASSERT_NE(nullptr, doc); + + wfp_json const * json_array = wfp_impl_json_doc_root(doc); + ASSERT_FALSE(wfp_impl_json_bool_get(json_array)); + ASSERT_EQ(0, wfp_impl_json_int_get(json_array)); + ASSERT_STREQ("", wfp_impl_json_string_get(json_array)); + ASSERT_EQ(0, wfp_impl_json_object_size(json_array)); + ASSERT_TRUE(wfp_impl_json_is_null(wfp_impl_json_object_get(json_array, "foo"))); + ASSERT_STREQ("", wfp_impl_json_object_key(json_array, 0)); + ASSERT_TRUE(wfp_impl_json_is_null(wfp_impl_json_object_value(json_array, 0))); + + wfp_json const * json_bool = wfp_impl_json_array_get(json_array, 0); + ASSERT_EQ(0, wfp_impl_json_array_size(json_bool)); + ASSERT_TRUE(wfp_impl_json_is_null(wfp_impl_json_array_get(json_bool, 0))); + + wfp_impl_json_doc_dispose(doc); + +} + TEST(json_parser, parse_fail_invalid_json) { + { + char text[] = ""; + wfp_json_doc * doc = parse_json(text); + ASSERT_EQ(nullptr, doc); + } + { char text[] = "invalid"; wfp_json_doc * doc = parse_json(text); @@ -141,6 +216,24 @@ TEST(json_parser, parse_fail_invalid_json) ASSERT_EQ(nullptr, doc); } + { + char text[] = "+1"; + wfp_json_doc * doc = parse_json(text); + ASSERT_EQ(nullptr, doc); + } + + { + char text[] = "\"unterminated_string"; + wfp_json_doc * doc = parse_json(text); + ASSERT_EQ(nullptr, doc); + } + + { + char text[] = "\"invale_\\escape_\\sequence\""; + wfp_json_doc * doc = parse_json(text); + ASSERT_EQ(nullptr, doc); + } + { char text[] = "[1,2,3}"; wfp_json_doc * doc = parse_json(text);