2005-08-04 13:54:46 +00:00
|
|
|
/* Standalone program to test functionality of exceptions.
|
|
|
|
*
|
|
|
|
* Copyright (c) 2004 MX Telecom Ltd. <richardv@mxtelecom.com>
|
|
|
|
*
|
2018-02-08 16:59:17 +00:00
|
|
|
* SPDX-License-Identifier: GPL-2.0-or-later
|
2005-08-04 13:54:46 +00:00
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
2016-03-14 19:03:11 +00:00
|
|
|
#include <config.h>
|
|
|
|
|
2005-08-04 13:54:46 +00:00
|
|
|
#include <stdio.h>
|
|
|
|
#include <glib.h>
|
|
|
|
#include "exceptions.h"
|
|
|
|
|
|
|
|
gboolean failed = FALSE;
|
|
|
|
|
2016-07-15 00:04:48 +00:00
|
|
|
static void
|
|
|
|
finally_called_uncaught_exception(volatile unsigned int* called)
|
|
|
|
{
|
|
|
|
TRY {
|
|
|
|
THROW(BoundsError);
|
|
|
|
}
|
|
|
|
FINALLY {
|
|
|
|
(*called)++;
|
|
|
|
}
|
|
|
|
ENDTRY;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
finally_called_rethrown_exception(volatile unsigned int* thrown, volatile unsigned int* called)
|
|
|
|
{
|
|
|
|
TRY {
|
|
|
|
THROW(BoundsError);
|
|
|
|
}
|
|
|
|
CATCH_ALL {
|
|
|
|
(*thrown) += 10;
|
|
|
|
RETHROW;
|
|
|
|
}
|
|
|
|
FINALLY {
|
|
|
|
(*called) += 10;
|
|
|
|
}
|
|
|
|
ENDTRY;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
finally_called_exception_from_catch(volatile unsigned int* thrown, volatile unsigned int* called)
|
|
|
|
{
|
|
|
|
TRY {
|
|
|
|
THROW(BoundsError);
|
|
|
|
}
|
|
|
|
CATCH_ALL {
|
|
|
|
if((*thrown) > 0) {
|
|
|
|
printf("05: Looping exception\n");
|
|
|
|
failed = TRUE;
|
|
|
|
} else {
|
|
|
|
(*thrown) += 10;
|
|
|
|
THROW(BoundsError);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
FINALLY {
|
|
|
|
(*called) += 10;
|
|
|
|
}
|
|
|
|
ENDTRY;
|
|
|
|
}
|
|
|
|
|
2018-09-05 18:37:20 +00:00
|
|
|
static void
|
2005-08-04 13:54:46 +00:00
|
|
|
run_tests(void)
|
|
|
|
{
|
|
|
|
volatile unsigned int ex_thrown, finally_called;
|
|
|
|
|
|
|
|
/* check that the right catch, and the finally, are called, on exception */
|
|
|
|
ex_thrown = finally_called = 0;
|
|
|
|
TRY {
|
|
|
|
THROW(BoundsError);
|
|
|
|
}
|
|
|
|
CATCH(BoundsError) {
|
|
|
|
ex_thrown++;
|
|
|
|
}
|
2013-04-18 19:22:24 +00:00
|
|
|
CATCH(FragmentBoundsError) {
|
|
|
|
printf("01: Caught wrong exception: FragmentBoundsError\n");
|
|
|
|
failed = TRUE;
|
|
|
|
}
|
2005-08-04 13:54:46 +00:00
|
|
|
CATCH(ReportedBoundsError) {
|
|
|
|
printf("01: Caught wrong exception: ReportedBoundsError\n");
|
|
|
|
failed = TRUE;
|
|
|
|
}
|
|
|
|
CATCH_ALL {
|
|
|
|
printf("01: Caught wrong exception: %lu\n", exc->except_id.except_code);
|
|
|
|
failed = TRUE;
|
|
|
|
}
|
|
|
|
FINALLY {
|
|
|
|
finally_called ++;
|
|
|
|
}
|
|
|
|
ENDTRY;
|
|
|
|
|
|
|
|
if (ex_thrown != 1) {
|
|
|
|
printf("01: %u BoundsErrors (not 1) on caught exception\n", ex_thrown);
|
|
|
|
failed = TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (finally_called != 1) {
|
|
|
|
printf("01: FINALLY called %u times (not 1) on caught exception\n", finally_called);
|
|
|
|
failed = TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* check that no catch at all is called when there is no exn */
|
2015-02-24 19:34:37 +00:00
|
|
|
ex_thrown = finally_called = 0;
|
2005-08-04 13:54:46 +00:00
|
|
|
TRY {
|
|
|
|
}
|
|
|
|
CATCH(BoundsError) {
|
|
|
|
printf("02: Caught wrong exception: BoundsError\n");
|
|
|
|
failed = TRUE;
|
|
|
|
}
|
2013-04-18 19:22:24 +00:00
|
|
|
CATCH(FragmentBoundsError) {
|
|
|
|
printf("02: Caught wrong exception: FragmentBoundsError\n");
|
|
|
|
failed = TRUE;
|
|
|
|
}
|
2005-08-04 13:54:46 +00:00
|
|
|
CATCH(ReportedBoundsError) {
|
|
|
|
printf("02: Caught wrong exception: ReportedBoundsError\n");
|
|
|
|
failed = TRUE;
|
|
|
|
}
|
|
|
|
CATCH_ALL {
|
|
|
|
printf("02: Caught wrong exception: %lu\n", exc->except_id.except_code);
|
|
|
|
failed = TRUE;
|
|
|
|
}
|
|
|
|
FINALLY {
|
|
|
|
finally_called ++;
|
|
|
|
}
|
|
|
|
ENDTRY;
|
|
|
|
|
|
|
|
if (finally_called != 1) {
|
|
|
|
printf("02: FINALLY called %u times (not 1) on no exception\n", finally_called);
|
|
|
|
failed = TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* check that finally is called on an uncaught exception */
|
|
|
|
ex_thrown = finally_called = 0;
|
|
|
|
TRY {
|
2016-07-15 00:04:48 +00:00
|
|
|
finally_called_uncaught_exception(&finally_called);
|
2005-08-04 13:54:46 +00:00
|
|
|
}
|
|
|
|
CATCH(BoundsError) {
|
|
|
|
ex_thrown++;
|
|
|
|
}
|
|
|
|
ENDTRY;
|
2011-05-12 13:50:44 +00:00
|
|
|
|
2005-08-04 13:54:46 +00:00
|
|
|
if (finally_called != 1) {
|
|
|
|
printf("03: FINALLY called %u times (not 1) on uncaught exception\n", finally_called);
|
|
|
|
failed = TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (ex_thrown != 1) {
|
|
|
|
printf("03: %u BoundsErrors (not 1) on uncaught exception\n", ex_thrown);
|
|
|
|
failed = TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* check that finally is called on an rethrown exception */
|
|
|
|
ex_thrown = finally_called = 0;
|
|
|
|
TRY {
|
2016-07-15 00:04:48 +00:00
|
|
|
finally_called_rethrown_exception(&ex_thrown, &finally_called);
|
2005-08-04 13:54:46 +00:00
|
|
|
}
|
|
|
|
CATCH(BoundsError) {
|
|
|
|
ex_thrown ++;
|
|
|
|
}
|
|
|
|
FINALLY {
|
|
|
|
finally_called ++;
|
|
|
|
}
|
|
|
|
ENDTRY;
|
2011-05-12 13:50:44 +00:00
|
|
|
|
2005-08-04 13:54:46 +00:00
|
|
|
if (finally_called != 11) {
|
|
|
|
printf("04: finally_called = %u (not 11) on rethrown exception\n", finally_called);
|
|
|
|
failed = TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (ex_thrown != 11) {
|
|
|
|
printf("04: %u BoundsErrors (not 11) on rethrown exception\n", ex_thrown);
|
|
|
|
failed = TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* check that finally is called on an exception thrown from a CATCH block */
|
|
|
|
ex_thrown = finally_called = 0;
|
|
|
|
TRY {
|
2016-07-15 00:04:48 +00:00
|
|
|
finally_called_exception_from_catch(&ex_thrown, &finally_called);
|
2005-08-04 13:54:46 +00:00
|
|
|
}
|
|
|
|
CATCH(BoundsError) {
|
|
|
|
ex_thrown ++;
|
|
|
|
}
|
|
|
|
FINALLY {
|
|
|
|
finally_called ++;
|
|
|
|
}
|
|
|
|
ENDTRY;
|
2011-05-12 13:50:44 +00:00
|
|
|
|
2005-08-04 13:54:46 +00:00
|
|
|
if (finally_called != 11) {
|
|
|
|
printf("05: finally_called = %u (not 11) on exception thrown from CATCH\n", finally_called);
|
|
|
|
failed = TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (ex_thrown != 11) {
|
|
|
|
printf("05: %u BoundsErrors (not 11) on exception thrown from CATCH\n", ex_thrown);
|
|
|
|
failed = TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
if(failed == FALSE )
|
|
|
|
printf("success\n");
|
|
|
|
}
|
|
|
|
|
|
|
|
int main(void)
|
|
|
|
{
|
|
|
|
except_init();
|
|
|
|
run_tests();
|
|
|
|
except_deinit();
|
|
|
|
exit(failed?1:0);
|
|
|
|
}
|
2014-10-10 14:41:10 +00:00
|
|
|
|
|
|
|
/*
|
|
|
|
* Editor modelines - http://www.wireshark.org/tools/modelines.html
|
|
|
|
*
|
|
|
|
* Local variables:
|
|
|
|
* c-basic-offset: 4
|
|
|
|
* tab-width: 8
|
|
|
|
* indent-tabs-mode: nil
|
|
|
|
* End:
|
|
|
|
*
|
|
|
|
* vi: set shiftwidth=4 tabstop=8 expandtab:
|
|
|
|
* :indentSize=4:tabSize=8:noTabs=true:
|
|
|
|
*/
|