annotate 3rdparty/vmime/tests/parser/emailAddressTest.cpp @ 0:a4671277546c tip

created the repository for the thymian project
author ferencd
date Tue, 17 Aug 2021 11:19:54 +0200
parents
children
rev   line source
ferencd@0 1 //
ferencd@0 2 // VMime library (http://www.vmime.org)
ferencd@0 3 // Copyright (C) 2002-2013 Vincent Richard <vincent@vmime.org>
ferencd@0 4 //
ferencd@0 5 // This program is free software; you can redistribute it and/or
ferencd@0 6 // modify it under the terms of the GNU General Public License as
ferencd@0 7 // published by the Free Software Foundation; either version 3 of
ferencd@0 8 // the License, or (at your option) any later version.
ferencd@0 9 //
ferencd@0 10 // This program is distributed in the hope that it will be useful,
ferencd@0 11 // but WITHOUT ANY WARRANTY; without even the implied warranty of
ferencd@0 12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
ferencd@0 13 // General Public License for more details.
ferencd@0 14 //
ferencd@0 15 // You should have received a copy of the GNU General Public License along
ferencd@0 16 // with this program; if not, write to the Free Software Foundation, Inc.,
ferencd@0 17 // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
ferencd@0 18 //
ferencd@0 19 // Linking this library statically or dynamically with other modules is making
ferencd@0 20 // a combined work based on this library. Thus, the terms and conditions of
ferencd@0 21 // the GNU General Public License cover the whole combination.
ferencd@0 22 //
ferencd@0 23
ferencd@0 24 #include "tests/testUtils.hpp"
ferencd@0 25
ferencd@0 26 #include "vmime/platform.hpp"
ferencd@0 27
ferencd@0 28 #include <locale>
ferencd@0 29 #include <clocale>
ferencd@0 30
ferencd@0 31
ferencd@0 32 VMIME_TEST_SUITE_BEGIN(emailAddressTest)
ferencd@0 33
ferencd@0 34 VMIME_TEST_LIST_BEGIN
ferencd@0 35 VMIME_TEST(testParseASCII)
ferencd@0 36 VMIME_TEST(testParseEAI)
ferencd@0 37 VMIME_TEST(testParseInvalid)
ferencd@0 38 VMIME_TEST(testGenerateASCII)
ferencd@0 39 VMIME_TEST(testGenerateEAI)
ferencd@0 40 VMIME_TEST(testParseSpecialChars)
ferencd@0 41 VMIME_TEST(testParseCommentInLocalPart)
ferencd@0 42 VMIME_TEST(testParseCommentInDomainPart)
ferencd@0 43 VMIME_TEST(testGenerateSpecialChars)
ferencd@0 44 VMIME_TEST_LIST_END
ferencd@0 45
ferencd@0 46
ferencd@0 47 void setUp()
ferencd@0 48 {
ferencd@0 49 // Set the global C and C++ locale to the user-configured locale.
ferencd@0 50 // The locale should use UTF-8 encoding for these tests to run successfully.
ferencd@0 51 try
ferencd@0 52 {
ferencd@0 53 std::locale::global(std::locale(""));
ferencd@0 54 }
ferencd@0 55 catch (std::exception &)
ferencd@0 56 {
ferencd@0 57 std::setlocale(LC_ALL, "");
ferencd@0 58 }
ferencd@0 59 }
ferencd@0 60
ferencd@0 61 void tearDown()
ferencd@0 62 {
ferencd@0 63 // Restore default locale
ferencd@0 64 std::locale::global(std::locale("C"));
ferencd@0 65 }
ferencd@0 66
ferencd@0 67
ferencd@0 68 void testParseASCII()
ferencd@0 69 {
ferencd@0 70 vmime::emailAddress eml1("local@domain");
ferencd@0 71 VASSERT_EQ("1/local", "local", eml1.getLocalName());
ferencd@0 72 VASSERT_EQ("1/domain", "domain", eml1.getDomainName());
ferencd@0 73
ferencd@0 74 // When not specified, domain should be local host name
ferencd@0 75 vmime::emailAddress eml2("local");
ferencd@0 76 VASSERT_EQ("2/local", "local", eml2.getLocalName());
ferencd@0 77 VASSERT_EQ("2/domain", vmime::platform::getHandler()->getHostName(), eml2.getDomainName());
ferencd@0 78 }
ferencd@0 79
ferencd@0 80 void testParseEAI()
ferencd@0 81 {
ferencd@0 82 // Examples taken from Wikipedia (http://en.wikipedia.org/wiki/Email_address)
ferencd@0 83
ferencd@0 84 // Latin Alphabet (with diacritics):
ferencd@0 85 vmime::emailAddress eml1("Pelé@example.com");
ferencd@0 86 VASSERT_EQ("1/local", "Pelé", eml1.getLocalName());
ferencd@0 87 VASSERT_EQ("1/domain", "example.com", eml1.getDomainName());
ferencd@0 88
ferencd@0 89 // Greek Alphabet
ferencd@0 90 vmime::emailAddress eml2("δοκιμή@παράδειγμα.δοκιμή");
ferencd@0 91 VASSERT_EQ("2/local", "δοκιμή", eml2.getLocalName());
ferencd@0 92 VASSERT_EQ("2/domain", "παράδειγμα.δοκιμή", eml2.getDomainName());
ferencd@0 93
ferencd@0 94 // Japanese Characters
ferencd@0 95 vmime::emailAddress eml3("甲斐@黒川.日本");
ferencd@0 96 VASSERT_EQ("3/local", "甲斐", eml3.getLocalName());
ferencd@0 97 VASSERT_EQ("3/domain", "黒川.日本", eml3.getDomainName());
ferencd@0 98
ferencd@0 99 // Cyrillic Characters
ferencd@0 100 vmime::emailAddress eml4("чебурашка@ящик-с-апельсинами.рф");
ferencd@0 101 VASSERT_EQ("4/local", "чебурашка", eml4.getLocalName());
ferencd@0 102 VASSERT_EQ("4/domain", "ящик-с-апельсинами.рф", eml4.getDomainName());
ferencd@0 103 }
ferencd@0 104
ferencd@0 105 void testParseInvalid()
ferencd@0 106 {
ferencd@0 107 // Only one @ is allowed outside quotation marks
ferencd@0 108 vmime::emailAddress eml1("local@part@domain");
ferencd@0 109 VASSERT_EQ("1/local", "local", eml1.getLocalName());
ferencd@0 110 VASSERT_EQ("1/domain", "part@domain", eml1.getDomainName());
ferencd@0 111
ferencd@0 112 // Quoted strings must be dot separated, or the only element making up
ferencd@0 113 // the local-part: should be parsed correctly, but it still represents
ferencd@0 114 // an invalid email address
ferencd@0 115 vmime::emailAddress eml2("Just\"not\"right@example.com");
ferencd@0 116 VASSERT_EQ("2/local", "Just\"not\"right", eml2.getLocalName());
ferencd@0 117 VASSERT_EQ("2/domain", "example.com", eml2.getDomainName());
ferencd@0 118
ferencd@0 119 // An @ character must separate the local and domain parts
ferencd@0 120 vmime::emailAddress eml3("Abc.example.com");
ferencd@0 121 VASSERT_EQ("3/local", "Abc.example.com", eml3.getLocalName());
ferencd@0 122 VASSERT_EQ("3/domain", vmime::platform::getHandler()->getHostName(), eml3.getDomainName());
ferencd@0 123
ferencd@0 124 // Whitespace must be escaped
ferencd@0 125 vmime::emailAddress eml4("local part@domain");
ferencd@0 126 VASSERT_EQ("4/local", "local", eml4.getLocalName());
ferencd@0 127 VASSERT_EQ("4/domain", vmime::platform::getHandler()->getHostName(), eml4.getDomainName());
ferencd@0 128
ferencd@0 129 vmime::emailAddress eml5("this\\ still\\\"not\\\\allowed@example.com");
ferencd@0 130 VASSERT_EQ("5/local", "this\\", eml5.getLocalName());
ferencd@0 131 VASSERT_EQ("5/domain", vmime::platform::getHandler()->getHostName(), eml5.getDomainName());
ferencd@0 132 }
ferencd@0 133
ferencd@0 134 void testParseSpecialChars()
ferencd@0 135 {
ferencd@0 136 // Examples taken from Wikipedia (http://en.wikipedia.org/wiki/Email_address)
ferencd@0 137
ferencd@0 138 vmime::emailAddress eml1("\" \"@example.org");
ferencd@0 139 VASSERT_EQ("1/local", " ", eml1.getLocalName());
ferencd@0 140 VASSERT_EQ("1/domain", "example.org", eml1.getDomainName());
ferencd@0 141
ferencd@0 142 vmime::emailAddress eml2("\"()<>[]:,;@\\\\\\\"!#$%&'*+-/=?^_`{}| ~.a\"@example.org");
ferencd@0 143 VASSERT_EQ("2/local", "()<>[]:,;@\\\"!#$%&'*+-/=?^_`{}| ~.a", eml2.getLocalName());
ferencd@0 144 VASSERT_EQ("3/domain", "example.org", eml2.getDomainName());
ferencd@0 145
ferencd@0 146 vmime::emailAddress eml3("!#$%&'*+-/=?^_`{}|~@example.org");
ferencd@0 147 VASSERT_EQ("3/local", "!#$%&'*+-/=?^_`{}|~", eml3.getLocalName());
ferencd@0 148 VASSERT_EQ("3/domain", "example.org", eml3.getDomainName());
ferencd@0 149
ferencd@0 150 vmime::emailAddress eml4("!#$%&'*+-/=?^_`{}|~@example.org");
ferencd@0 151 VASSERT_EQ("4/local", "!#$%&'*+-/=?^_`{}|~", eml4.getLocalName());
ferencd@0 152 VASSERT_EQ("4/domain", "example.org", eml4.getDomainName());
ferencd@0 153
ferencd@0 154 vmime::emailAddress eml5("\"very.unusual.@.unusual.com\"@example.com");
ferencd@0 155 VASSERT_EQ("5/local", "very.unusual.@.unusual.com", eml5.getLocalName());
ferencd@0 156 VASSERT_EQ("5/domain", "example.com", eml5.getDomainName());
ferencd@0 157
ferencd@0 158 vmime::emailAddress eml6("\"very.(),:;<>[]\\\".VERY.\\\"very@\\\\ \\\"very\\\".unusual\"@strange.example.com");
ferencd@0 159 VASSERT_EQ("6/local", "very.(),:;<>[]\".VERY.\"very@\\ \"very\".unusual", eml6.getLocalName());
ferencd@0 160 VASSERT_EQ("6/domain", "strange.example.com", eml6.getDomainName());
ferencd@0 161 }
ferencd@0 162
ferencd@0 163 void testParseCommentInLocalPart()
ferencd@0 164 {
ferencd@0 165 vmime::emailAddress eml1("john.smith(comment)@example.com");
ferencd@0 166 VASSERT_EQ("1/local", "john.smith", eml1.getLocalName());
ferencd@0 167 VASSERT_EQ("1/domain", "example.com", eml1.getDomainName());
ferencd@0 168
ferencd@0 169 vmime::emailAddress eml2("(comment)john.smith@example.com");
ferencd@0 170 VASSERT_EQ("2/local", "john.smith", eml2.getLocalName());
ferencd@0 171 VASSERT_EQ("2/domain", "example.com", eml2.getDomainName());
ferencd@0 172
ferencd@0 173 vmime::emailAddress eml3("(comment (comment in comment))john.smith@example.com");
ferencd@0 174 VASSERT_EQ("3/local", "john.smith", eml3.getLocalName());
ferencd@0 175 VASSERT_EQ("3/domain", "example.com", eml3.getDomainName());
ferencd@0 176
ferencd@0 177 vmime::emailAddress eml4("(comment \\) end comment)john.smith@example.com");
ferencd@0 178 VASSERT_EQ("4/local", "john.smith", eml4.getLocalName());
ferencd@0 179 VASSERT_EQ("4/domain", "example.com", eml4.getDomainName());
ferencd@0 180 }
ferencd@0 181
ferencd@0 182 void testParseCommentInDomainPart()
ferencd@0 183 {
ferencd@0 184 vmime::emailAddress eml1("john.smith@(comment)example.com");
ferencd@0 185 VASSERT_EQ("1/local", "john.smith", eml1.getLocalName());
ferencd@0 186 VASSERT_EQ("1/domain", "example.com", eml1.getDomainName());
ferencd@0 187
ferencd@0 188 vmime::emailAddress eml2("john.smith@example.com(comment)");
ferencd@0 189 VASSERT_EQ("2/local", "john.smith", eml2.getLocalName());
ferencd@0 190 VASSERT_EQ("2/domain", "example.com", eml2.getDomainName());
ferencd@0 191
ferencd@0 192 vmime::emailAddress eml3("john.smith@(comment (comment in comment))example.com");
ferencd@0 193 VASSERT_EQ("3/local", "john.smith", eml3.getLocalName());
ferencd@0 194 VASSERT_EQ("3/domain", "example.com", eml3.getDomainName());
ferencd@0 195
ferencd@0 196 vmime::emailAddress eml4("john.smith@(comment \\) end comment)example.com");
ferencd@0 197 VASSERT_EQ("4/local", "john.smith", eml4.getLocalName());
ferencd@0 198 VASSERT_EQ("4/domain", "example.com", eml4.getDomainName());
ferencd@0 199 }
ferencd@0 200
ferencd@0 201 void testGenerateASCII()
ferencd@0 202 {
ferencd@0 203 VASSERT_EQ("email 1", "local@domain", vmime::emailAddress("local", "domain").generate());
ferencd@0 204
ferencd@0 205 VASSERT_EQ("email 2", "=?utf-8?Q?Pel=C3=A9?=@example.com",
ferencd@0 206 vmime::emailAddress("Pelé", "example.com").generate());
ferencd@0 207 VASSERT_EQ("email 3", "=?utf-8?B?55Sy5paQ?=@xn--5rtw95l.xn--wgv71a",
ferencd@0 208 vmime::emailAddress("甲斐", "黒川.日本").generate());
ferencd@0 209 VASSERT_EQ("email 4", "mailtest@xn--r8jz45g.xn--zckzah",
ferencd@0 210 vmime::emailAddress("mailtest", "例え.テスト").generate());
ferencd@0 211 VASSERT_EQ("email 5", "mailtest@xn--mgbh0fb.xn--kgbechtv",
ferencd@0 212 vmime::emailAddress("mailtest", "مثال.إختبار").generate());
ferencd@0 213 }
ferencd@0 214
ferencd@0 215 void testGenerateEAI()
ferencd@0 216 {
ferencd@0 217 vmime::generationContext ctx(vmime::generationContext::getDefaultContext());
ferencd@0 218 ctx.setInternationalizedEmailSupport(true);
ferencd@0 219
ferencd@0 220 vmime::generationContext::switcher <vmime::generationContext> contextSwitcher(ctx);
ferencd@0 221
ferencd@0 222 VASSERT_EQ("email 1", "Pelé@example.com",
ferencd@0 223 vmime::emailAddress("Pelé", "example.com").generate());
ferencd@0 224 VASSERT_EQ("email 2", "δοκιμή@παράδειγμα.δοκιμή",
ferencd@0 225 vmime::emailAddress("δοκιμή", "παράδειγμα.δοκιμή").generate());
ferencd@0 226 VASSERT_EQ("email 3", "甲斐@黒川.日本",
ferencd@0 227 vmime::emailAddress("甲斐", "黒川.日本").generate());
ferencd@0 228 VASSERT_EQ("email 4", "чебурашка@ящик-с-апельсинами.рф",
ferencd@0 229 vmime::emailAddress("чебурашка", "ящик-с-апельсинами.рф").generate());
ferencd@0 230 }
ferencd@0 231
ferencd@0 232 void testGenerateSpecialChars()
ferencd@0 233 {
ferencd@0 234 VASSERT_EQ("email 1", "\"very.unusual.@.unusual.com\"@example.com",
ferencd@0 235 vmime::emailAddress("very.unusual.@.unusual.com", "example.com").generate());
ferencd@0 236
ferencd@0 237 VASSERT_EQ("email 2", "\"very.(),:;<>[]\\\".VERY.\\\"very@\\\\ \\\"very\\\".unusual\"@strange.example.com",
ferencd@0 238 vmime::emailAddress("very.(),:;<>[]\".VERY.\"very@\\ \"very\".unusual", "strange.example.com").generate());
ferencd@0 239
ferencd@0 240 VASSERT_EQ("email 3", "\" \"@example.com",
ferencd@0 241 vmime::emailAddress(" ", "example.com").generate());
ferencd@0 242 }
ferencd@0 243
ferencd@0 244 VMIME_TEST_SUITE_END