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/wordEncoder.hpp" ferencd@0: ferencd@0: ferencd@0: VMIME_TEST_SUITE_BEGIN(wordEncoderTest) ferencd@0: ferencd@0: VMIME_TEST_LIST_BEGIN ferencd@0: VMIME_TEST(testGetNextChunk) ferencd@0: VMIME_TEST(testGetNextChunk_integral) ferencd@0: VMIME_TEST(testIsEncodingNeeded_ascii) ferencd@0: VMIME_TEST(testIsEncodingNeeded_withLanguage) ferencd@0: VMIME_TEST(testIsEncodingNeeded_specialChars) ferencd@0: VMIME_TEST(testGuessBestEncoding_QP) ferencd@0: VMIME_TEST(testGuessBestEncoding_B64) ferencd@0: VMIME_TEST(testEncodeQP_RFC2047) ferencd@0: VMIME_TEST_LIST_END ferencd@0: ferencd@0: ferencd@0: void testGetNextChunk() ferencd@0: { ferencd@0: // An integral number of characters should be encoded ferencd@0: vmime::wordEncoder we( ferencd@0: "bufferfoobarbaz", ferencd@0: vmime::charset("utf-8"), ferencd@0: vmime::wordEncoder::ENCODING_AUTO); ferencd@0: ferencd@0: VASSERT_EQ("1", "buffer", we.getNextChunk(6)); ferencd@0: VASSERT_EQ("2", "foo", we.getNextChunk(3)); ferencd@0: VASSERT_EQ("3", "barbaz", we.getNextChunk(10)); ferencd@0: } ferencd@0: ferencd@0: void testGetNextChunk_integral() ferencd@0: { ferencd@0: // An integral number of characters should be encoded ferencd@0: vmime::wordEncoder we( ferencd@0: "buffer\xc3\xa0plop", ferencd@0: vmime::charset("utf-8"), ferencd@0: vmime::wordEncoder::ENCODING_AUTO); ferencd@0: ferencd@0: VASSERT_EQ("1", "buffer=C3=A0", we.getNextChunk(7)); ferencd@0: VASSERT_EQ("2", "plop", we.getNextChunk(10)); ferencd@0: } ferencd@0: ferencd@0: void testIsEncodingNeeded_ascii() ferencd@0: { ferencd@0: vmime::generationContext ctx(vmime::generationContext::getDefaultContext()); ferencd@0: ctx.setInternationalizedEmailSupport(false); ferencd@0: ferencd@0: VASSERT_FALSE("ascii", vmime::wordEncoder::isEncodingNeeded ferencd@0: (ctx, "ASCII-only buffer", vmime::charset("utf-8"), "")); ferencd@0: ferencd@0: VASSERT_TRUE("non-ascii", vmime::wordEncoder::isEncodingNeeded ferencd@0: (ctx, "Buffer with some UTF-8 '\xc3\xa0'", vmime::charset("utf-8"), "")); ferencd@0: } ferencd@0: ferencd@0: void testIsEncodingNeeded_withLanguage() ferencd@0: { ferencd@0: VASSERT_TRUE("ascii", vmime::wordEncoder::isEncodingNeeded ferencd@0: (vmime::generationContext::getDefaultContext(), "ASCII-only buffer", vmime::charset("utf-8"), "en")); ferencd@0: } ferencd@0: ferencd@0: void testIsEncodingNeeded_specialChars() ferencd@0: { ferencd@0: VASSERT_TRUE("rfc2047", vmime::wordEncoder::isEncodingNeeded ferencd@0: (vmime::generationContext::getDefaultContext(), ferencd@0: "foo bar =? foo bar", vmime::charset("us-ascii"), "")); ferencd@0: ferencd@0: VASSERT_TRUE("new line 1", vmime::wordEncoder::isEncodingNeeded ferencd@0: (vmime::generationContext::getDefaultContext(), ferencd@0: "foo bar \n foo bar", vmime::charset("us-ascii"), "")); ferencd@0: ferencd@0: VASSERT_TRUE("new line 2", vmime::wordEncoder::isEncodingNeeded ferencd@0: (vmime::generationContext::getDefaultContext(), ferencd@0: "foo bar \r foo bar", vmime::charset("us-ascii"), "")); ferencd@0: } ferencd@0: ferencd@0: void testGuessBestEncoding_QP() ferencd@0: { ferencd@0: VASSERT_EQ("1", vmime::wordEncoder::ENCODING_QP, ferencd@0: vmime::wordEncoder::guessBestEncoding("ASCII only buffer", vmime::charset("us-ascii"))); ferencd@0: } ferencd@0: ferencd@0: void testGuessBestEncoding_B64() ferencd@0: { ferencd@0: // >= 40% non-ASCII => Base64... ferencd@0: VASSERT_EQ("1", vmime::wordEncoder::ENCODING_B64, ferencd@0: vmime::wordEncoder::guessBestEncoding("xxxxx\xc3\xa0\xc3\xa0", vmime::charset("utf-8"))); ferencd@0: ferencd@0: // ...else Quoted-Printable ferencd@0: VASSERT_EQ("2", vmime::wordEncoder::ENCODING_QP, ferencd@0: vmime::wordEncoder::guessBestEncoding("xxxxxx\xc3\xa0\xc3\xa0", vmime::charset("utf-8"))); ferencd@0: } ferencd@0: ferencd@0: void testEncodeQP_RFC2047() ferencd@0: { ferencd@0: // When Quoted-Printable is used, it should be RFC-2047 QP encoding ferencd@0: vmime::wordEncoder we( ferencd@0: "buffer\xc3\xa0 foo_bar", ferencd@0: vmime::charset("utf-8"), ferencd@0: vmime::wordEncoder::ENCODING_AUTO); ferencd@0: ferencd@0: VASSERT_EQ("1", "buffer=C3=A0_foo=5Fbar", we.getNextChunk(100)); ferencd@0: } ferencd@0: ferencd@0: VMIME_TEST_SUITE_END