Added small app testing throwing/catching of exceptions beyond shared
object bounds. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@14975 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -3,3 +3,5 @@ SubDir HAIKU_TOP src tests misc ;
|
|||||||
SetSubDirSupportedPlatformsBeOSCompatible ;
|
SetSubDirSupportedPlatformsBeOSCompatible ;
|
||||||
|
|
||||||
SimpleTest rtti-test : rtti-test.cpp : be ;
|
SimpleTest rtti-test : rtti-test.cpp : be ;
|
||||||
|
|
||||||
|
SubInclude HAIKU_TOP src tests misc exception-test ;
|
||||||
|
|||||||
@@ -0,0 +1,12 @@
|
|||||||
|
SubDir HAIKU_TOP src tests misc exception-test ;
|
||||||
|
|
||||||
|
SetSubDirSupportedPlatformsBeOSCompatible ;
|
||||||
|
|
||||||
|
SharedLibrary libexceptiontest.so
|
||||||
|
: exceptions.cpp
|
||||||
|
;
|
||||||
|
|
||||||
|
SimpleTest exception-test
|
||||||
|
: exception-test.cpp
|
||||||
|
: libexceptiontest.so $(TARGET_LIBSTDC++)
|
||||||
|
;
|
||||||
@@ -0,0 +1,204 @@
|
|||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
#include "exceptions.h"
|
||||||
|
|
||||||
|
using std::string;
|
||||||
|
|
||||||
|
static const char *kCaughtNothing = "nothing";
|
||||||
|
static const char *kCaughtGeneric = "generic";
|
||||||
|
static const char *kCaughtBase = "ExceptionBase";
|
||||||
|
static const char *kCaughtA = "ExceptionA";
|
||||||
|
static const char *kCaughtB = "ExceptionB";
|
||||||
|
static const char *kCaughtVirtualBase = "VirtualExceptionBase";
|
||||||
|
static const char *kCaughtVirtualA = "VirtualExceptionA";
|
||||||
|
static const char *kCaughtVirtualB = "VirtualExceptionB";
|
||||||
|
static const char *kCaughtInt = "VirtualInt";
|
||||||
|
|
||||||
|
|
||||||
|
static string
|
||||||
|
catchBase(void (*function)())
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
(*function)();
|
||||||
|
} catch (ExceptionBase exception) {
|
||||||
|
return kCaughtBase;
|
||||||
|
} catch (...) {
|
||||||
|
return kCaughtGeneric;
|
||||||
|
}
|
||||||
|
return kCaughtNothing;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static string
|
||||||
|
catchA(void (*function)())
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
(*function)();
|
||||||
|
} catch (ExceptionA exception) {
|
||||||
|
return kCaughtA;
|
||||||
|
} catch (...) {
|
||||||
|
return kCaughtGeneric;
|
||||||
|
}
|
||||||
|
return kCaughtNothing;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static string
|
||||||
|
catchB(void (*function)())
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
(*function)();
|
||||||
|
} catch (ExceptionB exception) {
|
||||||
|
return kCaughtB;
|
||||||
|
} catch (...) {
|
||||||
|
return kCaughtGeneric;
|
||||||
|
}
|
||||||
|
return kCaughtNothing;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static string
|
||||||
|
catchVirtualBase(void (*function)())
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
(*function)();
|
||||||
|
} catch (VirtualExceptionBase exception) {
|
||||||
|
return kCaughtVirtualBase;
|
||||||
|
} catch (...) {
|
||||||
|
return kCaughtGeneric;
|
||||||
|
}
|
||||||
|
return kCaughtNothing;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static string
|
||||||
|
catchVirtualA(void (*function)())
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
(*function)();
|
||||||
|
} catch (VirtualExceptionA exception) {
|
||||||
|
return kCaughtVirtualA;
|
||||||
|
} catch (...) {
|
||||||
|
return kCaughtGeneric;
|
||||||
|
}
|
||||||
|
return kCaughtNothing;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static string
|
||||||
|
catchVirtualB(void (*function)())
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
(*function)();
|
||||||
|
} catch (VirtualExceptionB exception) {
|
||||||
|
return kCaughtVirtualB;
|
||||||
|
} catch (...) {
|
||||||
|
return kCaughtGeneric;
|
||||||
|
}
|
||||||
|
return kCaughtNothing;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static string
|
||||||
|
catchInt(void (*function)())
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
(*function)();
|
||||||
|
} catch (int exception) {
|
||||||
|
return kCaughtInt;
|
||||||
|
} catch (...) {
|
||||||
|
return kCaughtGeneric;
|
||||||
|
}
|
||||||
|
return kCaughtNothing;
|
||||||
|
}
|
||||||
|
|
||||||
|
static string
|
||||||
|
catchAny(void (*function)())
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
(*function)();
|
||||||
|
} catch (int exception) {
|
||||||
|
return kCaughtInt;
|
||||||
|
} catch (VirtualExceptionA exception) {
|
||||||
|
return kCaughtVirtualA;
|
||||||
|
} catch (VirtualExceptionB exception) {
|
||||||
|
return kCaughtVirtualB;
|
||||||
|
} catch (VirtualExceptionBase exception) {
|
||||||
|
return kCaughtVirtualBase;
|
||||||
|
} catch (ExceptionA exception) {
|
||||||
|
return kCaughtA;
|
||||||
|
} catch (ExceptionB exception) {
|
||||||
|
return kCaughtB;
|
||||||
|
} catch (ExceptionBase exception) {
|
||||||
|
return kCaughtBase;
|
||||||
|
} catch (...) {
|
||||||
|
return kCaughtGeneric;
|
||||||
|
}
|
||||||
|
return kCaughtNothing;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
test(string (*catcher)(void (*)()), void (*thrower)(), const char *expected)
|
||||||
|
{
|
||||||
|
string caught((*catcher)(thrower));
|
||||||
|
if (caught != expected) {
|
||||||
|
printf("ERROR: expected exception: %s, but caught: %s\n", expected,
|
||||||
|
caught.c_str());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
main()
|
||||||
|
{
|
||||||
|
test(catchBase, throwBase, kCaughtBase);
|
||||||
|
test(catchBase, throwA, kCaughtBase);
|
||||||
|
test(catchBase, throwB, kCaughtBase);
|
||||||
|
test(catchBase, throwVirtualBase, kCaughtBase);
|
||||||
|
test(catchBase, throwVirtualA, kCaughtBase);
|
||||||
|
test(catchBase, throwVirtualB, kCaughtBase);
|
||||||
|
test(catchBase, throwInt, kCaughtGeneric);
|
||||||
|
|
||||||
|
test(catchA, throwBase, kCaughtGeneric);
|
||||||
|
test(catchA, throwA, kCaughtA);
|
||||||
|
test(catchA, throwB, kCaughtGeneric);
|
||||||
|
test(catchA, throwVirtualBase, kCaughtGeneric);
|
||||||
|
test(catchA, throwVirtualA, kCaughtGeneric);
|
||||||
|
test(catchA, throwVirtualB, kCaughtGeneric);
|
||||||
|
test(catchA, throwInt, kCaughtGeneric);
|
||||||
|
|
||||||
|
test(catchVirtualBase, throwBase, kCaughtGeneric);
|
||||||
|
test(catchVirtualBase, throwA, kCaughtGeneric);
|
||||||
|
test(catchVirtualBase, throwB, kCaughtGeneric);
|
||||||
|
test(catchVirtualBase, throwVirtualBase, kCaughtVirtualBase);
|
||||||
|
test(catchVirtualBase, throwVirtualA, kCaughtVirtualBase);
|
||||||
|
test(catchVirtualBase, throwVirtualB, kCaughtVirtualBase);
|
||||||
|
test(catchVirtualBase, throwInt, kCaughtGeneric);
|
||||||
|
|
||||||
|
test(catchVirtualA, throwBase, kCaughtGeneric);
|
||||||
|
test(catchVirtualA, throwA, kCaughtGeneric);
|
||||||
|
test(catchVirtualA, throwB, kCaughtGeneric);
|
||||||
|
test(catchVirtualA, throwVirtualBase, kCaughtGeneric);
|
||||||
|
test(catchVirtualA, throwVirtualA, kCaughtVirtualA);
|
||||||
|
test(catchVirtualA, throwVirtualB, kCaughtGeneric);
|
||||||
|
test(catchVirtualA, throwInt, kCaughtGeneric);
|
||||||
|
|
||||||
|
test(catchInt, throwBase, kCaughtGeneric);
|
||||||
|
test(catchInt, throwA, kCaughtGeneric);
|
||||||
|
test(catchInt, throwB, kCaughtGeneric);
|
||||||
|
test(catchInt, throwVirtualBase, kCaughtGeneric);
|
||||||
|
test(catchInt, throwVirtualA, kCaughtGeneric);
|
||||||
|
test(catchInt, throwVirtualB, kCaughtGeneric);
|
||||||
|
test(catchInt, throwInt, kCaughtInt);
|
||||||
|
|
||||||
|
test(catchAny, throwBase, kCaughtBase);
|
||||||
|
test(catchAny, throwA, kCaughtA);
|
||||||
|
test(catchAny, throwB, kCaughtB);
|
||||||
|
test(catchAny, throwVirtualBase, kCaughtVirtualBase);
|
||||||
|
test(catchAny, throwVirtualA, kCaughtVirtualA);
|
||||||
|
test(catchAny, throwVirtualB, kCaughtVirtualB);
|
||||||
|
test(catchAny, throwInt, kCaughtInt);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
@@ -0,0 +1,28 @@
|
|||||||
|
|
||||||
|
#include "exceptions.h"
|
||||||
|
|
||||||
|
ExceptionBase::ExceptionBase() {}
|
||||||
|
ExceptionBase::~ExceptionBase() {}
|
||||||
|
|
||||||
|
ExceptionA::ExceptionA() {}
|
||||||
|
ExceptionA::~ExceptionA() {}
|
||||||
|
|
||||||
|
ExceptionB::ExceptionB() {}
|
||||||
|
ExceptionB::~ExceptionB() {}
|
||||||
|
|
||||||
|
VirtualExceptionBase::VirtualExceptionBase() {}
|
||||||
|
VirtualExceptionBase::~VirtualExceptionBase() {}
|
||||||
|
|
||||||
|
VirtualExceptionA::VirtualExceptionA() {}
|
||||||
|
VirtualExceptionA::~VirtualExceptionA() {}
|
||||||
|
|
||||||
|
VirtualExceptionB::VirtualExceptionB() {}
|
||||||
|
VirtualExceptionB::~VirtualExceptionB() {}
|
||||||
|
|
||||||
|
void throwBase() { throw ExceptionBase(); }
|
||||||
|
void throwA() { throw ExceptionA(); }
|
||||||
|
void throwB() { throw ExceptionB(); }
|
||||||
|
void throwVirtualBase() { throw VirtualExceptionBase(); }
|
||||||
|
void throwVirtualA() { throw VirtualExceptionA(); }
|
||||||
|
void throwVirtualB() { throw VirtualExceptionB(); }
|
||||||
|
void throwInt() { throw int(7); }
|
||||||
@@ -0,0 +1,52 @@
|
|||||||
|
|
||||||
|
#ifndef EXCEPTIONS_H
|
||||||
|
#define EXCEPTIONS_H
|
||||||
|
|
||||||
|
struct ExceptionBase {
|
||||||
|
ExceptionBase();
|
||||||
|
~ExceptionBase();
|
||||||
|
};
|
||||||
|
|
||||||
|
struct ExceptionA : ExceptionBase {
|
||||||
|
ExceptionA();
|
||||||
|
~ExceptionA();
|
||||||
|
|
||||||
|
int a;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct ExceptionB : ExceptionBase {
|
||||||
|
ExceptionB();
|
||||||
|
~ExceptionB();
|
||||||
|
|
||||||
|
int b;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct VirtualExceptionBase : ExceptionBase {
|
||||||
|
VirtualExceptionBase();
|
||||||
|
virtual ~VirtualExceptionBase();
|
||||||
|
};
|
||||||
|
|
||||||
|
struct VirtualExceptionA : VirtualExceptionBase {
|
||||||
|
VirtualExceptionA();
|
||||||
|
virtual ~VirtualExceptionA();
|
||||||
|
|
||||||
|
int a;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct VirtualExceptionB : VirtualExceptionBase {
|
||||||
|
VirtualExceptionB();
|
||||||
|
virtual ~VirtualExceptionB();
|
||||||
|
|
||||||
|
int b;
|
||||||
|
};
|
||||||
|
|
||||||
|
void throwBase();
|
||||||
|
void throwA();
|
||||||
|
void throwB();
|
||||||
|
void throwVirtualBase();
|
||||||
|
void throwVirtualA();
|
||||||
|
void throwVirtualB();
|
||||||
|
void throwInt();
|
||||||
|
|
||||||
|
|
||||||
|
#endif // EXCEPTIONS_H
|
||||||
Reference in New Issue
Block a user