From d9738e5d26a262cb5d7cb26eb5ec015e671c1a8c Mon Sep 17 00:00:00 2001 From: Yevgen Muntyan <17531749+muntyan@users.noreply.github.com> Date: Mon, 5 May 2008 10:13:42 -0500 Subject: [PATCH] More options for running tests --- moo/moo-test-utils.c | 105 ++++++++++++++++++++++++++++++++++--------- moo/moo-test-utils.h | 8 +++- tests/run-tests.c | 50 +++++++++++++++++---- 3 files changed, 133 insertions(+), 30 deletions(-) diff --git a/moo/moo-test-utils.c b/moo/moo-test-utils.c index 05347012..8df8546e 100644 --- a/moo/moo-test-utils.c +++ b/moo/moo-test-utils.c @@ -127,12 +127,19 @@ moo_test_suite_free (MooTestSuite *ts) } static void -run_test (MooTest *test, - MooTestSuite *ts) +run_test (MooTest *test, + MooTestSuite *ts, + MooTestOptions opts) { MooTestEnv env; gboolean failed; + if (opts & MOO_TEST_LIST_ONLY) + { + fprintf (stdout, " Test: %s\n", test->name); + return; + } + env.suite_data = ts->data; env.test_data = test->data; @@ -173,54 +180,110 @@ run_test (MooTest *test, } static void -run_suite (MooTestSuite *ts) +run_suite (MooTestSuite *ts, + MooTest *single_test, + MooTestOptions opts) { GSList *l; + gboolean run = !(opts & MOO_TEST_LIST_ONLY); - if (ts->init_func && !ts->init_func (ts->data)) + if (run && ts->init_func && !ts->init_func (ts->data)) return; registry.current_suite = ts; g_print ("Suite: %s\n", ts->name); - for (l = ts->tests; l != NULL; l = l->next) - run_test (l->data, ts); + if (single_test) + run_test (single_test, ts, opts); + else + for (l = ts->tests; l != NULL; l = l->next) + run_test (l->data, ts, opts); - if (ts->cleanup_func) + if (run && ts->cleanup_func) ts->cleanup_func (ts->data); registry.current_suite = NULL; registry.tr.suites += 1; } -void -moo_test_run_tests (const char *data_dir) +static gboolean +find_test (const char *name, + MooTestSuite **ts_p, + MooTest **test_p) { GSList *l; + for (l = registry.test_suites; l != NULL; l = l->next) + { + int idx; + MooTestSuite *ts = l->data; + + if (!g_str_has_prefix (name, ts->name)) + continue; + + *ts_p = ts; + + name += strlen (ts->name); + + if (!name[0]) + return TRUE; + else if (!name[1]) + return FALSE; + + idx = strtol (name + 1, NULL, 10); + *test_p = g_slist_nth_data (ts->tests, idx - 1); + + return *test_p != NULL; + } + + return FALSE; +} + +void +moo_test_run_tests (const char *name, + const char *data_dir, + MooTestOptions opts) +{ + GSList *l; + MooTestSuite *single_ts = NULL; + MooTest *single_test = NULL; + g_return_if_fail (data_dir != NULL); g_return_if_fail (g_file_test (data_dir, G_FILE_TEST_IS_DIR)); + if (name && !find_test (name, &single_ts, &single_test)) + { + g_printerr ("could not find test %s", name); + exit (EXIT_FAILURE); + } + g_free (registry.data_dir); registry.data_dir = g_strdup (data_dir); fprintf (stdout, "\n"); - for (l = registry.test_suites; l != NULL; l = l->next) - run_suite (l->data); + if (single_ts) + run_suite (single_ts, single_test, opts); + else + for (l = registry.test_suites; l != NULL; l = l->next) + run_suite (l->data, NULL, opts); fprintf (stdout, "\n"); - fprintf (stdout, "Run Summary: Type Total Ran Passed Failed\n"); - fprintf (stdout, " suites %5d %3d n/a n/a\n", - registry.tr.suites, registry.tr.suites); - fprintf (stdout, " tests %5d %3d %6d %6d\n", - registry.tr.tests, registry.tr.tests, registry.tr.tests_passed, - registry.tr.tests - registry.tr.tests_passed); - fprintf (stdout, " asserts %5d %3d %6d %6d\n", - registry.tr.asserts, registry.tr.asserts, registry.tr.asserts_passed, - registry.tr.asserts - registry.tr.asserts_passed); - fprintf (stdout, "\n"); + + if (!(opts & MOO_TEST_LIST_ONLY)) + { + fprintf (stdout, "Run Summary: Type Total Ran Passed Failed\n"); + fprintf (stdout, " suites %5d %3d n/a n/a\n", + registry.tr.suites, registry.tr.suites); + fprintf (stdout, " tests %5d %3d %6d %6d\n", + registry.tr.tests, registry.tr.tests, registry.tr.tests_passed, + registry.tr.tests - registry.tr.tests_passed); + fprintf (stdout, " asserts %5d %3d %6d %6d\n", + registry.tr.asserts, registry.tr.asserts, registry.tr.asserts_passed, + registry.tr.asserts - registry.tr.asserts_passed); + fprintf (stdout, "\n"); + } } void diff --git a/moo/moo-test-utils.h b/moo/moo-test-utils.h index 33ee0af7..5ee068cd 100644 --- a/moo/moo-test-utils.h +++ b/moo/moo-test-utils.h @@ -13,6 +13,10 @@ typedef struct { gpointer test_data; } MooTestEnv; +typedef enum { + MOO_TEST_LIST_ONLY = 1 << 0 +} MooTestOptions; + typedef struct MooTestSuite MooTestSuite; typedef gboolean (*MooTestSuiteInit) (gpointer data); typedef void (*MooTestSuiteCleanup) (gpointer data); @@ -27,7 +31,9 @@ void moo_test_suite_add_test (MooTestSuite *ts, MooTestFunc test_func, gpointer data); -void moo_test_run_tests (const char *data_dir); +void moo_test_run_tests (const char *single_test, + const char *data_dir, + MooTestOptions opts); void moo_test_cleanup (void); gboolean moo_test_get_result (void); diff --git a/tests/run-tests.c b/tests/run-tests.c index 73fefaa8..d3878efb 100644 --- a/tests/run-tests.c +++ b/tests/run-tests.c @@ -1,14 +1,9 @@ #include #include -int -main (int argc, char *argv[]) +static void +add_tests (void) { - const char *data_dir; - - g_thread_init (NULL); - gtk_init (&argc, &argv); - moo_test_gobject (); moo_test_mooaccel (); moo_test_mooutils_fs (); @@ -24,6 +19,24 @@ main (int argc, char *argv[]) moo_test_key_file (); moo_test_editor (); +} + +int +main (int argc, char *argv[]) +{ + const char *data_dir; + GOptionContext *ctx; + GOptionGroup *grp; + GError *error = NULL; + MooTestOptions opts = 0; + gboolean list_only = FALSE; + + GOptionEntry options[] = { + { "list", 0, 0, G_OPTION_ARG_NONE, &list_only, "List available tests", NULL }, + { NULL, 0, 0, 0, NULL, NULL, NULL } + }; + + g_thread_init (NULL); #ifdef __WIN32__ data_dir = "test-data"; @@ -31,8 +44,29 @@ main (int argc, char *argv[]) data_dir = SRCDIR "/data"; #endif - moo_test_run_tests (data_dir); + grp = g_option_group_new ("run-tests", "run-tests", "run-tests", NULL, NULL); + g_option_group_add_entries (grp, options); + ctx = g_option_context_new ("[TEST_SUITE]"); + g_option_context_set_main_group (ctx, grp); + g_option_context_add_group (ctx, gtk_get_option_group (TRUE)); + if (!g_option_context_parse (ctx, &argc, &argv, &error)) + { + g_printerr ("%s\n", error->message); + exit (EXIT_FAILURE); + } + + if (argc > 2) + { + g_printerr ("invalid arguments\n"); + exit (EXIT_FAILURE); + } + + if (list_only) + opts |= MOO_TEST_LIST_ONLY; + + add_tests (); + moo_test_run_tests (argv[1], data_dir, opts); moo_test_cleanup (); #ifdef __WIN32__