Mark Beckwith
6 years ago
committed by
Rusty Russell
2 changed files with 156 additions and 0 deletions
@ -0,0 +1,155 @@ |
|||||
|
#include "config.h" |
||||
|
#include <common/utils.h> |
||||
|
#include <common/json.c> |
||||
|
|
||||
|
/* AUTOGENERATED MOCKS START */ |
||||
|
/* AUTOGENERATED MOCKS END */ |
||||
|
|
||||
|
struct json { |
||||
|
jsmntok_t *toks; |
||||
|
char *buffer; |
||||
|
}; |
||||
|
|
||||
|
static void convert_quotes(char *first) |
||||
|
{ |
||||
|
while (*first != '\0') { |
||||
|
if (*first == '\'') |
||||
|
*first = '"'; |
||||
|
first++; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
static struct json *json_parse(const tal_t * ctx, const char *str) |
||||
|
{ |
||||
|
struct json *j = tal(ctx, struct json); |
||||
|
j->buffer = tal_strdup(j, str); |
||||
|
convert_quotes(j->buffer); |
||||
|
bool ok; |
||||
|
j->toks = json_parse_input(j->buffer, strlen(j->buffer), &ok); |
||||
|
assert(ok); |
||||
|
j->toks = json_tok_copy(j, j->toks); |
||||
|
return j; |
||||
|
} |
||||
|
|
||||
|
static void test_toks(const struct json *j, ...) |
||||
|
{ |
||||
|
const jsmntok_t * tok = j->toks + 1; |
||||
|
const char *value; |
||||
|
va_list(ap); |
||||
|
va_start(ap, j); |
||||
|
while ((value = va_arg(ap, char *)) != NULL) { |
||||
|
assert(json_tok_streq(j->buffer, tok, value)); |
||||
|
tok++; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
static void sanity(void) |
||||
|
{ |
||||
|
struct json *j = json_parse(tmpctx, "[]"); |
||||
|
json_tok_remove(&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); |
||||
|
assert(j); |
||||
|
} |
||||
|
|
||||
|
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); |
||||
|
assert(j->toks); |
||||
|
|
||||
|
test_toks(j, "two", "three", NULL); |
||||
|
assert(tal_count(j->toks) == 3); |
||||
|
|
||||
|
j = json_parse(tmpctx, "{'1':'one', '2':'two', '3':'three'}"); |
||||
|
assert(j); |
||||
|
|
||||
|
json_tok_remove(&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); |
||||
|
assert(j); |
||||
|
test_toks(j, "2", "two", "3", "three", NULL); |
||||
|
assert(tal_count(j->toks) == 5); |
||||
|
|
||||
|
} |
||||
|
|
||||
|
static void remove_last(void) |
||||
|
{ |
||||
|
struct json *j = json_parse(tmpctx, "['one', 'two', 'three']"); |
||||
|
json_tok_remove(&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); |
||||
|
assert(j); |
||||
|
test_toks(j, "1", "one", "2", "two", NULL); |
||||
|
assert(tal_count(j->toks) == 5); |
||||
|
} |
||||
|
|
||||
|
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); |
||||
|
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); |
||||
|
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); |
||||
|
assert(j); |
||||
|
test_toks(j, "1", "one", "4", "four", NULL); |
||||
|
assert(tal_count(j->toks) == 5); |
||||
|
} |
||||
|
|
||||
|
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); |
||||
|
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); |
||||
|
assert(tal_count(j->toks) == 1); |
||||
|
} |
||||
|
|
||||
|
static void remove_complex(void) |
||||
|
{ |
||||
|
struct json *j = json_parse(tmpctx, |
||||
|
"{'1':'one', '2':'two'," |
||||
|
"'3': { '3.1': 'a', '3.2':'b', '3.3':'c' }, " |
||||
|
"'4': { '4.1': 'a', '4.2':'b', '4.3':'c' }, " |
||||
|
"'5':'five'}"); |
||||
|
|
||||
|
json_tok_remove(&j->toks, j->toks + 5, 2); |
||||
|
test_toks(j, "1", "one", "2", "two", "5", "five", NULL); |
||||
|
} |
||||
|
|
||||
|
int main(void) |
||||
|
{ |
||||
|
setup_locale(); |
||||
|
setup_tmpctx(); |
||||
|
|
||||
|
sanity(); |
||||
|
remove_one(); |
||||
|
remove_first(); |
||||
|
remove_last(); |
||||
|
remove_multiple(); |
||||
|
remove_all(); |
||||
|
remove_complex(); |
||||
|
|
||||
|
tal_free(tmpctx); |
||||
|
printf("run-json_remove ok\n"); |
||||
|
} |
Loading…
Reference in new issue