[PATCH v1 2/4] lib: introduce json_token_is_leaf helper

Kirill Shcherbatov kshcherbatov at tarantool.org
Thu Dec 27 14:15:53 MSK 2018


A new json_token_is_leaf routine tests if the passed JSON token
is a JSON tree leaf(has no child record).

Needed for #1012
---
 src/lib/json/json.h   | 11 +++++++++++
 test/unit/json.c      | 39 ++++++++++++++++++++++++++++++++++++++-
 test/unit/json.result | 10 +++++++++-
 3 files changed, 58 insertions(+), 2 deletions(-)

diff --git a/src/lib/json/json.h b/src/lib/json/json.h
index c0adca450..0bc99474b 100644
--- a/src/lib/json/json.h
+++ b/src/lib/json/json.h
@@ -30,6 +30,7 @@
  * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  */
+#include <stdbool.h>
 #include <stddef.h>
 #include <stdint.h>
 #include "trivia/util.h"
@@ -253,6 +254,16 @@ json_path_cmp(const char *a, int a_len, const char *b, int b_len,
 int
 json_path_validate(const char *path, int path_len, int index_base);
 
+/**
+ * Test if the passed JSON token is a JSON tree leaf
+ * (has no child records).
+ */
+static inline bool
+json_token_is_leaf(struct json_token *token)
+{
+	return token->max_child_idx == -1;
+}
+
 /**
  * An snprint-style function to print path to a token in a JSON
  * tree. The root node doesn't necessarily have to be the tree
diff --git a/test/unit/json.c b/test/unit/json.c
index 26cc5088b..6dac688d1 100644
--- a/test/unit/json.c
+++ b/test/unit/json.c
@@ -508,17 +508,54 @@ test_path_snprintf()
 	footer();
 }
 
+void
+test_json_helpers()
+{
+	struct json_tree tree;
+	int rc = json_tree_create(&tree);
+	fail_if(rc != 0);
+	struct test_struct records[5];
+	const char *path0 = "[1][20][\"file\"]";
+	int path0_len = strlen(path0);
+	const char *path = "[1][20][\"file\"][8]";
+	int path_len = strlen(path);
+
+	header();
+	plan(4);
+
+	int records_idx = 0;
+	struct test_struct *node, *node_tmp;
+	node = test_add_path(&tree, path0, path0_len, records, &records_idx);
+	fail_if(&node->node != &records[2].node);
+	is(json_token_is_leaf(&records[1].node), false, "interm node is not leaf");
+	is(json_token_is_leaf(&records[2].node), true, "last node is leaf");
+
+	node = test_add_path(&tree, path, path_len, records, &records_idx);
+	fail_if(&node->node != &records[3].node);
+	is(json_token_is_leaf(&records[2].node), false,
+	   "last node became interm - it can't be leaf anymore");
+	is(json_token_is_leaf(&records[3].node), true, "last node is leaf");
+
+	json_tree_foreach_entry_safe(node, &tree.root, struct test_struct,
+				     node, node_tmp)
+		json_tree_del(&tree, &node->node);
+	json_tree_destroy(&tree);
+	check_plan();
+	footer();
+}
+
 int
 main()
 {
 	header();
-	plan(5);
+	plan(6);
 
 	test_basic();
 	test_errors();
 	test_tree();
 	test_path_cmp();
 	test_path_snprintf();
+	test_json_helpers();
 
 	int rc = check_plan();
 	footer();
diff --git a/test/unit/json.result b/test/unit/json.result
index a73203154..ea2d1af8e 100644
--- a/test/unit/json.result
+++ b/test/unit/json.result
@@ -1,5 +1,5 @@
 	*** main ***
-1..5
+1..6
 	*** test_basic ***
     1..71
     ok 1 - parse <[1]>
@@ -191,4 +191,12 @@ ok 4 - subtests
     ok 18 - "1-byte size buffer" - correct rc: have 18 expected 18
 ok 5 - subtests
 	*** test_path_snprintf: done ***
+	*** test_json_helpers ***
+    1..4
+    ok 1 - interm node is not leaf
+    ok 2 - last node is leaf
+    ok 3 - last node became interm - it can't be leaf anymore
+    ok 4 - last node is leaf
+ok 6 - subtests
+	*** test_json_helpers: done ***
 	*** main: done ***
-- 
2.19.2




More information about the Tarantool-patches mailing list