1/* 2 * Copyright (c) 2009-2014 Petri Lehtinen <petri@digip.org> 3 * 4 * Jansson is free software; you can redistribute it and/or modify 5 * it under the terms of the MIT license. See LICENSE for details. 6 */ 7 8#include <jansson.h> 9#include "util.h" 10 11static void test_misc(void) 12{ 13 json_t *array, *five, *seven, *value; 14 size_t i; 15 16 array = json_array(); 17 five = json_integer(5); 18 seven = json_integer(7); 19 20 if(!array) 21 fail("unable to create array"); 22 if(!five || !seven) 23 fail("unable to create integer"); 24 25 if(json_array_size(array) != 0) 26 fail("empty array has nonzero size"); 27 28 if(!json_array_append(array, NULL)) 29 fail("able to append NULL"); 30 31 if(json_array_append(array, five)) 32 fail("unable to append"); 33 34 if(json_array_size(array) != 1) 35 fail("wrong array size"); 36 37 value = json_array_get(array, 0); 38 if(!value) 39 fail("unable to get item"); 40 if(value != five) 41 fail("got wrong value"); 42 43 if(json_array_append(array, seven)) 44 fail("unable to append value"); 45 46 if(json_array_size(array) != 2) 47 fail("wrong array size"); 48 49 value = json_array_get(array, 1); 50 if(!value) 51 fail("unable to get item"); 52 if(value != seven) 53 fail("got wrong value"); 54 55 if(json_array_set(array, 0, seven)) 56 fail("unable to set value"); 57 58 if(!json_array_set(array, 0, NULL)) 59 fail("able to set NULL"); 60 61 if(json_array_size(array) != 2) 62 fail("wrong array size"); 63 64 value = json_array_get(array, 0); 65 if(!value) 66 fail("unable to get item"); 67 if(value != seven) 68 fail("got wrong value"); 69 70 if(json_array_get(array, 2) != NULL) 71 fail("able to get value out of bounds"); 72 73 if(!json_array_set(array, 2, seven)) 74 fail("able to set value out of bounds"); 75 76 for(i = 2; i < 30; i++) { 77 if(json_array_append(array, seven)) 78 fail("unable to append value"); 79 80 if(json_array_size(array) != i + 1) 81 fail("wrong array size"); 82 } 83 84 for(i = 0; i < 30; i++) { 85 value = json_array_get(array, i); 86 if(!value) 87 fail("unable to get item"); 88 if(value != seven) 89 fail("got wrong value"); 90 } 91 92 if(json_array_set_new(array, 15, json_integer(123))) 93 fail("unable to set new value"); 94 95 value = json_array_get(array, 15); 96 if(!json_is_integer(value) || json_integer_value(value) != 123) 97 fail("json_array_set_new works incorrectly"); 98 99 if(!json_array_set_new(array, 15, NULL)) 100 fail("able to set_new NULL value"); 101 102 if(json_array_append_new(array, json_integer(321))) 103 fail("unable to append new value"); 104 105 value = json_array_get(array, json_array_size(array) - 1); 106 if(!json_is_integer(value) || json_integer_value(value) != 321) 107 fail("json_array_append_new works incorrectly"); 108 109 if(!json_array_append_new(array, NULL)) 110 fail("able to append_new NULL value"); 111 112 json_decref(five); 113 json_decref(seven); 114 json_decref(array); 115} 116 117static void test_insert(void) 118{ 119 json_t *array, *five, *seven, *eleven, *value; 120 int i; 121 122 array = json_array(); 123 five = json_integer(5); 124 seven = json_integer(7); 125 eleven = json_integer(11); 126 127 if(!array) 128 fail("unable to create array"); 129 if(!five || !seven || !eleven) 130 fail("unable to create integer"); 131 132 133 if(!json_array_insert(array, 1, five)) 134 fail("able to insert value out of bounds"); 135 136 137 if(json_array_insert(array, 0, five)) 138 fail("unable to insert value in an empty array"); 139 140 if(json_array_get(array, 0) != five) 141 fail("json_array_insert works incorrectly"); 142 143 if(json_array_size(array) != 1) 144 fail("array size is invalid after insertion"); 145 146 147 if(json_array_insert(array, 1, seven)) 148 fail("unable to insert value at the end of an array"); 149 150 if(json_array_get(array, 0) != five) 151 fail("json_array_insert works incorrectly"); 152 153 if(json_array_get(array, 1) != seven) 154 fail("json_array_insert works incorrectly"); 155 156 if(json_array_size(array) != 2) 157 fail("array size is invalid after insertion"); 158 159 160 if(json_array_insert(array, 1, eleven)) 161 fail("unable to insert value in the middle of an array"); 162 163 if(json_array_get(array, 0) != five) 164 fail("json_array_insert works incorrectly"); 165 166 if(json_array_get(array, 1) != eleven) 167 fail("json_array_insert works incorrectly"); 168 169 if(json_array_get(array, 2) != seven) 170 fail("json_array_insert works incorrectly"); 171 172 if(json_array_size(array) != 3) 173 fail("array size is invalid after insertion"); 174 175 176 if(json_array_insert_new(array, 2, json_integer(123))) 177 fail("unable to insert value in the middle of an array"); 178 179 value = json_array_get(array, 2); 180 if(!json_is_integer(value) || json_integer_value(value) != 123) 181 fail("json_array_insert_new works incorrectly"); 182 183 if(json_array_size(array) != 4) 184 fail("array size is invalid after insertion"); 185 186 187 for(i = 0; i < 20; i++) { 188 if(json_array_insert(array, 0, seven)) 189 fail("unable to insert value at the begining of an array"); 190 } 191 192 for(i = 0; i < 20; i++) { 193 if(json_array_get(array, i) != seven) 194 fail("json_aray_insert works incorrectly"); 195 } 196 197 if(json_array_size(array) != 24) 198 fail("array size is invalid after loop insertion"); 199 200 json_decref(five); 201 json_decref(seven); 202 json_decref(eleven); 203 json_decref(array); 204} 205 206static void test_remove(void) 207{ 208 json_t *array, *five, *seven; 209 int i; 210 211 array = json_array(); 212 five = json_integer(5); 213 seven = json_integer(7); 214 215 if(!array) 216 fail("unable to create array"); 217 if(!five) 218 fail("unable to create integer"); 219 if(!seven) 220 fail("unable to create integer"); 221 222 223 if(!json_array_remove(array, 0)) 224 fail("able to remove an unexisting index"); 225 226 227 if(json_array_append(array, five)) 228 fail("unable to append"); 229 230 if(!json_array_remove(array, 1)) 231 fail("able to remove an unexisting index"); 232 233 if(json_array_remove(array, 0)) 234 fail("unable to remove"); 235 236 if(json_array_size(array) != 0) 237 fail("array size is invalid after removing"); 238 239 240 if(json_array_append(array, five) || 241 json_array_append(array, seven) || 242 json_array_append(array, five) || 243 json_array_append(array, seven)) 244 fail("unable to append"); 245 246 if(json_array_remove(array, 2)) 247 fail("unable to remove"); 248 249 if(json_array_size(array) != 3) 250 fail("array size is invalid after removing"); 251 252 if(json_array_get(array, 0) != five || 253 json_array_get(array, 1) != seven || 254 json_array_get(array, 2) != seven) 255 fail("remove works incorrectly"); 256 257 json_decref(array); 258 259 array = json_array(); 260 for(i = 0; i < 4; i++) { 261 json_array_append(array, five); 262 json_array_append(array, seven); 263 } 264 if(json_array_size(array) != 8) 265 fail("unable to append 8 items to array"); 266 267 /* Remove an element from a "full" array. */ 268 json_array_remove(array, 5); 269 270 json_decref(five); 271 json_decref(seven); 272 json_decref(array); 273} 274 275static void test_clear(void) 276{ 277 json_t *array, *five, *seven; 278 int i; 279 280 array = json_array(); 281 five = json_integer(5); 282 seven = json_integer(7); 283 284 if(!array) 285 fail("unable to create array"); 286 if(!five || !seven) 287 fail("unable to create integer"); 288 289 for(i = 0; i < 10; i++) { 290 if(json_array_append(array, five)) 291 fail("unable to append"); 292 } 293 for(i = 0; i < 10; i++) { 294 if(json_array_append(array, seven)) 295 fail("unable to append"); 296 } 297 298 if(json_array_size(array) != 20) 299 fail("array size is invalid after appending"); 300 301 if(json_array_clear(array)) 302 fail("unable to clear"); 303 304 if(json_array_size(array) != 0) 305 fail("array size is invalid after clearing"); 306 307 json_decref(five); 308 json_decref(seven); 309 json_decref(array); 310} 311 312static void test_extend(void) 313{ 314 json_t *array1, *array2, *five, *seven; 315 int i; 316 317 array1 = json_array(); 318 array2 = json_array(); 319 five = json_integer(5); 320 seven = json_integer(7); 321 322 if(!array1 || !array2) 323 fail("unable to create array"); 324 if(!five || !seven) 325 fail("unable to create integer"); 326 327 for(i = 0; i < 10; i++) { 328 if(json_array_append(array1, five)) 329 fail("unable to append"); 330 } 331 for(i = 0; i < 10; i++) { 332 if(json_array_append(array2, seven)) 333 fail("unable to append"); 334 } 335 336 if(json_array_size(array1) != 10 || json_array_size(array2) != 10) 337 fail("array size is invalid after appending"); 338 339 if(json_array_extend(array1, array2)) 340 fail("unable to extend"); 341 342 for(i = 0; i < 10; i++) { 343 if(json_array_get(array1, i) != five) 344 fail("invalid array contents after extending"); 345 } 346 for(i = 10; i < 20; i++) { 347 if(json_array_get(array1, i) != seven) 348 fail("invalid array contents after extending"); 349 } 350 351 json_decref(five); 352 json_decref(seven); 353 json_decref(array1); 354 json_decref(array2); 355} 356 357static void test_circular() 358{ 359 json_t *array1, *array2; 360 361 /* the simple cases are checked */ 362 363 array1 = json_array(); 364 if(!array1) 365 fail("unable to create array"); 366 367 if(json_array_append(array1, array1) == 0) 368 fail("able to append self"); 369 370 if(json_array_insert(array1, 0, array1) == 0) 371 fail("able to insert self"); 372 373 if(json_array_append_new(array1, json_true())) 374 fail("failed to append true"); 375 376 if(json_array_set(array1, 0, array1) == 0) 377 fail("able to set self"); 378 379 json_decref(array1); 380 381 382 /* create circular references */ 383 384 array1 = json_array(); 385 array2 = json_array(); 386 if(!array1 || !array2) 387 fail("unable to create array"); 388 389 if(json_array_append(array1, array2) || 390 json_array_append(array2, array1)) 391 fail("unable to append"); 392 393 /* circularity is detected when dumping */ 394 if(json_dumps(array1, 0) != NULL) 395 fail("able to dump circulars"); 396 397 /* decref twice to deal with the circular references */ 398 json_decref(array1); 399 json_decref(array2); 400 json_decref(array1); 401} 402 403static void test_array_foreach() 404{ 405 size_t index; 406 json_t *array1, *array2, *value; 407 408 array1 = json_pack("[sisisi]", "foo", 1, "bar", 2, "baz", 3); 409 array2 = json_array(); 410 411 json_array_foreach(array1, index, value) { 412 json_array_append(array2, value); 413 } 414 415 if(!json_equal(array1, array2)) 416 fail("json_array_foreach failed to iterate all elements"); 417 418 json_decref(array1); 419 json_decref(array2); 420} 421 422 423static void run_tests() 424{ 425 test_misc(); 426 test_insert(); 427 test_remove(); 428 test_clear(); 429 test_extend(); 430 test_circular(); 431 test_array_foreach(); 432} 433