much more tests; all exceptions in readin tested

This commit is contained in:
Marc Wäckerlin
2009-04-08 06:44:18 +00:00
parent 0965b21e27
commit e48b91683e
3 changed files with 115 additions and 22 deletions

View File

@@ -189,13 +189,6 @@ namespace xml {
stream_error("missing end tag, end of file reached", t, is, tag, c) {
}
};
class empty_stream: public stream_error {
public:
empty_stream(const Node& t, std::istream& is, const Tag& tag, char c=0)
throw():
stream_error("no xml tag found, stream is empty", t, is, tag, c) {
}
};
class wrong_start_tag: public stream_error {
public:
wrong_start_tag(const Node& t, std::istream& is, const Tag& tag, char c=0)
@@ -303,7 +296,8 @@ namespace xml {
//----------------------------------------------------------------------------
//! An xml Node.
/*! XML Nodes may contain either text or other nodes, but not both
at the same time. */
at the same time. This node can hold other nodes. For a Node for
text contents, see xml::String. */
class Node {
private:
typedef std::vector<Node*> Contents;
@@ -398,7 +392,7 @@ namespace xml {
throw(wrong_end_tag, wrong_start_tag, tag_expected, type_mismatch,
second_slash_in_tag, character_after_slash,
missing_end_tag, attribute_value_not_quoted, access_error,
empty_stream, duplicate_attribute, attributes_in_end_tag);
duplicate_attribute, attributes_in_end_tag);
private:
friend class stream_error;
Factory(); // not implemented

View File

@@ -426,15 +426,13 @@ namespace xml {
throw(tag_expected, type_mismatch) {
std::string::size_type
start(txt.find_first_not_of(" \t\n\r")),
last(txt.find_last_of(" \t\n\r"));
last(txt.find_last_not_of(" \t\n\r"));
if (start==std::string::npos) { // empty - set to 0
_text = "0";
return *this;
}
if (txt.find_first_not_of
("0123456789", start,
last!=std::string::npos?last-start+1:txt.size()-start)
!=std::string::npos)
std::string::size_type pos(txt.find_first_not_of("0123456789", start));
if (pos<last || pos==last && last==start)
throw type_mismatch(*this, txt,
"unsigned integer may only contain numbers");
unsigned long i(0);
@@ -463,24 +461,25 @@ namespace xml {
throw(wrong_end_tag, wrong_start_tag, tag_expected, type_mismatch,
second_slash_in_tag,
character_after_slash, missing_end_tag, attribute_value_not_quoted,
access_error, empty_stream, duplicate_attribute,
access_error, duplicate_attribute,
attributes_in_end_tag) try {
_line=1;
std::auto_ptr<Node> node(_template->clone());
node->clear();
Tag res;
while (true) try {
while (true) {
res = tag(is, *node);
*node<<res.attributes;
switch (res.type) {
case END: throw wrong_end_tag(*node, is, res);
case EMPTY: return node; // empty
case START: return read(is, *_template);
case START:
if (!res.name.size()) throw tag_expected(*node, res.text);
if (node->name()!=res.name) throw wrong_start_tag(*node, is, res);
return read(is, *_template);
//! @todo store instead of ignore
case SPECIAL: break;
}
} catch (missing_end_tag&) {
throw empty_stream(*node, is, res);
}
} catch (exception& e) {
e.line(_line);