#include #include "util.h" LILY_FILE_BEGIN(util_suite) LILY_TEST("expand NULL array") { size_t count = 0; int *array = NULL; int *first = kai_expand_array((void**) &array, &count, sizeof(int)); CHECK_NEQ(first, NULL, "%p"); CHECK_NEQ(array, NULL, "%p"); CHECK_EQ(first, array, "%p"); CHECK_EQ(count, 1, "%d"); int *second = kai_expand_array((void**) &array, &count, sizeof(int)); CHECK_NEQ(second, NULL, "%p"); CHECK_EQ(second, array+1, "%p"); CHECK_EQ(count, 2, "%d"); free(array); } #include LILY_PUSH_TEST() struct test100 { int value; const char *str; }; LILY_TEST("expand array 100 times") { size_t count = 0; struct test100 *array = NULL; const char *str = "hello, world!"; for (int i=0; i<100; i++) { struct test100 *element = kai_expand_array((void**) &array, &count, sizeof(struct test100)); element->value = i; element->str = str; } CHECK_EQ(count, 100, "%ul"); for (int i=0; i<100; i++) { CHECK_EQ(array[i].value, i, "%d"); CHECK_EQ(array[i].str, str, "%p"); } free(array); } #include LILY_PUSH_TEST() LILY_TEST("convert string to real array") { const char *str = "0 0.5 1 1.5 2"; ka_real_t array[5]; int conv = kai_text_to_reals(array, str, 5); CHECK_EQ(conv, 5, "%d"); CHECK_EQF(array[0], 0.0f, "%f"); CHECK_EQF(array[1], 0.5f, "%f"); CHECK_EQF(array[2], 1.0f, "%f"); CHECK_EQF(array[3], 1.5f, "%f"); CHECK_EQF(array[4], 2.0f, "%f"); } #include LILY_PUSH_TEST() LILY_TEST("convert string to real array with fewer conversions than expected") { const char *str = "0 0.5 1"; ka_real_t array[5]; int conv = kai_text_to_reals(array, str, 5); CHECK_EQ(conv, 3, "%d"); CHECK_EQF(array[0], 0.0f, "%f"); CHECK_EQF(array[1], 0.5f, "%f"); CHECK_EQF(array[2], 1.0f, "%f"); CHECK_EQF(array[3], 0.0f, "%f"); CHECK_EQF(array[4], 0.0f, "%f"); } #include LILY_PUSH_TEST() LILY_TEST("convert string to int array") { /* the lucas numbers 4 u math fans out there */ const char *str = "2 1 3 4 7"; long array[5]; int conv = kai_text_to_longs(array, str, 5); CHECK_EQ(conv, 5, "%d"); CHECK_EQ(array[0], 2, "%d"); CHECK_EQ(array[1], 1, "%d"); CHECK_EQ(array[2], 3, "%d"); CHECK_EQ(array[3], 4, "%d"); CHECK_EQ(array[4], 7, "%d"); } #include LILY_PUSH_TEST() LILY_TEST("convert string to int array with fewer conversions than expected") { const char *str = "2 1"; long array[5]; int conv = kai_text_to_longs(array, str, 5); CHECK_EQ(conv, 2, "%d"); CHECK_EQ(array[0], 2, "%d"); CHECK_EQ(array[1], 1, "%d"); CHECK_EQ(array[2], 0, "%d"); CHECK_EQ(array[3], 0, "%d"); CHECK_EQ(array[4], 0, "%d"); } #include LILY_PUSH_TEST() int f_read_int(int *dest, struct kai_tag_t *src) { long num = kai_tag_attr_to_long(src, "num", -1); if (num == -1) { return -1; } *dest = num; return 0; } int release_calls; void f_release_int(int i) { release_calls += 1; } LILY_TEST("KAI_FILL_ARRAY_FROM_TAGS produces NULL when no tags are found") { int result, count; int *buf; release_calls = 0; struct kai_tag_t *t = kai_parse_string( "" " " " " " " "" ); KAI_FILL_ARRAY_FROM_TAGS(result, buf, count, int, t, "num", f_read_int, f_release_int); kai_tag_destroy(t); CHECK_EQ(result, 0, "%d"); CHECK_EQ(release_calls, 0, "%d"); CHECK_EQ(buf, NULL, "%p"); CHECK_EQ(count, 0, "%d"); } #include LILY_PUSH_TEST() LILY_TEST("KAI_FILL_ARRAY_FROM_TAGS properly fills array") { int result, count; int *buf; release_calls = 0; struct kai_tag_t *t = kai_parse_string( "" " " " " " " " " " " " " " " "" ); KAI_FILL_ARRAY_FROM_TAGS(result, buf, count, int, t, "num", f_read_int, f_release_int); kai_tag_destroy(t); REQUIRE_EQ(result, 0, "%d"); CHECK_EQ(release_calls, 0, "%d"); REQUIRE_EQ(count, 4, "%d"); CHECK_EQ(buf[0], 5, "%d"); CHECK_EQ(buf[1], 4, "%d"); CHECK_EQ(buf[2], 3, "%d"); CHECK_EQ(buf[3], 2, "%d"); free(buf); } #include LILY_PUSH_TEST() LILY_TEST("KAI_FILL_ARRAY_FROM_TAGS properly releases on error") { int result, count; int *buf; release_calls = 0; struct kai_tag_t *t = kai_parse_string( "" " " " " " " " " " " " " " " "" ); KAI_FILL_ARRAY_FROM_TAGS(result, buf, count, int, t, "num", f_read_int, f_release_int); kai_tag_destroy(t); CHECK_EQ(result, -1, "%d"); CHECK_EQ(release_calls, 2, "%d"); CHECK_EQ(count, 0, "%d"); CHECK_EQ(buf, NULL, "%p"); } #include LILY_PUSH_TEST() #define LILY_FILE_END #include LILY_REGISTER_TESTS()