rendered paste body// C++ wrapper for the Expat XML parser// Copyright (c) 2009 Nicolas Alvarez//// See COPYING file for license information.#include <sstream>#include <string>using std::endl;#include <UnitTest++.h>#include "Handler.h"#include "Parser.h"struct App{ std::string name, user_friendly_name;};class AppHandler: public XMLHandler{ enum State { UNKNOWN, IN_APP, IN_NAME, IN_UFN };public: AppHandler(App* app): data(app), state(UNKNOWN) { } void start_element(const std::string& name, const XML_Char**) { if (name == "app" && state == UNKNOWN) { state = IN_APP; } else if (name == "name" && state == IN_APP) { state = IN_NAME; } else if (name == "user_friendly_name" && state == IN_APP) { state = IN_UFN; } } void end_element(const std::string& name) { if (name == "app") { CHECK_EQUAL(IN_APP, state); state = UNKNOWN; } else if (name == "name") { CHECK_EQUAL(IN_NAME, state); state = IN_APP; } else if (name == "user_friendly_name") { CHECK_EQUAL(IN_UFN, state); state = IN_APP; } } void character_data(const char *s, size_t len) { if (state == IN_NAME) { data->name.append(s, len); } else if (state == IN_UFN) { data->user_friendly_name.append(s, len); } }private: App* data; State state;};TEST(app){ std::string xml("\ <app>\ <name>ap26</name>\ <user_friendly_name>AP26 Search</user_friendly_name>\ </app>"); App app; { //dummy block to control parser destruction XMLParser parser; AppHandler handler(&app); parser.push_handler(&handler); if (!parser.parse(xml)) { //std::cerr << parser.get_error() << endl; CHECK(false); } parser.end_of_document(); } CHECK_EQUAL("ap26", app.name); CHECK_EQUAL("AP26 Search", app.user_friendly_name);}/* vim: set ts=4 sw=4 et: */