diff options
author | arseny.kapoulkine <arseny.kapoulkine@99668b35-9821-0410-8761-19e4c4f06640> | 2010-05-09 17:53:59 +0000 |
---|---|---|
committer | arseny.kapoulkine <arseny.kapoulkine@99668b35-9821-0410-8761-19e4c4f06640> | 2010-05-09 17:53:59 +0000 |
commit | 464d0f4ff9e6d30be6a5ccf9da571ce8596840fd (patch) | |
tree | 9b30bf0604a8f6630db7c15b639fa88936729b25 | |
parent | 78057035d24492e4d73e44fe00132feac13f1dd9 (diff) |
Added empty stream/buffer tests, fixed null buffer parsing in wchar_t mode
git-svn-id: http://pugixml.googlecode.com/svn/trunk@397 99668b35-9821-0410-8761-19e4c4f06640
-rw-r--r-- | src/pugixml.cpp | 13 | ||||
-rw-r--r-- | tests/test_document.cpp | 44 |
2 files changed, 54 insertions, 3 deletions
diff --git a/src/pugixml.cpp b/src/pugixml.cpp index 37f52fc..27c2960 100644 --- a/src/pugixml.cpp +++ b/src/pugixml.cpp @@ -922,10 +922,17 @@ namespace {
const char_t* data = static_cast<const char_t*>(contents);
- out_buffer = is_mutable ? const_cast<char_t*>(data) : static_cast<char_t*>(global_allocate(size > 0 ? size : 1));
- out_length = size / sizeof(char_t);
+ if (is_mutable)
+ {
+ out_buffer = const_cast<char_t*>(data);
+ }
+ else
+ {
+ out_buffer = static_cast<char_t*>(global_allocate(size > 0 ? size : 1));
+ if (!out_buffer) return false;
+ }
- if (!out_buffer) return false;
+ out_length = size / sizeof(char_t);
impl::convert_wchar_endian_swap(out_buffer, data, out_length);
diff --git a/tests/test_document.cpp b/tests/test_document.cpp index 97ba1d9..34d1ad1 100644 --- a/tests/test_document.cpp +++ b/tests/test_document.cpp @@ -71,6 +71,15 @@ TEST(document_load_stream_error) CHECK(doc.load(iss).status == status_out_of_memory);
}
+TEST(document_load_stream_empty)
+{
+ std::istringstream iss;
+
+ pugi::xml_document doc;
+ doc.load(iss); // parse result depends on STL implementation
+ CHECK(!doc.first_child());
+}
+
TEST(document_load_stream_wide)
{
pugi::xml_document doc;
@@ -571,3 +580,38 @@ TEST(document_convert_invalid_utf16) CHECK(test_parse_fail("\x00<\xde\x24", 4, encoding_utf16_be));
CHECK(test_parse_fail("<\x00\x24\xde", 4, encoding_utf16_le));
}
+
+TEST(document_load_buffer_empty)
+{
+ encoding_t encodings[] =
+ {
+ encoding_auto,
+ encoding_utf8,
+ encoding_utf16_le,
+ encoding_utf16_be,
+ encoding_utf16,
+ encoding_utf32_le,
+ encoding_utf32_be,
+ encoding_utf32,
+ encoding_wchar
+ };
+
+ char buffer[1];
+
+ for (unsigned int i = 0; i < sizeof(encodings) / sizeof(encodings[0]); ++i)
+ {
+ encoding_t encoding = encodings[i];
+
+ xml_document doc;
+ CHECK(doc.load_buffer(buffer, 0, parse_default, encoding) && !doc.first_child());
+ CHECK(doc.load_buffer(0, 0, parse_default, encoding) && !doc.first_child());
+
+ CHECK(doc.load_buffer_inplace(buffer, 0, parse_default, encoding) && !doc.first_child());
+ CHECK(doc.load_buffer_inplace(0, 0, parse_default, encoding) && !doc.first_child());
+
+ void* own_buffer = pugi::get_memory_allocation_function()(1);
+
+ CHECK(doc.load_buffer_inplace_own(own_buffer, 0, parse_default, encoding) && !doc.first_child());
+ CHECK(doc.load_buffer_inplace_own(0, 0, parse_default, encoding) && !doc.first_child());
+ }
+}
|