diff options
| author | Remko Tronçon <git@el-tramo.be> | 2010-03-28 15:46:49 (GMT) | 
|---|---|---|
| committer | Remko Tronçon <git@el-tramo.be> | 2010-03-28 15:46:49 (GMT) | 
| commit | f53a1ef582494458301b97bf6e546be52d7ff7e8 (patch) | |
| tree | 7571b5cbcbd8a8f1dd1c966c9045b6cb69f0e295 /Swiften/Parser/UnitTest/StanzaParserTest.cpp | |
| parent | 638345680d72ca6acaf123f2c8c1c391f696e371 (diff) | |
| download | swift-contrib-f53a1ef582494458301b97bf6e546be52d7ff7e8.zip swift-contrib-f53a1ef582494458301b97bf6e546be52d7ff7e8.tar.bz2  | |
Moving submodule contents back.
Diffstat (limited to 'Swiften/Parser/UnitTest/StanzaParserTest.cpp')
| -rw-r--r-- | Swiften/Parser/UnitTest/StanzaParserTest.cpp | 209 | 
1 files changed, 209 insertions, 0 deletions
diff --git a/Swiften/Parser/UnitTest/StanzaParserTest.cpp b/Swiften/Parser/UnitTest/StanzaParserTest.cpp new file mode 100644 index 0000000..3cb1879 --- /dev/null +++ b/Swiften/Parser/UnitTest/StanzaParserTest.cpp @@ -0,0 +1,209 @@ +#include <cppunit/extensions/HelperMacros.h> +#include <cppunit/extensions/TestFactoryRegistry.h> + +#include "Swiften/Parser/StanzaParser.h" +#include "Swiften/Parser/GenericPayloadParser.h" +#include "Swiften/Parser/PayloadParserFactory.h" +#include "Swiften/Parser/PayloadParserFactoryCollection.h" +#include "Swiften/Elements/Stanza.h" +#include "Swiften/Elements/Payload.h" + +using namespace Swift; + +class StanzaParserTest : public CppUnit::TestFixture +{ +		CPPUNIT_TEST_SUITE(StanzaParserTest); +		CPPUNIT_TEST(testHandleEndElement_OnePayload); +		CPPUNIT_TEST(testHandleEndElement_MultiplePayloads); +		CPPUNIT_TEST(testHandleEndElement_StrayCharacterData); +		CPPUNIT_TEST(testHandleEndElement_UnknownPayload); +		CPPUNIT_TEST(testHandleParse_BasicAttributes); +		CPPUNIT_TEST_SUITE_END(); + +	public: +		StanzaParserTest() {} + +		void setUp() { +			factoryCollection_ = new PayloadParserFactoryCollection(); +			factoryCollection_->addFactory(&factory1_); +			factoryCollection_->addFactory(&factory2_); +		} + +		void tearDown() { +			delete factoryCollection_; +		} + +		void testHandleEndElement_OnePayload() { +			MyStanzaParser testling(factoryCollection_); + +			AttributeMap attributes; +			attributes["foo"] = "fum"; +			attributes["bar"] = "baz"; +			testling.handleStartElement("mystanza", "", attributes); +			testling.handleStartElement("mypayload1", "", attributes); +			testling.handleStartElement("child", "", attributes); +			testling.handleEndElement("child", ""); +			testling.handleEndElement("mypayload1", ""); +			testling.handleEndElement("mystanza", ""); + +			CPPUNIT_ASSERT(testling.getStanza()->getPayload<MyPayload1>()); +			CPPUNIT_ASSERT(testling.getStanza()->getPayload<MyPayload1>()->hasChild); +		} + +		void testHandleEndElement_MultiplePayloads() { +			MyStanzaParser testling(factoryCollection_); + +			AttributeMap attributes; +			testling.handleStartElement("mystanza", "", attributes); +			testling.handleStartElement("mypayload1", "", attributes); +			testling.handleEndElement("mypayload1", ""); +			testling.handleStartElement("mypayload2", "", attributes); +			testling.handleEndElement("mypayload2", ""); +			testling.handleEndElement("mystanza", ""); + +			CPPUNIT_ASSERT(testling.getStanza()->getPayload<MyPayload1>()); +			CPPUNIT_ASSERT(testling.getStanza()->getPayload<MyPayload2>()); +		} + +		void testHandleEndElement_StrayCharacterData() { +			MyStanzaParser testling(factoryCollection_); + +			AttributeMap attributes; +			testling.handleStartElement("mystanza", "", attributes); +			testling.handleStartElement("mypayload1", "", attributes); +			testling.handleEndElement("mypayload1", ""); +			testling.handleCharacterData("bla"); +			testling.handleStartElement("mypayload2", "", attributes); +			testling.handleEndElement("mypayload2", ""); +			testling.handleEndElement("mystanza", ""); + +			CPPUNIT_ASSERT(testling.getStanza()->getPayload<MyPayload1>()); +			CPPUNIT_ASSERT(testling.getStanza()->getPayload<MyPayload2>()); +		} + +		void testHandleEndElement_UnknownPayload() { +			MyStanzaParser testling(factoryCollection_); + +			AttributeMap attributes; +			testling.handleStartElement("mystanza", "", attributes); +			testling.handleStartElement("mypayload1", "", attributes); +			testling.handleEndElement("mypayload1", ""); +			testling.handleStartElement("unknown-payload", "", attributes); +			testling.handleStartElement("unknown-payload-child", "", attributes); +			testling.handleEndElement("unknown-payload-child", ""); +			testling.handleEndElement("unknown-payload", ""); +			testling.handleStartElement("mypayload2", "", attributes); +			testling.handleEndElement("mypayload2", ""); +			testling.handleEndElement("mystanza", ""); + +			CPPUNIT_ASSERT(testling.getStanza()->getPayload<MyPayload1>()); +			CPPUNIT_ASSERT(testling.getStanza()->getPayload<MyPayload2>()); +		} + +		void testHandleParse_BasicAttributes() { +			MyStanzaParser testling(factoryCollection_); + +			AttributeMap attributes; +			attributes["to"] = "foo@example.com/blo"; +			attributes["from"] = "bar@example.com/baz"; +			attributes["id"] = "id-123"; +			testling.handleStartElement("mystanza", "", attributes); +			testling.handleEndElement("mypayload1", ""); + +			CPPUNIT_ASSERT_EQUAL(JID("foo@example.com/blo"), testling.getStanza()->getTo()); +			CPPUNIT_ASSERT_EQUAL(JID("bar@example.com/baz"), testling.getStanza()->getFrom()); +			CPPUNIT_ASSERT_EQUAL(String("id-123"), testling.getStanza()->getID()); +		} + +	private: +		class MyPayload1 : public Payload +		{ +			public: +				MyPayload1() : hasChild(false) {} + +				bool hasChild; +		}; + +		class MyPayload1Parser : public GenericPayloadParser<MyPayload1> +		{ +			public:	 +				MyPayload1Parser() {} + +			virtual void handleStartElement(const String& element, const String&, const AttributeMap&) {  +				if (element != "mypayload1") { +					getPayloadInternal()->hasChild = true; +				} +			} + +			virtual void handleEndElement(const String&, const String&) {} +			virtual void handleCharacterData(const String&) {} +		}; + +		class MyPayload1ParserFactory : public PayloadParserFactory +		{ +			public: +				MyPayload1ParserFactory() {} + +				PayloadParser* createPayloadParser() { return new MyPayload1Parser(); } + +				bool canParse(const String& element, const String&, const AttributeMap&) const { +					return element == "mypayload1"; +				} +		}; + +		class MyPayload2 : public Payload +		{ +			public: +				MyPayload2() {} +		}; + +		class MyPayload2Parser : public GenericPayloadParser<MyPayload2> +		{ +			public:	 +				MyPayload2Parser() {} + +			virtual void handleStartElement(const String&, const String&, const AttributeMap&) {} +			virtual void handleEndElement(const String&, const String&) {} +			virtual void handleCharacterData(const String&) {} +		}; + + +		class MyPayload2ParserFactory : public PayloadParserFactory +		{ +			public: +				MyPayload2ParserFactory() {} + +				PayloadParser* createPayloadParser() { return new MyPayload2Parser(); } +				bool canParse(const String& element, const String&, const AttributeMap&) const { +					return element == "mypayload2"; +				} +		}; + +		class MyStanza : public Stanza +		{ +			public: +				MyStanza() {} +		}; + +		class MyStanzaParser : public StanzaParser +		{ +			public: +				MyStanzaParser(PayloadParserFactoryCollection* collection) : StanzaParser(collection) +				{ +					stanza_ = boost::shared_ptr<MyStanza>(new MyStanza()); +				} +			 +				virtual boost::shared_ptr<Element> getElement() const { +					return stanza_; +				} + +			private: +				boost::shared_ptr<MyStanza> stanza_; +		}; +	 +		MyPayload1ParserFactory factory1_; +		MyPayload2ParserFactory factory2_; +		PayloadParserFactoryCollection* factoryCollection_; +}; + +CPPUNIT_TEST_SUITE_REGISTRATION(StanzaParserTest);  | 
 Swift