ferencd@0: // ferencd@0: // VMime library (http://www.vmime.org) ferencd@0: // Copyright (C) 2002-2013 Vincent Richard ferencd@0: // ferencd@0: // This program is free software; you can redistribute it and/or ferencd@0: // modify it under the terms of the GNU General Public License as ferencd@0: // published by the Free Software Foundation; either version 3 of ferencd@0: // the License, or (at your option) any later version. ferencd@0: // ferencd@0: // This program is distributed in the hope that it will be useful, ferencd@0: // but WITHOUT ANY WARRANTY; without even the implied warranty of ferencd@0: // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ferencd@0: // General Public License for more details. ferencd@0: // ferencd@0: // You should have received a copy of the GNU General Public License along ferencd@0: // with this program; if not, write to the Free Software Foundation, Inc., ferencd@0: // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. ferencd@0: // ferencd@0: // Linking this library statically or dynamically with other modules is making ferencd@0: // a combined work based on this library. Thus, the terms and conditions of ferencd@0: // the GNU General Public License cover the whole combination. ferencd@0: // ferencd@0: ferencd@0: #include "tests/testUtils.hpp" ferencd@0: ferencd@0: #include "vmime/net/messageSet.hpp" ferencd@0: ferencd@0: ferencd@0: VMIME_TEST_SUITE_BEGIN(messageSetTest) ferencd@0: ferencd@0: VMIME_TEST_LIST_BEGIN ferencd@0: VMIME_TEST(testNumberSet_Single) ferencd@0: VMIME_TEST(testNumberSet_Range) ferencd@0: VMIME_TEST(testNumberSet_InfiniteRange) ferencd@0: VMIME_TEST(testNumberSet_Multiple) ferencd@0: VMIME_TEST(testUIDSet_Single) ferencd@0: VMIME_TEST(testUIDSet_Range) ferencd@0: VMIME_TEST(testUIDSet_InfiniteRange) ferencd@0: VMIME_TEST(testUIDSet_MultipleNumeric) ferencd@0: VMIME_TEST(testUIDSet_MultipleNonNumeric) ferencd@0: VMIME_TEST(testIsNumberSet) ferencd@0: VMIME_TEST(testIsUIDSet) ferencd@0: VMIME_TEST_LIST_END ferencd@0: ferencd@0: ferencd@0: class messageSetStringEnumerator : public vmime::net::messageSetEnumerator ferencd@0: { ferencd@0: public: ferencd@0: ferencd@0: messageSetStringEnumerator() ferencd@0: : m_first(true) ferencd@0: { ferencd@0: } ferencd@0: ferencd@0: void enumerateNumberMessageRange(const vmime::net::numberMessageRange& range) ferencd@0: { ferencd@0: if (!m_first) ferencd@0: m_oss << ","; ferencd@0: ferencd@0: if (range.getFirst() == range.getLast()) ferencd@0: m_oss << range.getFirst(); ferencd@0: else ferencd@0: m_oss << range.getFirst() << ":" << range.getLast(); ferencd@0: ferencd@0: m_first = false; ferencd@0: } ferencd@0: ferencd@0: void enumerateUIDMessageRange(const vmime::net::UIDMessageRange& range) ferencd@0: { ferencd@0: if (!m_first) ferencd@0: m_oss << ","; ferencd@0: ferencd@0: if (range.getFirst() == range.getLast()) ferencd@0: m_oss << range.getFirst(); ferencd@0: else ferencd@0: m_oss << range.getFirst() << ":" << range.getLast(); ferencd@0: ferencd@0: m_first = false; ferencd@0: } ferencd@0: ferencd@0: const std::string str() const ferencd@0: { ferencd@0: return m_oss.str(); ferencd@0: } ferencd@0: ferencd@0: private: ferencd@0: ferencd@0: std::ostringstream m_oss; ferencd@0: bool m_first; ferencd@0: }; ferencd@0: ferencd@0: ferencd@0: const std::string enumerateAsString(const vmime::net::messageSet& set) ferencd@0: { ferencd@0: messageSetStringEnumerator en; ferencd@0: set.enumerate(en); ferencd@0: ferencd@0: return en.str(); ferencd@0: } ferencd@0: ferencd@0: ferencd@0: void testNumberSet_Single() ferencd@0: { ferencd@0: VASSERT_EQ("str", "42", enumerateAsString(vmime::net::messageSet::byNumber(42))); ferencd@0: } ferencd@0: ferencd@0: void testNumberSet_Range() ferencd@0: { ferencd@0: VASSERT_EQ("str", "42:100", enumerateAsString(vmime::net::messageSet::byNumber(42, 100))); ferencd@0: } ferencd@0: ferencd@0: void testNumberSet_InfiniteRange() ferencd@0: { ferencd@0: VASSERT_EQ("str", "42:-1", enumerateAsString(vmime::net::messageSet::byNumber(42, -1))); ferencd@0: } ferencd@0: ferencd@0: void testNumberSet_Multiple() ferencd@0: { ferencd@0: std::vector numbers; ferencd@0: numbers.push_back(1); // test grouping 1:3 ferencd@0: numbers.push_back(89); // test sorting ferencd@0: numbers.push_back(2); ferencd@0: numbers.push_back(3); ferencd@0: numbers.push_back(42); ferencd@0: numbers.push_back(53); // test grouping 53:57 ferencd@0: numbers.push_back(54); ferencd@0: numbers.push_back(55); ferencd@0: numbers.push_back(56); ferencd@0: numbers.push_back(56); // test duplicates ferencd@0: numbers.push_back(57); ferencd@0: numbers.push_back(99); ferencd@0: ferencd@0: VASSERT_EQ("str", "1:3,42,53:57,89,99", enumerateAsString(vmime::net::messageSet::byNumber(numbers))); ferencd@0: } ferencd@0: ferencd@0: ferencd@0: void testUIDSet_Single() ferencd@0: { ferencd@0: VASSERT_EQ("str", "abcdef", enumerateAsString(vmime::net::messageSet::byUID("abcdef"))); ferencd@0: } ferencd@0: ferencd@0: void testUIDSet_Range() ferencd@0: { ferencd@0: VASSERT_EQ("str", "abc:def", enumerateAsString(vmime::net::messageSet::byUID("abc:def"))); ferencd@0: } ferencd@0: ferencd@0: void testUIDSet_InfiniteRange() ferencd@0: { ferencd@0: VASSERT_EQ("str", "abc:*", enumerateAsString(vmime::net::messageSet::byUID("abc", "*"))); ferencd@0: } ferencd@0: ferencd@0: void testUIDSet_MultipleNumeric() ferencd@0: { ferencd@0: std::vector uids; ferencd@0: uids.push_back("1"); // test grouping 1:3 ferencd@0: uids.push_back("89"); // test sorting ferencd@0: uids.push_back("2"); ferencd@0: uids.push_back("3"); ferencd@0: uids.push_back("42"); ferencd@0: uids.push_back("53"); // test grouping 53:57 ferencd@0: uids.push_back("54"); ferencd@0: uids.push_back("55"); ferencd@0: uids.push_back("56"); ferencd@0: uids.push_back("56"); // test duplicates ferencd@0: uids.push_back("57"); ferencd@0: uids.push_back("99"); ferencd@0: ferencd@0: VASSERT_EQ("str", "1:3,42,53:57,89,99", enumerateAsString(vmime::net::messageSet::byUID(uids))); ferencd@0: } ferencd@0: ferencd@0: void testUIDSet_MultipleNonNumeric() ferencd@0: { ferencd@0: std::vector uids; ferencd@0: uids.push_back("12"); ferencd@0: uids.push_back("34"); ferencd@0: uids.push_back("ab56"); ferencd@0: uids.push_back("78cd"); ferencd@0: ferencd@0: VASSERT_EQ("str", "12,34,ab56,78cd", enumerateAsString(vmime::net::messageSet::byUID(uids))); ferencd@0: } ferencd@0: ferencd@0: void testIsNumberSet() ferencd@0: { ferencd@0: VASSERT_TRUE("number1", vmime::net::messageSet::byNumber(42).isNumberSet()); ferencd@0: VASSERT_FALSE("uid1", vmime::net::messageSet::byUID("42").isNumberSet()); ferencd@0: ferencd@0: VASSERT_TRUE("number2", vmime::net::messageSet::byNumber(42, -1).isNumberSet()); ferencd@0: VASSERT_FALSE("uid2", vmime::net::messageSet::byUID("42", "*").isNumberSet()); ferencd@0: } ferencd@0: ferencd@0: void testIsUIDSet() ferencd@0: { ferencd@0: VASSERT_FALSE("number1", vmime::net::messageSet::byNumber(42).isUIDSet()); ferencd@0: VASSERT_TRUE("uid1", vmime::net::messageSet::byUID("42").isUIDSet()); ferencd@0: ferencd@0: VASSERT_FALSE("number2", vmime::net::messageSet::byNumber(42, -1).isUIDSet()); ferencd@0: VASSERT_TRUE("uid2", vmime::net::messageSet::byUID("42", "*").isUIDSet()); ferencd@0: } ferencd@0: ferencd@0: VMIME_TEST_SUITE_END