From 464d0f4ff9e6d30be6a5ccf9da571ce8596840fd Mon Sep 17 00:00:00 2001 From: "arseny.kapoulkine" Date: Sun, 9 May 2010 17:53:59 +0000 Subject: 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 --- src/pugixml.cpp | 13 ++++++++++--- 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(contents); - out_buffer = is_mutable ? const_cast(data) : static_cast(global_allocate(size > 0 ? size : 1)); - out_length = size / sizeof(char_t); + if (is_mutable) + { + out_buffer = const_cast(data); + } + else + { + out_buffer = static_cast(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()); + } +} -- cgit v1.2.3