tests: Extracted generic tests in a separate header, better filter tests, some API tests added
git-svn-id: http://pugixml.googlecode.com/svn/trunk@221 99668b35-9821-0410-8761-19e4c4f06640
This commit is contained in:
parent
c8a8b30bdd
commit
48bbb9f4dd
90
tests/helpers.hpp
Normal file
90
tests/helpers.hpp
Normal file
@ -0,0 +1,90 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "common.hpp"
|
||||||
|
|
||||||
|
#include <utility>
|
||||||
|
|
||||||
|
template <typename T> static void generic_bool_ops_test(const T& obj)
|
||||||
|
{
|
||||||
|
T null;
|
||||||
|
|
||||||
|
CHECK(!null);
|
||||||
|
CHECK(obj);
|
||||||
|
CHECK(!!obj);
|
||||||
|
|
||||||
|
bool b1 = null, b2 = obj;
|
||||||
|
|
||||||
|
CHECK(!b1);
|
||||||
|
CHECK(b2);
|
||||||
|
|
||||||
|
CHECK(obj && true);
|
||||||
|
CHECK(obj || false);
|
||||||
|
CHECK(obj && obj);
|
||||||
|
CHECK(obj || obj);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename T> static void generic_eq_ops_test(const T& obj1, const T& obj2)
|
||||||
|
{
|
||||||
|
T null = T();
|
||||||
|
|
||||||
|
// operator==
|
||||||
|
CHECK(null == null);
|
||||||
|
CHECK(obj1 == obj1);
|
||||||
|
CHECK(!(null == obj1));
|
||||||
|
CHECK(!(null == obj2));
|
||||||
|
CHECK(T(null) == null);
|
||||||
|
CHECK(T(obj1) == obj1);
|
||||||
|
|
||||||
|
// operator!=
|
||||||
|
CHECK(!(null != null));
|
||||||
|
CHECK(!(obj1 != obj1));
|
||||||
|
CHECK(null != obj1);
|
||||||
|
CHECK(null != obj2);
|
||||||
|
CHECK(!(T(null) != null));
|
||||||
|
CHECK(!(T(obj1) != obj1));
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename T> static void generic_rel_ops_test(T obj1, T obj2)
|
||||||
|
{
|
||||||
|
T null = T();
|
||||||
|
|
||||||
|
// obj1 < obj2 (we use operator<, but there is no other choice
|
||||||
|
if (obj1 > obj2) std::swap(obj1, obj2);
|
||||||
|
|
||||||
|
// operator<
|
||||||
|
CHECK(null < obj1);
|
||||||
|
CHECK(null < obj2);
|
||||||
|
CHECK(obj1 < obj2);
|
||||||
|
CHECK(!(null < null));
|
||||||
|
CHECK(!(obj1 < obj1));
|
||||||
|
CHECK(!(obj1 < null));
|
||||||
|
CHECK(!(obj2 < obj1));
|
||||||
|
|
||||||
|
// operator<=
|
||||||
|
CHECK(null <= obj1);
|
||||||
|
CHECK(null <= obj2);
|
||||||
|
CHECK(obj1 <= obj2);
|
||||||
|
CHECK(null <= null);
|
||||||
|
CHECK(obj1 <= obj1);
|
||||||
|
CHECK(!(obj1 <= null));
|
||||||
|
CHECK(!(obj2 <= obj1));
|
||||||
|
|
||||||
|
// operator>
|
||||||
|
CHECK(obj1 > null);
|
||||||
|
CHECK(obj2 > null);
|
||||||
|
CHECK(obj2 > obj1);
|
||||||
|
CHECK(!(null > null));
|
||||||
|
CHECK(!(obj1 > obj1));
|
||||||
|
CHECK(!(null > obj1));
|
||||||
|
CHECK(!(obj1 > obj2));
|
||||||
|
|
||||||
|
// operator>=
|
||||||
|
CHECK(obj1 >= null);
|
||||||
|
CHECK(obj2 >= null);
|
||||||
|
CHECK(obj2 >= obj1);
|
||||||
|
CHECK(null >= null);
|
||||||
|
CHECK(obj1 >= obj1);
|
||||||
|
CHECK(!(null >= obj1));
|
||||||
|
CHECK(!(obj1 >= obj2));
|
||||||
|
}
|
||||||
|
|
||||||
@ -6,6 +6,8 @@
|
|||||||
#include <vector>
|
#include <vector>
|
||||||
#include <iterator>
|
#include <iterator>
|
||||||
|
|
||||||
|
#include "helpers.hpp"
|
||||||
|
|
||||||
#ifdef _MSC_VER
|
#ifdef _MSC_VER
|
||||||
#pragma warning(disable: 4996)
|
#pragma warning(disable: 4996)
|
||||||
#endif
|
#endif
|
||||||
@ -25,80 +27,6 @@ template <typename I> static I move_iter(I base, int n)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
template <typename T> static void generic_bool_ops_test(const T& obj)
|
|
||||||
{
|
|
||||||
T null;
|
|
||||||
|
|
||||||
CHECK(!null);
|
|
||||||
CHECK(obj);
|
|
||||||
CHECK(!!obj);
|
|
||||||
|
|
||||||
bool b1 = null, b2 = obj;
|
|
||||||
|
|
||||||
CHECK(!b1);
|
|
||||||
CHECK(b2);
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename T> static void generic_rel_ops_test(T obj1, T obj2)
|
|
||||||
{
|
|
||||||
T null = T();
|
|
||||||
|
|
||||||
// obj1 < obj2 (we use operator<, but there is no other choice
|
|
||||||
if (obj1 > obj2) std::swap(obj1, obj2);
|
|
||||||
|
|
||||||
// operator==
|
|
||||||
CHECK(null == null);
|
|
||||||
CHECK(obj1 == obj1);
|
|
||||||
CHECK(!(null == obj1));
|
|
||||||
CHECK(!(null == obj2));
|
|
||||||
CHECK(T(null) == null);
|
|
||||||
CHECK(T(obj1) == obj1);
|
|
||||||
|
|
||||||
// operator!=
|
|
||||||
CHECK(!(null != null));
|
|
||||||
CHECK(!(obj1 != obj1));
|
|
||||||
CHECK(null != obj1);
|
|
||||||
CHECK(null != obj2);
|
|
||||||
CHECK(!(T(null) != null));
|
|
||||||
CHECK(!(T(obj1) != obj1));
|
|
||||||
|
|
||||||
// operator<
|
|
||||||
CHECK(null < obj1);
|
|
||||||
CHECK(null < obj2);
|
|
||||||
CHECK(obj1 < obj2);
|
|
||||||
CHECK(!(null < null));
|
|
||||||
CHECK(!(obj1 < obj1));
|
|
||||||
CHECK(!(obj1 < null));
|
|
||||||
CHECK(!(obj2 < obj1));
|
|
||||||
|
|
||||||
// operator<=
|
|
||||||
CHECK(null <= obj1);
|
|
||||||
CHECK(null <= obj2);
|
|
||||||
CHECK(obj1 <= obj2);
|
|
||||||
CHECK(null <= null);
|
|
||||||
CHECK(obj1 <= obj1);
|
|
||||||
CHECK(!(obj1 <= null));
|
|
||||||
CHECK(!(obj2 <= obj1));
|
|
||||||
|
|
||||||
// operator>
|
|
||||||
CHECK(obj1 > null);
|
|
||||||
CHECK(obj2 > null);
|
|
||||||
CHECK(obj2 > obj1);
|
|
||||||
CHECK(!(null > null));
|
|
||||||
CHECK(!(obj1 > obj1));
|
|
||||||
CHECK(!(null > obj1));
|
|
||||||
CHECK(!(obj1 > obj2));
|
|
||||||
|
|
||||||
// operator>=
|
|
||||||
CHECK(obj1 >= null);
|
|
||||||
CHECK(obj2 >= null);
|
|
||||||
CHECK(obj2 >= obj1);
|
|
||||||
CHECK(null >= null);
|
|
||||||
CHECK(obj1 >= obj1);
|
|
||||||
CHECK(!(null >= obj1));
|
|
||||||
CHECK(!(obj1 >= obj2));
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename T> static void generic_empty_test(const T& obj)
|
template <typename T> static void generic_empty_test(const T& obj)
|
||||||
{
|
{
|
||||||
T null;
|
T null;
|
||||||
@ -112,6 +40,11 @@ TEST_XML(dom_attr_bool_ops, "<node attr='1'/>")
|
|||||||
generic_bool_ops_test(doc.child("node").attribute("attr"));
|
generic_bool_ops_test(doc.child("node").attribute("attr"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_XML(dom_attr_eq_ops, "<node attr1='1' attr2='2'/>")
|
||||||
|
{
|
||||||
|
generic_eq_ops_test(doc.child("node").attribute("attr1"), doc.child("node").attribute("attr2"));
|
||||||
|
}
|
||||||
|
|
||||||
TEST_XML(dom_attr_rel_ops, "<node attr1='1' attr2='2'/>")
|
TEST_XML(dom_attr_rel_ops, "<node attr1='1' attr2='2'/>")
|
||||||
{
|
{
|
||||||
generic_rel_ops_test(doc.child("node").attribute("attr1"), doc.child("node").attribute("attr2"));
|
generic_rel_ops_test(doc.child("node").attribute("attr1"), doc.child("node").attribute("attr2"));
|
||||||
@ -250,6 +183,11 @@ TEST_XML(dom_node_bool_ops, "<node/>")
|
|||||||
generic_bool_ops_test(doc.child("node"));
|
generic_bool_ops_test(doc.child("node"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_XML(dom_node_eq_ops, "<node><node1/><node2/></node>")
|
||||||
|
{
|
||||||
|
generic_eq_ops_test(doc.child("node").child("node1"), doc.child("node").child("node2"));
|
||||||
|
}
|
||||||
|
|
||||||
TEST_XML(dom_node_rel_ops, "<node><node1/><node2/></node>")
|
TEST_XML(dom_node_rel_ops, "<node><node1/><node2/></node>")
|
||||||
{
|
{
|
||||||
generic_rel_ops_test(doc.child("node").child("node1"), doc.child("node").child("node2"));
|
generic_rel_ops_test(doc.child("node").child("node1"), doc.child("node").child("node2"));
|
||||||
|
|||||||
66
tests/test_xpath_api.cpp
Normal file
66
tests/test_xpath_api.cpp
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
#ifndef PUGIXML_NO_XPATH
|
||||||
|
|
||||||
|
#include "common.hpp"
|
||||||
|
|
||||||
|
#include "helpers.hpp"
|
||||||
|
|
||||||
|
TEST_XML(xpath_api_select_nodes, "<node><head/><foo/><foo/><tail/></node>")
|
||||||
|
{
|
||||||
|
doc.precompute_document_order();
|
||||||
|
|
||||||
|
xpath_node_set ns1 = doc.select_nodes("node/foo");
|
||||||
|
|
||||||
|
xpath_query q("node/foo");
|
||||||
|
xpath_node_set ns2 = doc.select_nodes(q);
|
||||||
|
|
||||||
|
CHECK(ns1.size() == 2 && ns1[0].node().document_order() == 4 && ns1[1].node().document_order() == 5);
|
||||||
|
CHECK(ns2.size() == 2 && ns2[0].node().document_order() == 4 && ns2[1].node().document_order() == 5);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_XML(xpath_api_select_single_node, "<node><head/><foo/><foo/><tail/></node>")
|
||||||
|
{
|
||||||
|
doc.precompute_document_order();
|
||||||
|
|
||||||
|
xpath_node n1 = doc.select_single_node("node/foo");
|
||||||
|
|
||||||
|
xpath_query q("node/foo");
|
||||||
|
xpath_node n2 = doc.select_single_node(q);
|
||||||
|
|
||||||
|
CHECK(n1.node().document_order() == 4);
|
||||||
|
CHECK(n2.node().document_order() == 4);
|
||||||
|
|
||||||
|
xpath_node n3 = doc.select_single_node("node/bar");
|
||||||
|
|
||||||
|
CHECK(!n3);
|
||||||
|
|
||||||
|
xpath_node n4 = doc.select_single_node("node/head/following-sibling::foo");
|
||||||
|
xpath_node n5 = doc.select_single_node("node/tail/preceding-sibling::foo");
|
||||||
|
|
||||||
|
CHECK(n4.node().document_order() == 4);
|
||||||
|
CHECK(n5.node().document_order() == 4);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(xpath_api_exception_what)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
xpath_query q("");
|
||||||
|
}
|
||||||
|
catch (const xpath_exception& e)
|
||||||
|
{
|
||||||
|
CHECK(e.what()[0] != 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_XML(xpath_api_node_bool_ops, "<node attr='value'/>")
|
||||||
|
{
|
||||||
|
generic_bool_ops_test(doc.select_single_node("node"));
|
||||||
|
generic_bool_ops_test(doc.select_single_node("node/@attr"));
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_XML(xpath_api_node_eq_ops, "<node attr='value'/>")
|
||||||
|
{
|
||||||
|
generic_eq_ops_test(doc.select_single_node("node"), doc.select_single_node("node/@attr"));
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
@ -404,7 +404,19 @@ TEST_XML(xpath_paths_predicate_several, "<node><employee/><employee secretary=''
|
|||||||
CHECK_XPATH_NODESET(n, "employee[@secretary and @assistant]") % 8 % 11;
|
CHECK_XPATH_NODESET(n, "employee[@secretary and @assistant]") % 8 % 11;
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_XML(xpath_paths_predicate_filter, "<node><chapter/><chapter/><chapter/><chapter/><chapter/></node>")
|
TEST_XML(xpath_paths_predicate_filter_boolean, "<node><chapter/><chapter/><chapter/><chapter/><chapter/></node>")
|
||||||
|
{
|
||||||
|
doc.precompute_document_order();
|
||||||
|
|
||||||
|
xml_node n = doc.child("node").child("chapter").next_sibling().next_sibling();
|
||||||
|
|
||||||
|
CHECK_XPATH_NODESET(n, "(following-sibling::chapter)[position()=1]") % 6;
|
||||||
|
CHECK_XPATH_NODESET(n, "(following-sibling::chapter)[position()=2]") % 7;
|
||||||
|
CHECK_XPATH_NODESET(n, "(preceding-sibling::chapter)[position()=1]") % 3;
|
||||||
|
CHECK_XPATH_NODESET(n, "(preceding-sibling::chapter)[position()=2]") % 4;
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_XML(xpath_paths_predicate_filter_number, "<node><chapter/><chapter/><chapter/><chapter/><chapter/></node>")
|
||||||
{
|
{
|
||||||
doc.precompute_document_order();
|
doc.precompute_document_order();
|
||||||
|
|
||||||
@ -416,6 +428,17 @@ TEST_XML(xpath_paths_predicate_filter, "<node><chapter/><chapter/><chapter/><cha
|
|||||||
CHECK_XPATH_NODESET(n, "(preceding-sibling::chapter)[2]") % 4;
|
CHECK_XPATH_NODESET(n, "(preceding-sibling::chapter)[2]") % 4;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_XML(xpath_paths_predicate_filter_posinv, "<node><employee/><employee secretary=''/><employee assistant=''/><employee secretary='' assistant=''/><employee assistant='' secretary=''/></node>")
|
||||||
|
{
|
||||||
|
doc.precompute_document_order();
|
||||||
|
|
||||||
|
xml_node n = doc.child("node");
|
||||||
|
|
||||||
|
CHECK_XPATH_NODESET(n, "employee") % 3 % 4 % 6 % 8 % 11;
|
||||||
|
CHECK_XPATH_NODESET(n, "(employee[@secretary])[@assistant]") % 8 % 11;
|
||||||
|
CHECK_XPATH_NODESET(n, "((employee)[@assistant])[@secretary]") % 8 % 11;
|
||||||
|
}
|
||||||
|
|
||||||
TEST_XML(xpath_paths_step_compose, "<node><foo><foo/><foo/></foo><foo/></node>")
|
TEST_XML(xpath_paths_step_compose, "<node><foo><foo/><foo/></foo><foo/></node>")
|
||||||
{
|
{
|
||||||
doc.precompute_document_order();
|
doc.precompute_document_order();
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user