xlnt/tests/helpers/helper.hpp

134 lines
3.9 KiB
C++
Raw Normal View History

2014-06-05 06:42:17 +08:00
#pragma once
#include <sstream>
#include <xlnt/s11n/xml_document.hpp>
#include <xlnt/s11n/xml_node.hpp>
#include <xlnt/s11n/xml_serializer.hpp>
2014-06-05 06:42:17 +08:00
2014-06-06 04:19:31 +08:00
#include "path_helper.hpp"
2014-06-05 06:42:17 +08:00
class Helper
{
public:
2014-07-20 02:43:48 +08:00
enum class difference_type
2014-06-05 06:42:17 +08:00
{
2014-07-20 02:43:48 +08:00
names_differ,
missing_attribute,
attribute_values_differ,
missing_text,
text_values_differ,
missing_child,
child_order_differs,
equivalent,
};
struct comparison_result
{
difference_type difference;
std::string value_left;
std::string value_right;
operator bool() const { return difference == difference_type::equivalent; }
};
static comparison_result compare_xml(const std::string &expected, const xlnt::xml_document &observed)
2015-10-14 12:03:48 +08:00
{
std::ifstream f(expected);
std::ostringstream s;
f >> s.rdbuf();
2015-10-15 06:05:13 +08:00
auto expected_xml = xlnt::xml_serializer::deserialize(s.str());
return compare_xml(expected_xml.root(), observed.root());
}
static comparison_result compare_xml(const std::string &left_contents, const std::string &right_contents)
{
auto left_doc = xlnt::xml_serializer::deserialize(left_contents);
auto right_doc = xlnt::xml_serializer::deserialize(right_contents);
2015-10-15 06:05:13 +08:00
return compare_xml(left_doc.root(), right_doc.root());
2015-10-14 12:03:48 +08:00
}
static comparison_result compare_xml(const xlnt::xml_node &left, const xlnt::xml_node &right)
2014-07-20 02:43:48 +08:00
{
std::string left_temp = left.get_name();
std::string right_temp = right.get_name();
2014-07-20 02:43:48 +08:00
if(left_temp != right_temp)
2014-07-17 07:53:45 +08:00
{
2014-07-20 02:43:48 +08:00
return {difference_type::names_differ, left_temp, right_temp};
2014-07-17 07:53:45 +08:00
}
2014-07-20 02:43:48 +08:00
for(auto &left_attribute : left.get_attributes())
2014-07-17 07:53:45 +08:00
{
left_temp = left_attribute.second;
2014-07-20 02:43:48 +08:00
if(!right.has_attribute(left_attribute.first))
2014-07-20 02:43:48 +08:00
{
return {difference_type::missing_attribute, left_temp, "((empty))"};
}
left_temp = left_attribute.second;
right_temp = right.get_attribute(left_attribute.first);
2014-07-20 02:43:48 +08:00
if(left_temp != right_temp)
{
return {difference_type::attribute_values_differ, left_temp, right_temp};
}
2014-07-17 07:53:45 +08:00
}
2014-07-20 02:43:48 +08:00
if(left.has_text())
2014-07-20 02:43:48 +08:00
{
left_temp = left.get_text();
2014-07-20 02:43:48 +08:00
if(!right.has_text())
2014-07-20 02:43:48 +08:00
{
return {difference_type::missing_text, left_temp, "((empty))"};
}
right_temp = right.get_text();
2014-07-20 02:43:48 +08:00
if(left_temp != right_temp)
{
return {difference_type::text_values_differ, left_temp, right_temp};
}
}
else if(right.has_text())
2014-07-20 02:43:48 +08:00
{
right_temp = right.get_text();
2014-07-20 02:43:48 +08:00
return {difference_type::text_values_differ, "((empty))", right_temp};
}
auto right_child_iter = right.get_children().begin();
for(auto left_child : left.get_children())
2014-07-20 02:43:48 +08:00
{
left_temp = left_child.get_name();
2014-07-20 02:43:48 +08:00
if(right_child_iter == right.get_children().end())
2014-07-20 02:43:48 +08:00
{
return {difference_type::child_order_differs, left_temp, "((end))"};
}
auto right_child = *right_child_iter;
right_child_iter++;
auto child_comparison_result = compare_xml(left_child, right_child);
if(!child_comparison_result)
{
return child_comparison_result;
}
}
if(right_child_iter != right.get_children().end())
2014-07-20 02:43:48 +08:00
{
right_temp = right_child_iter->get_name();
2014-07-20 02:43:48 +08:00
return {difference_type::child_order_differs, "((end))", right_temp};
}
return {difference_type::equivalent, "", ""};
}
2014-06-05 06:42:17 +08:00
};