common: generalize json_tok_remove.

It assumes the head of the array is the object/array we want to remove from,
but that's not true if we're trying to remove from a sub-object.

Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
This commit is contained in:
Rusty Russell
2019-07-26 11:53:47 +09:30
parent 7b1088a235
commit b03369ea2d
4 changed files with 57 additions and 23 deletions

View File

@@ -42,7 +42,12 @@ static void test_toks(const struct json *j, ...)
va_list(ap);
va_start(ap, j);
while ((value = va_arg(ap, char *)) != NULL) {
assert(json_tok_streq(j->buffer, tok, value));
if (tok->type == JSMN_OBJECT)
assert(streq(value, "{"));
else if (tok->type == JSMN_ARRAY)
assert(streq(value, "["));
else
assert(json_tok_streq(j->buffer, tok, value));
tok++;
}
}
@@ -50,14 +55,14 @@ static void test_toks(const struct json *j, ...)
static void sanity(void)
{
struct json *j = json_parse(tmpctx, "[]");
json_tok_remove(&j->toks, j->toks, 0);
json_tok_remove(&j->toks, j->toks, j->toks, 0);
assert(j);
}
static void remove_one(void)
{
struct json *j = json_parse(tmpctx, "['invoice']");
json_tok_remove(&j->toks, j->toks + 1, 1);
json_tok_remove(&j->toks, j->toks, j->toks + 1, 1);
assert(j);
}
@@ -65,7 +70,7 @@ static void remove_first(void)
{
struct json *j = json_parse(tmpctx, "['one', 'two', 'three']");
assert(j);
json_tok_remove(&j->toks, j->toks + 1, 1);
json_tok_remove(&j->toks, j->toks, j->toks + 1, 1);
assert(j->toks);
test_toks(j, "two", "three", NULL);
@@ -74,13 +79,13 @@ static void remove_first(void)
j = json_parse(tmpctx, "{'1':'one', '2':'two', '3':'three'}");
assert(j);
json_tok_remove(&j->toks, j->toks + 1, 1);
json_tok_remove(&j->toks, j->toks, j->toks + 1, 1);
assert(j);
test_toks(j, "2", "two", "3", "three", NULL);
assert(tal_count(j->toks) == 5);
j = json_parse(tmpctx, "{'1':'one', '2':'two', '3':'three'}");
json_tok_remove(&j->toks, j->toks + 1, 1);
json_tok_remove(&j->toks, j->toks, j->toks + 1, 1);
assert(j);
test_toks(j, "2", "two", "3", "three", NULL);
assert(tal_count(j->toks) == 5);
@@ -90,12 +95,12 @@ static void remove_first(void)
static void remove_last(void)
{
struct json *j = json_parse(tmpctx, "['one', 'two', 'three']");
json_tok_remove(&j->toks, j->toks + 3, 1);
json_tok_remove(&j->toks, j->toks, j->toks + 3, 1);
test_toks(j, "one", "two", NULL);
assert(tal_count(j->toks) == 3);
j = json_parse(tmpctx, "{'1':'one', '2':'two', '3':'three'}");
json_tok_remove(&j->toks, j->toks + 5, 1);
json_tok_remove(&j->toks, j->toks, j->toks + 5, 1);
assert(j);
test_toks(j, "1", "one", "2", "two", NULL);
assert(tal_count(j->toks) == 5);
@@ -104,15 +109,15 @@ static void remove_last(void)
static void remove_multiple(void)
{
struct json *j = json_parse(tmpctx, "['a', 'b', 'c', 'd', 'e']");
json_tok_remove(&j->toks, j->toks + 1, 2);
json_tok_remove(&j->toks, j->toks, j->toks + 1, 2);
test_toks(j, "c", "d", "e", NULL);
j = json_parse(tmpctx, "['a', 'b', 'c', 'd', 'e']");
json_tok_remove(&j->toks, j->toks + 2, 2);
json_tok_remove(&j->toks, j->toks, j->toks + 2, 2);
test_toks(j, "a", "d", "e", NULL);
j = json_parse(tmpctx, "{'1':'one', '2':'two', '3':'three', '4':'four'}");
json_tok_remove(&j->toks, j->toks + 3, 2);
json_tok_remove(&j->toks, j->toks, j->toks + 3, 2);
assert(j);
test_toks(j, "1", "one", "4", "four", NULL);
assert(tal_count(j->toks) == 5);
@@ -121,11 +126,11 @@ static void remove_multiple(void)
static void remove_all(void)
{
struct json *j = json_parse(tmpctx, "['a', 'b', 'c', 'd', 'e']");
json_tok_remove(&j->toks, j->toks + 1, 5);
json_tok_remove(&j->toks, j->toks, j->toks + 1, 5);
assert(tal_count(j->toks) == 1);
j = json_parse(tmpctx, "{'1':'one', '2':'two', '3':'three', '4':'four'}");
json_tok_remove(&j->toks, j->toks + 1, 4);
json_tok_remove(&j->toks, j->toks, j->toks + 1, 4);
assert(tal_count(j->toks) == 1);
}
@@ -137,10 +142,24 @@ static void remove_complex(void)
"'4': { '4.1': 'a', '4.2':'b', '4.3':'c' }, "
"'5':'five'}");
json_tok_remove(&j->toks, j->toks + 5, 2);
json_tok_remove(&j->toks, j->toks, j->toks + 5, 2);
test_toks(j, "1", "one", "2", "two", "5", "five", NULL);
}
static void remove_inside_obj(void)
{
jsmntok_t *tok;
struct json *j = json_parse(tmpctx,
"{'1':'one', '2':'two',"
"'3': { '3.1': 'a', '3.2':'b', '3.3':'c' }, "
"'4':'four'}");
tok = (jsmntok_t *)json_get_member(j->buffer, j->toks, "3");
json_tok_remove(&j->toks, tok, tok+1, 1);
test_toks(j, "1", "one", "2", "two", "3", "{", "3.2", "b", "3.3", "c",
"4", "four", NULL);
}
int main(void)
{
setup_locale();
@@ -153,6 +172,7 @@ int main(void)
remove_multiple();
remove_all();
remove_complex();
remove_inside_obj();
tal_free(tmpctx);
printf("run-json_remove ok\n");