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 "unity/examples/unity_config.h"
24 #include "unity/src/unity.h"
25 #include "common.h"
26
compare_from_string(const char * const a,const char * const b,const cJSON_bool case_sensitive)27 static cJSON_bool compare_from_string(const char * const a, const char * const b, const cJSON_bool case_sensitive)
28 {
29 cJSON *a_json = NULL;
30 cJSON *b_json = NULL;
31 cJSON_bool result = false;
32
33 a_json = cJSON_Parse(a);
34 TEST_ASSERT_NOT_NULL_MESSAGE(a_json, "Failed to parse a.");
35 b_json = cJSON_Parse(b);
36 TEST_ASSERT_NOT_NULL_MESSAGE(b_json, "Failed to parse b.");
37
38 result = cJSON_Compare(a_json, b_json, case_sensitive);
39
40 cJSON_Delete(a_json);
41 cJSON_Delete(b_json);
42
43 return result;
44 }
45
cjson_compare_should_compare_null_pointer_as_not_equal(void)46 static void cjson_compare_should_compare_null_pointer_as_not_equal(void)
47 {
48 TEST_ASSERT_FALSE(cJSON_Compare(NULL, NULL, true));
49 TEST_ASSERT_FALSE(cJSON_Compare(NULL, NULL, false));
50 }
51
cjson_compare_should_compare_invalid_as_not_equal(void)52 static void cjson_compare_should_compare_invalid_as_not_equal(void)
53 {
54 cJSON invalid[1];
55 memset(invalid, '\0', sizeof(invalid));
56
57 TEST_ASSERT_FALSE(cJSON_Compare(invalid, invalid, false));
58 TEST_ASSERT_FALSE(cJSON_Compare(invalid, invalid, true));
59 }
60
cjson_compare_should_compare_numbers(void)61 static void cjson_compare_should_compare_numbers(void)
62 {
63 TEST_ASSERT_TRUE(compare_from_string("1", "1", true));
64 TEST_ASSERT_TRUE(compare_from_string("1", "1", false));
65 TEST_ASSERT_TRUE(compare_from_string("0.0001", "0.0001", true));
66 TEST_ASSERT_TRUE(compare_from_string("0.0001", "0.0001", false));
67 TEST_ASSERT_TRUE(compare_from_string("1E100", "10E99", false));
68
69 TEST_ASSERT_FALSE(compare_from_string("0.5E-100", "0.5E-101", false));
70
71 TEST_ASSERT_FALSE(compare_from_string("1", "2", true));
72 TEST_ASSERT_FALSE(compare_from_string("1", "2", false));
73 }
74
75 #ifdef __CJSON_USE_INT64
cjson_compare_should_compare_int64_numbers(void)76 static void cjson_compare_should_compare_int64_numbers(void)
77 {
78 TEST_ASSERT_TRUE(compare_from_string("1LL", "1LL", true));
79 TEST_ASSERT_TRUE(compare_from_string("1LL", "1LL", false));
80 TEST_ASSERT_TRUE(compare_from_string("9223372036854775807LL", "9223372036854775807LL", true));
81 TEST_ASSERT_TRUE(compare_from_string("9223372036854775807LL", "9223372036854775807LL", false));
82 TEST_ASSERT_TRUE(compare_from_string("-9223372036854775808LL", "-9223372036854775808LL", true));
83 TEST_ASSERT_TRUE(compare_from_string("-9223372036854775808LL", "-9223372036854775808LL", false));
84
85 TEST_ASSERT_FALSE(compare_from_string("1LL", "2LL", true));
86 TEST_ASSERT_FALSE(compare_from_string("1LL", "2LL", false));
87 }
88 #endif /* __CJSON_USE_INT64 */
89
cjson_compare_should_compare_booleans(void)90 static void cjson_compare_should_compare_booleans(void)
91 {
92 /* true */
93 TEST_ASSERT_TRUE(compare_from_string("true", "true", true));
94 TEST_ASSERT_TRUE(compare_from_string("true", "true", false));
95
96 /* false */
97 TEST_ASSERT_TRUE(compare_from_string("false", "false", true));
98 TEST_ASSERT_TRUE(compare_from_string("false", "false", false));
99
100 /* mixed */
101 TEST_ASSERT_FALSE(compare_from_string("true", "false", true));
102 TEST_ASSERT_FALSE(compare_from_string("true", "false", false));
103 TEST_ASSERT_FALSE(compare_from_string("false", "true", true));
104 TEST_ASSERT_FALSE(compare_from_string("false", "true", false));
105 }
106
cjson_compare_should_compare_null(void)107 static void cjson_compare_should_compare_null(void)
108 {
109 TEST_ASSERT_TRUE(compare_from_string("null", "null", true));
110 TEST_ASSERT_TRUE(compare_from_string("null", "null", false));
111
112 TEST_ASSERT_FALSE(compare_from_string("null", "true", true));
113 TEST_ASSERT_FALSE(compare_from_string("null", "true", false));
114 }
115
cjson_compare_should_not_accept_invalid_types(void)116 static void cjson_compare_should_not_accept_invalid_types(void)
117 {
118 cJSON invalid[1];
119 memset(invalid, '\0', sizeof(invalid));
120
121 invalid->type = cJSON_Number | cJSON_String;
122
123 TEST_ASSERT_FALSE(cJSON_Compare(invalid, invalid, true));
124 TEST_ASSERT_FALSE(cJSON_Compare(invalid, invalid, false));
125 }
126
cjson_compare_should_compare_strings(void)127 static void cjson_compare_should_compare_strings(void)
128 {
129 TEST_ASSERT_TRUE(compare_from_string("\"abcdefg\"", "\"abcdefg\"", true));
130 TEST_ASSERT_TRUE(compare_from_string("\"abcdefg\"", "\"abcdefg\"", false));
131
132 TEST_ASSERT_FALSE(compare_from_string("\"ABCDEFG\"", "\"abcdefg\"", true));
133 TEST_ASSERT_FALSE(compare_from_string("\"ABCDEFG\"", "\"abcdefg\"", false));
134 }
135
cjson_compare_should_compare_raw(void)136 static void cjson_compare_should_compare_raw(void)
137 {
138 cJSON *raw1 = NULL;
139 cJSON *raw2 = NULL;
140
141 raw1 = cJSON_Parse("\"[true, false]\"");
142 TEST_ASSERT_NOT_NULL(raw1);
143 raw2 = cJSON_Parse("\"[true, false]\"");
144 TEST_ASSERT_NOT_NULL(raw2);
145
146 raw1->type = cJSON_Raw;
147 raw2->type = cJSON_Raw;
148
149 TEST_ASSERT_TRUE(cJSON_Compare(raw1, raw2, true));
150 TEST_ASSERT_TRUE(cJSON_Compare(raw1, raw2, false));
151
152 cJSON_Delete(raw1);
153 cJSON_Delete(raw2);
154 }
155
cjson_compare_should_compare_arrays(void)156 static void cjson_compare_should_compare_arrays(void)
157 {
158 TEST_ASSERT_TRUE(compare_from_string("[]", "[]", true));
159 TEST_ASSERT_TRUE(compare_from_string("[]", "[]", false));
160
161 TEST_ASSERT_TRUE(compare_from_string("[false,true,null,42,\"string\",[],{}]", "[false, true, null, 42, \"string\", [], {}]", true));
162 TEST_ASSERT_TRUE(compare_from_string("[false,true,null,42,\"string\",[],{}]", "[false, true, null, 42, \"string\", [], {}]", false));
163
164 TEST_ASSERT_TRUE(compare_from_string("[[[1], 2]]", "[[[1], 2]]", true));
165 TEST_ASSERT_TRUE(compare_from_string("[[[1], 2]]", "[[[1], 2]]", false));
166
167 TEST_ASSERT_FALSE(compare_from_string("[true,null,42,\"string\",[],{}]", "[false, true, null, 42, \"string\", [], {}]", true));
168 TEST_ASSERT_FALSE(compare_from_string("[true,null,42,\"string\",[],{}]", "[false, true, null, 42, \"string\", [], {}]", false));
169
170 /* Arrays that are a prefix of another array */
171 TEST_ASSERT_FALSE(compare_from_string("[1,2,3]", "[1,2]", true));
172 TEST_ASSERT_FALSE(compare_from_string("[1,2,3]", "[1,2]", false));
173 }
174
cjson_compare_should_compare_objects(void)175 static void cjson_compare_should_compare_objects(void)
176 {
177 TEST_ASSERT_TRUE(compare_from_string("{}", "{}", true));
178 TEST_ASSERT_TRUE(compare_from_string("{}", "{}", false));
179
180 TEST_ASSERT_TRUE(compare_from_string(
181 "{\"false\": false, \"true\": true, \"null\": null, \"number\": 42, \"string\": \"string\", \"array\": [], \"object\": {}}",
182 "{\"true\": true, \"false\": false, \"null\": null, \"number\": 42, \"string\": \"string\", \"array\": [], \"object\": {}}",
183 true));
184 TEST_ASSERT_FALSE(compare_from_string(
185 "{\"False\": false, \"true\": true, \"null\": null, \"number\": 42, \"string\": \"string\", \"array\": [], \"object\": {}}",
186 "{\"true\": true, \"false\": false, \"null\": null, \"number\": 42, \"string\": \"string\", \"array\": [], \"object\": {}}",
187 true));
188 TEST_ASSERT_TRUE(compare_from_string(
189 "{\"False\": false, \"true\": true, \"null\": null, \"number\": 42, \"string\": \"string\", \"array\": [], \"object\": {}}",
190 "{\"true\": true, \"false\": false, \"null\": null, \"number\": 42, \"string\": \"string\", \"array\": [], \"object\": {}}",
191 false));
192 TEST_ASSERT_FALSE(compare_from_string(
193 "{\"Flse\": false, \"true\": true, \"null\": null, \"number\": 42, \"string\": \"string\", \"array\": [], \"object\": {}}",
194 "{\"true\": true, \"false\": false, \"null\": null, \"number\": 42, \"string\": \"string\", \"array\": [], \"object\": {}}",
195 false));
196 /* test objects that are a subset of each other */
197 TEST_ASSERT_FALSE(compare_from_string(
198 "{\"one\": 1, \"two\": 2}",
199 "{\"one\": 1, \"two\": 2, \"three\": 3}",
200 true))
201 TEST_ASSERT_FALSE(compare_from_string(
202 "{\"one\": 1, \"two\": 2}",
203 "{\"one\": 1, \"two\": 2, \"three\": 3}",
204 false))
205 }
206
main(void)207 int CJSON_CDECL main(void)
208 {
209 UNITY_BEGIN();
210
211 RUN_TEST(cjson_compare_should_compare_null_pointer_as_not_equal);
212 RUN_TEST(cjson_compare_should_compare_invalid_as_not_equal);
213 RUN_TEST(cjson_compare_should_compare_numbers);
214 #ifdef __CJSON_USE_INT64
215 RUN_TEST(cjson_compare_should_compare_int64_numbers);
216 #endif
217 RUN_TEST(cjson_compare_should_compare_booleans);
218 RUN_TEST(cjson_compare_should_compare_null);
219 RUN_TEST(cjson_compare_should_not_accept_invalid_types);
220 RUN_TEST(cjson_compare_should_compare_strings);
221 RUN_TEST(cjson_compare_should_compare_raw);
222 RUN_TEST(cjson_compare_should_compare_arrays);
223 RUN_TEST(cjson_compare_should_compare_objects);
224
225 return UNITY_END();
226 }
227