mirror of
https://github.com/aljazceru/lightning.git
synced 2025-12-18 22:54:25 +01:00
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:
@@ -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");
|
||||
|
||||
Reference in New Issue
Block a user