• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2   Copyright (c) 2009-2017 Dave Gamble and cJSON contributors
3 
4   Permission is hereby granted, free of charge, to any person obtaining a copy
5   of this software and associated documentation files (the "Software"), to deal
6   in the Software without restriction, including without limitation the rights
7   to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8   copies of the Software, and to permit persons to whom the Software is
9   furnished to do so, subject to the following conditions:
10 
11   The above copyright notice and this permission notice shall be included in
12   all copies or substantial portions of the Software.
13 
14   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15   IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16   FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17   AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18   LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
20   THE SOFTWARE.
21 */
22 
23 #include <stdio.h>
24 #include <stdlib.h>
25 #include <string.h>
26 
27 #include "unity/examples/unity_config.h"
28 #include "unity/src/unity.h"
29 #include "common.h"
30 
31 static const char *json = "{\n\
32 \t\"name\":\t\"Awesome 4K\",\n\
33 \t\"resolutions\":\t[{\n\
34 \t\t\t\"width\":\t1280,\n\
35 \t\t\t\"height\":\t720\n\
36 \t\t}, {\n\
37 \t\t\t\"width\":\t1920,\n\
38 \t\t\t\"height\":\t1080\n\
39 \t\t}, {\n\
40 \t\t\t\"width\":\t3840,\n\
41 \t\t\t\"height\":\t2160\n\
42 \t\t}]\n\
43 }";
44 
create_monitor(void)45 static char* create_monitor(void)
46 {
47     const unsigned int resolution_numbers[3][2] = {
48         {1280, 720},
49         {1920, 1080},
50         {3840, 2160}
51     };
52     char *string = NULL;
53     cJSON *name = NULL;
54     cJSON *resolutions = NULL;
55     cJSON *resolution = NULL;
56     cJSON *width = NULL;
57     cJSON *height = NULL;
58     size_t index = 0;
59 
60     cJSON *monitor = cJSON_CreateObject();
61     if (monitor == NULL)
62     {
63         goto end;
64     }
65 
66     name = cJSON_CreateString("Awesome 4K");
67     if (name == NULL)
68     {
69         goto end;
70     }
71     /* after creation was successful, immediately add it to the monitor,
72      * thereby transferring ownership of the pointer to it */
73     cJSON_AddItemToObject(monitor, "name", name);
74 
75     resolutions = cJSON_CreateArray();
76     if (resolutions == NULL)
77     {
78         goto end;
79     }
80     cJSON_AddItemToObject(monitor, "resolutions", resolutions);
81 
82     for (index = 0; index < (sizeof(resolution_numbers) / (2 * sizeof(int))); ++index)
83     {
84         resolution = cJSON_CreateObject();
85         if (resolution == NULL)
86         {
87             goto end;
88         }
89         cJSON_AddItemToArray(resolutions, resolution);
90 
91         width = cJSON_CreateNumber(resolution_numbers[index][0]);
92         if (width == NULL)
93         {
94             goto end;
95         }
96         cJSON_AddItemToObject(resolution, "width", width);
97 
98         height = cJSON_CreateNumber(resolution_numbers[index][1]);
99         if (height == NULL)
100         {
101             goto end;
102         }
103         cJSON_AddItemToObject(resolution, "height", height);
104     }
105 
106     string = cJSON_Print(monitor);
107     if (string == NULL)
108     {
109         fprintf(stderr, "Failed to print monitor.\n");
110     }
111 
112 end:
113     cJSON_Delete(monitor);
114     return string;
115 }
116 
create_monitor_with_helpers(void)117 static char *create_monitor_with_helpers(void)
118 {
119     const unsigned int resolution_numbers[3][2] = {
120         {1280, 720},
121         {1920, 1080},
122         {3840, 2160}
123     };
124     char *string = NULL;
125     cJSON *resolutions = NULL;
126     size_t index = 0;
127 
128     cJSON *monitor = cJSON_CreateObject();
129 
130     if (cJSON_AddStringToObject(monitor, "name", "Awesome 4K") == NULL)
131     {
132         goto end;
133     }
134 
135     resolutions = cJSON_AddArrayToObject(monitor, "resolutions");
136     if (resolutions == NULL)
137     {
138         goto end;
139     }
140 
141     for (index = 0; index < (sizeof(resolution_numbers) / (2 * sizeof(int))); ++index)
142     {
143         cJSON *resolution = cJSON_CreateObject();
144 
145         if (cJSON_AddNumberToObject(resolution, "width", resolution_numbers[index][0]) == NULL)
146         {
147             goto end;
148         }
149 
150         if(cJSON_AddNumberToObject(resolution, "height", resolution_numbers[index][1]) == NULL)
151         {
152             goto end;
153         }
154 
155         cJSON_AddItemToArray(resolutions, resolution);
156     }
157 
158     string = cJSON_Print(monitor);
159     if (string == NULL) {
160         fprintf(stderr, "Failed to print monitor.\n");
161     }
162 
163 end:
164     cJSON_Delete(monitor);
165     return string;
166 }
167 
168 /* return 1 if the monitor supports full hd, 0 otherwise */
supports_full_hd(const char * const monitor)169 static int supports_full_hd(const char * const monitor)
170 {
171     const cJSON *resolution = NULL;
172     const cJSON *resolutions = NULL;
173     const cJSON *name = NULL;
174     int status = 0;
175     cJSON *monitor_json = cJSON_Parse(monitor);
176     if (monitor_json == NULL)
177     {
178         const char *error_ptr = cJSON_GetErrorPtr();
179         if (error_ptr != NULL)
180         {
181             fprintf(stderr, "Error before: %s\n", error_ptr);
182         }
183         status = 0;
184         goto end;
185     }
186 
187     name = cJSON_GetObjectItemCaseSensitive(monitor_json, "name");
188     if (cJSON_IsString(name) && (name->valuestring != NULL))
189     {
190         printf("Checking monitor \"%s\"\n", name->valuestring);
191     }
192 
193     resolutions = cJSON_GetObjectItemCaseSensitive(monitor_json, "resolutions");
194     cJSON_ArrayForEach(resolution, resolutions)
195     {
196         cJSON *width = cJSON_GetObjectItemCaseSensitive(resolution, "width");
197         cJSON *height = cJSON_GetObjectItemCaseSensitive(resolution, "height");
198 
199         if (!cJSON_IsNumber(width) || !cJSON_IsNumber(height))
200         {
201             status = 0;
202             goto end;
203         }
204 
205         if (compare_double(width->valuedouble, 1920) && compare_double(height->valuedouble, 1080))
206         {
207             status = 1;
208             goto end;
209         }
210     }
211 
212 end:
213     cJSON_Delete(monitor_json);
214     return status;
215 }
216 
create_monitor_should_create_a_monitor(void)217 static void create_monitor_should_create_a_monitor(void)
218 {
219     char *monitor = create_monitor();
220 
221     TEST_ASSERT_EQUAL_STRING(monitor, json);
222 
223     free(monitor);
224 }
225 
create_monitor_with_helpers_should_create_a_monitor(void)226 static void create_monitor_with_helpers_should_create_a_monitor(void)
227 {
228     char *monitor = create_monitor_with_helpers();
229 
230     TEST_ASSERT_EQUAL_STRING(json, monitor);
231 
232     free(monitor);
233 }
234 
supports_full_hd_should_check_for_full_hd_support(void)235 static void supports_full_hd_should_check_for_full_hd_support(void)
236 {
237     static const char *monitor_without_hd = "{\n\
238 \t\t\"name\": \"lame monitor\",\n\
239 \t\t\"resolutions\":\t[{\n\
240 \t\t\t\"width\":\t640,\n\
241 \t\t\t\"height\":\t480\n\
242 \t\t}]\n\
243 }";
244 
245     TEST_ASSERT(supports_full_hd(json));
246     TEST_ASSERT_FALSE(supports_full_hd(monitor_without_hd));
247 }
248 
main(void)249 int CJSON_CDECL main(void)
250 {
251     UNITY_BEGIN();
252 
253     RUN_TEST(create_monitor_should_create_a_monitor);
254     RUN_TEST(create_monitor_with_helpers_should_create_a_monitor);
255     RUN_TEST(supports_full_hd_should_check_for_full_hd_support);
256 
257     return UNITY_END();
258 }
259