summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--tests/main.cpp60
-rw-r--r--tests/test.hpp22
-rw-r--r--tests/test_document.cpp29
-rw-r--r--tests/test_dom_traverse.cpp14
-rw-r--r--tests/test_unicode.cpp2
-rw-r--r--tests/test_write.cpp9
-rw-r--r--tests/test_xpath.cpp4
-rw-r--r--tests/test_xpath_functions.cpp4
-rw-r--r--tests/test_xpath_operators.cpp4
-rw-r--r--tests/test_xpath_parse.cpp4
10 files changed, 105 insertions, 47 deletions
diff --git a/tests/main.cpp b/tests/main.cpp
index 1886412..a1149ef 100644
--- a/tests/main.cpp
+++ b/tests/main.cpp
@@ -46,6 +46,35 @@ static void replace_memory_management()
pugi::set_memory_management_functions(custom_allocate, custom_deallocate);
}
+static bool run_test(test_runner* test)
+{
+ try
+ {
+ g_memory_total_size = 0;
+ test_runner::_memory_fail_threshold = 0;
+
+ test->run();
+
+ if (g_memory_total_size != 0) throw "Memory leaks found";
+
+ return true;
+ }
+ catch (const std::exception& e)
+ {
+ printf("Test %s failed: exception %s\n", test->_name, e.what());
+ }
+ catch (const char* e)
+ {
+ printf("Test %s failed: %s\n", test->_name, e);
+ }
+ catch (...)
+ {
+ printf("Test %s failed for unknown reason\n", test->_name);
+ }
+
+ return false;
+}
+
int main()
{
replace_memory_management();
@@ -53,33 +82,12 @@ int main()
unsigned int total = 0;
unsigned int passed = 0;
- for (test_runner* test = test_runner::_tests; test; test = test->_next)
+ test_runner* test = 0; // gcc3 "variable might be used uninitialized in this function" bug workaround
+
+ for (test = test_runner::_tests; test; test = test->_next)
{
- try
- {
- total++;
-
- g_memory_total_size = 0;
- test_runner::_memory_fail_threshold = 0;
-
- test->run();
-
- if (g_memory_total_size != 0) throw "Memory leaks found";
-
- passed++;
- }
- catch (const std::exception& e)
- {
- printf("Test %s failed: exception %s\n", test->_name, e.what());
- }
- catch (const char* e)
- {
- printf("Test %s failed: %s\n", test->_name, e);
- }
- catch (...)
- {
- printf("Test %s failed for unknown reason\n", test->_name);
- }
+ total++;
+ passed += run_test(test);
}
unsigned int failed = total - passed;
diff --git a/tests/test.hpp b/tests/test.hpp
index 5bbfbbd..b1e470e 100644
--- a/tests/test.hpp
+++ b/tests/test.hpp
@@ -4,7 +4,7 @@
#include <string.h>
#include <math.h>
#include <float.h>
-#include <sstream>
+#include <string>
#include "../src/pugixml.hpp"
@@ -18,14 +18,25 @@ template <typename Node> inline bool test_node_name_value(const Node& node, cons
return test_string_equal(node.name(), name) && test_string_equal(node.value(), value);
}
+struct xml_writer_string: public pugi::xml_writer
+{
+ std::string result;
+
+ virtual void write(const void* data, size_t size)
+ {
+ result += std::string(static_cast<const char*>(data), size);
+ }
+};
+
inline bool test_node(const pugi::xml_node& node, const char* contents, const char* indent, unsigned int flags)
{
- std::ostringstream oss;
- node.print(oss, indent, flags);
+ xml_writer_string writer;
+ node.print(writer, indent, flags);
- return oss.str() == contents;
+ return writer.result == contents;
}
+#ifndef PUGIXML_NO_XPATH
inline bool test_xpath_string(const pugi::xml_node& node, const char* query, const char* expected)
{
pugi::xpath_query q(query);
@@ -72,6 +83,7 @@ inline bool test_xpath_fail_compile(const char* query)
return true;
}
}
+#endif
struct test_runner
{
@@ -150,10 +162,12 @@ struct dummy_fixture {};
#define CHECK_NODE_EX(node, expected, indent, flags) CHECK_TEXT(test_node(node, expected, indent, flags), STR(node) " contents does not match " STR(expected))
#define CHECK_NODE(node, expected) CHECK_NODE_EX(node, expected, "", pugi::format_raw)
+#ifndef PUGIXML_NO_XPATH
#define CHECK_XPATH_STRING(node, query, expected) CHECK_TEXT(test_xpath_string(node, query, expected), STR(query) " does not evaluate to " STR(expected) " in context " STR(node))
#define CHECK_XPATH_BOOLEAN(node, query, expected) CHECK_TEXT(test_xpath_boolean(node, query, expected), STR(query) " does not evaluate to " STR(expected) " in context " STR(node))
#define CHECK_XPATH_NUMBER(node, query, expected) CHECK_TEXT(test_xpath_number(node, query, expected), STR(query) " does not evaluate to " STR(expected) " in context " STR(node))
#define CHECK_XPATH_NUMBER_NAN(node, query) CHECK_TEXT(test_xpath_number_nan(node, query), STR(query) " does not evaluate to NaN in context " STR(node))
#define CHECK_XPATH_FAIL(query) CHECK_TEXT(test_xpath_fail_compile(query), STR(query) " should not compile")
+#endif
#endif
diff --git a/tests/test_document.cpp b/tests/test_document.cpp
index ec54e95..d52635c 100644
--- a/tests/test_document.cpp
+++ b/tests/test_document.cpp
@@ -1,6 +1,8 @@
#include "common.hpp"
#include <fstream>
+#include <sstream>
+#include <string>
#ifdef _MSC_VER
#pragma warning(disable: 4996)
@@ -13,6 +15,7 @@ TEST(document_create)
CHECK_NODE(doc, "<node />");
}
+#ifndef PUGIXML_NO_STL
TEST(document_load_stream)
{
pugi::xml_document doc;
@@ -41,6 +44,7 @@ TEST(document_load_stream_error)
std::istringstream iss("<node/>");
CHECK(doc.load(iss).status == status_out_of_memory);
}
+#endif
TEST(document_load_string)
{
@@ -64,12 +68,12 @@ TEST(document_load_file_large)
CHECK(doc.load_file("tests/data/large.xml"));
- std::ostringstream oss;
- oss << "<node>";
- for (int i = 0; i < 10000; ++i) oss << "<node />";
- oss << "</node>";
+ std::string str;
+ str += "<node>";
+ for (int i = 0; i < 10000; ++i) str += "<node />";
+ str += "</node>";
- CHECK_NODE(doc, oss.str().c_str());
+ CHECK_NODE(doc, str.c_str());
}
TEST(document_load_file_error)
@@ -90,32 +94,29 @@ TEST(document_load_file_error)
TEST_XML(document_save, "<node/>")
{
- std::ostringstream oss;
- xml_writer_stream writer(oss);
+ xml_writer_string writer;
doc.save(writer, "", pugi::format_no_declaration | pugi::format_raw);
- CHECK(oss.str() == "<node />");
+ CHECK(writer.result == "<node />");
}
TEST_XML(document_save_bom, "<node/>")
{
- std::ostringstream oss;
- xml_writer_stream writer(oss);
+ xml_writer_string writer;
doc.save(writer, "", pugi::format_no_declaration | pugi::format_raw | pugi::format_write_bom_utf8);
- CHECK(oss.str() == "\xef\xbb\xbf<node />");
+ CHECK(writer.result == "\xef\xbb\xbf<node />");
}
TEST_XML(document_save_declaration, "<node/>")
{
- std::ostringstream oss;
- xml_writer_stream writer(oss);
+ xml_writer_string writer;
doc.save(writer);
- CHECK(oss.str() == "<?xml version=\"1.0\"?>\n<node />\n");
+ CHECK(writer.result == "<?xml version=\"1.0\"?>\n<node />\n");
}
TEST_XML(document_save_file, "<node/>")
diff --git a/tests/test_dom_traverse.cpp b/tests/test_dom_traverse.cpp
index ab3ed35..eef3e83 100644
--- a/tests/test_dom_traverse.cpp
+++ b/tests/test_dom_traverse.cpp
@@ -8,11 +8,20 @@
#pragma warning(disable: 4996)
#endif
+#ifdef PUGIXML_NO_STL
+template <typename I> static I move_iter(I base, int n)
+{
+ if (n > 0) while (n--) ++base;
+ else while (n++) --base;
+ return base;
+}
+#else
template <typename I> static I move_iter(I base, int n)
{
std::advance(base, n);
return base;
}
+#endif
template <typename T> static void generic_bool_ops_test(const T& obj)
{
@@ -566,6 +575,7 @@ TEST_XML(dom_node_find_node, "<node><child1/><child2/></node>")
CHECK(doc.find_node(find_predicate_prefix("child3")) == xml_node());
}
+#ifndef PUGIXML_NO_STL
TEST_XML(dom_node_path, "<node><child1>text<child2/></child1></node>")
{
CHECK(xml_node().path() == "");
@@ -578,6 +588,7 @@ TEST_XML(dom_node_path, "<node><child1>text<child2/></child1></node>")
CHECK(doc.child("node").child("child1").path('\\') == "\\node\\child1");
}
+#endif
TEST_XML(dom_node_first_element_by_path, "<node><child1>text<child2/></child1></node>")
{
@@ -591,7 +602,10 @@ TEST_XML(dom_node_first_element_by_path, "<node><child1>text<child2/></child1></
CHECK(doc.first_element_by_path("node") == doc.child("node"));
CHECK(doc.first_element_by_path("/node") == doc.child("node"));
+#ifndef PUGIXML_NO_STL
CHECK(doc.first_element_by_path("/node/child1/child2").path() == "/node/child1/child2");
+#endif
+
CHECK(doc.first_element_by_path("/node/child2") == xml_node());
CHECK(doc.first_element_by_path("\\node\\child1", '\\') == doc.child("node").child("child1"));
diff --git a/tests/test_unicode.cpp b/tests/test_unicode.cpp
index e7adc47..ce48edb 100644
--- a/tests/test_unicode.cpp
+++ b/tests/test_unicode.cpp
@@ -7,6 +7,7 @@ inline wchar_t wchar_cast(unsigned int value)
return static_cast<wchar_t>(value); // to avoid C4310 on MSVC
}
+#ifndef PUGIXML_NO_STL
TEST(as_utf16)
{
// valid 1-byte, 2-byte and 3-byte inputs
@@ -35,6 +36,7 @@ TEST(as_utf8)
CHECK(as_utf8(L"\x97624 \x1003ff") == "\xf2\x97\x98\xa4 \xf4\x80\x8f\xbf");
#endif
}
+#endif
TEST_XML(parse_bom_utf8, "\xef\xbb\xbf<node/>")
{
diff --git a/tests/test_write.cpp b/tests/test_write.cpp
index 81e945c..8981a39 100644
--- a/tests/test_write.cpp
+++ b/tests/test_write.cpp
@@ -1,6 +1,7 @@
#include "common.hpp"
#include <string>
+#include <sstream>
TEST_XML(write_simple, "<node attr='1'><child>text</child></node>")
{
@@ -72,6 +73,7 @@ TEST_XML(write_print_writer, "<node/>")
CHECK(writer.contents == "<node />\n");
}
+#ifndef PUGIXML_NO_STL
TEST_XML(write_print_stream, "<node/>")
{
std::ostringstream oss;
@@ -79,14 +81,15 @@ TEST_XML(write_print_stream, "<node/>")
CHECK(oss.str() == "<node />\n");
}
+#endif
TEST_XML(write_huge_chunk, "<node/>")
{
std::string name(10000, 'n');
doc.child("node").set_name(name.c_str());
- std::ostringstream oss;
- doc.print(oss);
+ test_writer writer;
+ doc.print(writer);
- CHECK(oss.str() == "<" + name + " />\n");
+ CHECK(writer.contents == "<" + name + " />\n");
}
diff --git a/tests/test_xpath.cpp b/tests/test_xpath.cpp
index b3ace66..39814a5 100644
--- a/tests/test_xpath.cpp
+++ b/tests/test_xpath.cpp
@@ -1,3 +1,5 @@
+#ifndef PUGIXML_NO_XPATH
+
#include "common.hpp"
TEST_XML(xpath_document_order, "<node><child1 attr1='value1' attr2='value2'/><child2 attr1='value1'>test</child2></node>")
@@ -17,3 +19,5 @@ TEST_XML(xpath_document_order, "<node><child1 attr1='value1' attr2='value2'/><ch
CHECK(doc.child("node").child("child2").attribute("attr1").document_order() == 7);
CHECK(doc.child("node").child("child2").first_child().document_order() == 8);
}
+
+#endif
diff --git a/tests/test_xpath_functions.cpp b/tests/test_xpath_functions.cpp
index d580d89..ef04667 100644
--- a/tests/test_xpath_functions.cpp
+++ b/tests/test_xpath_functions.cpp
@@ -1,3 +1,5 @@
+#ifndef PUGIXML_NO_XPATH
+
#include "common.hpp"
TEST_XML(xpath_number_number, "<node>123</node>")
@@ -530,3 +532,5 @@ TEST(xpath_function_arguments)
// lack of commas
CHECK_XPATH_FAIL("substring(1 2)");
}
+
+#endif
diff --git a/tests/test_xpath_operators.cpp b/tests/test_xpath_operators.cpp
index 08a54c4..8a83723 100644
--- a/tests/test_xpath_operators.cpp
+++ b/tests/test_xpath_operators.cpp
@@ -1,3 +1,5 @@
+#ifndef PUGIXML_NO_XPATH
+
#include "common.hpp"
#if defined(_MSC_VER) && _MSC_VER == 1200
@@ -395,3 +397,5 @@ TEST(xpath_operators_boolean_precedence)
CHECK_XPATH_BOOLEAN(c, "(3 > 2) > 1", false);
CHECK_XPATH_BOOLEAN(c, "3 > (2 > 1)", true);
}
+
+#endif
diff --git a/tests/test_xpath_parse.cpp b/tests/test_xpath_parse.cpp
index d9595c8..6d9a4e7 100644
--- a/tests/test_xpath_parse.cpp
+++ b/tests/test_xpath_parse.cpp
@@ -1,3 +1,5 @@
+#ifndef PUGIXML_NO_XPATH
+
#include "common.hpp"
TEST(xpath_literal_parse)
@@ -32,3 +34,5 @@ TEST(xpath_number_error)
CHECK_XPATH_FAIL("123.a");
CHECK_XPATH_FAIL(".123a");
}
+
+#endif