From 83b0d346aee82467c843e9527c104ff22d6e1d11 Mon Sep 17 00:00:00 2001 From: Pim van Pelt Date: Sun, 26 Nov 2017 16:01:08 +0100 Subject: [PATCH] Add unit tests that catch invalid 'screen' and 'widget' JSON data. --- include/screen.h | 1 + src/screen.c | 24 ++++++++++------- unittest/data/TestScreen-invalid.json | 27 +++++++++++++++++++ unittest/data/TestWidget-invalid.json | 8 ++++++ unittest/test_screen.c | 5 ++++ unittest/test_widget.c | 38 ++++++--------------------- 6 files changed, 64 insertions(+), 39 deletions(-) create mode 100644 unittest/data/TestScreen-invalid.json create mode 100644 unittest/data/TestWidget-invalid.json diff --git a/include/screen.h b/include/screen.h index ea41a42..a15006d 100644 --- a/include/screen.h +++ b/include/screen.h @@ -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_from_file(char *fn); +struct screen_t *screen_create_from_json(char *json); void screen_destroy(struct screen_t **s); bool screen_widget_add(struct screen_t *s, struct widget_t *w); diff --git a/src/screen.c b/src/screen.c index 032ad7e..e40a29b 100644 --- a/src/screen.c +++ b/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) { 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; // struct json_token key; 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; 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) { - 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 = 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: - if (json) free(json); if (screen_name) free(screen_name); return screen; } diff --git a/unittest/data/TestScreen-invalid.json b/unittest/data/TestScreen-invalid.json new file mode 100644 index 0000000..86647df --- /dev/null +++ b/unittest/data/TestScreen-invalid.json @@ -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 + } + ] +} diff --git a/unittest/data/TestWidget-invalid.json b/unittest/data/TestWidget-invalid.json new file mode 100644 index 0000000..b43f96f --- /dev/null +++ b/unittest/data/TestWidget-invalid.json @@ -0,0 +1,8 @@ +{ + "x": 16, + "y": 16, + "w": 48, + "h": 48, + "label": "One", + "type": 0 +} diff --git a/unittest/test_screen.c b/unittest/test_screen.c index 6eb7c6e..59aaf30 100644 --- a/unittest/test_screen.c +++ b/unittest/test_screen.c @@ -72,6 +72,11 @@ int test_screen() { struct widget_t *w = NULL; 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)")); s = screen_create_from_file("data/TestScreen.json"); ASSERT(s, "Could not create screen"); diff --git a/unittest/test_widget.c b/unittest/test_widget.c index 368bbc7..a19dabf 100644 --- a/unittest/test_widget.c +++ b/unittest/test_widget.c @@ -1,37 +1,11 @@ #include "test.h" #include "widget.h" -/* - 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) { +static int test_widget_create_from_file(void) { 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); ASSERT(w, "widget_create_from_file()"); 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->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; } int test_widget() { - test_widget_create_from_file("data/TestWidget.json"); + test_widget_create_from_file(); return 0; }