93 lines
2.1 KiB
C
93 lines
2.1 KiB
C
|
|
#include "akerror.h"
|
||
|
|
#include "err_capture.h"
|
||
|
|
|
||
|
|
/*
|
||
|
|
* Cover the conditional break/return failure macros:
|
||
|
|
* FAIL_ZERO_BREAK / FAIL_NONZERO_BREAK / FAIL_BREAK (inside ATTEMPT)
|
||
|
|
* FAIL_ZERO_RETURN / FAIL_NONZERO_RETURN / FAIL_RETURN (direct return)
|
||
|
|
* Each is checked in both its failing and its non-failing (pass-through) state.
|
||
|
|
*/
|
||
|
|
|
||
|
|
akerr_ErrorContext *zero_break(int x)
|
||
|
|
{
|
||
|
|
PREPARE_ERROR(e);
|
||
|
|
ATTEMPT {
|
||
|
|
FAIL_ZERO_BREAK(e, x, AKERR_VALUE, "x was zero");
|
||
|
|
} CLEANUP {
|
||
|
|
} PROCESS(e) {
|
||
|
|
} FINISH(e, true);
|
||
|
|
SUCCEED_RETURN(e);
|
||
|
|
}
|
||
|
|
|
||
|
|
akerr_ErrorContext *nonzero_break(int x)
|
||
|
|
{
|
||
|
|
PREPARE_ERROR(e);
|
||
|
|
ATTEMPT {
|
||
|
|
FAIL_NONZERO_BREAK(e, x, AKERR_INDEX, "x was nonzero");
|
||
|
|
} CLEANUP {
|
||
|
|
} PROCESS(e) {
|
||
|
|
} FINISH(e, true);
|
||
|
|
SUCCEED_RETURN(e);
|
||
|
|
}
|
||
|
|
|
||
|
|
akerr_ErrorContext *always_break(void)
|
||
|
|
{
|
||
|
|
PREPARE_ERROR(e);
|
||
|
|
ATTEMPT {
|
||
|
|
FAIL_BREAK(e, AKERR_IO, "always");
|
||
|
|
} CLEANUP {
|
||
|
|
} PROCESS(e) {
|
||
|
|
} FINISH(e, true);
|
||
|
|
SUCCEED_RETURN(e);
|
||
|
|
}
|
||
|
|
|
||
|
|
akerr_ErrorContext *zero_return(int x)
|
||
|
|
{
|
||
|
|
PREPARE_ERROR(e);
|
||
|
|
FAIL_ZERO_RETURN(e, x, AKERR_KEY, "x was zero");
|
||
|
|
SUCCEED_RETURN(e);
|
||
|
|
}
|
||
|
|
|
||
|
|
akerr_ErrorContext *nonzero_return(int x)
|
||
|
|
{
|
||
|
|
PREPARE_ERROR(e);
|
||
|
|
FAIL_NONZERO_RETURN(e, x, AKERR_TYPE, "x was nonzero");
|
||
|
|
SUCCEED_RETURN(e);
|
||
|
|
}
|
||
|
|
|
||
|
|
int main(void)
|
||
|
|
{
|
||
|
|
akerr_capture_install();
|
||
|
|
akerr_init();
|
||
|
|
|
||
|
|
akerr_ErrorContext *r;
|
||
|
|
|
||
|
|
r = zero_break(0);
|
||
|
|
AKERR_CHECK(r != NULL && r->status == AKERR_VALUE);
|
||
|
|
r = akerr_release_error(r);
|
||
|
|
AKERR_CHECK(zero_break(7) == NULL);
|
||
|
|
|
||
|
|
r = nonzero_break(7);
|
||
|
|
AKERR_CHECK(r != NULL && r->status == AKERR_INDEX);
|
||
|
|
r = akerr_release_error(r);
|
||
|
|
AKERR_CHECK(nonzero_break(0) == NULL);
|
||
|
|
|
||
|
|
r = always_break();
|
||
|
|
AKERR_CHECK(r != NULL && r->status == AKERR_IO);
|
||
|
|
r = akerr_release_error(r);
|
||
|
|
|
||
|
|
r = zero_return(0);
|
||
|
|
AKERR_CHECK(r != NULL && r->status == AKERR_KEY);
|
||
|
|
r = akerr_release_error(r);
|
||
|
|
AKERR_CHECK(zero_return(7) == NULL);
|
||
|
|
|
||
|
|
r = nonzero_return(7);
|
||
|
|
AKERR_CHECK(r != NULL && r->status == AKERR_TYPE);
|
||
|
|
r = akerr_release_error(r);
|
||
|
|
AKERR_CHECK(nonzero_return(0) == NULL);
|
||
|
|
|
||
|
|
AKERR_CHECK(akerr_slots_in_use() == 0);
|
||
|
|
fprintf(stderr, "err_break_variants ok\n");
|
||
|
|
return 0;
|
||
|
|
}
|