diff options
Diffstat (limited to 'tests')
| -rw-r--r-- | tests/main.cpp | 40 | ||||
| -rw-r--r-- | tests/test.hpp | 13 | ||||
| -rw-r--r-- | tests/test_memory.cpp | 41 | 
3 files changed, 58 insertions, 36 deletions
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);
  }
  | 
