From 1fdd096c8011446935396baf447bfed9331f3ff3 Mon Sep 17 00:00:00 2001 From: "arseny.kapoulkine" Date: Thu, 29 Oct 2009 08:11:22 +0000 Subject: tests: Tests can work without exceptions now git-svn-id: http://pugixml.googlecode.com/svn/trunk@194 99668b35-9821-0410-8761-19e4c4f06640 --- tests/main.cpp | 40 +++++++++++++++++++++++++++++++++------- tests/test.hpp | 13 ++++++++++--- tests/test_memory.cpp | 41 +++++++++++++++-------------------------- 3 files changed, 58 insertions(+), 36 deletions(-) (limited to 'tests') 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 #include #include -#include +#include -#include "../src/pugixml.hpp" +#include 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("")); + // parse document + xml_document doc; + CHECK(doc.load("")); - CHECK(allocate_count == 1); - CHECK(deallocate_count == 0); - CHECK_STRING(buffer, ""); + CHECK(allocate_count == 1); + CHECK(deallocate_count == 0); + CHECK_STRING(buffer, ""); - // 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); } -- cgit v1.2.3