// file : tests/xml/parser/driver.cxx // copyright : Copyright (c) 2009-2013 Code Synthesis Tools CC // license : MIT; see accompanying LICENSE file #include #include #include #include #include using namespace std; namespace xml = cutl::xml; using namespace xml; int main () { // Test error handling. // try { istringstream is ("X"); parser p (is, "test"); assert (p.next () == parser::start_element); assert (p.next () == parser::start_element); assert (p.next () == parser::characters && p.value () == "X"); p.next (); assert (false); } catch (const xml::exception& e) { // cerr << e.what () << endl; } try { istringstream is (""); is.exceptions (ios_base::badbit | ios_base::failbit); parser p (is, "test"); is.setstate (ios_base::badbit); p.next (); assert (false); } catch (const ios_base::failure& e) { } // Test peeking and getting the current event. // { istringstream is ("x"); parser p (is, "peek"); assert (p.event () == parser::eof); assert (p.peek () == parser::start_element); assert (p.next () == parser::start_element); assert (p.event () == parser::start_element); assert (p.peek () == parser::start_attribute); assert (p.event () == parser::start_attribute); assert (p.next () == parser::start_attribute); assert (p.peek () == parser::characters && p.value () == "x"); assert (p.next () == parser::characters && p.value () == "x"); assert (p.event () == parser::characters && p.value () == "x"); assert (p.peek () == parser::end_attribute); assert (p.event () == parser::end_attribute); assert (p.next () == parser::end_attribute); assert (p.peek () == parser::characters && p.value () == "x"); assert (p.next () == parser::characters && p.value () == "x"); assert (p.event () == parser::characters && p.value () == "x"); assert (p.peek () == parser::start_element); assert (p.next () == parser::start_element); assert (p.event () == parser::start_element); assert (p.peek () == parser::end_element); assert (p.next () == parser::end_element); assert (p.event () == parser::end_element); assert (p.peek () == parser::end_element); assert (p.next () == parser::end_element); assert (p.event () == parser::end_element); assert (p.peek () == parser::eof); assert (p.next () == parser::eof); assert (p.event () == parser::eof); } // Test content processing. // // empty // { istringstream is (" \n\t "); parser p (is, "empty"); assert (p.next () == parser::start_element); p.content (parser::empty); assert (p.next () == parser::start_attribute); assert (p.next () == parser::characters && p.value () == " x "); assert (p.next () == parser::end_attribute); assert (p.next () == parser::end_element); assert (p.next () == parser::eof); } try { istringstream is (" \n & X \t "); parser p (is, "empty"); assert (p.next () == parser::start_element); p.content (parser::empty); p.next (); assert (false); } catch (const xml::exception& e) { // cerr << e.what () << endl; } // simple // { istringstream is (" X "); parser p (is, "simple"); assert (p.next () == parser::start_element); p.content (parser::simple); assert (p.next () == parser::characters && p.value () == " X "); assert (p.next () == parser::end_element); assert (p.next () == parser::eof); } try { istringstream is (" ? "); parser p (is, "simple"); assert (p.next () == parser::start_element); p.content (parser::simple); assert (p.next () == parser::characters && p.value () == " ? "); p.next (); assert (false); } catch (const xml::exception& e) { // cerr << e.what () << endl; } // complex // { istringstream is ("\n" " \n" " \n" " X \n" " \n" "\n"); parser p (is, "complex"); assert (p.next () == parser::start_element); // root p.content (parser::complex); assert (p.next () == parser::start_attribute); assert (p.next () == parser::characters && p.value () == " x "); assert (p.next () == parser::end_attribute); assert (p.next () == parser::start_element); // nested p.content (parser::complex); assert (p.next () == parser::start_element); // inner p.content (parser::empty); assert (p.next () == parser::end_element); // inner assert (p.next () == parser::start_element); // inner p.content (parser::simple); assert (p.next () == parser::characters && p.value () == " X "); assert (p.next () == parser::end_element); // inner assert (p.next () == parser::end_element); // nested assert (p.next () == parser::end_element); // root assert (p.next () == parser::eof); } try { istringstream is (" \n X X "); parser p (is, "complex"); assert (p.next () == parser::start_element); p.content (parser::complex); assert (p.next () == parser::start_element); assert (p.next () == parser::end_element); p.next (); assert (false); } catch (const xml::exception& e) { // cerr << e.what () << endl; } }