diff options
| -rw-r--r-- | tests/test.hpp | 8 | ||||
| -rw-r--r-- | tests/test_dom_traverse.cpp | 150 | 
2 files changed, 128 insertions, 30 deletions
| diff --git a/tests/test.hpp b/tests/test.hpp index 09d7024..6b8878e 100644 --- a/tests/test.hpp +++ b/tests/test.hpp @@ -1,6 +1,13 @@  #ifndef HEADER_TEST_HPP
  #define HEADER_TEST_HPP
 +#include <string.h>
 +
 +inline bool test_string_equal(const char* lhs, const char* rhs)
 +{
 +	return (!lhs || !rhs) ? lhs == rhs : strcmp(lhs, rhs) == 0;
 +}
 +
  struct test_runner
  {
  	test_runner(const char* name)
 @@ -55,5 +62,6 @@ struct dummy_fixture {};  	TEST_FIXTURE(name, test_fixture_##name)
  #define CHECK(condition) if (condition) ; else throw #condition " is false"
 +#define CHECK_STRING(value, expected) if (test_string_equal(value, expected)) ; else throw #value " is not equal to " #expected
  #endif
 diff --git a/tests/test_dom_traverse.cpp b/tests/test_dom_traverse.cpp index bbee076..d48cf74 100644 --- a/tests/test_dom_traverse.cpp +++ b/tests/test_dom_traverse.cpp @@ -1,51 +1,141 @@  #include "common.hpp"
 -TEST_XML(dom_attr_bool_ops, "<node attr='1'/>")
 +#include <utility>
 +
 +template <typename T> void generic_bool_ops_test(const T& obj)
  {
 -	xml_attribute attr1;
 -	xml_attribute attr2 = doc.child("node").attribute("attr");
 +	T null;
 -	CHECK(!attr1);
 -	CHECK(attr2);
 -	CHECK(!!attr2);
 +	CHECK(!null);
 +	CHECK(obj);
 +	CHECK(!!obj);
 -	bool attr1b = attr1;
 -	bool attr2b = attr2;
 +	bool b1 = null, b2 = obj;
 -	CHECK(!attr1b);
 -	CHECK(attr2b);
 +	CHECK(!b1);
 +	CHECK(b2);
  }
 -TEST_XML(dom_attr_empty, "<node attr='1'/>")
 +template <typename T> void generic_rel_ops_test(T obj1, T obj2)
  {
 -	xml_attribute attr1;
 -	xml_attribute attr2 = doc.child("node").attribute("attr");
 +	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);
 -	CHECK(attr1.empty());
 -	CHECK(!attr2.empty());
 +	// 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));
  }
 -TEST_XML(dom_node_bool_ops, "<node/>")
 +template <typename T> void generic_empty_test(const T& obj)
 +{
 +	T null;
 +
 +	CHECK(null.empty());
 +	CHECK(!obj.empty());
 +}
 +
 +TEST_XML(dom_attr_bool_ops, "<node attr='1'/>")
 +{
 +	generic_bool_ops_test(doc.child("node").attribute("attr"));
 +}
 +
 +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"));
 +}
 +
 +TEST_XML(dom_attr_empty, "<node attr='1'/>")
 +{
 +	generic_empty_test(doc.child("node").attribute("attr"));
 +}
 +
 +TEST_XML(dom_attr_next_previous_attribute, "<node attr1='1' attr2='2' />")
  {
 -	xml_node node1;
 -	xml_node node2 = doc.child("node");
 +	xml_attribute attr1 = doc.child("node").attribute("attr1");
 +	xml_attribute attr2 = doc.child("node").attribute("attr2");
 -	CHECK(!node1);
 -	CHECK(node2);
 -	CHECK(!!node2);
 +	CHECK(attr1.next_attribute() == attr2);
 +	CHECK(attr2.next_attribute() == xml_attribute());
 +	
 +	CHECK(attr1.previous_attribute() == xml_attribute());
 +	CHECK(attr2.previous_attribute() == attr1);
 -	bool node1b = node1;
 -	bool node2b = node2;
 +	CHECK(xml_attribute().next_attribute() == xml_attribute());
 +	CHECK(xml_attribute().previous_attribute() == xml_attribute());
 +}
 +
 +TEST_XML(dom_attr_name_value, "<node attr='1'/>")
 +{
 +	xml_attribute attr = doc.child("node").attribute("attr");
 -	CHECK(!node1b);
 -	CHECK(node2b);
 +	CHECK_STRING(attr.name(), "attr");
 +	CHECK_STRING(attr.value(), "1");
 +
 +	CHECK_STRING(xml_attribute().name(), "");
 +	CHECK_STRING(xml_attribute().value(), "");
  }
 -TEST_XML(dom_node_empty, "<node/>")
 +TEST_XML(dom_node_bool_ops, "<node/>")
  {
 -	xml_node node1;
 -	xml_node node2 = doc.child("node");
 +	generic_bool_ops_test(doc.child("node"));
 +}
 -	CHECK(node1.empty());
 -	CHECK(!node2.empty());
 +TEST_XML(dom_node_rel_ops, "<node><node1/><node2/></node>")
 +{
 +	generic_rel_ops_test(doc.child("node").child("node1"), doc.child("node").child("node2"));
 +}
 +
 +TEST_XML(dom_node_empty, "<node/>")
 +{
 +	generic_empty_test(doc.child("node"));
  }
 | 
