From dc4cb4585c98295a0ea1ab51d56515d5e80c988b Mon Sep 17 00:00:00 2001 From: Niklas Hauser Date: Tue, 17 Nov 2015 15:08:29 +0000 Subject: [PATCH] Unify `Case` and `AsyncCase` using return type. By letting the test case return a `control_t` type, it can decide itself if it repeats, and what timeouts are required. This removes the `AsyncCase` and allows a uniform declaration of test cases. --- "frameworks\\utest/source/case.cpp" | 211 ++++++++----------------- "frameworks\\utest/source/harness.cpp" | 28 ++-- 2 files changed, 78 insertions(+), 161 deletions(-) diff --git "a/frameworks\\utest/source/case.cpp" "b/frameworks\\utest/source/case.cpp" index 2c391f6ab7..5ebc501c46 100644 --- "a/frameworks\\utest/source/case.cpp" +++ "b/frameworks\\utest/source/case.cpp" @@ -28,11 +28,11 @@ Case::Case(const char *description, const case_failure_handler_t failure_handler) : description(description), handler(handler), - control_flow_handler(ignore_handler), + control_handler(ignore_handler), + repeat_count_handler(ignore_handler), setup_handler(setup_handler), teardown_handler(teardown_handler), - failure_handler(failure_handler), - timeout_ms(0) + failure_handler(failure_handler) {} Case::Case(const char *description, @@ -41,11 +41,11 @@ Case::Case(const char *description, const case_failure_handler_t failure_handler) : description(description), handler(handler), - control_flow_handler(ignore_handler), + control_handler(ignore_handler), + repeat_count_handler(ignore_handler), setup_handler(default_handler), teardown_handler(teardown_handler), - failure_handler(failure_handler), - timeout_ms(0) + failure_handler(failure_handler) {} Case::Case(const char *description, @@ -53,67 +53,91 @@ Case::Case(const char *description, const case_failure_handler_t failure_handler) : description(description), handler(handler), - control_flow_handler(ignore_handler), + control_handler(ignore_handler), + repeat_count_handler(ignore_handler), setup_handler(default_handler), teardown_handler(default_handler), - failure_handler(failure_handler), - timeout_ms(0) + failure_handler(failure_handler) +{} + +// control handler +Case::Case(const char *description, + const case_setup_handler_t setup_handler, + const case_control_handler_t handler, + const case_teardown_handler_t teardown_handler, + const case_failure_handler_t failure_handler) : + description(description), + handler(ignore_handler), + control_handler(handler), + repeat_count_handler(ignore_handler), + setup_handler(setup_handler), + teardown_handler(teardown_handler), + failure_handler(failure_handler) +{} + +Case::Case(const char *description, + const case_control_handler_t handler, + const case_teardown_handler_t teardown_handler, + const case_failure_handler_t failure_handler) : + description(description), + handler(ignore_handler), + control_handler(handler), + repeat_count_handler(ignore_handler), + setup_handler(default_handler), + teardown_handler(teardown_handler), + failure_handler(failure_handler) +{} + +Case::Case(const char *description, + const case_control_handler_t handler, + const case_failure_handler_t failure_handler) : + description(description), + handler(ignore_handler), + control_handler(handler), + repeat_count_handler(ignore_handler), + setup_handler(default_handler), + teardown_handler(default_handler), + failure_handler(failure_handler) {} // control flow handler Case::Case(const char *description, const case_setup_handler_t setup_handler, - const case_control_flow_handler_t control_flow_handler, + const case_repeat_count_handler_t case_repeat_count_handler, const case_teardown_handler_t teardown_handler, const case_failure_handler_t failure_handler) : description(description), handler(ignore_handler), - control_flow_handler(control_flow_handler), + control_handler(ignore_handler), + repeat_count_handler(case_repeat_count_handler), setup_handler(setup_handler), teardown_handler(teardown_handler), - failure_handler(failure_handler), - timeout_ms(0) + failure_handler(failure_handler) {} Case::Case(const char *description, - const case_control_flow_handler_t control_flow_handler, + const case_repeat_count_handler_t case_repeat_count_handler, const case_failure_handler_t failure_handler) : description(description), handler(ignore_handler), - control_flow_handler(control_flow_handler), + control_handler(ignore_handler), + repeat_count_handler(case_repeat_count_handler), setup_handler(default_handler), teardown_handler(default_handler), - failure_handler(failure_handler), - timeout_ms(0) + failure_handler(failure_handler) {} Case::Case(const char *description, - const case_control_flow_handler_t control_flow_handler, + const case_repeat_count_handler_t case_repeat_count_handler, const case_teardown_handler_t teardown_handler, const case_failure_handler_t failure_handler) : description(description), handler(ignore_handler), - control_flow_handler(control_flow_handler), + control_handler(ignore_handler), + repeat_count_handler(case_repeat_count_handler), setup_handler(default_handler), teardown_handler(teardown_handler), - failure_handler(failure_handler), - timeout_ms(0) -{} - -Case::Case(const char *description, - const case_setup_handler_t setup_handler, - const case_handler_t handler, - const case_control_flow_handler_t control_flow_handler, - const case_teardown_handler_t teardown_handler, - const case_failure_handler_t failure_handler, - const int32_t timeout_ms) : - description(description), - handler(handler), - control_flow_handler(control_flow_handler), - setup_handler(setup_handler), - teardown_handler(teardown_handler), - failure_handler(failure_handler), - timeout_ms(timeout_ms) + failure_handler(failure_handler) {} const char* @@ -123,116 +147,5 @@ Case::get_description() const { bool Case::is_empty() const { - return !(handler || control_flow_handler || setup_handler || teardown_handler); + return !(handler || repeat_count_handler || setup_handler || teardown_handler); } - - -AsyncCase::AsyncCase(const char *description, - const case_handler_t case_handler, - const uint32_t timeout_ms) : - Case(description, default_handler, case_handler, ignore_handler, default_handler, default_handler, timeout_ms) {} - -AsyncCase::AsyncCase(const char *description, - const case_setup_handler_t setup_handler, - const case_handler_t case_handler, - const uint32_t timeout_ms) : - Case(description, setup_handler, case_handler, ignore_handler, default_handler, default_handler, timeout_ms) {} - - -AsyncCase::AsyncCase(const char *description, - const case_handler_t case_handler, - const case_teardown_handler_t teardown_handler, - const uint32_t timeout_ms) : - Case(description, default_handler, case_handler, ignore_handler, teardown_handler, default_handler, timeout_ms) {} - -AsyncCase::AsyncCase(const char *description, - const case_setup_handler_t setup_handler, - const case_handler_t case_handler, - const case_teardown_handler_t teardown_handler, - const uint32_t timeout_ms) : - Case(description, setup_handler, case_handler, ignore_handler, teardown_handler, default_handler, timeout_ms) {} - - -AsyncCase::AsyncCase(const char *description, - const case_handler_t case_handler, - const case_failure_handler_t failure_handler, - const uint32_t timeout_ms) : - Case(description, default_handler, case_handler, ignore_handler, default_handler, failure_handler, timeout_ms) {} - -AsyncCase::AsyncCase(const char *description, - const case_setup_handler_t setup_handler, - const case_handler_t case_handler, - const case_failure_handler_t failure_handler, - const uint32_t timeout_ms) : - Case(description, setup_handler, case_handler, ignore_handler, default_handler, failure_handler, timeout_ms) {} - -AsyncCase::AsyncCase(const char *description, - const case_handler_t case_handler, - const case_teardown_handler_t teardown_handler, - const case_failure_handler_t failure_handler, - const uint32_t timeout_ms) : - Case(description, default_handler, case_handler, ignore_handler, teardown_handler, failure_handler, timeout_ms) {} - -AsyncCase::AsyncCase(const char *description, - const case_setup_handler_t setup_handler, - const case_handler_t case_handler, - const case_teardown_handler_t teardown_handler, - const case_failure_handler_t failure_handler, - const uint32_t timeout_ms) : - Case(description, setup_handler, case_handler, ignore_handler, teardown_handler, failure_handler, timeout_ms) {} - - -AsyncCase::AsyncCase(const char *description, - const case_control_flow_handler_t case_handler, - const uint32_t timeout_ms) : - Case(description, default_handler, ignore_handler, case_handler, default_handler, default_handler, timeout_ms) {} - -AsyncCase::AsyncCase(const char *description, - const case_setup_handler_t setup_handler, - const case_control_flow_handler_t case_handler, - const uint32_t timeout_ms) : - Case(description, setup_handler, ignore_handler, case_handler, default_handler, default_handler, timeout_ms) {} - - -AsyncCase::AsyncCase(const char *description, - const case_control_flow_handler_t case_handler, - const case_teardown_handler_t teardown_handler, - const uint32_t timeout_ms) : - Case(description, default_handler, ignore_handler, case_handler, teardown_handler, default_handler, timeout_ms) {} - -AsyncCase::AsyncCase(const char *description, - const case_setup_handler_t setup_handler, - const case_control_flow_handler_t case_handler, - const case_teardown_handler_t teardown_handler, - const uint32_t timeout_ms) : - Case(description, setup_handler, ignore_handler, case_handler, teardown_handler, default_handler, timeout_ms) {} - - -AsyncCase::AsyncCase(const char *description, - const case_control_flow_handler_t case_handler, - const case_failure_handler_t failure_handler, - const uint32_t timeout_ms) : - Case(description, default_handler, ignore_handler, case_handler, default_handler, failure_handler, timeout_ms) {} - -AsyncCase::AsyncCase(const char *description, - const case_setup_handler_t setup_handler, - const case_control_flow_handler_t case_handler, - const case_failure_handler_t failure_handler, - const uint32_t timeout_ms) : - Case(description, setup_handler, ignore_handler, case_handler, default_handler, failure_handler, timeout_ms) {} - - -AsyncCase::AsyncCase(const char *description, - const case_control_flow_handler_t case_handler, - const case_teardown_handler_t teardown_handler, - const case_failure_handler_t failure_handler, - const uint32_t timeout_ms) : - Case(description, default_handler, ignore_handler, case_handler, teardown_handler, failure_handler, timeout_ms) {} - -AsyncCase::AsyncCase(const char *description, - const case_setup_handler_t setup_handler, - const case_control_flow_handler_t case_handler, - const case_teardown_handler_t teardown_handler, - const case_failure_handler_t failure_handler, - const uint32_t timeout_ms) : - Case(description, setup_handler, ignore_handler, case_handler, teardown_handler, failure_handler, timeout_ms) {} diff --git "a/frameworks\\utest/source/harness.cpp" "b/frameworks\\utest/source/harness.cpp" index f174c66626..17ed0e2008 100644 --- "a/frameworks\\utest/source/harness.cpp" +++ "b/frameworks\\utest/source/harness.cpp" @@ -34,7 +34,7 @@ namespace size_t test_failed = 0; const Case *case_current = NULL; - control_flow_t case_control_flow = CONTROL_FLOW_NEXT; + control_t case_control = control_t(); size_t case_repeat_count = 0; minar::callback_handle_t case_timeout_handle = NULL; @@ -107,16 +107,19 @@ void Harness::schedule_next_case() { if (case_failed_before == case_failed) case_passed++; - if(case_control_flow == CONTROL_FLOW_NEXT) { + if(case_control.repeat != REPEAT_CASE_ONLY) { if (handlers.case_teardown && (handlers.case_teardown(case_current, case_passed, case_failed, case_failed ? FAILURE_CASES : FAILURE_NONE) != STATUS_CONTINUE)) { raise_failure(FAILURE_TEARDOWN); } + } + if(case_control.repeat == REPEAT_NO_REPEAT) { if (case_failed > 0) test_failed++; else test_passed++; + case_control = control_t(); case_current++; case_passed = 0; case_failed = 0; @@ -167,7 +170,7 @@ void Harness::run_next_case() { handlers.case_setup = defaults.get_handler(case_current->setup_handler); handlers.case_teardown = defaults.get_handler(case_current->teardown_handler); - handlers.case_failure = defaults.get_handler(case_current->failure_handler); + handlers.case_failure = defaults.get_handler(case_current->failure_handler); if (case_current->is_empty()) { raise_failure(FAILURE_EMPTY_CASE); @@ -175,9 +178,9 @@ void Harness::run_next_case() return; } - if (!case_failed && !case_passed) { - size_t index = test_index_of_case++; - if (handlers.case_setup && (handlers.case_setup(case_current, index) != STATUS_CONTINUE)) { + if ((!case_failed && !case_passed) || case_control.repeat == REPEAT_ALL) { + if (case_control.repeat == REPEAT_NO_REPEAT) test_index_of_case++; + if (handlers.case_setup && (handlers.case_setup(case_current, test_index_of_case) != STATUS_CONTINUE)) { raise_failure(FAILURE_SETUP); schedule_next_case(); return; @@ -187,16 +190,17 @@ void Harness::run_next_case() case_failed_before = case_failed; if (case_current->handler) { - case_control_flow = CONTROL_FLOW_NEXT; case_current->handler(); - } else if (case_current->control_flow_handler) { - case_control_flow = case_current->control_flow_handler(case_repeat_count); - case_repeat_count++; + } else if (case_current->control_handler) { + case_control = case_current->control_handler(); + } else if (case_current->repeat_count_handler) { + case_control = case_current->repeat_count_handler(case_repeat_count); } + case_repeat_count++; - if (case_current->timeout_ms > 0) { + if (case_control.timeout > 0) { case_timeout_handle = minar::Scheduler::postCallback(handle_timeout) - .delay(minar::milliseconds(case_current->timeout_ms)) + .delay(minar::milliseconds(case_control.timeout)) .getHandle(); } else {