diff options
-rw-r--r-- | Swiften/Parser/EnumParser.h | 37 | ||||
-rw-r--r-- | Swiften/Parser/UnitTest/EnumParserTest.cpp | 36 | ||||
-rw-r--r-- | Swiften/SConscript | 1 |
3 files changed, 74 insertions, 0 deletions
diff --git a/Swiften/Parser/EnumParser.h b/Swiften/Parser/EnumParser.h new file mode 100644 index 0000000..d7bdbbc --- /dev/null +++ b/Swiften/Parser/EnumParser.h @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2013 Remko Tronçon + * Licensed under the GNU General Public License. + * See the COPYING file for more information. + */ + +#pragma once + +#include <string> +#include <map> +#include <cassert> +#include <boost/optional.hpp> + +#include <Swiften/Base/Override.h> +#include <Swiften/Base/API.h> + +namespace Swift { + template<typename T> + class SWIFTEN_API EnumParser { + public: + EnumParser() { + } + + EnumParser& operator()(T value, const std::string& text) { + values[text] = value; + return *this; + } + + boost::optional<T> parse(const std::string& value) { + typename std::map<std::string, T>::const_iterator i = values.find(value); + return i == values.end() ? boost::optional<T>() : i->second; + } + + private: + std::map<std::string, T> values; + }; +} diff --git a/Swiften/Parser/UnitTest/EnumParserTest.cpp b/Swiften/Parser/UnitTest/EnumParserTest.cpp new file mode 100644 index 0000000..44a30c0 --- /dev/null +++ b/Swiften/Parser/UnitTest/EnumParserTest.cpp @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2013 Remko Tronçon + * Licensed under the GNU General Public License v3. + * See Documentation/Licenses/GPLv3.txt for more information. + */ + +#include <cppunit/extensions/HelperMacros.h> +#include <cppunit/extensions/TestFactoryRegistry.h> + +#include <Swiften/Parser/EnumParser.h> + +using namespace Swift; + +class EnumParserTest : public CppUnit::TestFixture { + CPPUNIT_TEST_SUITE(EnumParserTest); + CPPUNIT_TEST(testParse); + CPPUNIT_TEST(testParse_NoValue); + CPPUNIT_TEST_SUITE_END(); + + public: + enum MyEnum { + MyValue1, + MyValue2, + MyValue3 + }; + + void testParse() { + CPPUNIT_ASSERT(MyValue2 == EnumParser<MyEnum>()(MyValue1, "my-value-1")(MyValue2, "my-value-2")(MyValue3, "my-value-3").parse("my-value-2")); + } + + void testParse_NoValue() { + CPPUNIT_ASSERT(!EnumParser<MyEnum>()(MyValue1, "my-value-1")(MyValue2, "my-value-2")(MyValue3, "my-value-3").parse("my-value-4")); + } +}; + +CPPUNIT_TEST_SUITE_REGISTRATION(EnumParserTest); diff --git a/Swiften/SConscript b/Swiften/SConscript index 9da1858..b2c47f1 100644 --- a/Swiften/SConscript +++ b/Swiften/SConscript @@ -374,6 +374,7 @@ if env["SCONS_STAGE"] == "build" : File("Parser/PayloadParsers/UnitTest/IdleParserTest.cpp"), File("Parser/UnitTest/BOSHBodyExtractorTest.cpp"), File("Parser/UnitTest/AttributeMapTest.cpp"), + File("Parser/UnitTest/EnumParserTest.cpp"), File("Parser/UnitTest/IQParserTest.cpp"), File("Parser/UnitTest/GenericPayloadTreeParserTest.cpp"), File("Parser/UnitTest/MessageParserTest.cpp"), |