1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
|
#include "stdafx.h"
#include "OS/Thread.h"
#include "OS/ThreadGroup.h"
#include "OS/Future.h"
static void error() {
throw UserError(L"ERROR");
}
class PtrError : public os::PtrThrowable {
public:
virtual const wchar *toCStr() const { return S("ERROR"); }
};
static void errorPtr() {
PtrError *e = new PtrError();
throw e;
}
struct ExThread {
os::FutureBase result;
ExThread() : result() {}
void run() {
try {
error();
} catch (...) {
result.error();
}
}
void runPtr() {
try {
errorPtr();
} catch (...) {
result.error();
}
}
};
BEGIN_TEST(ExceptionTest, OS) {
ExThread z;
os::ThreadGroup g;
os::Thread::spawn(util::memberVoidFn(&z, &ExThread::run), g);
try {
z.result.result();
CHECK(false);
} catch (const UserError &) {
CHECK(true);
} catch (...) {
CHECK(false);
}
g.join();
} END_TEST
BEGIN_TEST(ExceptionPtrTest, OS) {
ExThread z;
os::ThreadGroup g;
os::Thread::spawn(util::memberVoidFn(&z, &ExThread::runPtr), g);
try {
z.result.result();
CHECK(false);
} catch (const PtrError *ex) {
CHECK(true);
delete ex;
} catch (...) {
CHECK(false);
}
g.join();
} END_TEST
|