tests: Tests can work without exceptions now

git-svn-id: http://pugixml.googlecode.com/svn/trunk@194 99668b35-9821-0410-8761-19e4c4f06640
This commit is contained in:
arseny.kapoulkine 2009-10-29 08:11:22 +00:00
parent 6210c21984
commit 1fdd096c80
4 changed files with 64 additions and 38 deletions

View File

@ -64,6 +64,10 @@ else if ( $(toolset:I=^msvc) )
{ {
CCFLAGS += /EHsc ; CCFLAGS += /EHsc ;
} }
else
{
CCFLAGS += /D_HAS_EXCEPTIONS=0 ;
}
actions ObjectAction actions ObjectAction
{ {
@ -136,14 +140,14 @@ else if ( $(toolset:I=^dmc) )
CCFLAGS += -DNDEBUG ; CCFLAGS += -DNDEBUG ;
} }
if ( !(PUGIXML_NO_EXCEPTIONS in $(defines)) ) if ( ! ( PUGIXML_NO_EXCEPTIONS in $(defines) ) )
{ {
CCFLAGS += -Ae ; CCFLAGS += -Ae ;
} }
actions ObjectAction actions ObjectAction
{ {
"%$(toolset)_PATH%\bin\dmc.exe" -c -f -wx $(>) -o$(<) "%$(toolset)_PATH%\bin\dmc.exe" -c -f -wx $(>) -o$(<) $(CCFLAGS)
} }
actions LibraryAction actions LibraryAction

View File

@ -7,6 +7,7 @@
test_runner* test_runner::_tests = 0; test_runner* test_runner::_tests = 0;
size_t test_runner::_memory_fail_threshold = 0; size_t test_runner::_memory_fail_threshold = 0;
jmp_buf test_runner::_failure;
static size_t g_memory_total_size = 0; 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); 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) static bool run_test(test_runner* test)
{ {
#ifndef PUGIXML_NO_EXCEPTIONS
try try
{ {
#endif
g_memory_total_size = 0; g_memory_total_size = 0;
test_runner::_memory_fail_threshold = 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(); 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; return true;
#ifndef PUGIXML_NO_EXCEPTIONS
} }
catch (const std::exception& e) catch (const std::exception& e)
{ {
printf("Test %s failed: exception %s\n", test->_name, e.what()); printf("Test %s failed: exception %s\n", test->_name, e.what());
} return false;
catch (const char* e)
{
printf("Test %s failed: %s\n", test->_name, e);
} }
catch (...) catch (...)
{ {
printf("Test %s failed for unknown reason\n", test->_name); printf("Test %s failed for unknown reason\n", test->_name);
}
return false; return false;
}
#endif
} }
int main() int main()

View File

@ -1,12 +1,18 @@
#ifndef HEADER_TEST_HPP #ifndef HEADER_TEST_HPP
#define 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 <string.h>
#include <math.h> #include <math.h>
#include <float.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) inline bool test_string_equal(const char* lhs, const char* rhs)
{ {
@ -103,6 +109,7 @@ struct test_runner
static test_runner* _tests; static test_runner* _tests;
static size_t _memory_fail_threshold; static size_t _memory_fail_threshold;
static jmp_buf _failure;
}; };
struct dummy_fixture {}; struct dummy_fixture {};
@ -147,7 +154,7 @@ struct dummy_fixture {};
#define CHECK_JOIN(text, file, line) text file #line #define CHECK_JOIN(text, file, line) text file #line
#define CHECK_JOIN2(text, file, line) CHECK_JOIN(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 #if defined(_MSC_VER) && _MSC_VER == 1200
# define STR(value) "??" // MSVC 6.0 has troubles stringizing stuff with strings w/escaping inside # define STR(value) "??" // MSVC 6.0 has troubles stringizing stuff with strings w/escaping inside

View File

@ -29,8 +29,6 @@ TEST(custom_memory_management)
// replace functions // replace functions
set_memory_management_functions(allocate, deallocate); set_memory_management_functions(allocate, deallocate);
try
{
{ {
// parse document // parse document
xml_document doc; xml_document doc;
@ -54,13 +52,4 @@ TEST(custom_memory_management)
// restore old functions // restore old functions
set_memory_management_functions(old_allocate, old_deallocate); 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;
}
} }