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.
Niklas Hauser 2015-11-17 15:08:29 +00:00 committed by Martin Kojtal
parent b72f18009b
commit dc4cb4585c
2 changed files with 78 additions and 161 deletions

View File

@ -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) {}

View File

@ -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 {