forked from ElementsProject/lightning
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
test: add json_tok_remove unit tests
Signed-off-by: Mark Beckwith <[email protected]>
- Loading branch information
1 parent
70707bf
commit 164c764
Showing
2 changed files
with
156 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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"); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters