123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258 |
- /*
- 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 transferring 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 (compare_double(width->valuedouble, 1920) && compare_double(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 CJSON_CDECL 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();
- }
|