Skip to content

Instantly share code, notes, and snippets.

@reynir
Created February 6, 2024 09:28
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save reynir/99a37390dc4b7e7005d350a6725d7ef4 to your computer and use it in GitHub Desktop.
Save reynir/99a37390dc4b7e7005d350a6725d7ef4 to your computer and use it in GitHub Desktop.
(test
(name test_validate_email)
(libraries validate alcotest))
(lang dune 3.12)
(name test_validate_email)
$ dune runt
File "dune", line 2, characters 7-26:
2 | (name test_validate_email)
^^^^^^^^^^^^^^^^^^^
Testing `Address test'.
This run has ID `F410UWID'.
> [FAIL] good 0 "Mary Smith <mary@example.net>".
[FAIL] good 1 "Mary Smith <mary@x.test>, jdoe@example.org...
[FAIL] good 2 "A Group:Ed Jones <c@a.test>,joe@where.test...
[FAIL] good 3 "Undisclosed recipients:;".
[FAIL] good 4 "\"Mary Smith: Personal Account\" <smith@ho...
[FAIL] good 5 "John Doe <jdoe@machine.example>".
[FAIL] good 6 "Pete(A nice \\) chap) <pete(his account)@s...
[FAIL] good 7 "A Group(Some people) :Chris Jones <c@(C...
[FAIL] good 8 "(Empty list)(start)Hidden recipients :(no...
[FAIL] good 9 "Mary Smith <@node.test:mary@example.net>, ...
[FAIL] good 10 "Joe Q. Public <john.q.public@example.com>".
[FAIL] good 11 "John Doe <jdoe@machine(comment). example>".
[FAIL] good 12 "Mary Smith <mary@example.net>".
[FAIL] good 13 "<boss@nil.test>, \"Giant; \\\"Big\\\" Box\...
[OK] good 14 "!#$%&`*+/=?^`{|}~@iana.org".
[FAIL] good 15 "(\007;)mary@example.net".
[FAIL] good 16 "\"\\\n\"@x.test".
[FAIL] good 17 "\"\\a\"@x.test".
[FAIL] good 18 "\"\007\"@x.test".
[FAIL] good 19 "\"\\\007\"@x.test".
[FAIL] good 20 "pete@[255.255.255.255]".
[FAIL] good 21 "\"mary\"@example.net".
[FAIL] good 22 "\"\\\"\"@example.net".
[FAIL] good 23 "\"john\".\"public\"@example.com".
[FAIL] good 24 "\"mary smith\"@home.example".
[FAIL] good 25 "\"mary\".smith@home.example".
[FAIL] good 26 "\"mary\\\000\"@home.example".
[FAIL] good 27 " richard @home.example".
[FAIL] good 28 "richar@ home .example".
[FAIL] good 29 "mary . smith@y.test".
[FAIL] good 30 " jdoe@example.net".
[FAIL] good 31 " jdoe@example.net".
[FAIL] good 32 "(comment)smith@home.example".
[FAIL] good 33 "(comment(comment))smith@home.example".
[FAIL] good 34 "smith@(comment)home.example".
[FAIL] good 35 "smith@(comment)[255.255.255.255]".
[OK] good 36 "robert@xn--hxajbheg2az3al.xn--jxalpdlp".
[OK] good 37 "xn--robert@x.test".
[OK] good 38 "stephane+blog@bortzmeyer.org".
[OK] good 39 "{tropdur}@example.org".
[OK] good 40 "c&a@hotmail.com".
[OK] good 41 "directeur@arts-premiers.museum".
[FAIL] good 42 "\"Stephane[Bortzmeyer]\"@laposte.net".
[OK] good 43 "first.last@iana.org".
[OK] good 44 "123456789012345678901234567890123456789012...
[FAIL] good 45 "\"first\\\"last\"@iana.org".
[FAIL] good 46 "\"first@last\"@iana.org".
[FAIL] good 47 "\"first\\last\"@iana.org".
[FAIL] good 48 "first.last@[12.34.56.78]".
[FAIL] good 49 "first.last@[IPv6:::12.34.56.78]".
[FAIL] good 50 "first.last@[IPv6:1111:2222:3333::4444:12.3...
[FAIL] good 51 "first.last@[IPv6:1111:2222:3333:4444:5555:...
[FAIL] good 52 "first.last@[IPv6:::1111:2222:3333:4444:555...
[FAIL] good 53 "first.last@[IPv6:1111:2222:3333::4444:5555...
[FAIL] good 54 "first.last@[IPv6:1111:2222:3333:4444:5555:...
[FAIL] good 55 "first.last@[IPv6:1111:2222:3333:4444:5555:...
[OK] good 56 "first.last@x234567890123456789012345678901...
[OK] good 57 "first.last@3com.com".
[OK] good 58 "first.last@123.iana.org".
[FAIL] good 59 "first.last@[IPv6:1111:2222:3333::4444:5555...
[FAIL] good 60 "first.last@[IPv6:1111:2222:3333::4444:5555...
[OK] good 61 "first.last@example.123".
[FAIL] good 62 "first.last@com".
[OK] good 63 "!#$%&'*+-/=?^_`.{|}~@example.com".
[FAIL] good 64 "\"Abc@def\"@example.com".
[FAIL] good 65 "\"Abc\\@def\"@iana.org".
[FAIL] good 66 "\"Fred\\ Bloggs\"@iana.org".
[FAIL] good 67 "\"Joe.\\Blow\"@iana.org".
[FAIL] good 68 "\"Abc@def\"@iana.org".
[FAIL] good 69 "\"Fred Bloggs\"@iana.org".
[OK] good 70 "user+mailbox@iana.org".
[OK] good 71 "customer/department=shipping@iana.org".
[FAIL] good 72 "$A12345@iana.org".
[OK] good 73 "!def!xyz%abc@iana.org".
[OK] good 74 "_somename@iana.org".
[OK] good 75 "dclo@us.ibm.com".
[OK] good 76 "peter.piper@iana.org".
[FAIL] good 77 "\"Doug \\\"Ace\\\" L.\"@iana.org".
[OK] good 78 "test@iana.org".
[FAIL] good 79 "TEST@iana.org".
[OK] good 80 "1234567890@iana.org".
[OK] good 81 "test+test@iana.org".
[OK] good 82 "test-test@iana.org".
[OK] good 83 "t*est@iana.org".
[OK] good 84 "+1~1+@iana.org".
[OK] good 85 "{_test_}@iana.org".
[FAIL] good 86 "\"[[ test ]]\"@iana.org".
[OK] good 87 "test.test@iana.org".
[FAIL] good 88 "\"test.test\"@iana.org".
[FAIL] good 89 "test.\"test\"@iana.org".
[FAIL] good 90 "\"test@test\"@iana.org".
[OK] good 91 "test@123.123.123.x123".
[OK] good 92 "test@123.123.123.123".
[FAIL] good 93 "test@[123.123.123.123]".
[OK] good 94 "test@example.iana.org".
[OK] good 95 "test@example.example.iana.org".
[FAIL] good 96 "\"test\\test\"@iana.org".
[FAIL] good 97 "test@example".
[FAIL] good 98 "\"test\\blah\"@iana.org".
[FAIL] good 99 "\"test\\\"blah\"@iana.org".
[OK] good 100 "customer/department@iana.org".
[FAIL] good 101 "_Yosemite.Sam@iana.org".
[OK] good 102 "~@iana.org".
[FAIL] good 103 "\"Austin@Powers\"@iana.org".
[FAIL] good 104 "Ima.Fool@iana.org".
[FAIL] good 105 "\"Ima.Fool\"@iana.org".
[FAIL] good 106 "\"Ima Fool\"@iana.org".
[FAIL] good 107 "\"first\".\"last\"@iana.org".
[FAIL] good 108 "\"first\".middle.\"last\"@iana.org".
[FAIL] good 109 "\"first\".last@iana.org".
[FAIL] good 110 "first.\"last\"@iana.org".
[FAIL] good 111 "\"first\".\"middle\".\"last\"@iana.org".
[FAIL] good 112 "\"first.middle\".\"last\"@iana.org".
[FAIL] good 113 "\"first.middle.last\"@iana.org".
[FAIL] good 114 "\"first..last\"@iana.org".
[FAIL] good 115 "\"first\\\\\\\"last\"@iana.org".
[FAIL] good 116 "first.\"mid\\dle\".\"last\"@iana.org".
[FAIL] good 117 "\"test blah\"@iana.org".
[FAIL] good 118 "(foo)cal(bar)@(baz)iamcal.com(quux)".
[FAIL] good 119 "cal@iamcal(woo).(yay)com".
[FAIL] good 120 "cal(woo(yay)hoopla)@iamcal.com".
[FAIL] good 121 "cal(foo\\@bar)@iamcal.com".
[FAIL] good 122 "cal(foo\\)bar)@iamcal.com".
[FAIL] good 123 "first().last@iana.org".
[FAIL] good 124 "pete(his account)@silly.test(his host)".
[FAIL] good 125 "c@(Chris's host.)public.example".
[FAIL] good 126 "jdoe@machine(comment). example".
[FAIL] good 127 "1234 @ local(blah) .machine .example".
[FAIL] good 128 "first(abc.def).last@iana.org".
[FAIL] good 129 "first(a\"bc.def).last@iana.org".
[FAIL] good 130 "first.(\")middle.last(\")@iana.org".
[FAIL] good 131 "first(abc\\(def)@iana.org".
[FAIL] good 132 "first.last@x(12345678901234567890123456789...
[FAIL] good 133 "a(a(b(c)d(e(f))g)h(i)j)@iana.org".
[OK] good 134 "name.lastname@domain.com".
[FAIL] good 135 "a@b".
[OK] good 136 "a@bar.com".
[FAIL] good 137 "aaa@[123.123.123.123]".
[FAIL] good 138 "a@bar".
[OK] good 139 "a-b@bar.com".
[OK] good 140 "+@b.c".
[OK] good 141 "+@b.com".
[OK] good 142 "a@b.co-foo.uk".
[FAIL] good 143 "\"hello my name is\"@stutter.com".
[FAIL] good 144 "\"Romain \" <romain@github.com>".
[FAIL] good 145 "\"Test \\\"Fail\\\" Ing\"@iana.org".
[OK] good 146 "valid@about.museum".
[OK] good 147 "shaitan@my-domain.thisisminekthx".
[OK] good 148 "foobar@192.168.0.1".
[FAIL] good 149 "\"Joe\\Blow\"@iana.org".
[FAIL] good 150 "HM2Kinsists@(that comments are allowed)thi...
[OK] good 151 "user%uucp!path@berkeley.edu".
[FAIL] good 152 "first.last @iana.org".
[OK] good 153 "cdburgess+!#$%&'*-/=?+_{}|~test@gmail.com".
[FAIL] good 154 "first.last@[IPv6:a1:a2:a3:a4:b1:b2:b3::]".
[FAIL] good 155 "first.last@[IPv6:::]".
[FAIL] good 156 "first.last@[IPv6:::b4]".
[FAIL] good 157 "first.last@[IPv6:::b3:b4]".
[FAIL] good 158 "first.last@[IPv6:a1::b4]".
[FAIL] good 159 "first.last@[IPv6:a1::]".
[FAIL] good 160 "first.last@[IPv6:a1:a2::]".
[FAIL] good 161 "first.last@[IPv6:0123:4567:89ab:cdef::]".
[FAIL] good 162 "first.last@[IPv6:0123:4567:89ab:CDEF::]".
[FAIL] good 163 "first.last@[IPv6:::a3:a4:b1:ffff:11.22.33....
[FAIL] good 164 "first.last@[IPv6:a1:a2:a3:a4::11.22.33.44]".
[FAIL] good 165 "first.last@[IPv6:a1:a2:a3:a4:b1::11.22.33....
[FAIL] good 166 "first.last@[IPv6:a1::11.22.33.44]".
[FAIL] good 167 "first.last@[IPv6:a1:a2::11.22.33.44]".
[FAIL] good 168 "first.last@[IPv6:0123:4567:89ab:cdef::11.2...
[FAIL] good 169 "first.last@[IPv6:0123:4567:89ab:CDEF::11.2...
[FAIL] good 170 "first.last@[IPv6:a1::b2:11.22.33.44]".
[FAIL] good 171 "first.last@[IPv6:::a2:a3:a4:b1:b2:b3:b4]".
[FAIL] good 172 "first.last@[IPv6:::a2:a3:a4:b1:ffff:11.22....
[OK] good 173 "test@test.com".
[OK] good 174 "test@xn--example.com".
[OK] good 175 "test@example.com".
[FAIL] good 176 "\231\148\168\230\136\183@\228\190\139\229\...
[FAIL] good 177 "\224\164\133\224\164\156\224\164\175@\224\...
[FAIL] good 178 "\208\186\208\178\209\150\209\130\208\190\2...
[FAIL] good 179 "\206\184\207\131\206\181\207\129@\206\181\...
[FAIL] good 180 "D\195\182rte@S\195\182rensen.example.com".
[FAIL] good 181 "\208\186\208\190\208\187\209\143@\208\191\...
[OK] bad 0 "".
[OK] bad 1 "mary".
[OK] bad 2 "@".
[OK] bad 3 "mary@".
[OK] bad 4 "@io".
[OK] bad 5 "@example.net".
[OK] bad 6 ".mary@example.net".
[OK] bad 7 "jdoe.@example.net".
[OK] bad 8 "pete..silly.test".
[OK] bad 9 "sm_i-th.com".
[OK] bad 10 "mary\\@jdoe@one.test".
[OK] bad 11 "jdoe@.one.test".
[OK] bad 12 "jdon@one.test.".
[OK] bad 13 "boss@nil..test".
[OK] bad 14 "\"\"\"@example.net".
[OK] bad 15 "\"\\\"@example.net".
[OK] bad 16 "jdoe\"@machine.example".
[OK] bad 17 "\"jdoe@machine.example".
[OK] bad 18 "\"john\"public@example.com".
[OK] bad 19 "john\"public\"@example.com".
[OK] bad 20 "\"john\"\"public\"@example.com".
[OK] bad 21 "\"mary\000\"@home.example".
[OK] bad 22 "pete@a[255.255.255.255]".
[OK] bad 23 "((comment)smith@home.example".
[OK] bad 24 "smith(coment)doe@home.example".
[OK] bad 25 "robert@henry.com\r".
[OK] bad 26 "(smith@home.example".
[OK] bad 27 "robert@[1.2.3.4".
[OK] bad 28 "\"john\\\"@example.com".
[OK] bad 29 "(comment\\)smith@home.example".
[OK] bad 30 "smith@home.example(comment\\)".
[OK] bad 31 "smith@home.example(comment\\".
[OK] bad 32 "robert@[RFC5322-[domain-literal\\]".
[OK] bad 33 "robert@[RFC5322-[domain-literal]".
[OK] bad 34 "robert@[RFC5322-[domain-literal\\".
[OK] bad 35 "marx@capitalism.ru\r".
[OK] bad 36 "\rmarx@capitalism.ru".
[OK] bad 37 "\"\rmarx\"@capitalism.ru".
[OK] bad 38 "(\r)marx@capitalism.ru".
[OK] bad 39 "marx@capitalism.ru(\r)".
[OK] bad 40 "smith@communism.uk\n".
[OK] bad 41 "\nsmith@communism.uk".
[OK] bad 42 "\"\nsmith\"@communism.uk".
[OK] bad 43 "(\n)smith@communism.uk".
[OK] bad 44 "smith@communism.uk(\n)".
[OK] bad 45 "first.last@sub.do,com".
[OK] bad 46 "first\\@last@iana.org".
[OK] bad 47 "first.last".
[OK] bad 48 ".first.last@iana.org".
[OK] bad 49 "first.last.@iana.org".
[OK] bad 50 "first..last@iana.org".
[OK] bad 51 "\"first\"last\"@iana.org".
[OK] bad 52 "\"\"\"@iana.org".
[OK] bad 53 "\"\\\"@iana.org".
[OK] bad 54 "\"\"@iana.org".
[OK] bad 55 "first\\@last@iana.org".
[OK] bad 56 "first.last@".
[OK] bad 57 "first.last@[.12.34.56.78]".
[OK] bad 58 "first.last@[12.34.56.789]".
[OK] bad 59 "first.last@[::12.34.56.78]".
[OK] bad 60 "first.last@[IPv5:::12.34.56.78]".
[OK] bad 61 "first.last@[IPv6:1111:2222:3333:4444:5555:...
[OK] bad 62 "first.last@[IPv6:1111:2222:3333:4444:5555:...
[OK] bad 63 "first.last@[IPv6:1111:2222:3333:4444:5555:...
[OK] bad 64 "first.last@[IPv6:1111:2222:3333:4444:5555:...
[OK] bad 65 "first.last@[IPv6:1111:2222::3333::4444:555...
[OK] bad 66 "first.last@[IPv6:1111:2222:333x::4444:5555]".
[OK] bad 67 "first.last@[IPv6:1111:2222:33333::4444:555...
[OK] bad 68 "abc\\@def@iana.org".
[OK] bad 69 "abc\\@iana.org".
[OK] bad 70 "@iana.org".
[OK] bad 71 "doug@".
[OK] bad 72 "\"qu@iana.org".
[OK] bad 73 "ote\"@iana.org".
[OK] bad 74 ".dot@iana.org".
[OK] bad 75 "dot.@iana.org".
[OK] bad 76 "two..dot@iana.org".
[OK] bad 77 "\"Doug \"Ace\" L.\"@iana.org".
[OK] bad 78 "Doug\\ \\\"Ace\\\"\\ L\\.@iana.org".
[OK] bad 79 "hello world@iana.org".
[OK] bad 80 "gatsby@f.sc.ot.t.f.i.tzg.era.l.d.".
[OK] bad 81 "test.iana.org".
[OK] bad 82 "test.@iana.org".
[OK] bad 83 "test..test@iana.org".
[OK] bad 84 ".test@iana.org".
[OK] bad 85 "test@test@iana.org".
[OK] bad 86 "test@@iana.org".
[OK] bad 87 "-- test --@iana.org".
[OK] bad 88 "[test]@iana.org".
[OK] bad 89 "\"test\"test\"@iana.org".
[OK] bad 90 "()[]\\;:,><@iana.org".
[OK] bad 91 "test@.".
[OK] bad 92 "test@example.".
[OK] bad 93 "test@.org".
[OK] bad 94 "test@[123.123.123.123".
[OK] bad 95 "test@123.123.123.123]".
[OK] bad 96 "NotAnEmail".
[OK] bad 97 "NotAnEmail".
[OK] bad 98 "\"test\"blah\"@iana.org".
[OK] bad 99 ".wooly@iana.org".
[OK] bad 100 "wo..oly@iana.org".
[OK] bad 101 "pootietang.@iana.org".
[OK] bad 102 ".@iana.org".
[OK] bad 103 "Ima Fool@iana.org".
[OK] bad 104 "phil.h\\@\\@ck@haacked.com".
[OK] bad 105 "first\\last@iana.org".
[OK] bad 106 "Abc\\@def@iana.org".
[OK] bad 107 "Fred\\ Bloggs@iana.org".
[OK] bad 108 "Joe.\\Blow@iana.org".
[OK] bad 109 "first.last@[IPv6:1111:2222:3333:4444:5555:...
[OK] bad 110 "{^c\\@**Dog^}@cartoon.com".
[OK] bad 111 "cal(foo(bar)@iamcal.com".
[OK] bad 112 "cal(foo\\)@iamcal.com".
[OK] bad 113 "cal(foo)bar)@iamcal.com".
[OK] bad 114 "first(middle)last@iana.org".
[OK] bad 115 "a(a(b(c)d(e(f))g)(h(i)j)@iana.org".
[OK] bad 116 ".@".
[OK] bad 117 "@bar.com".
[OK] bad 118 "@@bar.com".
[OK] bad 119 "aaa.com".
[OK] bad 120 "aaa@.com".
[OK] bad 121 "aaa@.com".
[OK] bad 122 "aaa@.123".
[OK] bad 123 "aaa@[123.123.123.123]a".
[OK] bad 124 "aaa@[123.123.123.333]".
[OK] bad 125 "a@bar.com.".
[OK] bad 126 "-@..com".
[OK] bad 127 "-@a..com".
[OK] bad 128 "test@...........com".
[OK] bad 129 "\"\000 \"@char.com".
[OK] bad 130 "\000@char.com".
[OK] bad 131 "first.last@[IPv6::]".
[OK] bad 132 "first.last@[IPv6::::]".
[OK] bad 133 "first.last@[IPv6::b4]".
[OK] bad 134 "first.last@[IPv6::::b4]".
[OK] bad 135 "first.last@[IPv6::b3:b4]".
[OK] bad 136 "first.last@[IPv6::::b3:b4]".
[OK] bad 137 "first.last@[IPv6:a1:::b4]".
[OK] bad 138 "first.last@[IPv6:a1:]".
[OK] bad 139 "first.last@[IPv6:a1:::]".
[OK] bad 140 "first.last@[IPv6:a1:a2:]".
[OK] bad 141 "first.last@[IPv6:a1:a2:::]".
[OK] bad 142 "first.last@[IPv6::11.22.33.44]".
[OK] bad 143 "first.last@[IPv6::::11.22.33.44]".
[OK] bad 144 "first.last@[IPv6:a1:11.22.33.44]".
[OK] bad 145 "first.last@[IPv6:a1:::11.22.33.44]".
[OK] bad 146 "first.last@[IPv6:a1:a2:::11.22.33.44]".
[OK] bad 147 "first.last@[IPv6:0123:4567:89ab:cdef::11.2...
[OK] bad 148 "first.last@[IPv6:0123:4567:89ab:CDEFF::11....
[OK] bad 149 "first.last@[IPv6:a1::a4:b1::b4:11.22.33.44]".
[OK] bad 150 "first.last@[IPv6:a1::11.22.33]".
[OK] bad 151 "first.last@[IPv6:a1::11.22.33.44.55]".
[OK] bad 152 "first.last@[IPv6:a1::b211.22.33.44]".
[OK] bad 153 "first.last@[IPv6:a1::11.22.33]".
[OK] bad 154 "first.last@[IPv6:a1::11.22.33.44.55]".
[OK] bad 155 "first.last@[IPv6:a1::b211.22.33.44]".
[OK] bad 156 "first.last@[IPv6:a1::b2::11.22.33.44]".
[OK] bad 157 "first.last@[IPv6:a1::b3:]".
[OK] bad 158 "first.last@[IPv6::a2::b4]".
[OK] bad 159 "first.last@[IPv6:a1:a2:a3:a4:b1:b2:b3:]".
[OK] bad 160 "first.last@[IPv6::a2:a3:a4:b1:b2:b3:b4]".
[OK] bad 161 "first.last@[IPv6:a1:a2:a3:a4::b1:b2:b3:b4]".
[OK] bad 162 "=?us-ascii?Q?Chri's_Smith?= =?us-ascii?Q?H...
[OK] bad 163 "jdoe@[RFC-5322-\\a-domain-literal]".
[OK] bad 164 "jdoe@[RFC-5322-\\t-domain-literal]".
[OK] bad 165 "jdoe@[RFC-5322-\\]-domain-literal]".
[OK] bad 166 "jdoe@[RFC-5322-domain-literal] (comment)".
┌──────────────────────────────────────────────────────────────────────────────┐
│ [FAIL] good 0 "Mary Smith <mary@example.net>". │
└──────────────────────────────────────────────────────────────────────────────┘
ASSERT (Err.BaseError { Err.code = "invalid_email"; params = [] })
FAIL (Err.BaseError { Err.code = "invalid_email"; params = [] })
Raised at Alcotest_engine__Test.check_err in file "src/alcotest-engine/test.ml", line 157, characters 20-48
Called from Alcotest_engine__Core.Make.protect_test.(fun) in file "src/alcotest-engine/core.ml", line 181, characters 17-23
Called from Alcotest_engine__Monad.Identity.catch in file "src/alcotest-engine/monad.ml", line 24, characters 31-35
Logs saved to `~/tmp/validate-email/_build/default/_build/_tests/Address test/good.000.output'.
──────────────────────────────────────────────────────────────────────────────
Full test results in `~/tmp/validate-email/_build/default/_build/_tests/Address test'.
134 failures! in 0.050s. 349 tests run.
let make_good_test s =
( Printf.sprintf "%S" s,
`Quick,
fun () ->
match Validate.validate_email s with
| Ok () -> ()
| Error e -> Alcotest.failf "%s" (Validate.show_validation_error e) )
let sp = Format.asprintf
let make_bad_test s =
Alcotest.test_case (sp "%S" s) `Quick @@ fun () ->
match Validate.validate_email s with
| Ok () -> Alcotest.fail "Expected error"
| Error _ -> ()
let tests =
[
"Mary Smith <mary@example.net>";
"Mary Smith <mary@x.test>, jdoe@example.org, Who? <one@y.test>";
"A Group:Ed Jones <c@a.test>,joe@where.test,John <jdoe@one.test>;";
"Undisclosed recipients:;";
"\"Mary Smith: Personal Account\" <smith@home.example>";
"John Doe <jdoe@machine.example>";
{|Pete(A nice \) chap) <pete(his account)@silly.test(his host)>|};
"A Group(Some people) :Chris Jones <c@(Chris's \
host.)public.example>, joe@example.org, John <jdoe@one.test> (my \
dear friend); (the end of the group)";
"(Empty list)(start)Hidden recipients :(nobody(that I know)) ;";
"Mary Smith <@node.test:mary@example.net>, , jdoe@test . example";
"Joe Q. Public <john.q.public@example.com>";
"John Doe <jdoe@machine(comment). example>";
"Mary Smith <mary@example.net>";
"<boss@nil.test>, \"Giant; \\\"Big\\\" Box\" <sysservices@example.net>";
"!#$%&`*+/=?^`{|}~@iana.org";
"(\x07;)mary@example.net";
"\"\\\x0a\"@x.test";
{|"\a"@x.test|};
"\"\x07\"@x.test";
"\"\\\x07\"@x.test";
"pete@[255.255.255.255]";
"\"mary\"@example.net";
"\"\\\"\"@example.net";
"\"john\".\"public\"@example.com";
"\"mary smith\"@home.example";
"\"mary\".smith@home.example";
"\"mary\\\000\"@home.example";
" richard @home.example";
"richar@ home .example";
"mary . smith@y.test";
" jdoe@example.net";
" jdoe@example.net";
"(comment)smith@home.example";
"(comment(comment))smith@home.example";
"smith@(comment)home.example";
"smith@(comment)[255.255.255.255]";
"robert@xn--hxajbheg2az3al.xn--jxalpdlp";
"xn--robert@x.test";
"stephane+blog@bortzmeyer.org";
"{tropdur}@example.org";
"c&a@hotmail.com";
"directeur@arts-premiers.museum";
"\"Stephane[Bortzmeyer]\"@laposte.net";
"first.last@iana.org";
"1234567890123456789012345678901234567890123456789012345678901234@iana.org";
"\"first\\\"last\"@iana.org";
"\"first@last\"@iana.org";
"\"first\\last\"@iana.org";
"first.last@[12.34.56.78]";
"first.last@[IPv6:::12.34.56.78]";
"first.last@[IPv6:1111:2222:3333::4444:12.34.56.78]";
"first.last@[IPv6:1111:2222:3333:4444:5555:6666:12.34.56.78]";
"first.last@[IPv6:::1111:2222:3333:4444:5555:6666]";
"first.last@[IPv6:1111:2222:3333::4444:5555:6666]";
"first.last@[IPv6:1111:2222:3333:4444:5555:6666::]";
"first.last@[IPv6:1111:2222:3333:4444:5555:6666:7777:8888]";
"first.last@x23456789012345678901234567890123456789012345678901234567890123.iana.org";
"first.last@3com.com";
"first.last@123.iana.org";
"first.last@[IPv6:1111:2222:3333::4444:5555:12.34.56.78]";
"first.last@[IPv6:1111:2222:3333::4444:5555:6666:7777]";
"first.last@example.123";
"first.last@com";
"!#$%&'*+-/=?^_`.{|}~@example.com";
"\"Abc@def\"@example.com";
"\"Abc\\@def\"@iana.org";
"\"Fred\\ Bloggs\"@iana.org";
"\"Joe.\\Blow\"@iana.org";
"\"Abc@def\"@iana.org";
"\"Fred Bloggs\"@iana.org";
"user+mailbox@iana.org";
"customer/department=shipping@iana.org";
"$A12345@iana.org";
"!def!xyz%abc@iana.org";
"_somename@iana.org";
"dclo@us.ibm.com";
"peter.piper@iana.org";
"\"Doug \\\"Ace\\\" L.\"@iana.org";
"test@iana.org";
"TEST@iana.org";
"1234567890@iana.org";
"test+test@iana.org";
"test-test@iana.org";
"t*est@iana.org";
"+1~1+@iana.org";
"{_test_}@iana.org";
"\"[[ test ]]\"@iana.org";
"test.test@iana.org";
"\"test.test\"@iana.org";
"test.\"test\"@iana.org";
"\"test@test\"@iana.org";
"test@123.123.123.x123";
"test@123.123.123.123";
"test@[123.123.123.123]";
"test@example.iana.org";
"test@example.example.iana.org";
"\"test\\test\"@iana.org";
"test@example";
"\"test\\blah\"@iana.org";
"\"test\\\"blah\"@iana.org";
"customer/department@iana.org";
"_Yosemite.Sam@iana.org";
"~@iana.org";
"\"Austin@Powers\"@iana.org";
"Ima.Fool@iana.org";
"\"Ima.Fool\"@iana.org";
"\"Ima Fool\"@iana.org";
"\"first\".\"last\"@iana.org";
"\"first\".middle.\"last\"@iana.org";
"\"first\".last@iana.org";
"first.\"last\"@iana.org";
"\"first\".\"middle\".\"last\"@iana.org";
"\"first.middle\".\"last\"@iana.org";
"\"first.middle.last\"@iana.org";
"\"first..last\"@iana.org";
"\"first\\\\\\\"last\"@iana.org";
"first.\"mid\\dle\".\"last\"@iana.org";
"\"test blah\"@iana.org";
"(foo)cal(bar)@(baz)iamcal.com(quux)";
"cal@iamcal(woo).(yay)com";
"cal(woo(yay)hoopla)@iamcal.com";
"cal(foo\\@bar)@iamcal.com";
"cal(foo\\)bar)@iamcal.com";
"first().last@iana.org";
"pete(his account)@silly.test(his host)";
"c@(Chris's host.)public.example";
"jdoe@machine(comment). example";
"1234 @ local(blah) .machine .example";
"first(abc.def).last@iana.org";
"first(a\"bc.def).last@iana.org";
"first.(\")middle.last(\")@iana.org";
"first(abc\\(def)@iana.org";
"first.last@x(1234567890123456789012345678901234567890123456789012345678901234567890).com";
"a(a(b(c)d(e(f))g)h(i)j)@iana.org";
"name.lastname@domain.com";
"a@b";
"a@bar.com";
"aaa@[123.123.123.123]";
"a@bar";
"a-b@bar.com";
"+@b.c";
"+@b.com";
"a@b.co-foo.uk";
"\"hello my name is\"@stutter.com";
"\"Romain \" <romain@github.com>";
"\"Test \\\"Fail\\\" Ing\"@iana.org";
"valid@about.museum";
"shaitan@my-domain.thisisminekthx";
"foobar@192.168.0.1";
"\"Joe\\Blow\"@iana.org";
"HM2Kinsists@(that comments are allowed)this.is.ok";
"user%uucp!path@berkeley.edu";
"first.last @iana.org";
"cdburgess+!#$%&'*-/=?+_{}|~test@gmail.com";
"first.last@[IPv6:a1:a2:a3:a4:b1:b2:b3::]";
"first.last@[IPv6:::]";
"first.last@[IPv6:::b4]";
"first.last@[IPv6:::b3:b4]";
"first.last@[IPv6:a1::b4]";
"first.last@[IPv6:a1::]";
"first.last@[IPv6:a1:a2::]";
"first.last@[IPv6:0123:4567:89ab:cdef::]";
"first.last@[IPv6:0123:4567:89ab:CDEF::]";
"first.last@[IPv6:::a3:a4:b1:ffff:11.22.33.44]";
"first.last@[IPv6:a1:a2:a3:a4::11.22.33.44]";
"first.last@[IPv6:a1:a2:a3:a4:b1::11.22.33.44]";
"first.last@[IPv6:a1::11.22.33.44]";
"first.last@[IPv6:a1:a2::11.22.33.44]";
"first.last@[IPv6:0123:4567:89ab:cdef::11.22.33.44]";
"first.last@[IPv6:0123:4567:89ab:CDEF::11.22.33.44]";
"first.last@[IPv6:a1::b2:11.22.33.44]";
"first.last@[IPv6:::a2:a3:a4:b1:b2:b3:b4]";
"first.last@[IPv6:::a2:a3:a4:b1:ffff:11.22.33.44]";
"test@test.com";
"test@xn--example.com";
"test@example.com";
"用户@例子.广告";
"अजय@डाटा.भारत";
"квіточка@пошта.укр";
"θσερ@εχαμπλε.ψομ";
"Dörte@Sörensen.example.com";
"коля@пример.рф";
]
let bad_tests =
[
"";
"mary";
"@";
"mary@";
"@io";
"@example.net";
".mary@example.net";
"jdoe.@example.net";
"pete..silly.test";
"sm_i-th.com";
{|mary\@jdoe@one.test|};
"jdoe@.one.test";
"jdon@one.test.";
"boss@nil..test";
"\"\"\"@example.net";
"\"\\\"@example.net";
"jdoe\"@machine.example";
"\"jdoe@machine.example";
"\"john\"public@example.com";
"john\"public\"@example.com";
"\"john\"\"public\"@example.com";
"\"mary\000\"@home.example";
"pete@a[255.255.255.255]";
"((comment)smith@home.example";
"smith(coment)doe@home.example";
"robert@henry.com\r";
"(smith@home.example";
"robert@[1.2.3.4";
"\"john\\\"@example.com";
"(comment\\)smith@home.example";
"smith@home.example(comment\\)";
"smith@home.example(comment\\";
"robert@[RFC5322-[domain-literal\\]";
"robert@[RFC5322-[domain-literal]";
"robert@[RFC5322-[domain-literal\\";
"marx@capitalism.ru\x0d";
"\x0dmarx@capitalism.ru";
"\"\x0dmarx\"@capitalism.ru";
"(\x0d)marx@capitalism.ru";
"marx@capitalism.ru(\x0d)";
"smith@communism.uk\x0a";
"\x0asmith@communism.uk";
"\"\x0asmith\"@communism.uk";
"(\x0a)smith@communism.uk";
"smith@communism.uk(\x0a)";
"first.last@sub.do,com";
"first\\@last@iana.org";
"first.last";
".first.last@iana.org";
"first.last.@iana.org";
"first..last@iana.org";
"\"first\"last\"@iana.org";
"\"\"\"@iana.org";
"\"\\\"@iana.org";
"\"\"@iana.org";
"first\\@last@iana.org";
"first.last@";
"first.last@[.12.34.56.78]";
"first.last@[12.34.56.789]";
"first.last@[::12.34.56.78]";
"first.last@[IPv5:::12.34.56.78]";
"first.last@[IPv6:1111:2222:3333:4444:5555:12.34.56.78]";
"first.last@[IPv6:1111:2222:3333:4444:5555:6666:7777:12.34.56.78]";
"first.last@[IPv6:1111:2222:3333:4444:5555:6666:7777]";
"first.last@[IPv6:1111:2222:3333:4444:5555:6666:7777:8888:9999]";
"first.last@[IPv6:1111:2222::3333::4444:5555:6666]";
"first.last@[IPv6:1111:2222:333x::4444:5555]";
"first.last@[IPv6:1111:2222:33333::4444:5555]";
"abc\\@def@iana.org";
"abc\\@iana.org";
"@iana.org";
"doug@";
"\"qu@iana.org";
"ote\"@iana.org";
".dot@iana.org";
"dot.@iana.org";
"two..dot@iana.org";
"\"Doug \"Ace\" L.\"@iana.org";
"Doug\\ \\\"Ace\\\"\\ L\\.@iana.org";
"hello world@iana.org";
"gatsby@f.sc.ot.t.f.i.tzg.era.l.d.";
"test.iana.org";
"test.@iana.org";
"test..test@iana.org";
".test@iana.org";
"test@test@iana.org";
"test@@iana.org";
"-- test --@iana.org";
"[test]@iana.org";
"\"test\"test\"@iana.org";
{|()[]\;:,><@iana.org|};
"test@.";
"test@example.";
"test@.org";
"test@[123.123.123.123";
"test@123.123.123.123]";
"NotAnEmail";
"NotAnEmail";
"\"test\"blah\"@iana.org";
".wooly@iana.org";
"wo..oly@iana.org";
"pootietang.@iana.org";
".@iana.org";
"Ima Fool@iana.org";
"phil.h\\@\\@ck@haacked.com";
"first\\last@iana.org";
"Abc\\@def@iana.org";
"Fred\\ Bloggs@iana.org";
"Joe.\\Blow@iana.org";
"first.last@[IPv6:1111:2222:3333:4444:5555:6666:12.34.567.89]";
"{^c\\@**Dog^}@cartoon.com";
"cal(foo(bar)@iamcal.com";
"cal(foo\\)@iamcal.com";
"cal(foo)bar)@iamcal.com";
"first(middle)last@iana.org";
"a(a(b(c)d(e(f))g)(h(i)j)@iana.org";
".@";
"@bar.com";
"@@bar.com";
"aaa.com";
"aaa@.com";
"aaa@.com";
"aaa@.123";
"aaa@[123.123.123.123]a";
"aaa@[123.123.123.333]";
"a@bar.com.";
"-@..com";
"-@a..com";
"test@...........com";
"\"\000 \"@char.com";
"\000@char.com";
"first.last@[IPv6::]";
"first.last@[IPv6::::]";
"first.last@[IPv6::b4]";
"first.last@[IPv6::::b4]";
"first.last@[IPv6::b3:b4]";
"first.last@[IPv6::::b3:b4]";
"first.last@[IPv6:a1:::b4]";
"first.last@[IPv6:a1:]";
"first.last@[IPv6:a1:::]";
"first.last@[IPv6:a1:a2:]";
"first.last@[IPv6:a1:a2:::]";
"first.last@[IPv6::11.22.33.44]";
"first.last@[IPv6::::11.22.33.44]";
"first.last@[IPv6:a1:11.22.33.44]";
"first.last@[IPv6:a1:::11.22.33.44]";
"first.last@[IPv6:a1:a2:::11.22.33.44]";
"first.last@[IPv6:0123:4567:89ab:cdef::11.22.33.xx]";
"first.last@[IPv6:0123:4567:89ab:CDEFF::11.22.33.44]";
"first.last@[IPv6:a1::a4:b1::b4:11.22.33.44]";
"first.last@[IPv6:a1::11.22.33]";
"first.last@[IPv6:a1::11.22.33.44.55]";
"first.last@[IPv6:a1::b211.22.33.44]";
"first.last@[IPv6:a1::11.22.33]";
"first.last@[IPv6:a1::11.22.33.44.55]";
"first.last@[IPv6:a1::b211.22.33.44]";
"first.last@[IPv6:a1::b2::11.22.33.44]";
"first.last@[IPv6:a1::b3:]";
"first.last@[IPv6::a2::b4]";
"first.last@[IPv6:a1:a2:a3:a4:b1:b2:b3:]";
"first.last@[IPv6::a2:a3:a4:b1:b2:b3:b4]";
"first.last@[IPv6:a1:a2:a3:a4::b1:b2:b3:b4]";
"=?us-ascii?Q?Chri's_Smith?= =?us-ascii?Q?Henry?= \
<.@gmail.com,@hotmail.fr:henry.chris+spam@(Chris's host.)public.example> \
(a simple comment)";
"jdoe@[RFC-5322-\\a-domain-literal]";
"jdoe@[RFC-5322-\\t-domain-literal]";
"jdoe@[RFC-5322-\\]-domain-literal]";
"jdoe@[RFC-5322-domain-literal] (comment)";
]
let () =
Alcotest.run "Address test"
[
("good", List.map make_good_test tests);
("bad", List.map make_bad_test bad_tests);
]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment