/** * Filter loaded test suites, either remove suites listed (exclude=TRUE), or all * that are not listed (exclude=FALSE). */ static void apply_filter(array_t *loaded, char *filter, bool exclude) { enumerator_t *enumerator, *names; hashtable_t *listed; test_suite_t *suite; char *name; listed = hashtable_create(hashtable_hash_str, hashtable_equals_str, 8); names = enumerator_create_token(filter, ",", " "); while (names->enumerate(names, &name)) { listed->put(listed, name, name); } enumerator = array_create_enumerator(loaded); while (enumerator->enumerate(enumerator, &suite)) { if ((exclude && listed->get(listed, suite->name)) || (!exclude && !listed->get(listed, suite->name))) { array_remove_at(loaded, enumerator); destroy_suite(suite); } } enumerator->destroy(enumerator); listed->destroy(listed); names->destroy(names); }
/** * Invoke fixture setup/teardown */ static bool call_fixture(test_case_t *tcase, bool up) { enumerator_t *enumerator; test_fixture_t *fixture; bool failure = FALSE; enumerator = array_create_enumerator(tcase->fixtures); while (enumerator->enumerate(enumerator, &fixture)) { if (test_restore_point()) { if (up) { if (fixture->setup) { fixture->setup(); } } else { if (fixture->teardown) { fixture->teardown(); } } } else { thread_cleanup_popall(); failure = TRUE; break; } } enumerator->destroy(enumerator); return !failure; }
END_TEST START_TEST(test_enumerate) { array_t *array; int i, *x, y[6] = {0, 1, 2, 3, 4, 5}; enumerator_t *enumerator; array = array_create(sizeof(y[0]), 0); array_insert(array, ARRAY_TAIL, &y[0]); array_insert(array, ARRAY_TAIL, &y[1]); array_insert(array, ARRAY_TAIL, &y[2]); array_insert(array, ARRAY_TAIL, &y[3]); array_insert(array, ARRAY_TAIL, &y[4]); array_insert(array, ARRAY_TAIL, &y[5]); ck_assert_int_eq(array_count(array), 6); /* 0, 1, 2, 3, 4, 5 */ i = 0; enumerator = array_create_enumerator(array); while (enumerator->enumerate(enumerator, &x)) { ck_assert_int_eq(*x, y[i]); i++; } enumerator->destroy(enumerator); ck_assert_int_eq(i, 6); i = 0; enumerator = array_create_enumerator(array); while (enumerator->enumerate(enumerator, &x)) { ck_assert_int_eq(*x, y[i]); if (i == 0 || i == 3 || i == 5) { array_remove_at(array, enumerator); } i++; } enumerator->destroy(enumerator); ck_assert_int_eq(i, 6); ck_assert_int_eq(array_count(array), 3); /* 1, 2, 4 */ i = 0; enumerator = array_create_enumerator(array); while (enumerator->enumerate(enumerator, &x)) { switch (i++) { case 0: ck_assert_int_eq(*x, y[1]); break; case 1: ck_assert_int_eq(*x, y[2]); break; case 2: ck_assert_int_eq(*x, y[4]); break; default: ck_assert(0); } } enumerator->destroy(enumerator); array_compress(array); i = 0; enumerator = array_create_enumerator(array); while (enumerator->enumerate(enumerator, &x)) { switch (i++) { case 0: ck_assert_int_eq(*x, y[1]); break; case 1: ck_assert_int_eq(*x, y[2]); break; case 2: ck_assert_int_eq(*x, y[4]); break; default: ck_assert(0); } } enumerator->destroy(enumerator); array_destroy(array); }