diff options
| -rw-r--r-- | tests/test_memory.cpp | 111 | 
1 files changed, 109 insertions, 2 deletions
| diff --git a/tests/test_memory.cpp b/tests/test_memory.cpp index 8b4b6bc..b7a5577 100644 --- a/tests/test_memory.cpp +++ b/tests/test_memory.cpp @@ -1,5 +1,7 @@  #include "common.hpp" +#include "writer_string.hpp" +  #include <string>  namespace @@ -20,7 +22,7 @@ namespace  	}  } -TEST(custom_memory_management) +TEST(memory_custom_memory_management)  {  	allocate_count = deallocate_count = 0; @@ -64,7 +66,7 @@ TEST(custom_memory_management)  	set_memory_management_functions(old_allocate, old_deallocate);  } -TEST(large_allocations) +TEST(memory_large_allocations)  {  	allocate_count = deallocate_count = 0; @@ -127,3 +129,108 @@ TEST(large_allocations)  	// restore old functions  	set_memory_management_functions(old_allocate, old_deallocate);  } + +TEST(memory_string_allocate_increasing) +{ +	xml_document doc; + +	doc.append_child(node_pcdata).set_value(STR("x")); + +	std::basic_string<char_t> s = STR("ab"); + +	for (int i = 0; i < 17; ++i) +	{ +		doc.append_child(node_pcdata).set_value(s.c_str()); + +		s += s; +	} + +	std::string result = save_narrow(doc, format_no_declaration | format_raw, encoding_utf8); + +	CHECK(result.size() == 262143); +	CHECK(result[0] == 'x'); + +	for (size_t j = 1; j < result.size(); ++j) +	{ +		CHECK(result[j] == (j % 2 ? 'a' : 'b')); +	} +} + +TEST(memory_string_allocate_decreasing) +{ +	xml_document doc; + +	std::basic_string<char_t> s = STR("ab"); + +	for (int i = 0; i < 17; ++i) s += s; + +	for (int i = 0; i < 17; ++i) +	{ +		s.resize(s.size() / 2); + +		doc.append_child(node_pcdata).set_value(s.c_str()); +	} + +	doc.append_child(node_pcdata).set_value(STR("x")); + +	std::string result = save_narrow(doc, format_no_declaration | format_raw, encoding_utf8); + +	CHECK(result.size() == 262143); +	CHECK(result[result.size() - 1] == 'x'); + +	for (size_t j = 0; j + 1 < result.size(); ++j) +	{ +		CHECK(result[j] == (j % 2 ? 'b' : 'a')); +	} +} + +TEST(memory_string_allocate_increasing_inplace) +{ +	xml_document doc; + +	xml_node node = doc.append_child(node_pcdata); + +	node.set_value(STR("x")); + +	std::basic_string<char_t> s = STR("ab"); + +	for (int i = 0; i < 17; ++i) +	{ +		node.set_value(s.c_str()); + +		s += s; +	} + +	std::string result = save_narrow(doc, format_no_declaration | format_raw, encoding_utf8); + +	CHECK(result.size() == 131072); + +	for (size_t j = 0; j < result.size(); ++j) +	{ +		CHECK(result[j] == (j % 2 ? 'b' : 'a')); +	} +} + +TEST(memory_string_allocate_decreasing_inplace) +{ +	xml_document doc; + +	xml_node node = doc.append_child(node_pcdata); + +	std::basic_string<char_t> s = STR("ab"); + +	for (int i = 0; i < 17; ++i) s += s; + +	for (int i = 0; i < 17; ++i) +	{ +		s.resize(s.size() / 2); + +		node.set_value(s.c_str()); +	} + +	node.set_value(STR("x")); + +	std::string result = save_narrow(doc, format_no_declaration | format_raw, encoding_utf8); + +	CHECK(result == "x"); +} | 
