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 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141
|
#include <tut/tut.hpp>
#include <stdexcept>
using std::runtime_error;
/*
* If the test ctor throws an exception, we shall terminate current group
* execution: there is no reason to continue to run tests in that group as they
* all going to fail and even if not their credibility is low anyway.
*/
namespace tut
{
class counter : public tut::callback
{
public:
int cnt;
counter()
: cnt(0)
{
}
void test_completed(const tut::test_result& tr)
{
cnt++;
}
};
struct ctor_ex
{
test_runner tr;
struct dummy
{
dummy()
{
throw runtime_error("dummy has throwed an exception");
}
};
typedef test_group<dummy> tf;
typedef tf::object object;
tf factory;
ctor_ex()
: factory("internal", tr)
{
}
}
;
struct ctor_ex2
{
test_runner tr;
static int cnt;
struct dummy
{
dummy()
{
if (cnt++ == 1)
{
throw runtime_error("dummy has throwed an exception");
}
}
};
typedef test_group<dummy> tf;
typedef tf::object object;
tf factory;
ctor_ex2()
: factory("internal 2", tr)
{
}
};
int ctor_ex2::cnt = 0;
typedef test_group<ctor_ex> tf;
typedef tf::object object;
tf ctor_ex("exceptions at ctor");
typedef test_group<ctor_ex2> tf2;
typedef tf2::object object2;
tf2 ctor_ex2("exceptions at ctor 2");
template<>
template<>
void object::test<1>()
{
counter cnt;
tr.set_callback(&cnt);
tr.run_tests("internal");
ensure_equals("called only once", cnt.cnt, 1);
}
template<>
template<>
void object::test<2>()
{
counter cnt;
tr.set_callback(&cnt);
tr.run_tests();
ensure_equals("called only once", cnt.cnt, 1);
}
template<>
template<>
void ctor_ex2::object::test<1>()
{
}
template<>
template<>
void ctor_ex2::object::test<2>()
{
}
template<>
template<>
void ctor_ex2::object::test<3>()
{
}
template<>
template<>
void object2::test<1>()
{
counter cnt;
tr.set_callback(&cnt);
tr.run_tests("internal 2");
ensure_equals("called only twice", cnt.cnt, 2);
}
}
|