Add unit tests that catch invalid 'screen' and 'widget' JSON data.
This commit is contained in:
@ -16,6 +16,7 @@ struct screen_t {
|
|||||||
|
|
||||||
struct screen_t *screen_create(char *name, uint16_t x, uint16_t y, uint16_t w, uint16_t h);
|
struct screen_t *screen_create(char *name, uint16_t x, uint16_t y, uint16_t w, uint16_t h);
|
||||||
struct screen_t *screen_create_from_file(char *fn);
|
struct screen_t *screen_create_from_file(char *fn);
|
||||||
|
struct screen_t *screen_create_from_json(char *json);
|
||||||
void screen_destroy(struct screen_t **s);
|
void screen_destroy(struct screen_t **s);
|
||||||
|
|
||||||
bool screen_widget_add(struct screen_t *s, struct widget_t *w);
|
bool screen_widget_add(struct screen_t *s, struct widget_t *w);
|
||||||
|
24
src/screen.c
24
src/screen.c
@ -19,6 +19,20 @@ struct screen_t *screen_create(char *name, uint16_t x, uint16_t y, uint16_t w, u
|
|||||||
|
|
||||||
struct screen_t *screen_create_from_file(char *fn) {
|
struct screen_t *screen_create_from_file(char *fn) {
|
||||||
char *json;
|
char *json;
|
||||||
|
struct screen_t *screen = NULL;
|
||||||
|
|
||||||
|
json = json_fread(fn);
|
||||||
|
if (!json) {
|
||||||
|
LOG(LL_ERROR, ("%s: Could not json_fread()", fn));
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
screen = screen_create_from_json(json);
|
||||||
|
free (json);
|
||||||
|
return screen;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct screen_t *screen_create_from_json(char *json) {
|
||||||
void *h = NULL;
|
void *h = NULL;
|
||||||
// struct json_token key;
|
// struct json_token key;
|
||||||
struct json_token val;
|
struct json_token val;
|
||||||
@ -28,15 +42,8 @@ struct screen_t *screen_create_from_file(char *fn) {
|
|||||||
int screen_x, screen_y, screen_w, screen_h;
|
int screen_x, screen_y, screen_w, screen_h;
|
||||||
char *screen_name = NULL;
|
char *screen_name = NULL;
|
||||||
|
|
||||||
|
|
||||||
json = json_fread(fn);
|
|
||||||
if (!json) {
|
|
||||||
LOG(LL_ERROR, ("Could not read file %s", fn));
|
|
||||||
goto exit;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (json_scanf(json, strlen(json), "{x:%d,y:%d,w:%d,h:%d,name:%Q}", &screen_x, &screen_y, &screen_w, &screen_h, &screen_name) != 5) {
|
if (json_scanf(json, strlen(json), "{x:%d,y:%d,w:%d,h:%d,name:%Q}", &screen_x, &screen_y, &screen_w, &screen_h, &screen_name) != 5) {
|
||||||
LOG(LL_ERROR, ("%s: Incomplete JSON: require 'x', 'y', 'w', 'h' and 'name' fields", fn));
|
LOG(LL_ERROR, ("Incomplete JSON: require 'x', 'y', 'w', 'h' and 'name' fields"));
|
||||||
screen=NULL; goto exit;
|
screen=NULL; goto exit;
|
||||||
}
|
}
|
||||||
screen = screen_create(screen_name, screen_x, screen_y, screen_w, screen_h);
|
screen = screen_create(screen_name, screen_x, screen_y, screen_w, screen_h);
|
||||||
@ -61,7 +68,6 @@ struct screen_t *screen_create_from_file(char *fn) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
exit:
|
exit:
|
||||||
if (json) free(json);
|
|
||||||
if (screen_name) free(screen_name);
|
if (screen_name) free(screen_name);
|
||||||
return screen;
|
return screen;
|
||||||
}
|
}
|
||||||
|
27
unittest/data/TestScreen-invalid.json
Normal file
27
unittest/data/TestScreen-invalid.json
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
{
|
||||||
|
"x": 0,
|
||||||
|
"y": 0,
|
||||||
|
"w": 320,
|
||||||
|
"h": 240,
|
||||||
|
|
||||||
|
"widgets": [
|
||||||
|
{
|
||||||
|
"name": "one",
|
||||||
|
"x": 16,
|
||||||
|
"y": 16,
|
||||||
|
"w": 48,
|
||||||
|
"h": 48,
|
||||||
|
"label": "One",
|
||||||
|
"type": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "two",
|
||||||
|
"x": 256,
|
||||||
|
"y": 16,
|
||||||
|
"w": 48,
|
||||||
|
"h": 48,
|
||||||
|
"label": "Two",
|
||||||
|
"type": 0
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
8
unittest/data/TestWidget-invalid.json
Normal file
8
unittest/data/TestWidget-invalid.json
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
{
|
||||||
|
"x": 16,
|
||||||
|
"y": 16,
|
||||||
|
"w": 48,
|
||||||
|
"h": 48,
|
||||||
|
"label": "One",
|
||||||
|
"type": 0
|
||||||
|
}
|
@ -72,6 +72,11 @@ int test_screen() {
|
|||||||
struct widget_t *w = NULL;
|
struct widget_t *w = NULL;
|
||||||
uint16_t num_widgets;
|
uint16_t num_widgets;
|
||||||
|
|
||||||
|
LOG(LL_INFO, ("screen_create_from_file(data/TestScreen-invalid.json)"));
|
||||||
|
s = screen_create_from_file("data/TestScreen-invalid.json");
|
||||||
|
ASSERT(!s, "created screen from invalid date");
|
||||||
|
|
||||||
|
num_widgets = screen_get_num_widgets(s);
|
||||||
LOG(LL_INFO, ("screen_create_from_file(data/TestScreen.json)"));
|
LOG(LL_INFO, ("screen_create_from_file(data/TestScreen.json)"));
|
||||||
s = screen_create_from_file("data/TestScreen.json");
|
s = screen_create_from_file("data/TestScreen.json");
|
||||||
ASSERT(s, "Could not create screen");
|
ASSERT(s, "Could not create screen");
|
||||||
|
@ -1,37 +1,11 @@
|
|||||||
#include "test.h"
|
#include "test.h"
|
||||||
#include "widget.h"
|
#include "widget.h"
|
||||||
|
|
||||||
/*
|
static int test_widget_create_from_file(void) {
|
||||||
char *json;
|
|
||||||
void *h = NULL;
|
|
||||||
struct json_token key, val;
|
|
||||||
int idx;
|
|
||||||
|
|
||||||
json = json_fread("data/TestWidget.json");
|
|
||||||
if (!json) {
|
|
||||||
printf("Could not read json\n");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Traverse Object
|
|
||||||
while ((h = json_next_key(json, strlen(json), h, ".", &key, &val)) != NULL) {
|
|
||||||
printf("[%.*s] -> [%.*s]\n", key.len, key.ptr, val.len, val.ptr);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Traverse Array
|
|
||||||
while ((h = json_next_elem(json, strlen(json), h, ".widgets", &idx, &val)) != NULL) {
|
|
||||||
printf("[%d]: [%.*s]\n", idx, val.len, val.ptr);
|
|
||||||
}
|
|
||||||
|
|
||||||
exit:
|
|
||||||
free(json);
|
|
||||||
return 0;
|
|
||||||
*/
|
|
||||||
|
|
||||||
static int test_widget_create_from_file(char *fn) {
|
|
||||||
struct widget_t *w;
|
struct widget_t *w;
|
||||||
|
|
||||||
LOG(LL_INFO, ("Adding widget from %s", fn));
|
char *fn = "data/TestWidget.json";
|
||||||
|
LOG(LL_INFO, ("widget_create_from_file(%s)", fn));
|
||||||
w = widget_create_from_file(fn);
|
w = widget_create_from_file(fn);
|
||||||
ASSERT(w, "widget_create_from_file()");
|
ASSERT(w, "widget_create_from_file()");
|
||||||
ASSERT(w->x == 16, "'x' field is invalid");
|
ASSERT(w->x == 16, "'x' field is invalid");
|
||||||
@ -39,10 +13,14 @@ static int test_widget_create_from_file(char *fn) {
|
|||||||
ASSERT(w->w == 48, "'x' field is invalid");
|
ASSERT(w->w == 48, "'x' field is invalid");
|
||||||
ASSERT(w->h == 48, "'x' field is invalid");
|
ASSERT(w->h == 48, "'x' field is invalid");
|
||||||
|
|
||||||
|
fn = "data/TestWidget-invalid.json";
|
||||||
|
LOG(LL_INFO, ("widget_create_from_file(%s)", fn));
|
||||||
|
w = widget_create_from_file(fn);
|
||||||
|
ASSERT(!w, "invalid widget created");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int test_widget() {
|
int test_widget() {
|
||||||
test_widget_create_from_file("data/TestWidget.json");
|
test_widget_create_from_file();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user