示例#1
0
文件: xml_lmi.cpp 项目: vadz/lmi.new
xml::node::const_iterator retrieve_element
    (xml::element const& parent
    ,std::string  const& name
    )
{
    xml::node::const_iterator i = parent.find(name.c_str());
    if(parent.end() == i)
        {
        fatal_error()
            << "Required element '"
            << name
            << "' not found."
            << LMI_FLUSH
            ;
        }
    return i;
}
bool run_test(const xml::element& test)
{
	cout << "----------------------------------------------------------" << endl
		 << "ID: " << test.get_attribute("ID")
		 << endl
		 << "xpath: " << test.get_attribute("xpath") << endl
//		 << "data: " << test.content() << endl
//		 << "expected-size: " << test.get_attribute("expected-size") << endl
		 << endl;

	fs::path data_file = fs::current_path() / test.get_attribute("data");
	if (not fs::exists(data_file))
		throw zeep::exception("file does not exist");
	
	xml::document doc;
	doc.set_validating(false);
	
	fs::ifstream file(data_file);
	file >> doc;
	
	if (VERBOSE)
		cout << "test doc:" << endl << doc << endl;
	
	xml::xpath xp(test.get_attribute("xpath"));

	xml::context context;
	foreach (const xml::element* e, test.find("var"))
		context.set(e->get_attribute("name"), e->get_attribute("value"));
	
	xml::node_set ns = xp.evaluate<xml::node>(*doc.root(), context);

	if (VERBOSE)
	{
		int nr = 1;
		foreach (const xml::node* n, ns)
			cout << nr++ << ">> " << *n << endl;
	}
	
	bool result = true;
	
	if (ns.size() != boost::lexical_cast<unsigned int>(test.get_attribute("expected-size")))
	{
		cout << "incorrect number of nodes in returned node-set" << endl
			 << "expected: " << test.get_attribute("expected-size") << endl;

		result = false;
	}

	string test_attr_name = test.get_attribute("test-name");
	string attr_test = test.get_attribute("test-attr");

	if (not attr_test.empty())
	{
		if (VERBOSE)
			cout << "testing attribute " << test_attr_name << " for " << attr_test << endl;
		
		foreach (const xml::node* n, ns)
		{
			const xml::element* e = dynamic_cast<const xml::element*>(n);
			if (e == NULL)
				continue;
			
			if (e->get_attribute(test_attr_name) != attr_test)
			{
				cout << "expected attribute content is not found for node " << e->qname() << endl;
				result = false;
			}
		}
	}
	
	if (result)
		cout << "Test passed" << endl;
	else
	{
		cout << "Test failed" << endl;
		
		int nr = 1;
		foreach (const xml::node* n, ns)
			cout << nr++ << ") " << *n << endl;
	}
	
	return result;
}