All pastes #1680397 Raw Edit

nicolas

public text v1 · immutable
#1680397 ·published 2009-11-21 02:38 UTC
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: */