From 8d303a9185ff9e7e43d33c7acad0c4bb2f31052f Mon Sep 17 00:00:00 2001 From: Wolfgang Thaller Date: Sun, 13 Jan 2019 21:43:38 +0100 Subject: [PATCH] add automated test for exception handling --- AutomatedTests/CMakeLists.txt | 2 +- AutomatedTests/Exceptions.cc | 73 +++++++++++++++++++++++++++++++++++ 2 files changed, 74 insertions(+), 1 deletion(-) create mode 100644 AutomatedTests/Exceptions.cc diff --git a/AutomatedTests/CMakeLists.txt b/AutomatedTests/CMakeLists.txt index 5eb78204a0..dc267a5e2e 100644 --- a/AutomatedTests/CMakeLists.txt +++ b/AutomatedTests/CMakeLists.txt @@ -79,4 +79,4 @@ if(CMAKE_SYSTEM_NAME MATCHES Retro68) ${LAUNCH_METHOD_FLAG} ${RETRO68_TEST_CONFIG} Segments.bin) endif() - +test(Exceptions.cc PROPERTIES PASS_REGULAR_EXPRESSION "OK") diff --git a/AutomatedTests/Exceptions.cc b/AutomatedTests/Exceptions.cc new file mode 100644 index 0000000000..16ef99c10e --- /dev/null +++ b/AutomatedTests/Exceptions.cc @@ -0,0 +1,73 @@ +/* + Copyright 2019 Wolfgang Thaller. + + This file is part of Retro68. + + Retro68 is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + Retro68 is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Retro68. If not, see . +*/ + +#include +#include +#include + +class Foo +{ +}; + +void foobar() +{ + throw Foo(); +} + +void UnexpectedExceptionOccurred() +{ + printf("std::unexpected called.\n"); + exit(1); +} + +void UncaughtExceptionOccurred() +{ + printf("std::terminate called.\n"); + exit(1); +} + +int main(int argc, char** argv) +{ + freopen("out", "w", stdout); + + std::set_unexpected(&UnexpectedExceptionOccurred); + std::set_terminate(&UncaughtExceptionOccurred); + + bool throwFail = false; + bool catchFail = true; + + try + { + foobar(); + throwFail = true; + } + catch(...) + { + catchFail = false; + } + + if(throwFail) + printf("throw didn't really throw\n"); + if(catchFail) + printf("catch block never entered\n"); + + if(!throwFail && !catchFail) + printf("OK\n"); + return 0; +}