Przeglądaj źródła

Tests: Test if the readme examples are working

Max Bruckner 7 lat temu
rodzic
commit
e7d0c1dc37
2 zmienionych plików z 259 dodań i 0 usunięć
  1. 1 0
      tests/CMakeLists.txt
  2. 258 0
      tests/readme_examples.c

+ 1 - 0
tests/CMakeLists.txt

@@ -56,6 +56,7 @@ if(ENABLE_CJSON_TEST)
         parse_with_opts
         parse_with_opts
         compare_tests
         compare_tests
         cjson_add
         cjson_add
+        readme_examples
     )
     )
 
 
     option(ENABLE_VALGRIND OFF "Enable the valgrind memory checker for the tests.")
     option(ENABLE_VALGRIND OFF "Enable the valgrind memory checker for the tests.")

+ 258 - 0
tests/readme_examples.c

@@ -0,0 +1,258 @@
+/*
+  Copyright (c) 2009-2017 Dave Gamble and cJSON contributors
+
+  Permission is hereby granted, free of charge, to any person obtaining a copy
+  of this software and associated documentation files (the "Software"), to deal
+  in the Software without restriction, including without limitation the rights
+  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+  copies of the Software, and to permit persons to whom the Software is
+  furnished to do so, subject to the following conditions:
+
+  The above copyright notice and this permission notice shall be included in
+  all copies or substantial portions of the Software.
+
+  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+  THE SOFTWARE.
+*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "unity/examples/unity_config.h"
+#include "unity/src/unity.h"
+#include "common.h"
+
+static const char *json = "{\n\
+\t\"name\":\t\"Awesome 4K\",\n\
+\t\"resolutions\":\t[{\n\
+\t\t\t\"width\":\t1280,\n\
+\t\t\t\"height\":\t720\n\
+\t\t}, {\n\
+\t\t\t\"width\":\t1920,\n\
+\t\t\t\"height\":\t1080\n\
+\t\t}, {\n\
+\t\t\t\"width\":\t3840,\n\
+\t\t\t\"height\":\t2160\n\
+\t\t}]\n\
+}";
+
+static char* create_monitor(void)
+{
+    const unsigned int resolution_numbers[3][2] = {
+        {1280, 720},
+        {1920, 1080},
+        {3840, 2160}
+    };
+    char *string = NULL;
+    cJSON *name = NULL;
+    cJSON *resolutions = NULL;
+    cJSON *resolution = NULL;
+    cJSON *width = NULL;
+    cJSON *height = NULL;
+    size_t index = 0;
+
+    cJSON *monitor = cJSON_CreateObject();
+    if (monitor == NULL)
+    {
+        goto end;
+    }
+
+    name = cJSON_CreateString("Awesome 4K");
+    if (name == NULL)
+    {
+        goto end;
+    }
+    /* after creation was successful, immediately add it to the monitor,
+     * thereby transfering ownership of the pointer to it */
+    cJSON_AddItemToObject(monitor, "name", name);
+
+    resolutions = cJSON_CreateArray();
+    if (resolutions == NULL)
+    {
+        goto end;
+    }
+    cJSON_AddItemToObject(monitor, "resolutions", resolutions);
+
+    for (index = 0; index < (sizeof(resolution_numbers) / (2 * sizeof(int))); ++index)
+    {
+        resolution = cJSON_CreateObject();
+        if (resolution == NULL)
+        {
+            goto end;
+        }
+        cJSON_AddItemToArray(resolutions, resolution);
+
+        width = cJSON_CreateNumber(resolution_numbers[index][0]);
+        if (width == NULL)
+        {
+            goto end;
+        }
+        cJSON_AddItemToObject(resolution, "width", width);
+
+        height = cJSON_CreateNumber(resolution_numbers[index][1]);
+        if (height == NULL)
+        {
+            goto end;
+        }
+        cJSON_AddItemToObject(resolution, "height", height);
+    }
+
+    string = cJSON_Print(monitor);
+    if (string == NULL)
+    {
+        fprintf(stderr, "Failed to print monitor.\n");
+    }
+
+end:
+    cJSON_Delete(monitor);
+    return string;
+}
+
+static char *create_monitor_with_helpers(void)
+{
+    const unsigned int resolution_numbers[3][2] = {
+        {1280, 720},
+        {1920, 1080},
+        {3840, 2160}
+    };
+    char *string = NULL;
+    cJSON *resolutions = NULL;
+    size_t index = 0;
+
+    cJSON *monitor = cJSON_CreateObject();
+
+    if (cJSON_AddStringToObject(monitor, "name", "Awesome 4K") == NULL)
+    {
+        goto end;
+    }
+
+    resolutions = cJSON_AddArrayToObject(monitor, "resolutions");
+    if (resolutions == NULL)
+    {
+        goto end;
+    }
+
+    for (index = 0; index < (sizeof(resolution_numbers) / (2 * sizeof(int))); ++index)
+    {
+        cJSON *resolution = cJSON_CreateObject();
+
+        if (cJSON_AddNumberToObject(resolution, "width", resolution_numbers[index][0]) == NULL)
+        {
+            goto end;
+        }
+
+        if(cJSON_AddNumberToObject(resolution, "height", resolution_numbers[index][1]) == NULL)
+        {
+            goto end;
+        }
+
+        cJSON_AddItemToArray(resolutions, resolution);
+    }
+
+    string = cJSON_Print(monitor);
+    if (string == NULL) {
+        fprintf(stderr, "Failed to print monitor.\n");
+    }
+
+end:
+    cJSON_Delete(monitor);
+    return string;
+}
+
+/* return 1 if the monitor supports full hd, 0 otherwise */
+static int supports_full_hd(const char * const monitor)
+{
+    const cJSON *resolution = NULL;
+    const cJSON *resolutions = NULL;
+    const cJSON *name = NULL;
+    int status = 0;
+    cJSON *monitor_json = cJSON_Parse(monitor);
+    if (monitor_json == NULL)
+    {
+        const char *error_ptr = cJSON_GetErrorPtr();
+        if (error_ptr != NULL)
+        {
+            fprintf(stderr, "Error before: %s\n", error_ptr);
+        }
+        status = 0;
+        goto end;
+    }
+
+    name = cJSON_GetObjectItemCaseSensitive(monitor_json, "name");
+    if (cJSON_IsString(name) && (name->valuestring != NULL))
+    {
+        printf("Checking monitor \"%s\"\n", name->valuestring);
+    }
+
+    resolutions = cJSON_GetObjectItemCaseSensitive(monitor_json, "resolutions");
+    cJSON_ArrayForEach(resolution, resolutions)
+    {
+        cJSON *width = cJSON_GetObjectItemCaseSensitive(resolution, "width");
+        cJSON *height = cJSON_GetObjectItemCaseSensitive(resolution, "height");
+
+        if (!cJSON_IsNumber(width) || !cJSON_IsNumber(height))
+        {
+            status = 0;
+            goto end;
+        }
+
+        if ((width->valuedouble == 1920) && (height->valuedouble == 1080))
+        {
+            status = 1;
+            goto end;
+        }
+    }
+
+end:
+    cJSON_Delete(monitor_json);
+    return status;
+}
+
+static void create_monitor_should_create_a_monitor(void)
+{
+    char *monitor = create_monitor();
+
+    TEST_ASSERT_EQUAL_STRING(monitor, json);
+
+    free(monitor);
+}
+
+static void create_monitor_with_helpers_should_create_a_monitor(void)
+{
+    char *monitor = create_monitor_with_helpers();
+
+    TEST_ASSERT_EQUAL_STRING(json, monitor);
+
+    free(monitor);
+}
+
+static void supports_full_hd_should_check_for_full_hd_support(void)
+{
+    static const char *monitor_without_hd = "{\n\
+\t\t\"name\": \"lame monitor\",\n\
+\t\t\"resolutions\":\t[{\n\
+\t\t\t\"width\":\t640,\n\
+\t\t\t\"height\":\t480\n\
+\t\t}]\n\
+}";
+
+    TEST_ASSERT(supports_full_hd(json));
+    TEST_ASSERT_FALSE(supports_full_hd(monitor_without_hd));
+}
+
+int main(void)
+{
+    UNITY_BEGIN();
+
+    RUN_TEST(create_monitor_should_create_a_monitor);
+    RUN_TEST(create_monitor_with_helpers_should_create_a_monitor);
+    RUN_TEST(supports_full_hd_should_check_for_full_hd_support);
+
+    return UNITY_END();
+}