bool run_test(const xml::element& test, fs::path base_dir) { bool result = true; fs::path input(base_dir / test.get_attribute("URI")); fs::path output(base_dir / test.get_attribute("OUTPUT")); if (VERBOSE) { cout << "-----------------------------------------------" << endl << "ID: " << test.get_attribute("ID") << endl << "TYPE: " << test.get_attribute("TYPE") << endl << "FILE: " << fs::system_complete(input) << endl << test.content() << endl << endl; } ++total_tests; if (not fs::exists(input)) { cout << "test file " << input << " does not exist" << endl; return false; } if (test.get_attribute("SECTIONS") == "B.") { if (VERBOSE) cout << "skipping unicode character validation tests" << endl; ++skipped_tests; return true; } fs::current_path(input.branch_path()); fs::ifstream is(input); if (not is.is_open()) throw zeep::exception("test file not open"); try { fs::current_path(input.branch_path()); if (test.get_attribute("TYPE") == "valid") result = run_valid_test(is, output); else if (test.get_attribute("TYPE") == "not-wf" or test.get_attribute("TYPE") == "invalid") { bool failed = false; try { DOC doc; doc.set_validating(test.get_attribute("TYPE") == "invalid"); is >> doc; ++should_have_failed; result = false; } catch (zeep::xml::not_wf_exception& e) { if (test.get_attribute("TYPE") != "not-wf") { ++wrong_exception; throw zeep::exception(string("Wrong exception (should have been invalid):\n\t") + e.what()); } failed = true; if (VERBOSE) cout << e.what() << endl; } catch (zeep::xml::invalid_exception& e) { if (test.get_attribute("TYPE") != "invalid") { ++wrong_exception; throw zeep::exception(string("Wrong exception (should have been not-wf):\n\t") + e.what()); } failed = true; if (VERBOSE) cout << e.what() << endl; } catch (std::exception& e) { throw zeep::exception(string("Wrong exception:\n\t") + e.what()); } if (VERBOSE and not failed) throw zeep::exception("invalid document, should have failed"); } else // if (test.get_attribute("TYPE") == "not-wf" or test.get_attribute("TYPE") == "error" ) { bool failed = false; try { DOC doc; is >> doc; ++should_have_failed; result = false; } catch (std::exception& e) { if (VERBOSE) cout << e.what() << endl; failed = true; } if (VERBOSE and not failed) throw zeep::exception("invalid document, should have failed"); } }
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; }