From 47c23efe6215e24e390d820b0ef0412655b455e3 Mon Sep 17 00:00:00 2001 From: "arseny.kapoulkine" Date: Mon, 10 May 2010 08:59:48 +0000 Subject: Reworked DOM memory allocation scheme (name/value allocations use the same pages as node/attribute structures, pages are now deallocated when completely free) git-svn-id: http://pugixml.googlecode.com/svn/trunk@401 99668b35-9821-0410-8761-19e4c4f06640 --- tests/test_dom_modify.cpp | 2 +- tests/test_memory.cpp | 50 +++++++++++++++++++++++++++++++++++++++-------- 2 files changed, 43 insertions(+), 9 deletions(-) (limited to 'tests') diff --git a/tests/test_dom_modify.cpp b/tests/test_dom_modify.cpp index c80e0e9..8b869f4 100644 --- a/tests/test_dom_modify.cpp +++ b/tests/test_dom_modify.cpp @@ -494,7 +494,7 @@ TEST_XML_FLAGS(dom_node_copy_types, "pcdatapcdata")); } -TEST_XML(dom_attr_assign_large, "") +TEST_XML(dom_attr_assign_large_number, "") { xml_node node = doc.child(STR("node")); diff --git a/tests/test_memory.cpp b/tests/test_memory.cpp index 7ca87d6..474cf45 100644 --- a/tests/test_memory.cpp +++ b/tests/test_memory.cpp @@ -1,22 +1,22 @@ #include "common.hpp" +#include + namespace { - pugi::char_t buffer[8]; int allocate_count = 0; int deallocate_count = 0; void* allocate(size_t size) { - CHECK(size == sizeof(pugi::char_t) * 8); ++allocate_count; - return buffer; + return new char[size]; } void deallocate(void* ptr) { - CHECK(ptr == buffer); ++deallocate_count; + delete[] reinterpret_cast(ptr); } } @@ -34,22 +34,56 @@ TEST(custom_memory_management) xml_document doc; CHECK(doc.load(STR(""))); - CHECK(allocate_count == 1); + CHECK(allocate_count == 2); CHECK(deallocate_count == 0); - CHECK_STRING(buffer, STR(" s(i * 128, 'x'); + + CHECK(doc.append_child(node_pcdata).set_value(s.c_str())); + } + + // grow-prune loop + while (doc.first_child()) + { + pugi::xml_node node; + + // grow + for (node = doc.first_child(); node; node = node.next_sibling()) + { + std::basic_string s = node.value(); + + CHECK(node.set_value((s + s).c_str())); + } + + // prune + for (node = doc.first_child(); node; ) + { + pugi::xml_node next = node.next_sibling().next_sibling(); + + node.parent().remove_child(node); + + node = next; + } + } +} -- cgit v1.2.3