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; }