summaryrefslogtreecommitdiff
path: root/tests/test_memory.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tests/test_memory.cpp')
-rw-r--r--tests/test_memory.cpp111
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");
+}