/* * Check: a unit test framework for C * Copyright (C) 2001, 2002 Arien Malec * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, * MA 02110-1301, USA. */ #include "../lib/libcompat.h" #include #include #include #include #include #include "check_check.h" enum { RED, BLUE, PURPLE, YELLOW, BLACK, MAX_TESTS } test_ids; /* * Flag per test which is set true when that test runs */ unsigned int test_executed[MAX_TESTS]; static void reset_executed(void) { memset(test_executed, 0, sizeof(test_executed)); } START_TEST(red_test1) { test_executed[RED] = 1; } END_TEST START_TEST(blue_test1) { test_executed[BLUE] = 1; } END_TEST START_TEST(purple_test1) { test_executed[PURPLE] = 1; } END_TEST START_TEST(yellow_test1) { test_executed[YELLOW] = 1; } END_TEST START_TEST(black_test1) { test_executed[BLACK] = 1; } END_TEST static SRunner *make_tagged_testrunner(void) { SRunner *sr; Suite *s1, *s2; TCase *red, *blue, *purple, *yellow, *black; s1 = suite_create("RedBlue Suite"); red = tcase_create("Red"); tcase_set_tags(red, "Red"); suite_add_tcase (s1, red); tcase_add_test(red, red_test1); blue = tcase_create("Blue"); tcase_set_tags(blue, "Blue"); suite_add_tcase (s1, blue); tcase_add_test(blue, blue_test1); s2 = suite_create("PurpleYellowBlack Suite"); purple = tcase_create("Purple"); tcase_set_tags(purple, "Red Blue"); suite_add_tcase (s2, purple); tcase_add_test(purple, purple_test1); yellow = tcase_create("Yellow"); tcase_set_tags(yellow, "Yellow"); suite_add_tcase (s2, yellow); tcase_add_test(yellow, yellow_test1); black = tcase_create("Black"); suite_add_tcase (s2, black); tcase_add_test(black, black_test1); sr = srunner_create(s1); srunner_add_suite(sr, s2); return sr; } static SRunner *sr = NULL; static void tag_test_setup(void) { sr = make_tagged_testrunner(); srunner_set_fork_status(sr, CK_NOFORK); } static void tag_test_teardown (void) { srunner_free (sr); } /* * Show that with no filter we run all the tests */ START_TEST(null_filter) { reset_executed(); srunner_run_tagged(sr, NULL, NULL, NULL, NULL, CK_VERBOSE); ck_assert(test_executed[RED]); ck_assert(test_executed[BLUE]); ck_assert(test_executed[PURPLE]); ck_assert(test_executed[YELLOW]); ck_assert(test_executed[BLACK]); } END_TEST START_TEST(include_nothing) { reset_executed(); srunner_run_tagged(sr, NULL, NULL, "", NULL, CK_VERBOSE); ck_assert(!test_executed[RED]); ck_assert(!test_executed[BLUE]); ck_assert(!test_executed[PURPLE]); ck_assert(!test_executed[YELLOW]); ck_assert(!test_executed[BLACK]); } END_TEST START_TEST(exclude_nothing) { reset_executed(); srunner_run_tagged(sr, NULL, NULL, NULL, "", CK_VERBOSE); ck_assert(test_executed[RED]); ck_assert(test_executed[BLUE]); ck_assert(test_executed[PURPLE]); ck_assert(test_executed[YELLOW]); ck_assert(test_executed[BLACK]); } END_TEST START_TEST(include_nothing_exclude_nothing) { reset_executed(); srunner_run_tagged(sr, NULL, NULL, "", "", CK_VERBOSE); ck_assert(!test_executed[RED]); ck_assert(!test_executed[BLUE]); ck_assert(!test_executed[PURPLE]); ck_assert(!test_executed[YELLOW]); ck_assert(!test_executed[BLACK]); } END_TEST START_TEST(include_yellow) { reset_executed(); srunner_run_tagged(sr, NULL, NULL, "Yellow", NULL, CK_VERBOSE); ck_assert(!test_executed[RED]); ck_assert(!test_executed[BLUE]); ck_assert(!test_executed[PURPLE]); ck_assert(test_executed[YELLOW]); ck_assert(!test_executed[BLACK]); } END_TEST START_TEST(include_red) { reset_executed(); srunner_run_tagged(sr, NULL, NULL, "Red", NULL, CK_VERBOSE); ck_assert(test_executed[RED]); ck_assert(!test_executed[BLUE]); ck_assert(test_executed[PURPLE]); ck_assert(!test_executed[YELLOW]); ck_assert(!test_executed[BLACK]); } END_TEST START_TEST(include_red_blue) { reset_executed(); srunner_run_tagged(sr, NULL, NULL, "Red Blue", NULL, CK_VERBOSE); ck_assert(test_executed[RED]); ck_assert(test_executed[BLUE]); ck_assert(test_executed[PURPLE]); ck_assert(!test_executed[YELLOW]); ck_assert(!test_executed[BLACK]); } END_TEST START_TEST(include_red_blue_yellow) { reset_executed(); srunner_run_tagged(sr, NULL, NULL, "Red Blue Yellow", NULL, CK_VERBOSE); ck_assert(test_executed[RED]); ck_assert(test_executed[BLUE]); ck_assert(test_executed[PURPLE]); ck_assert(test_executed[YELLOW]); ck_assert(!test_executed[BLACK]); } END_TEST START_TEST(exclude_yellow) { reset_executed(); srunner_run_tagged(sr, NULL, NULL, NULL, "Yellow", CK_VERBOSE); ck_assert(test_executed[RED]); ck_assert(test_executed[BLUE]); ck_assert(test_executed[PURPLE]); ck_assert(!test_executed[YELLOW]); ck_assert(test_executed[BLACK]); } END_TEST START_TEST(exclude_red) { reset_executed(); srunner_run_tagged(sr, NULL, NULL, NULL, "Red", CK_VERBOSE); ck_assert(!test_executed[RED]); ck_assert(test_executed[BLUE]); ck_assert(!test_executed[PURPLE]); ck_assert(test_executed[YELLOW]); ck_assert(test_executed[BLACK]); } END_TEST START_TEST(exclude_red_blue) { reset_executed(); srunner_run_tagged(sr, NULL, NULL, NULL, "Red Blue", CK_VERBOSE); ck_assert(!test_executed[RED]); ck_assert(!test_executed[BLUE]); ck_assert(!test_executed[PURPLE]); ck_assert(test_executed[YELLOW]); ck_assert(test_executed[BLACK]); } END_TEST START_TEST(exclude_red_blue_yellow) { reset_executed(); srunner_run_tagged(sr, NULL, NULL, NULL, "Red Blue Yellow", CK_VERBOSE); ck_assert(!test_executed[RED]); ck_assert(!test_executed[BLUE]); ck_assert(!test_executed[PURPLE]); ck_assert(!test_executed[YELLOW]); ck_assert(test_executed[BLACK]); } END_TEST #if HAVE_DECL_SETENV /* env var driven tests */ START_TEST(include_yellow_env) { reset_executed(); setenv ("CK_INCLUDE_TAGS", "Yellow", 1); srunner_run_all(sr, CK_VERBOSE); ck_assert(!test_executed[RED]); ck_assert(!test_executed[BLUE]); ck_assert(!test_executed[PURPLE]); ck_assert(test_executed[YELLOW]); ck_assert(!test_executed[BLACK]); unsetenv ("CK_INCLUDE_TAGS"); } END_TEST START_TEST(include_red_env) { reset_executed(); setenv ("CK_INCLUDE_TAGS", "Red", 1); srunner_run_all(sr, CK_VERBOSE); ck_assert(test_executed[RED]); ck_assert(!test_executed[BLUE]); ck_assert(test_executed[PURPLE]); ck_assert(!test_executed[YELLOW]); ck_assert(!test_executed[BLACK]); unsetenv ("CK_INCLUDE_TAGS"); } END_TEST START_TEST(include_red_blue_env) { reset_executed(); setenv ("CK_INCLUDE_TAGS", "Red Blue", 1); srunner_run_all(sr, CK_VERBOSE); ck_assert(test_executed[RED]); ck_assert(test_executed[BLUE]); ck_assert(test_executed[PURPLE]); ck_assert(!test_executed[YELLOW]); ck_assert(!test_executed[BLACK]); unsetenv ("CK_INCLUDE_TAGS"); } END_TEST START_TEST(include_red_blue_yellow_env) { reset_executed(); setenv ("CK_INCLUDE_TAGS", "Red Blue Yellow", 1); srunner_run_all(sr, CK_VERBOSE); ck_assert(test_executed[RED]); ck_assert(test_executed[BLUE]); ck_assert(test_executed[PURPLE]); ck_assert(test_executed[YELLOW]); ck_assert(!test_executed[BLACK]); unsetenv ("CK_INCLUDE_TAGS"); } END_TEST START_TEST(exclude_yellow_env) { reset_executed(); setenv ("CK_EXCLUDE_TAGS", "Yellow", 1); srunner_run_all(sr, CK_VERBOSE); ck_assert(test_executed[RED]); ck_assert(test_executed[BLUE]); ck_assert(test_executed[PURPLE]); ck_assert(!test_executed[YELLOW]); ck_assert(test_executed[BLACK]); unsetenv ("CK_EXCLUDE_TAGS"); } END_TEST START_TEST(exclude_red_env) { reset_executed(); setenv ("CK_EXCLUDE_TAGS", "Red", 1); srunner_run_all(sr, CK_VERBOSE); ck_assert(!test_executed[RED]); ck_assert(test_executed[BLUE]); ck_assert(!test_executed[PURPLE]); ck_assert(test_executed[YELLOW]); ck_assert(test_executed[BLACK]); unsetenv ("CK_EXCLUDE_TAGS"); } END_TEST START_TEST(exclude_red_blue_env) { reset_executed(); setenv ("CK_EXCLUDE_TAGS", "Red Blue", 1); srunner_run_all(sr, CK_VERBOSE); ck_assert(!test_executed[RED]); ck_assert(!test_executed[BLUE]); ck_assert(!test_executed[PURPLE]); ck_assert(test_executed[YELLOW]); ck_assert(test_executed[BLACK]); unsetenv ("CK_EXCLUDE_TAGS"); } END_TEST START_TEST(exclude_red_blue_yellow_env) { reset_executed(); setenv ("CK_EXCLUDE_TAGS", "Red Blue Yellow", 1); srunner_run_all(sr, CK_VERBOSE); ck_assert(!test_executed[RED]); ck_assert(!test_executed[BLUE]); ck_assert(!test_executed[PURPLE]); ck_assert(!test_executed[YELLOW]); ck_assert(test_executed[BLACK]); unsetenv ("CK_EXCLUDE_TAGS"); } END_TEST START_TEST(include_red_case_red_env) { reset_executed(); setenv ("CK_INCLUDE_TAGS", "Red Yellow", 1); setenv ("CK_RUN_CASE", "Red", 1); srunner_run_all(sr, CK_VERBOSE); ck_assert(test_executed[RED]); ck_assert(!test_executed[BLUE]); ck_assert(!test_executed[PURPLE]); ck_assert(!test_executed[YELLOW]); ck_assert(!test_executed[BLACK]); unsetenv ("CK_INCLUDE_TAGS"); unsetenv ("CK_RUN_CASE"); } END_TEST START_TEST(include_red_case_blue_env) { reset_executed(); setenv ("CK_INCLUDE_TAGS", "Red Yellow", 1); setenv ("CK_RUN_CASE", "Blue", 1); srunner_run_all(sr, CK_VERBOSE); ck_assert(!test_executed[RED]); ck_assert(!test_executed[BLUE]); ck_assert(!test_executed[PURPLE]); ck_assert(!test_executed[YELLOW]); ck_assert(!test_executed[BLACK]); unsetenv ("CK_INCLUDE_TAGS"); unsetenv ("CK_RUN_CASE"); } END_TEST START_TEST(exclude_red_case_red_env) { reset_executed(); setenv ("CK_EXCLUDE_TAGS", "Red Yellow", 1); setenv ("CK_RUN_CASE", "Red", 1); srunner_run_all(sr, CK_VERBOSE); ck_assert(!test_executed[RED]); ck_assert(!test_executed[BLUE]); ck_assert(!test_executed[PURPLE]); ck_assert(!test_executed[YELLOW]); ck_assert(!test_executed[BLACK]); unsetenv ("CK_EXCLUDE_TAGS"); unsetenv ("CK_RUN_CASE"); } END_TEST START_TEST(exclude_red_case_blue_env) { reset_executed(); setenv ("CK_EXCLUDE_TAGS", "Red Yellow", 1); setenv ("CK_RUN_CASE", "Blue", 1); srunner_run_all(sr, CK_VERBOSE); ck_assert(!test_executed[RED]); ck_assert(test_executed[BLUE]); ck_assert(!test_executed[PURPLE]); ck_assert(!test_executed[YELLOW]); ck_assert(!test_executed[BLACK]); unsetenv ("CK_EXCLUDE_TAGS"); unsetenv ("CK_RUN_CASE"); } END_TEST START_TEST(include_red_suite_redblue_env) { reset_executed(); setenv ("CK_INCLUDE_TAGS", "Red Yellow", 1); setenv ("CK_RUN_SUITE", "RedBlue Suite", 1); srunner_run_all(sr, CK_VERBOSE); ck_assert(test_executed[RED]); ck_assert(!test_executed[BLUE]); ck_assert(!test_executed[PURPLE]); ck_assert(!test_executed[YELLOW]); ck_assert(!test_executed[BLACK]); unsetenv ("CK_INCLUDE_TAGS"); unsetenv ("CK_RUN_SUITE"); } END_TEST START_TEST(include_red_suite_purpleyellowblack_env) { reset_executed(); setenv ("CK_INCLUDE_TAGS", "Red Yellow", 1); setenv ("CK_RUN_SUITE", "PurpleYellowBlack Suite", 1); srunner_run_all(sr, CK_VERBOSE); ck_assert(!test_executed[RED]); ck_assert(!test_executed[BLUE]); ck_assert(test_executed[PURPLE]); ck_assert(test_executed[YELLOW]); ck_assert(!test_executed[BLACK]); unsetenv ("CK_INCLUDE_TAGS"); unsetenv ("CK_RUN_SUITE"); } END_TEST START_TEST(exclude_red_suite_redblue_env) { reset_executed(); setenv ("CK_EXCLUDE_TAGS", "Red Yellow", 1); setenv ("CK_RUN_SUITE", "RedBlue Suite", 1); srunner_run_all(sr, CK_VERBOSE); ck_assert(!test_executed[RED]); ck_assert(test_executed[BLUE]); ck_assert(!test_executed[PURPLE]); ck_assert(!test_executed[YELLOW]); ck_assert(!test_executed[BLACK]); unsetenv ("CK_EXCLUDE_TAGS"); unsetenv ("CK_RUN_SUITE"); } END_TEST START_TEST(exclude_red_suite_purpleyellowblack_env) { reset_executed(); setenv ("CK_EXCLUDE_TAGS", "Red Yellow", 1); setenv ("CK_RUN_SUITE", "PurpleYellowBlack Suite", 1); srunner_run_all(sr, CK_VERBOSE); ck_assert(!test_executed[RED]); ck_assert(!test_executed[BLUE]); ck_assert(!test_executed[PURPLE]); ck_assert(!test_executed[YELLOW]); ck_assert(test_executed[BLACK]); unsetenv ("CK_EXCLUDE_TAGS"); unsetenv ("CK_RUN_SUITE"); } END_TEST #endif /* HAVE_DECL_SETENV */ START_TEST(include_red_exclude_red) { reset_executed(); srunner_run_tagged(sr, NULL, NULL, "Red", "Red", CK_VERBOSE); ck_assert(!test_executed[RED]); ck_assert(!test_executed[BLUE]); ck_assert(!test_executed[PURPLE]); ck_assert(!test_executed[YELLOW]); ck_assert(!test_executed[BLACK]); } END_TEST START_TEST(include_red_exclude_blue) { reset_executed(); srunner_run_tagged(sr, NULL, NULL, "Red", "Blue", CK_VERBOSE); ck_assert(test_executed[RED]); ck_assert(!test_executed[BLUE]); ck_assert(!test_executed[PURPLE]); ck_assert(!test_executed[YELLOW]); ck_assert(!test_executed[BLACK]); } END_TEST START_TEST(include_red_include_red) { reset_executed(); srunner_run_tagged(sr, NULL, NULL, "Red Red Red", NULL, CK_VERBOSE); ck_assert(test_executed[RED]); ck_assert(!test_executed[BLUE]); ck_assert(test_executed[PURPLE]); ck_assert(!test_executed[YELLOW]); ck_assert(!test_executed[BLACK]); } END_TEST START_TEST(include_w_spaces) { reset_executed(); srunner_run_tagged(sr, NULL, NULL, " Red Blue ", NULL, CK_VERBOSE); ck_assert(test_executed[RED]); ck_assert(test_executed[BLUE]); ck_assert(test_executed[PURPLE]); ck_assert(!test_executed[YELLOW]); ck_assert(!test_executed[BLACK]); } END_TEST Suite *make_tag_suite(void) { TCase *set_get_tags, *no_filters; TCase *include_filters, *exclude_filters; #if HAVE_DECL_SETENV TCase *include_filters_env, *exclude_filters_env; #endif /* HAVE_DECL_SETENV */ TCase *include_exclude_filters, *strange_filters; TCase *tag_plus_suite_env, *tag_plus_case_env; Suite *s; s = suite_create("Check Tag Filtering"); no_filters = tcase_create("no tag filters"); suite_add_tcase (s, no_filters); tcase_add_test(no_filters, null_filter); tcase_add_test(no_filters, include_nothing); tcase_add_test(no_filters, exclude_nothing); tcase_add_unchecked_fixture (no_filters, tag_test_setup, tag_test_teardown); include_filters = tcase_create("include tags"); suite_add_tcase (s, include_filters); tcase_add_test(include_filters, include_yellow); tcase_add_test(include_filters, include_red); tcase_add_test(include_filters, include_red_blue); tcase_add_test(include_filters, include_red_blue_yellow); tcase_add_unchecked_fixture (include_filters, tag_test_setup, tag_test_teardown); exclude_filters = tcase_create("exclude tags"); suite_add_tcase (s, exclude_filters); tcase_add_test(exclude_filters, exclude_yellow); tcase_add_test(exclude_filters, exclude_red); tcase_add_test(exclude_filters, exclude_red_blue); tcase_add_test(exclude_filters, exclude_red_blue_yellow); tcase_add_unchecked_fixture (exclude_filters, tag_test_setup, tag_test_teardown); #if HAVE_DECL_SETENV include_filters_env = tcase_create("include tags via env"); suite_add_tcase (s, include_filters_env); tcase_add_test(include_filters_env, include_yellow_env); tcase_add_test(include_filters_env, include_red_env); tcase_add_test(include_filters_env, include_red_blue_env); tcase_add_test(include_filters_env, include_red_blue_yellow_env); tcase_add_unchecked_fixture (include_filters_env, tag_test_setup, tag_test_teardown); exclude_filters_env = tcase_create("exclude tags via env"); suite_add_tcase (s, exclude_filters_env); tcase_add_test(exclude_filters_env, exclude_yellow_env); tcase_add_test(exclude_filters_env, exclude_red_env); tcase_add_test(exclude_filters_env, exclude_red_blue_env); tcase_add_test(exclude_filters_env, exclude_red_blue_yellow_env); tcase_add_unchecked_fixture (exclude_filters_env, tag_test_setup, tag_test_teardown); tag_plus_suite_env = tcase_create("combining tag filters with suite selection"); suite_add_tcase (s, tag_plus_suite_env); tcase_add_test(tag_plus_suite_env, include_red_suite_redblue_env); tcase_add_test(tag_plus_suite_env, include_red_suite_purpleyellowblack_env); tcase_add_test(tag_plus_suite_env, exclude_red_suite_redblue_env); tcase_add_test(tag_plus_suite_env, exclude_red_suite_purpleyellowblack_env); tcase_add_unchecked_fixture (tag_plus_suite_env, tag_test_setup, tag_test_teardown); tag_plus_case_env = tcase_create("combining tag filters with case selection"); suite_add_tcase (s, tag_plus_case_env); tcase_add_test(tag_plus_case_env, include_red_case_red_env); tcase_add_test(tag_plus_case_env, include_red_case_blue_env); tcase_add_test(tag_plus_case_env, exclude_red_case_red_env); tcase_add_test(tag_plus_case_env, exclude_red_case_blue_env); tcase_add_unchecked_fixture (tag_plus_case_env, tag_test_setup, tag_test_teardown); #endif /* HAVE_DECL_SETENV */ include_exclude_filters = tcase_create("include and exclude tags"); suite_add_tcase (s, include_exclude_filters); tcase_add_test(include_exclude_filters, include_nothing_exclude_nothing); tcase_add_test(include_exclude_filters, include_red_exclude_blue); tcase_add_test(include_exclude_filters, include_red_exclude_red); tcase_add_unchecked_fixture (include_exclude_filters, tag_test_setup, tag_test_teardown); strange_filters = tcase_create("strange tag filters"); suite_add_tcase (s, strange_filters); tcase_add_test(strange_filters, include_red_include_red); tcase_add_test(strange_filters, include_w_spaces); tcase_add_unchecked_fixture (strange_filters, tag_test_setup, tag_test_teardown); return s; }