diff options
-rw-r--r-- | Jamrules.jam | 8 | ||||
-rw-r--r-- | tests/main.cpp | 40 | ||||
-rw-r--r-- | tests/test.hpp | 13 | ||||
-rw-r--r-- | tests/test_memory.cpp | 41 |
4 files changed, 64 insertions, 38 deletions
diff --git a/Jamrules.jam b/Jamrules.jam index fccb75c..8733b25 100644 --- a/Jamrules.jam +++ b/Jamrules.jam @@ -64,6 +64,10 @@ else if ( $(toolset:I=^msvc) ) {
CCFLAGS += /EHsc ;
}
+ else
+ {
+ CCFLAGS += /D_HAS_EXCEPTIONS=0 ;
+ }
actions ObjectAction
{
@@ -136,14 +140,14 @@ else if ( $(toolset:I=^dmc) ) CCFLAGS += -DNDEBUG ;
}
- if ( !(PUGIXML_NO_EXCEPTIONS in $(defines)) )
+ if ( ! ( PUGIXML_NO_EXCEPTIONS in $(defines) ) )
{
CCFLAGS += -Ae ;
}
actions ObjectAction
{
- "%$(toolset)_PATH%\bin\dmc.exe" -c -f -wx $(>) -o$(<)
+ "%$(toolset)_PATH%\bin\dmc.exe" -c -f -wx $(>) -o$(<) $(CCFLAGS)
}
actions LibraryAction
diff --git a/tests/main.cpp b/tests/main.cpp index a1149ef..07263a3 100644 --- a/tests/main.cpp +++ b/tests/main.cpp @@ -7,6 +7,7 @@ test_runner* test_runner::_tests = 0;
size_t test_runner::_memory_fail_threshold = 0;
+jmp_buf test_runner::_failure;
static size_t g_memory_total_size = 0;
@@ -46,33 +47,58 @@ static void replace_memory_management() pugi::set_memory_management_functions(custom_allocate, custom_deallocate);
}
+#if defined(_MSC_VER) && _MSC_VER > 1200 && _MSC_VER < 1400 && !defined(__INTEL_COMPILER)
+namespace std
+{
+ _CRTIMP2 _Prhand _Raise_handler;
+ _CRTIMP2 void __cdecl _Throw(const exception&) {}
+}
+#endif
+
static bool run_test(test_runner* test)
{
+#ifndef PUGIXML_NO_EXCEPTIONS
try
{
+#endif
g_memory_total_size = 0;
test_runner::_memory_fail_threshold = 0;
+
+#ifdef _MSC_VER
+# pragma warning(push)
+# pragma warning(disable: 4611) // interaction between _setjmp and C++ object destruction is non-portable
+#endif
+
+ volatile int result = setjmp(test_runner::_failure);
+
+#ifdef _MSC_VER
+# pragma warning(pop)
+#endif
+
+ if (result)
+ {
+ printf("Test %s failed: %s\n", test->_name, (const char*)(intptr_t)result);
+ return false;
+ }
test->run();
- if (g_memory_total_size != 0) throw "Memory leaks found";
+ if (g_memory_total_size != 0) longjmp(test_runner::_failure, (int)(intptr_t)"Memory leaks found");
return true;
+#ifndef PUGIXML_NO_EXCEPTIONS
}
catch (const std::exception& e)
{
printf("Test %s failed: exception %s\n", test->_name, e.what());
- }
- catch (const char* e)
- {
- printf("Test %s failed: %s\n", test->_name, e);
+ return false;
}
catch (...)
{
printf("Test %s failed for unknown reason\n", test->_name);
+ return false;
}
-
- return false;
+#endif
}
int main()
diff --git a/tests/test.hpp b/tests/test.hpp index b1e470e..c59bb1c 100644 --- a/tests/test.hpp +++ b/tests/test.hpp @@ -1,12 +1,18 @@ #ifndef HEADER_TEST_HPP
#define HEADER_TEST_HPP
+#include "../src/pugixml.hpp"
+
+#if (defined(_MSC_VER) && _MSC_VER==1200) || defined(__DMC__)
+typedef int intptr_t;
+#endif
+
#include <string.h>
#include <math.h>
#include <float.h>
-#include <string>
+#include <setjmp.h>
-#include "../src/pugixml.hpp"
+#include <string>
inline bool test_string_equal(const char* lhs, const char* rhs)
{
@@ -103,6 +109,7 @@ struct test_runner static test_runner* _tests;
static size_t _memory_fail_threshold;
+ static jmp_buf _failure;
};
struct dummy_fixture {};
@@ -147,7 +154,7 @@ struct dummy_fixture {}; #define CHECK_JOIN(text, file, line) text file #line
#define CHECK_JOIN2(text, file, line) CHECK_JOIN(text, file, line)
-#define CHECK_TEXT(condition, text) if (condition) ; else throw CHECK_JOIN2(text, " at "__FILE__ ":", __LINE__)
+#define CHECK_TEXT(condition, text) if (condition) ; else longjmp(test_runner::_failure, (int)(intptr_t)(CHECK_JOIN2(text, " at "__FILE__ ":", __LINE__)))
#if defined(_MSC_VER) && _MSC_VER == 1200
# define STR(value) "??" // MSVC 6.0 has troubles stringizing stuff with strings w/escaping inside
diff --git a/tests/test_memory.cpp b/tests/test_memory.cpp index 8f2d41b..8706ed2 100644 --- a/tests/test_memory.cpp +++ b/tests/test_memory.cpp @@ -29,38 +29,27 @@ TEST(custom_memory_management) // replace functions
set_memory_management_functions(allocate, deallocate);
- try
{
- {
- // parse document
- xml_document doc;
- CHECK(doc.load("<node/>"));
+ // parse document
+ xml_document doc;
+ CHECK(doc.load("<node/>"));
- CHECK(allocate_count == 1);
- CHECK(deallocate_count == 0);
- CHECK_STRING(buffer, "<node\0>");
+ CHECK(allocate_count == 1);
+ CHECK(deallocate_count == 0);
+ CHECK_STRING(buffer, "<node\0>");
- // modify document
- doc.child("node").set_name("foobars");
-
- CHECK(allocate_count == 2);
- CHECK(deallocate_count == 0);
- CHECK_STRING(buffer, "foobars");
- }
+ // modify document
+ doc.child("node").set_name("foobars");
CHECK(allocate_count == 2);
- CHECK(deallocate_count == 2);
+ CHECK(deallocate_count == 0);
CHECK_STRING(buffer, "foobars");
-
- // restore old functions
- set_memory_management_functions(old_allocate, old_deallocate);
}
- catch (const char* error)
- {
- // restore old functions
- set_memory_management_functions(old_allocate, old_deallocate);
- // rethrow
- throw error;
- }
+ CHECK(allocate_count == 2);
+ CHECK(deallocate_count == 2);
+ CHECK_STRING(buffer, "foobars");
+
+ // restore old functions
+ set_memory_management_functions(old_allocate, old_deallocate);
}
|