| 201 cxstring value; |
200 cxstring value; |
| 202 const char *str; |
201 const char *str; |
| 203 |
202 |
| 204 CX_TEST_DO { |
203 CX_TEST_DO { |
| 205 str = ""; |
204 str = ""; |
| 206 cxPropertiesFill(&prop, str); |
205 CX_TEST_ASSERT(0 == cxPropertiesFill(&prop, str)); |
| 207 result = cxPropertiesNext(&prop, &key, &value); |
206 result = cxPropertiesNext(&prop, &key, &value); |
| 208 CX_TEST_ASSERT(result == CX_PROPERTIES_NO_DATA); |
207 CX_TEST_ASSERT(result == CX_PROPERTIES_NO_DATA); |
| 209 |
208 |
| 210 str = " \n"; |
209 str = " \n"; |
| 211 cxPropertiesFill(&prop, str); |
210 CX_TEST_ASSERT(0 == cxPropertiesFill(&prop, str)); |
| 212 result = cxPropertiesNext(&prop, &key, &value); |
211 result = cxPropertiesNext(&prop, &key, &value); |
| 213 CX_TEST_ASSERT(result == CX_PROPERTIES_NO_DATA); |
212 CX_TEST_ASSERT(result == CX_PROPERTIES_NO_DATA); |
| 214 |
213 |
| 215 str = "name"; |
214 str = "name"; |
| 216 cxPropertiesFill(&prop, str); |
215 CX_TEST_ASSERT(0 == cxPropertiesFill(&prop, str)); |
| 217 result = cxPropertiesNext(&prop, &key, &value); |
216 result = cxPropertiesNext(&prop, &key, &value); |
| 218 CX_TEST_ASSERT(result == CX_PROPERTIES_INCOMPLETE_DATA); |
217 CX_TEST_ASSERT(result == CX_PROPERTIES_INCOMPLETE_DATA); |
| 219 |
218 |
| 220 str = " "; |
219 str = " "; |
| 221 cxPropertiesFill(&prop, str); |
220 CX_TEST_ASSERT(0 == cxPropertiesFill(&prop, str)); |
| 222 result = cxPropertiesNext(&prop, &key, &value); |
221 result = cxPropertiesNext(&prop, &key, &value); |
| 223 CX_TEST_ASSERT(result == CX_PROPERTIES_INCOMPLETE_DATA); |
222 CX_TEST_ASSERT(result == CX_PROPERTIES_INCOMPLETE_DATA); |
| 224 |
223 |
| 225 // call fill twice in a row |
224 // call fill twice in a row |
| 226 str = "= "; |
225 str = "= "; |
| 227 cxPropertiesFill(&prop, str); |
226 CX_TEST_ASSERT(0 == cxPropertiesFill(&prop, str)); |
| 228 str = "value"; |
227 str = "value"; |
| 229 cxPropertiesFill(&prop, str); |
228 CX_TEST_ASSERT(0 == cxPropertiesFill(&prop, str)); |
| 230 result = cxPropertiesNext(&prop, &key, &value); |
229 result = cxPropertiesNext(&prop, &key, &value); |
| 231 CX_TEST_ASSERT(result == CX_PROPERTIES_INCOMPLETE_DATA); |
230 CX_TEST_ASSERT(result == CX_PROPERTIES_INCOMPLETE_DATA); |
| 232 |
231 |
| 233 str = "\n"; |
232 str = "\n"; |
| 234 cxPropertiesFill(&prop, str); |
233 CX_TEST_ASSERT(0 == cxPropertiesFill(&prop, str)); |
| 235 result = cxPropertiesNext(&prop, &key, &value); |
234 result = cxPropertiesNext(&prop, &key, &value); |
| 236 CX_TEST_ASSERT(result == CX_PROPERTIES_NO_ERROR); |
235 CX_TEST_ASSERT(result == CX_PROPERTIES_NO_ERROR); |
| 237 CX_TEST_ASSERT(0 == cx_strcmp(key, cx_str("name"))); |
236 CX_TEST_ASSERT(0 == cx_strcmp(key, cx_str("name"))); |
| 238 CX_TEST_ASSERT(0 == cx_strcmp(value, cx_str("value"))); |
237 CX_TEST_ASSERT(0 == cx_strcmp(value, cx_str("value"))); |
| 239 |
238 |
| 240 // second round |
239 // second round |
| 241 str = "#comment\n"; |
240 str = "#comment\n"; |
| 242 cxPropertiesFill(&prop, str); |
241 CX_TEST_ASSERT(0 == cxPropertiesFill(&prop, str)); |
| 243 result = cxPropertiesNext(&prop, &key, &value); |
242 result = cxPropertiesNext(&prop, &key, &value); |
| 244 CX_TEST_ASSERT(result == CX_PROPERTIES_NO_DATA); |
243 CX_TEST_ASSERT(result == CX_PROPERTIES_NO_DATA); |
| 245 |
244 |
| 246 str = "#comment\nname2 = "; |
245 str = "#comment\nname2 = "; |
| 247 cxPropertiesFill(&prop, str); |
246 CX_TEST_ASSERT(0 == cxPropertiesFill(&prop, str)); |
| 248 result = cxPropertiesNext(&prop, &key, &value); |
247 result = cxPropertiesNext(&prop, &key, &value); |
| 249 CX_TEST_ASSERT(result == CX_PROPERTIES_INCOMPLETE_DATA); |
248 CX_TEST_ASSERT(result == CX_PROPERTIES_INCOMPLETE_DATA); |
| 250 |
249 |
| 251 str = "value2\na = b\n"; |
250 str = "value2\na = b\n"; |
| 252 cxPropertiesFill(&prop, str); |
251 CX_TEST_ASSERT(0 == cxPropertiesFill(&prop, str)); |
| 253 result = cxPropertiesNext(&prop, &key, &value); |
252 result = cxPropertiesNext(&prop, &key, &value); |
| 254 CX_TEST_ASSERT(result == CX_PROPERTIES_NO_ERROR); |
253 CX_TEST_ASSERT(result == CX_PROPERTIES_NO_ERROR); |
| 255 CX_TEST_ASSERT(0 == cx_strcmp(key, cx_str("name2"))); |
254 CX_TEST_ASSERT(0 == cx_strcmp(key, cx_str("name2"))); |
| 256 CX_TEST_ASSERT(0 == cx_strcmp(value, cx_str("value2"))); |
255 CX_TEST_ASSERT(0 == cx_strcmp(value, cx_str("value2"))); |
| 257 |
256 |
| 259 CX_TEST_ASSERT(result == CX_PROPERTIES_NO_ERROR); |
258 CX_TEST_ASSERT(result == CX_PROPERTIES_NO_ERROR); |
| 260 CX_TEST_ASSERT(0 == cx_strcmp(key, cx_str("a"))); |
259 CX_TEST_ASSERT(0 == cx_strcmp(key, cx_str("a"))); |
| 261 CX_TEST_ASSERT(0 == cx_strcmp(value, cx_str("b"))); |
260 CX_TEST_ASSERT(0 == cx_strcmp(value, cx_str("b"))); |
| 262 |
261 |
| 263 str = "# comment\n#\n#\ntests = "; |
262 str = "# comment\n#\n#\ntests = "; |
| 264 cxPropertiesFill(&prop, str); |
263 CX_TEST_ASSERT(0 == cxPropertiesFill(&prop, str)); |
| 265 result = cxPropertiesNext(&prop, &key, &value); |
264 result = cxPropertiesNext(&prop, &key, &value); |
| 266 CX_TEST_ASSERT(result == CX_PROPERTIES_INCOMPLETE_DATA); |
265 CX_TEST_ASSERT(result == CX_PROPERTIES_INCOMPLETE_DATA); |
| 267 |
266 |
| 268 str = "test1 "; |
267 str = "test1 "; |
| 269 cxPropertiesFill(&prop, str); |
268 CX_TEST_ASSERT(0 == cxPropertiesFill(&prop, str)); |
| 270 result = cxPropertiesNext(&prop, &key, &value); |
269 result = cxPropertiesNext(&prop, &key, &value); |
| 271 CX_TEST_ASSERT(result == CX_PROPERTIES_INCOMPLETE_DATA); |
270 CX_TEST_ASSERT(result == CX_PROPERTIES_INCOMPLETE_DATA); |
| 272 |
271 |
| 273 str = "test2 test3 test4\n"; |
272 str = "test2 test3 test4\n"; |
| 274 cxPropertiesFill(&prop, str); |
273 CX_TEST_ASSERT(0 == cxPropertiesFill(&prop, str)); |
| 275 result = cxPropertiesNext(&prop, &key, &value); |
274 result = cxPropertiesNext(&prop, &key, &value); |
| 276 CX_TEST_ASSERT(result == CX_PROPERTIES_NO_ERROR); |
275 CX_TEST_ASSERT(result == CX_PROPERTIES_NO_ERROR); |
| 277 CX_TEST_ASSERT(0 == cx_strcmp(key, cx_str("tests"))); |
276 CX_TEST_ASSERT(0 == cx_strcmp(key, cx_str("tests"))); |
| 278 CX_TEST_ASSERT(0 == cx_strcmp(value, cx_str("test1 test2 test3 test4"))); |
277 CX_TEST_ASSERT(0 == cx_strcmp(value, cx_str("test1 test2 test3 test4"))); |
| 279 |
278 |
| 280 // test if cxPropertiesNext finds a name/value after a comment |
279 // test if cxPropertiesNext finds a name/value after a comment |
| 281 str = "# just a comment"; |
280 str = "# just a comment"; |
| 282 cxPropertiesFill(&prop, str); |
281 CX_TEST_ASSERT(0 == cxPropertiesFill(&prop, str)); |
| 283 result = cxPropertiesNext(&prop, &key, &value); |
282 result = cxPropertiesNext(&prop, &key, &value); |
| 284 CX_TEST_ASSERT(result == CX_PROPERTIES_INCOMPLETE_DATA); |
283 CX_TEST_ASSERT(result == CX_PROPERTIES_INCOMPLETE_DATA); |
| 285 |
284 |
| 286 str = " in 3"; |
285 str = " in 3"; |
| 287 cxPropertiesFill(&prop, str); |
286 CX_TEST_ASSERT(0 == cxPropertiesFill(&prop, str)); |
| 288 result = cxPropertiesNext(&prop, &key, &value); |
287 result = cxPropertiesNext(&prop, &key, &value); |
| 289 CX_TEST_ASSERT(result == CX_PROPERTIES_INCOMPLETE_DATA); |
288 CX_TEST_ASSERT(result == CX_PROPERTIES_INCOMPLETE_DATA); |
| 290 |
289 |
| 291 str = " parts\nx = 1\n"; |
290 str = " parts\nx = 1\n"; |
| 292 cxPropertiesFill(&prop, str); |
291 CX_TEST_ASSERT(0 == cxPropertiesFill(&prop, str)); |
| 293 result = cxPropertiesNext(&prop, &key, &value); |
292 result = cxPropertiesNext(&prop, &key, &value); |
| 294 CX_TEST_ASSERT(result == CX_PROPERTIES_NO_ERROR); |
293 CX_TEST_ASSERT(result == CX_PROPERTIES_NO_ERROR); |
| 295 CX_TEST_ASSERT(0 == cx_strcmp(key, cx_str("x"))); |
294 CX_TEST_ASSERT(0 == cx_strcmp(key, cx_str("x"))); |
| 296 CX_TEST_ASSERT(0 == cx_strcmp(value, cx_str("1"))); |
295 CX_TEST_ASSERT(0 == cx_strcmp(value, cx_str("1"))); |
| 297 |
296 |
| 298 // finally we are done |
297 // finally we are done |
| 299 result = cxPropertiesNext(&prop, &key, &value); |
298 result = cxPropertiesNext(&prop, &key, &value); |
| 300 CX_TEST_ASSERT(result == CX_PROPERTIES_NO_DATA); |
299 CX_TEST_ASSERT(result == CX_PROPERTIES_NO_DATA); |
| 301 } |
300 } |
| 302 cxPropertiesDestroy(&prop); |
301 cxPropertiesDestroy(&prop); |
| 519 CX_TEST_ASSERT(cx_testing_allocator_verify(&talloc)); |
517 CX_TEST_ASSERT(cx_testing_allocator_verify(&talloc)); |
| 520 } |
518 } |
| 521 cx_testing_allocator_destroy(&talloc); |
519 cx_testing_allocator_destroy(&talloc); |
| 522 } |
520 } |
| 523 |
521 |
| |
522 CX_TEST(test_properties_multiple_fill) { |
| |
523 const char *props1 = "key1 = value1\n"; |
| |
524 const char *props2 = "key2 = value2\n"; |
| |
525 const char *props3 = "key3 = value3\n"; |
| |
526 |
| |
527 CxProperties prop; |
| |
528 cxPropertiesInitDefault(&prop); |
| |
529 CxPropertiesStatus result; |
| |
530 cxstring key; |
| |
531 cxstring value; |
| |
532 CX_TEST_DO { |
| |
533 cxPropertiesFill(&prop, props1); |
| |
534 cxPropertiesFill(&prop, props2); |
| |
535 cxPropertiesFill(&prop, props3); |
| |
536 result = cxPropertiesNext(&prop, &key, &value); |
| |
537 CX_TEST_ASSERT(result == CX_PROPERTIES_NO_ERROR); |
| |
538 CX_TEST_ASSERT(0 == cx_strcmp(key, cx_str("key1"))); |
| |
539 CX_TEST_ASSERT(0 == cx_strcmp(value, cx_str("value1"))); |
| |
540 result = cxPropertiesNext(&prop, &key, &value); |
| |
541 CX_TEST_ASSERT(result == CX_PROPERTIES_NO_ERROR); |
| |
542 CX_TEST_ASSERT(0 == cx_strcmp(key, cx_str("key2"))); |
| |
543 CX_TEST_ASSERT(0 == cx_strcmp(value, cx_str("value2"))); |
| |
544 result = cxPropertiesNext(&prop, &key, &value); |
| |
545 CX_TEST_ASSERT(result == CX_PROPERTIES_NO_ERROR); |
| |
546 CX_TEST_ASSERT(0 == cx_strcmp(key, cx_str("key3"))); |
| |
547 CX_TEST_ASSERT(0 == cx_strcmp(value, cx_str("value3"))); |
| |
548 |
| |
549 result = cxPropertiesNext(&prop, &key, &value); |
| |
550 CX_TEST_ASSERT(result == CX_PROPERTIES_NO_DATA); |
| |
551 } |
| |
552 cxPropertiesDestroy(&prop); |
| |
553 } |
| |
554 |
| |
555 CX_TEST(test_properties_use_stack) { |
| |
556 const char *props1 = "key1 = val"; |
| |
557 const char *props2 = "ue1\nkey2 = value2"; |
| |
558 const char *props3 = "\nkey3 = value3\n"; |
| |
559 char stackmem[16]; |
| |
560 |
| |
561 CxProperties prop; |
| |
562 cxPropertiesInitDefault(&prop); |
| |
563 cxPropertiesUseStack(&prop, stackmem, 16); |
| |
564 CxPropertiesStatus result; |
| |
565 cxstring key; |
| |
566 cxstring value; |
| |
567 CX_TEST_DO { |
| |
568 cxPropertiesFill(&prop, props1); |
| |
569 result = cxPropertiesNext(&prop, &key, &value); |
| |
570 CX_TEST_ASSERT(result == CX_PROPERTIES_INCOMPLETE_DATA); |
| |
571 cxPropertiesFill(&prop, props2); |
| |
572 result = cxPropertiesNext(&prop, &key, &value); |
| |
573 CX_TEST_ASSERT(result == CX_PROPERTIES_NO_ERROR); |
| |
574 CX_TEST_ASSERT(0 == cx_strcmp(key, cx_str("key1"))); |
| |
575 CX_TEST_ASSERT(0 == cx_strcmp(value, cx_str("value1"))); |
| |
576 result = cxPropertiesNext(&prop, &key, &value); |
| |
577 CX_TEST_ASSERT(result == CX_PROPERTIES_INCOMPLETE_DATA); |
| |
578 cxPropertiesFill(&prop, props3); |
| |
579 result = cxPropertiesNext(&prop, &key, &value); |
| |
580 CX_TEST_ASSERT(result == CX_PROPERTIES_NO_ERROR); |
| |
581 CX_TEST_ASSERT(0 == cx_strcmp(key, cx_str("key2"))); |
| |
582 CX_TEST_ASSERT(0 == cx_strcmp(value, cx_str("value2"))); |
| |
583 result = cxPropertiesNext(&prop, &key, &value); |
| |
584 CX_TEST_ASSERT(result == CX_PROPERTIES_NO_ERROR); |
| |
585 CX_TEST_ASSERT(0 == cx_strcmp(key, cx_str("key3"))); |
| |
586 CX_TEST_ASSERT(0 == cx_strcmp(value, cx_str("value3"))); |
| |
587 result = cxPropertiesNext(&prop, &key, &value); |
| |
588 CX_TEST_ASSERT(result == CX_PROPERTIES_NO_DATA); |
| |
589 } |
| |
590 cxPropertiesDestroy(&prop); |
| |
591 } |
| |
592 |
| |
593 CX_TEST(test_properties_empty_key) { |
| |
594 const char *fail1 = "= val\n"; |
| |
595 const char *fail2 = " = val\n"; |
| |
596 const char *good = " key = val\n"; |
| |
597 |
| |
598 CxProperties prop; |
| |
599 CxPropertiesStatus result; |
| |
600 cxstring key; |
| |
601 cxstring value; |
| |
602 CX_TEST_DO { |
| |
603 cxPropertiesInitDefault(&prop); |
| |
604 cxPropertiesFill(&prop, fail1); |
| |
605 result = cxPropertiesNext(&prop, &key, &value); |
| |
606 CX_TEST_ASSERT(result == CX_PROPERTIES_INVALID_EMPTY_KEY); |
| |
607 cxPropertiesReset(&prop); |
| |
608 cxPropertiesFill(&prop, fail2); |
| |
609 result = cxPropertiesNext(&prop, &key, &value); |
| |
610 CX_TEST_ASSERT(result == CX_PROPERTIES_INVALID_EMPTY_KEY); |
| |
611 cxPropertiesReset(&prop); |
| |
612 cxPropertiesFill(&prop, good); |
| |
613 result = cxPropertiesNext(&prop, &key, &value); |
| |
614 CX_TEST_ASSERT(result == CX_PROPERTIES_NO_ERROR); |
| |
615 CX_TEST_ASSERT(0 == cx_strcmp(key, cx_str("key"))); |
| |
616 CX_TEST_ASSERT(0 == cx_strcmp(value, cx_str("val"))); |
| |
617 cxPropertiesDestroy(&prop); |
| |
618 } |
| |
619 } |
| |
620 |
| 524 CxTestSuite *cx_test_suite_properties(void) { |
621 CxTestSuite *cx_test_suite_properties(void) { |
| 525 CxTestSuite *suite = cx_test_suite_new("properties"); |
622 CxTestSuite *suite = cx_test_suite_new("properties"); |
| 526 |
623 |
| 527 cx_test_register(suite, test_properties_init); |
624 cx_test_register(suite, test_properties_init); |
| 528 cx_test_register(suite, test_properties_next); |
625 cx_test_register(suite, test_properties_next); |
| 529 cx_test_register(suite, test_properties_next_multi); |
626 cx_test_register(suite, test_properties_next_multi); |
| 530 cx_test_register(suite, test_properties_next_part); |
627 cx_test_register(suite, test_properties_next_part); |
| 531 cx_test_register(suite, test_properties_next_long_lines); |
628 cx_test_register(suite, test_properties_next_long_lines); |
| 532 cx_test_register(suite, test_properties_load_string_to_map); |
629 cx_test_register(suite, test_properties_load_string_to_map); |
| 533 cx_test_register(suite, test_properties_load_file_to_map); |
630 cx_test_register(suite, test_properties_load_file_to_map); |
| |
631 cx_test_register(suite, test_properties_multiple_fill); |
| |
632 cx_test_register(suite, test_properties_use_stack); |
| |
633 cx_test_register(suite, test_properties_empty_key); |
| 534 |
634 |
| 535 return suite; |
635 return suite; |
| 536 } |
636 } |