From fcb3f6574318f3bc9cd5e53bc66e288d585d2806 Mon Sep 17 00:00:00 2001 From: Tushar Verma Date: Mon, 13 Apr 2026 23:37:18 +0530 Subject: [PATCH 01/10] test(email): add RFC 5321 coverage to draft3 format tests --- tests/draft3/optional/format/email.json | 730 ++++++++++++++++++++++++ 1 file changed, 730 insertions(+) diff --git a/tests/draft3/optional/format/email.json b/tests/draft3/optional/format/email.json index 4749100a..02a5104b 100644 --- a/tests/draft3/optional/format/email.json +++ b/tests/draft3/optional/format/email.json @@ -57,6 +57,736 @@ "description": "full \"From\" header is invalid", "data": "\"Winston Smith\" (Records Department)", "valid": false + }, + { + "description": "simple local part with standard domain is valid", + "data": "test@iana.org", + "valid": true + }, + { + "description": "subdomain with country-code TLD is valid", + "data": "test@nominet.org.uk", + "valid": true + }, + { + "description": "six-letter TLD is valid", + "data": "test@about.museum", + "valid": true + }, + { + "description": "single-character local part is valid", + "data": "a@iana.org", + "valid": true + }, + { + "description": "single-character subdomain is valid", + "data": "test@e.com", + "valid": true + }, + { + "description": "single-character TLD is valid", + "data": "test@iana.a", + "valid": true + }, + { + "description": "dotted local part is valid", + "data": "test.test@iana.org", + "valid": true + }, + { + "description": "atext special characters in local part are valid", + "data": "!#$%&'*+/=?^_{|}~@iana.org", + "valid": true + }, + { + "description": "all-digit local part is valid", + "data": "123@iana.org", + "valid": true + }, + { + "description": "digit at start of subdomain is valid", + "data": "test@123.com", + "valid": true + }, + { + "description": "all-digit TLD is valid", + "data": "test@iana.123", + "valid": true + }, + { + "description": "domain that looks like an IPv4 address without brackets is valid", + "data": "test@255.255.255.255", + "valid": true + }, + { + "description": "64-character local part is valid", + "data": "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghiklm@iana.org", + "valid": true + }, + { + "description": "63-character domain label is valid", + "data": "test@abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghikl.com", + "valid": true + }, + { + "description": "hyphen in subdomain is valid", + "data": "test@mason-dixon.com", + "valid": true + }, + { + "description": "consecutive hyphens in subdomain are valid", + "data": "test@c--n.com", + "valid": true + }, + { + "description": "hyphen in TLD is valid", + "data": "test@iana.co-uk", + "valid": true + }, + { + "description": "domain with many labels is valid", + "data": "a@a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.q.r.s.t.u.v.w.x.y.z.a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.q.r.s.t.u.v.w.x.y.z.a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.q.r.s.t.u.v.w.x.y.z.a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.q.r.s.t.u.v", + "valid": true + }, + { + "description": "punycode-encoded domain is valid", + "data": "test@xn--hxajbheg2az3al.xn--jxalpdlp", + "valid": true + }, + { + "description": "punycode-like prefix in local part is valid", + "data": "xn--test@iana.org", + "valid": true + }, + { + "description": "empty string is not valid", + "data": "", + "valid": false + }, + { + "description": "no @ sign is not valid", + "data": "test", + "valid": false + }, + { + "description": "dotted string without @ is not valid", + "data": "test..iana.org", + "valid": false + }, + { + "description": "domain-like string without @ is not valid", + "data": "test_exa-mple.com", + "valid": false + }, + { + "description": "missing domain is not valid", + "data": "test@", + "valid": false + }, + { + "description": "unclosed bracket in domain is not valid", + "data": "test@[1.2.3.4", + "valid": false + }, + { + "description": "bare @ sign is not valid", + "data": "@", + "valid": false + }, + { + "description": "@ with TLD but no local part is not valid", + "data": "@io", + "valid": false + }, + { + "description": "@ with domain but no local part is not valid", + "data": "@iana.org", + "valid": false + }, + { + "description": "leading dot in local part is not valid", + "data": ".test@iana.org", + "valid": false + }, + { + "description": "trailing dot in local part is not valid", + "data": "test.@iana.org", + "valid": false + }, + { + "description": "backslash in unquoted local part is not valid", + "data": "test\\@test@iana.org", + "valid": false + }, + { + "description": "double-quote in unquoted local part is not valid", + "data": "test\"@iana.org", + "valid": false + }, + { + "description": "text followed by quoted string in local part is not valid", + "data": "test\"text\"@iana.org", + "valid": false + }, + { + "description": "parentheses before local part are not valid", + "data": "((comment)test@iana.org", + "valid": false + }, + { + "description": "parentheses in middle of local part are not valid", + "data": "test(comment)test@iana.org", + "valid": false + }, + { + "description": "open parenthesis before local part is not valid", + "data": "(test@iana.org", + "valid": false + }, + { + "description": "backslash-parenthesis before local part is not valid", + "data": "(comment\\)test@iana.org", + "valid": false + }, + { + "description": "DEL character in local part is not valid", + "data": "\u007f@iana.org", + "valid": false + }, + { + "description": "CR before local part is not valid", + "data": "\rtest@iana.org", + "valid": false + }, + { + "description": "LF before local part is not valid", + "data": "\ntest@iana.org", + "valid": false + }, + { + "description": "BEL character as local part is not valid", + "data": "\u0007@iana.org", + "valid": false + }, + { + "description": "CRLF before local part is not valid", + "data": "\r\ntest@iana.org", + "valid": false + }, + { + "description": "SP then CRLF before local part is not valid", + "data": " \r\ntest@iana.org", + "valid": false + }, + { + "description": "basic quoted string local part is valid", + "data": "\"test\"@iana.org", + "valid": true + }, + { + "description": "empty quoted string local part is valid", + "data": "\"\"@iana.org", + "valid": true + }, + { + "description": "quoted pair with letter is valid", + "data": "\"\\a\"@iana.org", + "valid": true + }, + { + "description": "escaped double-quote in quoted string is valid", + "data": "\"\\\"\"@iana.org", + "valid": true + }, + { + "description": "escaped backslash in quoted string is valid", + "data": "\"\\\\\"@iana.org", + "valid": true + }, + { + "description": "space via quoted pair in quoted string is valid", + "data": "\"test\\ test\"@iana.org", + "valid": true + }, + { + "description": "@ inside quoted string local part is valid", + "data": "\"a@b\"@iana.org", + "valid": true + }, + { + "description": "quoted string containing only @ is valid", + "data": "\"@\"@iana.org", + "valid": true + }, + { + "description": "multiple @ signs inside quoted string is valid", + "data": "\"a@b@c\"@iana.org", + "valid": true + }, + { + "description": "three consecutive double-quotes is not valid", + "data": "\"\"\"@iana.org", + "valid": false + }, + { + "description": "backslash before closing double-quote eats the delimiter", + "data": "\"\\\"@iana.org", + "valid": false + }, + { + "description": "unclosed double-quote in local part is not valid", + "data": "\"test@iana.org", + "valid": false + }, + { + "description": "text after closing double-quote in local part is not valid", + "data": "\"test\"test@iana.org", + "valid": false + }, + { + "description": "two adjacent quoted strings in local part is not valid", + "data": "\"test\"\"test\"@iana.org", + "valid": false + }, + { + "description": "NUL inside quoted string is not valid", + "data": "\"test\u0000\"@iana.org", + "valid": false + }, + { + "description": "trailing backslash eats closing double-quote making it not valid", + "data": "\"test\\\"@iana.org", + "valid": false + }, + { + "description": "CR inside quoted string is not valid", + "data": "\"\rtest\"@iana.org", + "valid": false + }, + { + "description": "LF inside quoted string is not valid", + "data": "\"\n\"@iana.org", + "valid": false + }, + { + "description": "domain label starting with hyphen is not valid", + "data": "test@-iana.org", + "valid": false + }, + { + "description": "domain label ending with hyphen is not valid", + "data": "test@iana-.com", + "valid": false + }, + { + "description": "leading dot in domain is not valid", + "data": "test@.iana.org", + "valid": false + }, + { + "description": "trailing dot in domain is not valid", + "data": "test@iana.org.", + "valid": false + }, + { + "description": "consecutive dots in domain are not valid", + "data": "test@iana..com", + "valid": false + }, + { + "description": "letter immediately before bracket in domain is not valid", + "data": "test@a[255.255.255.255]", + "valid": false + }, + { + "description": "LF after domain is not valid", + "data": "test@iana.org\n", + "valid": false + }, + { + "description": "trailing hyphen in TLD is not valid", + "data": "test@iana.org-", + "valid": false + }, + { + "description": "open parenthesis in domain is not valid", + "data": "test@(iana.org", + "valid": false + }, + { + "description": "DEL character in domain label is not valid", + "data": "test@\u007f.org", + "valid": false + }, + { + "description": "CR after domain is not valid", + "data": "test@iana.org\r", + "valid": false + }, + { + "description": "BEL character in domain label is not valid", + "data": "test@\u0007.org", + "valid": false + }, + { + "description": "two-character bare TLD is valid", + "data": "test@io", + "valid": true + }, + { + "description": "three-character bare TLD is valid", + "data": "test@org", + "valid": true + }, + { + "description": "common test domain is valid", + "data": "test@test.com", + "valid": true + }, + { + "description": "two-letter TLD with two-letter subdomain is valid", + "data": "test@nic.no", + "valid": true + }, + { + "description": "IPv4 address literal with max-value octets is valid", + "data": "test@[255.255.255.255]", + "valid": true + }, + { + "description": "full 8-group IPv6 address literal is valid", + "data": "test@[IPv6:1111:2222:3333:4444:5555:6666:7777:8888]", + "valid": true + }, + { + "description": "compressed IPv6 address literal is valid", + "data": "test@[IPv6:1111:2222:3333:4444:5555::8888]", + "valid": true + }, + { + "description": "IPv6 address literal with leading :: compression is valid", + "data": "test@[IPv6:::3333:4444:5555:6666:7777:8888]", + "valid": true + }, + { + "description": "IPv6 all-zeros address literal is valid", + "data": "test@[IPv6:::]", + "valid": true + }, + { + "description": "IPv6 address literal with embedded IPv4 suffix is valid", + "data": "test@[IPv6:1111:2222:3333:4444:5555:6666:255.255.255.255]", + "valid": true + }, + { + "description": "compressed IPv6 address literal with embedded IPv4 is valid", + "data": "test@[IPv6:1111:2222:3333:4444::255.255.255.255]", + "valid": true + }, + { + "description": "IPv4 address literal with all-zero octets is valid", + "data": "test@[0.0.0.0]", + "valid": true + }, + { + "description": "non-IP content inside address literal brackets is not valid", + "data": "test@[RFC-5322]-domain-literal]", + "valid": false + }, + { + "description": "nested bracket in address literal is not valid", + "data": "test@[RFC-5322-[domain-literal]", + "valid": false + }, + { + "description": "backslash before closing bracket in address literal is not valid", + "data": "test@[RFC-5322-domain-literal\\]", + "valid": false + }, + { + "description": "unclosed address literal with backslash is not valid", + "data": "test@[RFC-5322-domain-literal\\", + "valid": false + }, + { + "description": "63-character local part and domain label boundary is valid", + "data": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.com", + "valid": true + }, + { + "description": "NUL character in local part is not valid", + "data": "a\u0000b@iana.org", + "valid": false + }, + { + "description": "tab character in local part is not valid", + "data": "a\tb@iana.org", + "valid": false + }, + { + "description": "tab character in domain is not valid", + "data": "a@b\tc.com", + "valid": false + }, + { + "description": "non-ASCII UTF-8 character in local part is not valid", + "data": "aé@iana.org", + "valid": false + }, + { + "description": "non-ASCII UTF-8 character in domain is not valid", + "data": "a@é.org", + "valid": false + }, + { + "description": "unquoted space in local part is not valid", + "data": "a b@iana.org", + "valid": false + }, + { + "description": "trailing space is not valid", + "data": "a@iana.org ", + "valid": false + }, + { + "description": "leading space is not valid", + "data": " a@iana.org", + "valid": false + }, + { + "description": "single character on each side of @ is valid", + "data": "a@b", + "valid": true + }, + { + "description": "underscore in local part is valid", + "data": "a_b@iana.org", + "valid": true + }, + { + "description": "comma in local part is not valid", + "data": "a,b@iana.org", + "valid": false + }, + { + "description": "semicolon in local part is not valid", + "data": "a;b@iana.org", + "valid": false + }, + { + "description": "colon in local part is not valid", + "data": "a:b@iana.org", + "valid": false + }, + { + "description": "parenthesis in domain is not valid", + "data": "a@b(c).org", + "valid": false + }, + { + "description": "brackets in local part position are not valid", + "data": "[1.2.3.4]@iana.org", + "valid": false + }, + { + "description": "IPv4 address literal 0.0.0.0 is valid", + "data": "a@[0.0.0.0]", + "valid": true + }, + { + "description": "IPv4 octet value over 255 is not valid", + "data": "a@[256.0.0.0]", + "valid": false + }, + { + "description": "IPv4 literal with only three octets is not valid", + "data": "a@[1.2.3]", + "valid": false + }, + { + "description": "IPv6 address without 'IPv6:' prefix is not valid", + "data": "a@[1111:2222:3333:4444:5555:6666:7777:8888]", + "valid": false + }, + { + "description": "lowercase 'ipv6:' prefix in address literal is valid", + "data": "a@[ipv6:::]", + "valid": true + }, + { + "description": "empty brackets in domain are not valid", + "data": "a@[]", + "valid": false + }, + { + "description": "space inside address literal brackets is not valid", + "data": "a@[ 1.2.3.4]", + "valid": false + }, + { + "description": "64-character local part with all same characters is valid", + "data": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@iana.org", + "valid": true + }, + { + "description": "two @ signs in unquoted local part is not valid", + "data": "a@b@c.org", + "valid": false + }, + { + "description": "dot inside quoted string local part is valid", + "data": "\"a.b\"@iana.org", + "valid": true + }, + { + "description": "leading dot inside quoted string is valid", + "data": "\".test\"@iana.org", + "valid": true + }, + { + "description": "space-only quoted string local part is valid", + "data": "\" \"@iana.org", + "valid": true + }, + { + "description": "general address literal with unregistered tag is not valid", + "data": "a@[extn:test]", + "valid": false + }, + { + "description": "long domain with multiple max-length labels is valid", + "data": "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghiklm@abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghikl.abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghikl.abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghi", + "valid": true + }, + { + "description": "comment-like parentheses after domain are not valid", + "data": "test@iana.org(comment\\)", + "valid": false + }, + { + "description": "open parenthesis with backslash after domain is not valid", + "data": "test@iana.org(comment\\", + "valid": false + }, + { + "description": "CR inside parentheses after domain is not valid", + "data": "test@iana.org(\r)", + "valid": false + }, + { + "description": "CR inside parentheses before address is not valid", + "data": "(\r)test@iana.org", + "valid": false + }, + { + "description": "LF inside parentheses before address is not valid", + "data": "(\n)test@iana.org", + "valid": false + }, + { + "description": "CRLF SP CRLF sequence before address is not valid", + "data": "\r\n \r\ntest@iana.org", + "valid": false + }, + { + "description": "SP CRLF SP CRLF sequence before address is not valid", + "data": " \r\n \r\ntest@iana.org", + "valid": false + }, + { + "description": "SP CRLF CRLF sequence before address is not valid", + "data": " \r\n\r\ntest@iana.org", + "valid": false + }, + { + "description": "SP CRLF CRLF SP sequence before address is not valid", + "data": " \r\n\r\n test@iana.org", + "valid": false + }, + { + "description": "CRLF after domain is not valid", + "data": "test@iana.org\r\n", + "valid": false + }, + { + "description": "CRLF SP CRLF after domain is not valid", + "data": "test@iana.org\r\n \r\n", + "valid": false + }, + { + "description": "SP CRLF after domain is not valid", + "data": "test@iana.org \r\n", + "valid": false + }, + { + "description": "SP CRLF SP CRLF after domain is not valid", + "data": "test@iana.org \r\n \r\n", + "valid": false + }, + { + "description": "SP CRLF CRLF after domain is not valid", + "data": "test@iana.org \r\n\r\n", + "valid": false + }, + { + "description": "SP CRLF CRLF SP after domain is not valid", + "data": "test@iana.org \r\n\r\n ", + "valid": false + }, + { + "description": "non-ASCII character in quoted pair is not valid", + "data": "\"test\\©\"@iana.org", + "valid": false + }, + { + "description": "fullwidth @ sign (U+FF20) is not a valid separator", + "data": "a@iana.org", + "valid": false + }, + { + "description": "US control character (U+001F) in local part is not valid", + "data": "a\u001fb@iana.org", + "valid": false + }, + { + "description": "SOH control character (U+0001) in local part is not valid", + "data": "a\u0001b@iana.org", + "valid": false + }, + { + "description": "dot as entire local part is not valid", + "data": ".@iana.org", + "valid": false + }, + { + "description": "two dots as entire local part is not valid", + "data": "..@iana.org", + "valid": false + }, + { + "description": "IPv4 literal with five octets is not valid", + "data": "a@[1.2.3.4.5]", + "valid": false + }, + { + "description": "dot-string then quoted-string as local part is not valid", + "data": "a.\"b\"@iana.org", + "valid": false + }, + { + "description": "quoted-string then dot-string as local part is not valid", + "data": "\"a\".b@iana.org", + "valid": false + }, + { + "description": "leading dot in local with leading hyphen in domain is not valid", + "data": ".@-iana.org", + "valid": false + }, + { + "description": "leading hyphen and consecutive dots in domain are not valid", + "data": "test@-iana..org", + "valid": false } ] } From 72466aa23188eedbe68ec9d21e87a08ea8606d9f Mon Sep 17 00:00:00 2001 From: Tushar Verma Date: Mon, 13 Apr 2026 23:37:21 +0530 Subject: [PATCH 02/10] test(email): extend draft4 email tests with quoted-string and address-literal cases --- tests/draft4/optional/format/email.json | 730 ++++++++++++++++++++++++ 1 file changed, 730 insertions(+) diff --git a/tests/draft4/optional/format/email.json b/tests/draft4/optional/format/email.json index 7e4c2f68..d0ec6a2a 100644 --- a/tests/draft4/optional/format/email.json +++ b/tests/draft4/optional/format/email.json @@ -102,6 +102,736 @@ "description": "unquoted space in local part is invalid", "data": "joe bloggs@example.com", "valid": false + }, + { + "description": "simple local part with standard domain is valid", + "data": "test@iana.org", + "valid": true + }, + { + "description": "subdomain with country-code TLD is valid", + "data": "test@nominet.org.uk", + "valid": true + }, + { + "description": "six-letter TLD is valid", + "data": "test@about.museum", + "valid": true + }, + { + "description": "single-character local part is valid", + "data": "a@iana.org", + "valid": true + }, + { + "description": "single-character subdomain is valid", + "data": "test@e.com", + "valid": true + }, + { + "description": "single-character TLD is valid", + "data": "test@iana.a", + "valid": true + }, + { + "description": "dotted local part is valid", + "data": "test.test@iana.org", + "valid": true + }, + { + "description": "atext special characters in local part are valid", + "data": "!#$%&'*+/=?^_{|}~@iana.org", + "valid": true + }, + { + "description": "all-digit local part is valid", + "data": "123@iana.org", + "valid": true + }, + { + "description": "digit at start of subdomain is valid", + "data": "test@123.com", + "valid": true + }, + { + "description": "all-digit TLD is valid", + "data": "test@iana.123", + "valid": true + }, + { + "description": "domain that looks like an IPv4 address without brackets is valid", + "data": "test@255.255.255.255", + "valid": true + }, + { + "description": "64-character local part is valid", + "data": "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghiklm@iana.org", + "valid": true + }, + { + "description": "63-character domain label is valid", + "data": "test@abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghikl.com", + "valid": true + }, + { + "description": "hyphen in subdomain is valid", + "data": "test@mason-dixon.com", + "valid": true + }, + { + "description": "consecutive hyphens in subdomain are valid", + "data": "test@c--n.com", + "valid": true + }, + { + "description": "hyphen in TLD is valid", + "data": "test@iana.co-uk", + "valid": true + }, + { + "description": "domain with many labels is valid", + "data": "a@a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.q.r.s.t.u.v.w.x.y.z.a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.q.r.s.t.u.v.w.x.y.z.a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.q.r.s.t.u.v.w.x.y.z.a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.q.r.s.t.u.v", + "valid": true + }, + { + "description": "punycode-encoded domain is valid", + "data": "test@xn--hxajbheg2az3al.xn--jxalpdlp", + "valid": true + }, + { + "description": "punycode-like prefix in local part is valid", + "data": "xn--test@iana.org", + "valid": true + }, + { + "description": "empty string is not valid", + "data": "", + "valid": false + }, + { + "description": "no @ sign is not valid", + "data": "test", + "valid": false + }, + { + "description": "dotted string without @ is not valid", + "data": "test..iana.org", + "valid": false + }, + { + "description": "domain-like string without @ is not valid", + "data": "test_exa-mple.com", + "valid": false + }, + { + "description": "missing domain is not valid", + "data": "test@", + "valid": false + }, + { + "description": "unclosed bracket in domain is not valid", + "data": "test@[1.2.3.4", + "valid": false + }, + { + "description": "bare @ sign is not valid", + "data": "@", + "valid": false + }, + { + "description": "@ with TLD but no local part is not valid", + "data": "@io", + "valid": false + }, + { + "description": "@ with domain but no local part is not valid", + "data": "@iana.org", + "valid": false + }, + { + "description": "leading dot in local part is not valid", + "data": ".test@iana.org", + "valid": false + }, + { + "description": "trailing dot in local part is not valid", + "data": "test.@iana.org", + "valid": false + }, + { + "description": "backslash in unquoted local part is not valid", + "data": "test\\@test@iana.org", + "valid": false + }, + { + "description": "double-quote in unquoted local part is not valid", + "data": "test\"@iana.org", + "valid": false + }, + { + "description": "text followed by quoted string in local part is not valid", + "data": "test\"text\"@iana.org", + "valid": false + }, + { + "description": "parentheses before local part are not valid", + "data": "((comment)test@iana.org", + "valid": false + }, + { + "description": "parentheses in middle of local part are not valid", + "data": "test(comment)test@iana.org", + "valid": false + }, + { + "description": "open parenthesis before local part is not valid", + "data": "(test@iana.org", + "valid": false + }, + { + "description": "backslash-parenthesis before local part is not valid", + "data": "(comment\\)test@iana.org", + "valid": false + }, + { + "description": "DEL character in local part is not valid", + "data": "\u007f@iana.org", + "valid": false + }, + { + "description": "CR before local part is not valid", + "data": "\rtest@iana.org", + "valid": false + }, + { + "description": "LF before local part is not valid", + "data": "\ntest@iana.org", + "valid": false + }, + { + "description": "BEL character as local part is not valid", + "data": "\u0007@iana.org", + "valid": false + }, + { + "description": "CRLF before local part is not valid", + "data": "\r\ntest@iana.org", + "valid": false + }, + { + "description": "SP then CRLF before local part is not valid", + "data": " \r\ntest@iana.org", + "valid": false + }, + { + "description": "basic quoted string local part is valid", + "data": "\"test\"@iana.org", + "valid": true + }, + { + "description": "empty quoted string local part is valid", + "data": "\"\"@iana.org", + "valid": true + }, + { + "description": "quoted pair with letter is valid", + "data": "\"\\a\"@iana.org", + "valid": true + }, + { + "description": "escaped double-quote in quoted string is valid", + "data": "\"\\\"\"@iana.org", + "valid": true + }, + { + "description": "escaped backslash in quoted string is valid", + "data": "\"\\\\\"@iana.org", + "valid": true + }, + { + "description": "space via quoted pair in quoted string is valid", + "data": "\"test\\ test\"@iana.org", + "valid": true + }, + { + "description": "@ inside quoted string local part is valid", + "data": "\"a@b\"@iana.org", + "valid": true + }, + { + "description": "quoted string containing only @ is valid", + "data": "\"@\"@iana.org", + "valid": true + }, + { + "description": "multiple @ signs inside quoted string is valid", + "data": "\"a@b@c\"@iana.org", + "valid": true + }, + { + "description": "three consecutive double-quotes is not valid", + "data": "\"\"\"@iana.org", + "valid": false + }, + { + "description": "backslash before closing double-quote eats the delimiter", + "data": "\"\\\"@iana.org", + "valid": false + }, + { + "description": "unclosed double-quote in local part is not valid", + "data": "\"test@iana.org", + "valid": false + }, + { + "description": "text after closing double-quote in local part is not valid", + "data": "\"test\"test@iana.org", + "valid": false + }, + { + "description": "two adjacent quoted strings in local part is not valid", + "data": "\"test\"\"test\"@iana.org", + "valid": false + }, + { + "description": "NUL inside quoted string is not valid", + "data": "\"test\u0000\"@iana.org", + "valid": false + }, + { + "description": "trailing backslash eats closing double-quote making it not valid", + "data": "\"test\\\"@iana.org", + "valid": false + }, + { + "description": "CR inside quoted string is not valid", + "data": "\"\rtest\"@iana.org", + "valid": false + }, + { + "description": "LF inside quoted string is not valid", + "data": "\"\n\"@iana.org", + "valid": false + }, + { + "description": "domain label starting with hyphen is not valid", + "data": "test@-iana.org", + "valid": false + }, + { + "description": "domain label ending with hyphen is not valid", + "data": "test@iana-.com", + "valid": false + }, + { + "description": "leading dot in domain is not valid", + "data": "test@.iana.org", + "valid": false + }, + { + "description": "trailing dot in domain is not valid", + "data": "test@iana.org.", + "valid": false + }, + { + "description": "consecutive dots in domain are not valid", + "data": "test@iana..com", + "valid": false + }, + { + "description": "letter immediately before bracket in domain is not valid", + "data": "test@a[255.255.255.255]", + "valid": false + }, + { + "description": "LF after domain is not valid", + "data": "test@iana.org\n", + "valid": false + }, + { + "description": "trailing hyphen in TLD is not valid", + "data": "test@iana.org-", + "valid": false + }, + { + "description": "open parenthesis in domain is not valid", + "data": "test@(iana.org", + "valid": false + }, + { + "description": "DEL character in domain label is not valid", + "data": "test@\u007f.org", + "valid": false + }, + { + "description": "CR after domain is not valid", + "data": "test@iana.org\r", + "valid": false + }, + { + "description": "BEL character in domain label is not valid", + "data": "test@\u0007.org", + "valid": false + }, + { + "description": "two-character bare TLD is valid", + "data": "test@io", + "valid": true + }, + { + "description": "three-character bare TLD is valid", + "data": "test@org", + "valid": true + }, + { + "description": "common test domain is valid", + "data": "test@test.com", + "valid": true + }, + { + "description": "two-letter TLD with two-letter subdomain is valid", + "data": "test@nic.no", + "valid": true + }, + { + "description": "IPv4 address literal with max-value octets is valid", + "data": "test@[255.255.255.255]", + "valid": true + }, + { + "description": "full 8-group IPv6 address literal is valid", + "data": "test@[IPv6:1111:2222:3333:4444:5555:6666:7777:8888]", + "valid": true + }, + { + "description": "compressed IPv6 address literal is valid", + "data": "test@[IPv6:1111:2222:3333:4444:5555::8888]", + "valid": true + }, + { + "description": "IPv6 address literal with leading :: compression is valid", + "data": "test@[IPv6:::3333:4444:5555:6666:7777:8888]", + "valid": true + }, + { + "description": "IPv6 all-zeros address literal is valid", + "data": "test@[IPv6:::]", + "valid": true + }, + { + "description": "IPv6 address literal with embedded IPv4 suffix is valid", + "data": "test@[IPv6:1111:2222:3333:4444:5555:6666:255.255.255.255]", + "valid": true + }, + { + "description": "compressed IPv6 address literal with embedded IPv4 is valid", + "data": "test@[IPv6:1111:2222:3333:4444::255.255.255.255]", + "valid": true + }, + { + "description": "IPv4 address literal with all-zero octets is valid", + "data": "test@[0.0.0.0]", + "valid": true + }, + { + "description": "non-IP content inside address literal brackets is not valid", + "data": "test@[RFC-5322]-domain-literal]", + "valid": false + }, + { + "description": "nested bracket in address literal is not valid", + "data": "test@[RFC-5322-[domain-literal]", + "valid": false + }, + { + "description": "backslash before closing bracket in address literal is not valid", + "data": "test@[RFC-5322-domain-literal\\]", + "valid": false + }, + { + "description": "unclosed address literal with backslash is not valid", + "data": "test@[RFC-5322-domain-literal\\", + "valid": false + }, + { + "description": "63-character local part and domain label boundary is valid", + "data": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.com", + "valid": true + }, + { + "description": "NUL character in local part is not valid", + "data": "a\u0000b@iana.org", + "valid": false + }, + { + "description": "tab character in local part is not valid", + "data": "a\tb@iana.org", + "valid": false + }, + { + "description": "tab character in domain is not valid", + "data": "a@b\tc.com", + "valid": false + }, + { + "description": "non-ASCII UTF-8 character in local part is not valid", + "data": "aé@iana.org", + "valid": false + }, + { + "description": "non-ASCII UTF-8 character in domain is not valid", + "data": "a@é.org", + "valid": false + }, + { + "description": "unquoted space in local part is not valid", + "data": "a b@iana.org", + "valid": false + }, + { + "description": "trailing space is not valid", + "data": "a@iana.org ", + "valid": false + }, + { + "description": "leading space is not valid", + "data": " a@iana.org", + "valid": false + }, + { + "description": "single character on each side of @ is valid", + "data": "a@b", + "valid": true + }, + { + "description": "underscore in local part is valid", + "data": "a_b@iana.org", + "valid": true + }, + { + "description": "comma in local part is not valid", + "data": "a,b@iana.org", + "valid": false + }, + { + "description": "semicolon in local part is not valid", + "data": "a;b@iana.org", + "valid": false + }, + { + "description": "colon in local part is not valid", + "data": "a:b@iana.org", + "valid": false + }, + { + "description": "parenthesis in domain is not valid", + "data": "a@b(c).org", + "valid": false + }, + { + "description": "brackets in local part position are not valid", + "data": "[1.2.3.4]@iana.org", + "valid": false + }, + { + "description": "IPv4 address literal 0.0.0.0 is valid", + "data": "a@[0.0.0.0]", + "valid": true + }, + { + "description": "IPv4 octet value over 255 is not valid", + "data": "a@[256.0.0.0]", + "valid": false + }, + { + "description": "IPv4 literal with only three octets is not valid", + "data": "a@[1.2.3]", + "valid": false + }, + { + "description": "IPv6 address without 'IPv6:' prefix is not valid", + "data": "a@[1111:2222:3333:4444:5555:6666:7777:8888]", + "valid": false + }, + { + "description": "lowercase 'ipv6:' prefix in address literal is valid", + "data": "a@[ipv6:::]", + "valid": true + }, + { + "description": "empty brackets in domain are not valid", + "data": "a@[]", + "valid": false + }, + { + "description": "space inside address literal brackets is not valid", + "data": "a@[ 1.2.3.4]", + "valid": false + }, + { + "description": "64-character local part with all same characters is valid", + "data": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@iana.org", + "valid": true + }, + { + "description": "two @ signs in unquoted local part is not valid", + "data": "a@b@c.org", + "valid": false + }, + { + "description": "dot inside quoted string local part is valid", + "data": "\"a.b\"@iana.org", + "valid": true + }, + { + "description": "leading dot inside quoted string is valid", + "data": "\".test\"@iana.org", + "valid": true + }, + { + "description": "space-only quoted string local part is valid", + "data": "\" \"@iana.org", + "valid": true + }, + { + "description": "general address literal with unregistered tag is not valid", + "data": "a@[extn:test]", + "valid": false + }, + { + "description": "long domain with multiple max-length labels is valid", + "data": "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghiklm@abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghikl.abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghikl.abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghi", + "valid": true + }, + { + "description": "comment-like parentheses after domain are not valid", + "data": "test@iana.org(comment\\)", + "valid": false + }, + { + "description": "open parenthesis with backslash after domain is not valid", + "data": "test@iana.org(comment\\", + "valid": false + }, + { + "description": "CR inside parentheses after domain is not valid", + "data": "test@iana.org(\r)", + "valid": false + }, + { + "description": "CR inside parentheses before address is not valid", + "data": "(\r)test@iana.org", + "valid": false + }, + { + "description": "LF inside parentheses before address is not valid", + "data": "(\n)test@iana.org", + "valid": false + }, + { + "description": "CRLF SP CRLF sequence before address is not valid", + "data": "\r\n \r\ntest@iana.org", + "valid": false + }, + { + "description": "SP CRLF SP CRLF sequence before address is not valid", + "data": " \r\n \r\ntest@iana.org", + "valid": false + }, + { + "description": "SP CRLF CRLF sequence before address is not valid", + "data": " \r\n\r\ntest@iana.org", + "valid": false + }, + { + "description": "SP CRLF CRLF SP sequence before address is not valid", + "data": " \r\n\r\n test@iana.org", + "valid": false + }, + { + "description": "CRLF after domain is not valid", + "data": "test@iana.org\r\n", + "valid": false + }, + { + "description": "CRLF SP CRLF after domain is not valid", + "data": "test@iana.org\r\n \r\n", + "valid": false + }, + { + "description": "SP CRLF after domain is not valid", + "data": "test@iana.org \r\n", + "valid": false + }, + { + "description": "SP CRLF SP CRLF after domain is not valid", + "data": "test@iana.org \r\n \r\n", + "valid": false + }, + { + "description": "SP CRLF CRLF after domain is not valid", + "data": "test@iana.org \r\n\r\n", + "valid": false + }, + { + "description": "SP CRLF CRLF SP after domain is not valid", + "data": "test@iana.org \r\n\r\n ", + "valid": false + }, + { + "description": "non-ASCII character in quoted pair is not valid", + "data": "\"test\\©\"@iana.org", + "valid": false + }, + { + "description": "fullwidth @ sign (U+FF20) is not a valid separator", + "data": "a@iana.org", + "valid": false + }, + { + "description": "US control character (U+001F) in local part is not valid", + "data": "a\u001fb@iana.org", + "valid": false + }, + { + "description": "SOH control character (U+0001) in local part is not valid", + "data": "a\u0001b@iana.org", + "valid": false + }, + { + "description": "dot as entire local part is not valid", + "data": ".@iana.org", + "valid": false + }, + { + "description": "two dots as entire local part is not valid", + "data": "..@iana.org", + "valid": false + }, + { + "description": "IPv4 literal with five octets is not valid", + "data": "a@[1.2.3.4.5]", + "valid": false + }, + { + "description": "dot-string then quoted-string as local part is not valid", + "data": "a.\"b\"@iana.org", + "valid": false + }, + { + "description": "quoted-string then dot-string as local part is not valid", + "data": "\"a\".b@iana.org", + "valid": false + }, + { + "description": "leading dot in local with leading hyphen in domain is not valid", + "data": ".@-iana.org", + "valid": false + }, + { + "description": "leading hyphen and consecutive dots in domain are not valid", + "data": "test@-iana..org", + "valid": false } ] } From 244119a84eec2ca5a023693ad703d54cd87cf96c Mon Sep 17 00:00:00 2001 From: Tushar Verma Date: Mon, 13 Apr 2026 23:37:23 +0530 Subject: [PATCH 03/10] test(email): add missing email format cases to draft6 --- tests/draft6/optional/format/email.json | 730 ++++++++++++++++++++++++ 1 file changed, 730 insertions(+) diff --git a/tests/draft6/optional/format/email.json b/tests/draft6/optional/format/email.json index 7e4c2f68..d0ec6a2a 100644 --- a/tests/draft6/optional/format/email.json +++ b/tests/draft6/optional/format/email.json @@ -102,6 +102,736 @@ "description": "unquoted space in local part is invalid", "data": "joe bloggs@example.com", "valid": false + }, + { + "description": "simple local part with standard domain is valid", + "data": "test@iana.org", + "valid": true + }, + { + "description": "subdomain with country-code TLD is valid", + "data": "test@nominet.org.uk", + "valid": true + }, + { + "description": "six-letter TLD is valid", + "data": "test@about.museum", + "valid": true + }, + { + "description": "single-character local part is valid", + "data": "a@iana.org", + "valid": true + }, + { + "description": "single-character subdomain is valid", + "data": "test@e.com", + "valid": true + }, + { + "description": "single-character TLD is valid", + "data": "test@iana.a", + "valid": true + }, + { + "description": "dotted local part is valid", + "data": "test.test@iana.org", + "valid": true + }, + { + "description": "atext special characters in local part are valid", + "data": "!#$%&'*+/=?^_{|}~@iana.org", + "valid": true + }, + { + "description": "all-digit local part is valid", + "data": "123@iana.org", + "valid": true + }, + { + "description": "digit at start of subdomain is valid", + "data": "test@123.com", + "valid": true + }, + { + "description": "all-digit TLD is valid", + "data": "test@iana.123", + "valid": true + }, + { + "description": "domain that looks like an IPv4 address without brackets is valid", + "data": "test@255.255.255.255", + "valid": true + }, + { + "description": "64-character local part is valid", + "data": "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghiklm@iana.org", + "valid": true + }, + { + "description": "63-character domain label is valid", + "data": "test@abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghikl.com", + "valid": true + }, + { + "description": "hyphen in subdomain is valid", + "data": "test@mason-dixon.com", + "valid": true + }, + { + "description": "consecutive hyphens in subdomain are valid", + "data": "test@c--n.com", + "valid": true + }, + { + "description": "hyphen in TLD is valid", + "data": "test@iana.co-uk", + "valid": true + }, + { + "description": "domain with many labels is valid", + "data": "a@a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.q.r.s.t.u.v.w.x.y.z.a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.q.r.s.t.u.v.w.x.y.z.a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.q.r.s.t.u.v.w.x.y.z.a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.q.r.s.t.u.v", + "valid": true + }, + { + "description": "punycode-encoded domain is valid", + "data": "test@xn--hxajbheg2az3al.xn--jxalpdlp", + "valid": true + }, + { + "description": "punycode-like prefix in local part is valid", + "data": "xn--test@iana.org", + "valid": true + }, + { + "description": "empty string is not valid", + "data": "", + "valid": false + }, + { + "description": "no @ sign is not valid", + "data": "test", + "valid": false + }, + { + "description": "dotted string without @ is not valid", + "data": "test..iana.org", + "valid": false + }, + { + "description": "domain-like string without @ is not valid", + "data": "test_exa-mple.com", + "valid": false + }, + { + "description": "missing domain is not valid", + "data": "test@", + "valid": false + }, + { + "description": "unclosed bracket in domain is not valid", + "data": "test@[1.2.3.4", + "valid": false + }, + { + "description": "bare @ sign is not valid", + "data": "@", + "valid": false + }, + { + "description": "@ with TLD but no local part is not valid", + "data": "@io", + "valid": false + }, + { + "description": "@ with domain but no local part is not valid", + "data": "@iana.org", + "valid": false + }, + { + "description": "leading dot in local part is not valid", + "data": ".test@iana.org", + "valid": false + }, + { + "description": "trailing dot in local part is not valid", + "data": "test.@iana.org", + "valid": false + }, + { + "description": "backslash in unquoted local part is not valid", + "data": "test\\@test@iana.org", + "valid": false + }, + { + "description": "double-quote in unquoted local part is not valid", + "data": "test\"@iana.org", + "valid": false + }, + { + "description": "text followed by quoted string in local part is not valid", + "data": "test\"text\"@iana.org", + "valid": false + }, + { + "description": "parentheses before local part are not valid", + "data": "((comment)test@iana.org", + "valid": false + }, + { + "description": "parentheses in middle of local part are not valid", + "data": "test(comment)test@iana.org", + "valid": false + }, + { + "description": "open parenthesis before local part is not valid", + "data": "(test@iana.org", + "valid": false + }, + { + "description": "backslash-parenthesis before local part is not valid", + "data": "(comment\\)test@iana.org", + "valid": false + }, + { + "description": "DEL character in local part is not valid", + "data": "\u007f@iana.org", + "valid": false + }, + { + "description": "CR before local part is not valid", + "data": "\rtest@iana.org", + "valid": false + }, + { + "description": "LF before local part is not valid", + "data": "\ntest@iana.org", + "valid": false + }, + { + "description": "BEL character as local part is not valid", + "data": "\u0007@iana.org", + "valid": false + }, + { + "description": "CRLF before local part is not valid", + "data": "\r\ntest@iana.org", + "valid": false + }, + { + "description": "SP then CRLF before local part is not valid", + "data": " \r\ntest@iana.org", + "valid": false + }, + { + "description": "basic quoted string local part is valid", + "data": "\"test\"@iana.org", + "valid": true + }, + { + "description": "empty quoted string local part is valid", + "data": "\"\"@iana.org", + "valid": true + }, + { + "description": "quoted pair with letter is valid", + "data": "\"\\a\"@iana.org", + "valid": true + }, + { + "description": "escaped double-quote in quoted string is valid", + "data": "\"\\\"\"@iana.org", + "valid": true + }, + { + "description": "escaped backslash in quoted string is valid", + "data": "\"\\\\\"@iana.org", + "valid": true + }, + { + "description": "space via quoted pair in quoted string is valid", + "data": "\"test\\ test\"@iana.org", + "valid": true + }, + { + "description": "@ inside quoted string local part is valid", + "data": "\"a@b\"@iana.org", + "valid": true + }, + { + "description": "quoted string containing only @ is valid", + "data": "\"@\"@iana.org", + "valid": true + }, + { + "description": "multiple @ signs inside quoted string is valid", + "data": "\"a@b@c\"@iana.org", + "valid": true + }, + { + "description": "three consecutive double-quotes is not valid", + "data": "\"\"\"@iana.org", + "valid": false + }, + { + "description": "backslash before closing double-quote eats the delimiter", + "data": "\"\\\"@iana.org", + "valid": false + }, + { + "description": "unclosed double-quote in local part is not valid", + "data": "\"test@iana.org", + "valid": false + }, + { + "description": "text after closing double-quote in local part is not valid", + "data": "\"test\"test@iana.org", + "valid": false + }, + { + "description": "two adjacent quoted strings in local part is not valid", + "data": "\"test\"\"test\"@iana.org", + "valid": false + }, + { + "description": "NUL inside quoted string is not valid", + "data": "\"test\u0000\"@iana.org", + "valid": false + }, + { + "description": "trailing backslash eats closing double-quote making it not valid", + "data": "\"test\\\"@iana.org", + "valid": false + }, + { + "description": "CR inside quoted string is not valid", + "data": "\"\rtest\"@iana.org", + "valid": false + }, + { + "description": "LF inside quoted string is not valid", + "data": "\"\n\"@iana.org", + "valid": false + }, + { + "description": "domain label starting with hyphen is not valid", + "data": "test@-iana.org", + "valid": false + }, + { + "description": "domain label ending with hyphen is not valid", + "data": "test@iana-.com", + "valid": false + }, + { + "description": "leading dot in domain is not valid", + "data": "test@.iana.org", + "valid": false + }, + { + "description": "trailing dot in domain is not valid", + "data": "test@iana.org.", + "valid": false + }, + { + "description": "consecutive dots in domain are not valid", + "data": "test@iana..com", + "valid": false + }, + { + "description": "letter immediately before bracket in domain is not valid", + "data": "test@a[255.255.255.255]", + "valid": false + }, + { + "description": "LF after domain is not valid", + "data": "test@iana.org\n", + "valid": false + }, + { + "description": "trailing hyphen in TLD is not valid", + "data": "test@iana.org-", + "valid": false + }, + { + "description": "open parenthesis in domain is not valid", + "data": "test@(iana.org", + "valid": false + }, + { + "description": "DEL character in domain label is not valid", + "data": "test@\u007f.org", + "valid": false + }, + { + "description": "CR after domain is not valid", + "data": "test@iana.org\r", + "valid": false + }, + { + "description": "BEL character in domain label is not valid", + "data": "test@\u0007.org", + "valid": false + }, + { + "description": "two-character bare TLD is valid", + "data": "test@io", + "valid": true + }, + { + "description": "three-character bare TLD is valid", + "data": "test@org", + "valid": true + }, + { + "description": "common test domain is valid", + "data": "test@test.com", + "valid": true + }, + { + "description": "two-letter TLD with two-letter subdomain is valid", + "data": "test@nic.no", + "valid": true + }, + { + "description": "IPv4 address literal with max-value octets is valid", + "data": "test@[255.255.255.255]", + "valid": true + }, + { + "description": "full 8-group IPv6 address literal is valid", + "data": "test@[IPv6:1111:2222:3333:4444:5555:6666:7777:8888]", + "valid": true + }, + { + "description": "compressed IPv6 address literal is valid", + "data": "test@[IPv6:1111:2222:3333:4444:5555::8888]", + "valid": true + }, + { + "description": "IPv6 address literal with leading :: compression is valid", + "data": "test@[IPv6:::3333:4444:5555:6666:7777:8888]", + "valid": true + }, + { + "description": "IPv6 all-zeros address literal is valid", + "data": "test@[IPv6:::]", + "valid": true + }, + { + "description": "IPv6 address literal with embedded IPv4 suffix is valid", + "data": "test@[IPv6:1111:2222:3333:4444:5555:6666:255.255.255.255]", + "valid": true + }, + { + "description": "compressed IPv6 address literal with embedded IPv4 is valid", + "data": "test@[IPv6:1111:2222:3333:4444::255.255.255.255]", + "valid": true + }, + { + "description": "IPv4 address literal with all-zero octets is valid", + "data": "test@[0.0.0.0]", + "valid": true + }, + { + "description": "non-IP content inside address literal brackets is not valid", + "data": "test@[RFC-5322]-domain-literal]", + "valid": false + }, + { + "description": "nested bracket in address literal is not valid", + "data": "test@[RFC-5322-[domain-literal]", + "valid": false + }, + { + "description": "backslash before closing bracket in address literal is not valid", + "data": "test@[RFC-5322-domain-literal\\]", + "valid": false + }, + { + "description": "unclosed address literal with backslash is not valid", + "data": "test@[RFC-5322-domain-literal\\", + "valid": false + }, + { + "description": "63-character local part and domain label boundary is valid", + "data": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.com", + "valid": true + }, + { + "description": "NUL character in local part is not valid", + "data": "a\u0000b@iana.org", + "valid": false + }, + { + "description": "tab character in local part is not valid", + "data": "a\tb@iana.org", + "valid": false + }, + { + "description": "tab character in domain is not valid", + "data": "a@b\tc.com", + "valid": false + }, + { + "description": "non-ASCII UTF-8 character in local part is not valid", + "data": "aé@iana.org", + "valid": false + }, + { + "description": "non-ASCII UTF-8 character in domain is not valid", + "data": "a@é.org", + "valid": false + }, + { + "description": "unquoted space in local part is not valid", + "data": "a b@iana.org", + "valid": false + }, + { + "description": "trailing space is not valid", + "data": "a@iana.org ", + "valid": false + }, + { + "description": "leading space is not valid", + "data": " a@iana.org", + "valid": false + }, + { + "description": "single character on each side of @ is valid", + "data": "a@b", + "valid": true + }, + { + "description": "underscore in local part is valid", + "data": "a_b@iana.org", + "valid": true + }, + { + "description": "comma in local part is not valid", + "data": "a,b@iana.org", + "valid": false + }, + { + "description": "semicolon in local part is not valid", + "data": "a;b@iana.org", + "valid": false + }, + { + "description": "colon in local part is not valid", + "data": "a:b@iana.org", + "valid": false + }, + { + "description": "parenthesis in domain is not valid", + "data": "a@b(c).org", + "valid": false + }, + { + "description": "brackets in local part position are not valid", + "data": "[1.2.3.4]@iana.org", + "valid": false + }, + { + "description": "IPv4 address literal 0.0.0.0 is valid", + "data": "a@[0.0.0.0]", + "valid": true + }, + { + "description": "IPv4 octet value over 255 is not valid", + "data": "a@[256.0.0.0]", + "valid": false + }, + { + "description": "IPv4 literal with only three octets is not valid", + "data": "a@[1.2.3]", + "valid": false + }, + { + "description": "IPv6 address without 'IPv6:' prefix is not valid", + "data": "a@[1111:2222:3333:4444:5555:6666:7777:8888]", + "valid": false + }, + { + "description": "lowercase 'ipv6:' prefix in address literal is valid", + "data": "a@[ipv6:::]", + "valid": true + }, + { + "description": "empty brackets in domain are not valid", + "data": "a@[]", + "valid": false + }, + { + "description": "space inside address literal brackets is not valid", + "data": "a@[ 1.2.3.4]", + "valid": false + }, + { + "description": "64-character local part with all same characters is valid", + "data": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@iana.org", + "valid": true + }, + { + "description": "two @ signs in unquoted local part is not valid", + "data": "a@b@c.org", + "valid": false + }, + { + "description": "dot inside quoted string local part is valid", + "data": "\"a.b\"@iana.org", + "valid": true + }, + { + "description": "leading dot inside quoted string is valid", + "data": "\".test\"@iana.org", + "valid": true + }, + { + "description": "space-only quoted string local part is valid", + "data": "\" \"@iana.org", + "valid": true + }, + { + "description": "general address literal with unregistered tag is not valid", + "data": "a@[extn:test]", + "valid": false + }, + { + "description": "long domain with multiple max-length labels is valid", + "data": "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghiklm@abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghikl.abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghikl.abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghi", + "valid": true + }, + { + "description": "comment-like parentheses after domain are not valid", + "data": "test@iana.org(comment\\)", + "valid": false + }, + { + "description": "open parenthesis with backslash after domain is not valid", + "data": "test@iana.org(comment\\", + "valid": false + }, + { + "description": "CR inside parentheses after domain is not valid", + "data": "test@iana.org(\r)", + "valid": false + }, + { + "description": "CR inside parentheses before address is not valid", + "data": "(\r)test@iana.org", + "valid": false + }, + { + "description": "LF inside parentheses before address is not valid", + "data": "(\n)test@iana.org", + "valid": false + }, + { + "description": "CRLF SP CRLF sequence before address is not valid", + "data": "\r\n \r\ntest@iana.org", + "valid": false + }, + { + "description": "SP CRLF SP CRLF sequence before address is not valid", + "data": " \r\n \r\ntest@iana.org", + "valid": false + }, + { + "description": "SP CRLF CRLF sequence before address is not valid", + "data": " \r\n\r\ntest@iana.org", + "valid": false + }, + { + "description": "SP CRLF CRLF SP sequence before address is not valid", + "data": " \r\n\r\n test@iana.org", + "valid": false + }, + { + "description": "CRLF after domain is not valid", + "data": "test@iana.org\r\n", + "valid": false + }, + { + "description": "CRLF SP CRLF after domain is not valid", + "data": "test@iana.org\r\n \r\n", + "valid": false + }, + { + "description": "SP CRLF after domain is not valid", + "data": "test@iana.org \r\n", + "valid": false + }, + { + "description": "SP CRLF SP CRLF after domain is not valid", + "data": "test@iana.org \r\n \r\n", + "valid": false + }, + { + "description": "SP CRLF CRLF after domain is not valid", + "data": "test@iana.org \r\n\r\n", + "valid": false + }, + { + "description": "SP CRLF CRLF SP after domain is not valid", + "data": "test@iana.org \r\n\r\n ", + "valid": false + }, + { + "description": "non-ASCII character in quoted pair is not valid", + "data": "\"test\\©\"@iana.org", + "valid": false + }, + { + "description": "fullwidth @ sign (U+FF20) is not a valid separator", + "data": "a@iana.org", + "valid": false + }, + { + "description": "US control character (U+001F) in local part is not valid", + "data": "a\u001fb@iana.org", + "valid": false + }, + { + "description": "SOH control character (U+0001) in local part is not valid", + "data": "a\u0001b@iana.org", + "valid": false + }, + { + "description": "dot as entire local part is not valid", + "data": ".@iana.org", + "valid": false + }, + { + "description": "two dots as entire local part is not valid", + "data": "..@iana.org", + "valid": false + }, + { + "description": "IPv4 literal with five octets is not valid", + "data": "a@[1.2.3.4.5]", + "valid": false + }, + { + "description": "dot-string then quoted-string as local part is not valid", + "data": "a.\"b\"@iana.org", + "valid": false + }, + { + "description": "quoted-string then dot-string as local part is not valid", + "data": "\"a\".b@iana.org", + "valid": false + }, + { + "description": "leading dot in local with leading hyphen in domain is not valid", + "data": ".@-iana.org", + "valid": false + }, + { + "description": "leading hyphen and consecutive dots in domain are not valid", + "data": "test@-iana..org", + "valid": false } ] } From 11720dec1b1ba4015dbc5884900f21bad88e810e Mon Sep 17 00:00:00 2001 From: Tushar Verma Date: Mon, 13 Apr 2026 23:37:26 +0530 Subject: [PATCH 04/10] test(email): expand draft7 email format coverage --- tests/draft7/optional/format/email.json | 730 ++++++++++++++++++++++++ 1 file changed, 730 insertions(+) diff --git a/tests/draft7/optional/format/email.json b/tests/draft7/optional/format/email.json index 7e4c2f68..d0ec6a2a 100644 --- a/tests/draft7/optional/format/email.json +++ b/tests/draft7/optional/format/email.json @@ -102,6 +102,736 @@ "description": "unquoted space in local part is invalid", "data": "joe bloggs@example.com", "valid": false + }, + { + "description": "simple local part with standard domain is valid", + "data": "test@iana.org", + "valid": true + }, + { + "description": "subdomain with country-code TLD is valid", + "data": "test@nominet.org.uk", + "valid": true + }, + { + "description": "six-letter TLD is valid", + "data": "test@about.museum", + "valid": true + }, + { + "description": "single-character local part is valid", + "data": "a@iana.org", + "valid": true + }, + { + "description": "single-character subdomain is valid", + "data": "test@e.com", + "valid": true + }, + { + "description": "single-character TLD is valid", + "data": "test@iana.a", + "valid": true + }, + { + "description": "dotted local part is valid", + "data": "test.test@iana.org", + "valid": true + }, + { + "description": "atext special characters in local part are valid", + "data": "!#$%&'*+/=?^_{|}~@iana.org", + "valid": true + }, + { + "description": "all-digit local part is valid", + "data": "123@iana.org", + "valid": true + }, + { + "description": "digit at start of subdomain is valid", + "data": "test@123.com", + "valid": true + }, + { + "description": "all-digit TLD is valid", + "data": "test@iana.123", + "valid": true + }, + { + "description": "domain that looks like an IPv4 address without brackets is valid", + "data": "test@255.255.255.255", + "valid": true + }, + { + "description": "64-character local part is valid", + "data": "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghiklm@iana.org", + "valid": true + }, + { + "description": "63-character domain label is valid", + "data": "test@abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghikl.com", + "valid": true + }, + { + "description": "hyphen in subdomain is valid", + "data": "test@mason-dixon.com", + "valid": true + }, + { + "description": "consecutive hyphens in subdomain are valid", + "data": "test@c--n.com", + "valid": true + }, + { + "description": "hyphen in TLD is valid", + "data": "test@iana.co-uk", + "valid": true + }, + { + "description": "domain with many labels is valid", + "data": "a@a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.q.r.s.t.u.v.w.x.y.z.a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.q.r.s.t.u.v.w.x.y.z.a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.q.r.s.t.u.v.w.x.y.z.a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.q.r.s.t.u.v", + "valid": true + }, + { + "description": "punycode-encoded domain is valid", + "data": "test@xn--hxajbheg2az3al.xn--jxalpdlp", + "valid": true + }, + { + "description": "punycode-like prefix in local part is valid", + "data": "xn--test@iana.org", + "valid": true + }, + { + "description": "empty string is not valid", + "data": "", + "valid": false + }, + { + "description": "no @ sign is not valid", + "data": "test", + "valid": false + }, + { + "description": "dotted string without @ is not valid", + "data": "test..iana.org", + "valid": false + }, + { + "description": "domain-like string without @ is not valid", + "data": "test_exa-mple.com", + "valid": false + }, + { + "description": "missing domain is not valid", + "data": "test@", + "valid": false + }, + { + "description": "unclosed bracket in domain is not valid", + "data": "test@[1.2.3.4", + "valid": false + }, + { + "description": "bare @ sign is not valid", + "data": "@", + "valid": false + }, + { + "description": "@ with TLD but no local part is not valid", + "data": "@io", + "valid": false + }, + { + "description": "@ with domain but no local part is not valid", + "data": "@iana.org", + "valid": false + }, + { + "description": "leading dot in local part is not valid", + "data": ".test@iana.org", + "valid": false + }, + { + "description": "trailing dot in local part is not valid", + "data": "test.@iana.org", + "valid": false + }, + { + "description": "backslash in unquoted local part is not valid", + "data": "test\\@test@iana.org", + "valid": false + }, + { + "description": "double-quote in unquoted local part is not valid", + "data": "test\"@iana.org", + "valid": false + }, + { + "description": "text followed by quoted string in local part is not valid", + "data": "test\"text\"@iana.org", + "valid": false + }, + { + "description": "parentheses before local part are not valid", + "data": "((comment)test@iana.org", + "valid": false + }, + { + "description": "parentheses in middle of local part are not valid", + "data": "test(comment)test@iana.org", + "valid": false + }, + { + "description": "open parenthesis before local part is not valid", + "data": "(test@iana.org", + "valid": false + }, + { + "description": "backslash-parenthesis before local part is not valid", + "data": "(comment\\)test@iana.org", + "valid": false + }, + { + "description": "DEL character in local part is not valid", + "data": "\u007f@iana.org", + "valid": false + }, + { + "description": "CR before local part is not valid", + "data": "\rtest@iana.org", + "valid": false + }, + { + "description": "LF before local part is not valid", + "data": "\ntest@iana.org", + "valid": false + }, + { + "description": "BEL character as local part is not valid", + "data": "\u0007@iana.org", + "valid": false + }, + { + "description": "CRLF before local part is not valid", + "data": "\r\ntest@iana.org", + "valid": false + }, + { + "description": "SP then CRLF before local part is not valid", + "data": " \r\ntest@iana.org", + "valid": false + }, + { + "description": "basic quoted string local part is valid", + "data": "\"test\"@iana.org", + "valid": true + }, + { + "description": "empty quoted string local part is valid", + "data": "\"\"@iana.org", + "valid": true + }, + { + "description": "quoted pair with letter is valid", + "data": "\"\\a\"@iana.org", + "valid": true + }, + { + "description": "escaped double-quote in quoted string is valid", + "data": "\"\\\"\"@iana.org", + "valid": true + }, + { + "description": "escaped backslash in quoted string is valid", + "data": "\"\\\\\"@iana.org", + "valid": true + }, + { + "description": "space via quoted pair in quoted string is valid", + "data": "\"test\\ test\"@iana.org", + "valid": true + }, + { + "description": "@ inside quoted string local part is valid", + "data": "\"a@b\"@iana.org", + "valid": true + }, + { + "description": "quoted string containing only @ is valid", + "data": "\"@\"@iana.org", + "valid": true + }, + { + "description": "multiple @ signs inside quoted string is valid", + "data": "\"a@b@c\"@iana.org", + "valid": true + }, + { + "description": "three consecutive double-quotes is not valid", + "data": "\"\"\"@iana.org", + "valid": false + }, + { + "description": "backslash before closing double-quote eats the delimiter", + "data": "\"\\\"@iana.org", + "valid": false + }, + { + "description": "unclosed double-quote in local part is not valid", + "data": "\"test@iana.org", + "valid": false + }, + { + "description": "text after closing double-quote in local part is not valid", + "data": "\"test\"test@iana.org", + "valid": false + }, + { + "description": "two adjacent quoted strings in local part is not valid", + "data": "\"test\"\"test\"@iana.org", + "valid": false + }, + { + "description": "NUL inside quoted string is not valid", + "data": "\"test\u0000\"@iana.org", + "valid": false + }, + { + "description": "trailing backslash eats closing double-quote making it not valid", + "data": "\"test\\\"@iana.org", + "valid": false + }, + { + "description": "CR inside quoted string is not valid", + "data": "\"\rtest\"@iana.org", + "valid": false + }, + { + "description": "LF inside quoted string is not valid", + "data": "\"\n\"@iana.org", + "valid": false + }, + { + "description": "domain label starting with hyphen is not valid", + "data": "test@-iana.org", + "valid": false + }, + { + "description": "domain label ending with hyphen is not valid", + "data": "test@iana-.com", + "valid": false + }, + { + "description": "leading dot in domain is not valid", + "data": "test@.iana.org", + "valid": false + }, + { + "description": "trailing dot in domain is not valid", + "data": "test@iana.org.", + "valid": false + }, + { + "description": "consecutive dots in domain are not valid", + "data": "test@iana..com", + "valid": false + }, + { + "description": "letter immediately before bracket in domain is not valid", + "data": "test@a[255.255.255.255]", + "valid": false + }, + { + "description": "LF after domain is not valid", + "data": "test@iana.org\n", + "valid": false + }, + { + "description": "trailing hyphen in TLD is not valid", + "data": "test@iana.org-", + "valid": false + }, + { + "description": "open parenthesis in domain is not valid", + "data": "test@(iana.org", + "valid": false + }, + { + "description": "DEL character in domain label is not valid", + "data": "test@\u007f.org", + "valid": false + }, + { + "description": "CR after domain is not valid", + "data": "test@iana.org\r", + "valid": false + }, + { + "description": "BEL character in domain label is not valid", + "data": "test@\u0007.org", + "valid": false + }, + { + "description": "two-character bare TLD is valid", + "data": "test@io", + "valid": true + }, + { + "description": "three-character bare TLD is valid", + "data": "test@org", + "valid": true + }, + { + "description": "common test domain is valid", + "data": "test@test.com", + "valid": true + }, + { + "description": "two-letter TLD with two-letter subdomain is valid", + "data": "test@nic.no", + "valid": true + }, + { + "description": "IPv4 address literal with max-value octets is valid", + "data": "test@[255.255.255.255]", + "valid": true + }, + { + "description": "full 8-group IPv6 address literal is valid", + "data": "test@[IPv6:1111:2222:3333:4444:5555:6666:7777:8888]", + "valid": true + }, + { + "description": "compressed IPv6 address literal is valid", + "data": "test@[IPv6:1111:2222:3333:4444:5555::8888]", + "valid": true + }, + { + "description": "IPv6 address literal with leading :: compression is valid", + "data": "test@[IPv6:::3333:4444:5555:6666:7777:8888]", + "valid": true + }, + { + "description": "IPv6 all-zeros address literal is valid", + "data": "test@[IPv6:::]", + "valid": true + }, + { + "description": "IPv6 address literal with embedded IPv4 suffix is valid", + "data": "test@[IPv6:1111:2222:3333:4444:5555:6666:255.255.255.255]", + "valid": true + }, + { + "description": "compressed IPv6 address literal with embedded IPv4 is valid", + "data": "test@[IPv6:1111:2222:3333:4444::255.255.255.255]", + "valid": true + }, + { + "description": "IPv4 address literal with all-zero octets is valid", + "data": "test@[0.0.0.0]", + "valid": true + }, + { + "description": "non-IP content inside address literal brackets is not valid", + "data": "test@[RFC-5322]-domain-literal]", + "valid": false + }, + { + "description": "nested bracket in address literal is not valid", + "data": "test@[RFC-5322-[domain-literal]", + "valid": false + }, + { + "description": "backslash before closing bracket in address literal is not valid", + "data": "test@[RFC-5322-domain-literal\\]", + "valid": false + }, + { + "description": "unclosed address literal with backslash is not valid", + "data": "test@[RFC-5322-domain-literal\\", + "valid": false + }, + { + "description": "63-character local part and domain label boundary is valid", + "data": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.com", + "valid": true + }, + { + "description": "NUL character in local part is not valid", + "data": "a\u0000b@iana.org", + "valid": false + }, + { + "description": "tab character in local part is not valid", + "data": "a\tb@iana.org", + "valid": false + }, + { + "description": "tab character in domain is not valid", + "data": "a@b\tc.com", + "valid": false + }, + { + "description": "non-ASCII UTF-8 character in local part is not valid", + "data": "aé@iana.org", + "valid": false + }, + { + "description": "non-ASCII UTF-8 character in domain is not valid", + "data": "a@é.org", + "valid": false + }, + { + "description": "unquoted space in local part is not valid", + "data": "a b@iana.org", + "valid": false + }, + { + "description": "trailing space is not valid", + "data": "a@iana.org ", + "valid": false + }, + { + "description": "leading space is not valid", + "data": " a@iana.org", + "valid": false + }, + { + "description": "single character on each side of @ is valid", + "data": "a@b", + "valid": true + }, + { + "description": "underscore in local part is valid", + "data": "a_b@iana.org", + "valid": true + }, + { + "description": "comma in local part is not valid", + "data": "a,b@iana.org", + "valid": false + }, + { + "description": "semicolon in local part is not valid", + "data": "a;b@iana.org", + "valid": false + }, + { + "description": "colon in local part is not valid", + "data": "a:b@iana.org", + "valid": false + }, + { + "description": "parenthesis in domain is not valid", + "data": "a@b(c).org", + "valid": false + }, + { + "description": "brackets in local part position are not valid", + "data": "[1.2.3.4]@iana.org", + "valid": false + }, + { + "description": "IPv4 address literal 0.0.0.0 is valid", + "data": "a@[0.0.0.0]", + "valid": true + }, + { + "description": "IPv4 octet value over 255 is not valid", + "data": "a@[256.0.0.0]", + "valid": false + }, + { + "description": "IPv4 literal with only three octets is not valid", + "data": "a@[1.2.3]", + "valid": false + }, + { + "description": "IPv6 address without 'IPv6:' prefix is not valid", + "data": "a@[1111:2222:3333:4444:5555:6666:7777:8888]", + "valid": false + }, + { + "description": "lowercase 'ipv6:' prefix in address literal is valid", + "data": "a@[ipv6:::]", + "valid": true + }, + { + "description": "empty brackets in domain are not valid", + "data": "a@[]", + "valid": false + }, + { + "description": "space inside address literal brackets is not valid", + "data": "a@[ 1.2.3.4]", + "valid": false + }, + { + "description": "64-character local part with all same characters is valid", + "data": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@iana.org", + "valid": true + }, + { + "description": "two @ signs in unquoted local part is not valid", + "data": "a@b@c.org", + "valid": false + }, + { + "description": "dot inside quoted string local part is valid", + "data": "\"a.b\"@iana.org", + "valid": true + }, + { + "description": "leading dot inside quoted string is valid", + "data": "\".test\"@iana.org", + "valid": true + }, + { + "description": "space-only quoted string local part is valid", + "data": "\" \"@iana.org", + "valid": true + }, + { + "description": "general address literal with unregistered tag is not valid", + "data": "a@[extn:test]", + "valid": false + }, + { + "description": "long domain with multiple max-length labels is valid", + "data": "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghiklm@abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghikl.abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghikl.abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghi", + "valid": true + }, + { + "description": "comment-like parentheses after domain are not valid", + "data": "test@iana.org(comment\\)", + "valid": false + }, + { + "description": "open parenthesis with backslash after domain is not valid", + "data": "test@iana.org(comment\\", + "valid": false + }, + { + "description": "CR inside parentheses after domain is not valid", + "data": "test@iana.org(\r)", + "valid": false + }, + { + "description": "CR inside parentheses before address is not valid", + "data": "(\r)test@iana.org", + "valid": false + }, + { + "description": "LF inside parentheses before address is not valid", + "data": "(\n)test@iana.org", + "valid": false + }, + { + "description": "CRLF SP CRLF sequence before address is not valid", + "data": "\r\n \r\ntest@iana.org", + "valid": false + }, + { + "description": "SP CRLF SP CRLF sequence before address is not valid", + "data": " \r\n \r\ntest@iana.org", + "valid": false + }, + { + "description": "SP CRLF CRLF sequence before address is not valid", + "data": " \r\n\r\ntest@iana.org", + "valid": false + }, + { + "description": "SP CRLF CRLF SP sequence before address is not valid", + "data": " \r\n\r\n test@iana.org", + "valid": false + }, + { + "description": "CRLF after domain is not valid", + "data": "test@iana.org\r\n", + "valid": false + }, + { + "description": "CRLF SP CRLF after domain is not valid", + "data": "test@iana.org\r\n \r\n", + "valid": false + }, + { + "description": "SP CRLF after domain is not valid", + "data": "test@iana.org \r\n", + "valid": false + }, + { + "description": "SP CRLF SP CRLF after domain is not valid", + "data": "test@iana.org \r\n \r\n", + "valid": false + }, + { + "description": "SP CRLF CRLF after domain is not valid", + "data": "test@iana.org \r\n\r\n", + "valid": false + }, + { + "description": "SP CRLF CRLF SP after domain is not valid", + "data": "test@iana.org \r\n\r\n ", + "valid": false + }, + { + "description": "non-ASCII character in quoted pair is not valid", + "data": "\"test\\©\"@iana.org", + "valid": false + }, + { + "description": "fullwidth @ sign (U+FF20) is not a valid separator", + "data": "a@iana.org", + "valid": false + }, + { + "description": "US control character (U+001F) in local part is not valid", + "data": "a\u001fb@iana.org", + "valid": false + }, + { + "description": "SOH control character (U+0001) in local part is not valid", + "data": "a\u0001b@iana.org", + "valid": false + }, + { + "description": "dot as entire local part is not valid", + "data": ".@iana.org", + "valid": false + }, + { + "description": "two dots as entire local part is not valid", + "data": "..@iana.org", + "valid": false + }, + { + "description": "IPv4 literal with five octets is not valid", + "data": "a@[1.2.3.4.5]", + "valid": false + }, + { + "description": "dot-string then quoted-string as local part is not valid", + "data": "a.\"b\"@iana.org", + "valid": false + }, + { + "description": "quoted-string then dot-string as local part is not valid", + "data": "\"a\".b@iana.org", + "valid": false + }, + { + "description": "leading dot in local with leading hyphen in domain is not valid", + "data": ".@-iana.org", + "valid": false + }, + { + "description": "leading hyphen and consecutive dots in domain are not valid", + "data": "test@-iana..org", + "valid": false } ] } From 37fd92d5c3803ed428bb5ecf9eff2b08a879cc04 Mon Sep 17 00:00:00 2001 From: Tushar Verma Date: Mon, 13 Apr 2026 23:37:29 +0530 Subject: [PATCH 05/10] test(email): add comprehensive email tests to draft2019-09 --- tests/draft2019-09/optional/format/email.json | 730 ++++++++++++++++++ 1 file changed, 730 insertions(+) diff --git a/tests/draft2019-09/optional/format/email.json b/tests/draft2019-09/optional/format/email.json index eac0575d..9414eac4 100644 --- a/tests/draft2019-09/optional/format/email.json +++ b/tests/draft2019-09/optional/format/email.json @@ -105,6 +105,736 @@ "description": "unquoted space in local part is invalid", "data": "joe bloggs@example.com", "valid": false + }, + { + "description": "simple local part with standard domain is valid", + "data": "test@iana.org", + "valid": true + }, + { + "description": "subdomain with country-code TLD is valid", + "data": "test@nominet.org.uk", + "valid": true + }, + { + "description": "six-letter TLD is valid", + "data": "test@about.museum", + "valid": true + }, + { + "description": "single-character local part is valid", + "data": "a@iana.org", + "valid": true + }, + { + "description": "single-character subdomain is valid", + "data": "test@e.com", + "valid": true + }, + { + "description": "single-character TLD is valid", + "data": "test@iana.a", + "valid": true + }, + { + "description": "dotted local part is valid", + "data": "test.test@iana.org", + "valid": true + }, + { + "description": "atext special characters in local part are valid", + "data": "!#$%&'*+/=?^_{|}~@iana.org", + "valid": true + }, + { + "description": "all-digit local part is valid", + "data": "123@iana.org", + "valid": true + }, + { + "description": "digit at start of subdomain is valid", + "data": "test@123.com", + "valid": true + }, + { + "description": "all-digit TLD is valid", + "data": "test@iana.123", + "valid": true + }, + { + "description": "domain that looks like an IPv4 address without brackets is valid", + "data": "test@255.255.255.255", + "valid": true + }, + { + "description": "64-character local part is valid", + "data": "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghiklm@iana.org", + "valid": true + }, + { + "description": "63-character domain label is valid", + "data": "test@abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghikl.com", + "valid": true + }, + { + "description": "hyphen in subdomain is valid", + "data": "test@mason-dixon.com", + "valid": true + }, + { + "description": "consecutive hyphens in subdomain are valid", + "data": "test@c--n.com", + "valid": true + }, + { + "description": "hyphen in TLD is valid", + "data": "test@iana.co-uk", + "valid": true + }, + { + "description": "domain with many labels is valid", + "data": "a@a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.q.r.s.t.u.v.w.x.y.z.a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.q.r.s.t.u.v.w.x.y.z.a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.q.r.s.t.u.v.w.x.y.z.a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.q.r.s.t.u.v", + "valid": true + }, + { + "description": "punycode-encoded domain is valid", + "data": "test@xn--hxajbheg2az3al.xn--jxalpdlp", + "valid": true + }, + { + "description": "punycode-like prefix in local part is valid", + "data": "xn--test@iana.org", + "valid": true + }, + { + "description": "empty string is not valid", + "data": "", + "valid": false + }, + { + "description": "no @ sign is not valid", + "data": "test", + "valid": false + }, + { + "description": "dotted string without @ is not valid", + "data": "test..iana.org", + "valid": false + }, + { + "description": "domain-like string without @ is not valid", + "data": "test_exa-mple.com", + "valid": false + }, + { + "description": "missing domain is not valid", + "data": "test@", + "valid": false + }, + { + "description": "unclosed bracket in domain is not valid", + "data": "test@[1.2.3.4", + "valid": false + }, + { + "description": "bare @ sign is not valid", + "data": "@", + "valid": false + }, + { + "description": "@ with TLD but no local part is not valid", + "data": "@io", + "valid": false + }, + { + "description": "@ with domain but no local part is not valid", + "data": "@iana.org", + "valid": false + }, + { + "description": "leading dot in local part is not valid", + "data": ".test@iana.org", + "valid": false + }, + { + "description": "trailing dot in local part is not valid", + "data": "test.@iana.org", + "valid": false + }, + { + "description": "backslash in unquoted local part is not valid", + "data": "test\\@test@iana.org", + "valid": false + }, + { + "description": "double-quote in unquoted local part is not valid", + "data": "test\"@iana.org", + "valid": false + }, + { + "description": "text followed by quoted string in local part is not valid", + "data": "test\"text\"@iana.org", + "valid": false + }, + { + "description": "parentheses before local part are not valid", + "data": "((comment)test@iana.org", + "valid": false + }, + { + "description": "parentheses in middle of local part are not valid", + "data": "test(comment)test@iana.org", + "valid": false + }, + { + "description": "open parenthesis before local part is not valid", + "data": "(test@iana.org", + "valid": false + }, + { + "description": "backslash-parenthesis before local part is not valid", + "data": "(comment\\)test@iana.org", + "valid": false + }, + { + "description": "DEL character in local part is not valid", + "data": "\u007f@iana.org", + "valid": false + }, + { + "description": "CR before local part is not valid", + "data": "\rtest@iana.org", + "valid": false + }, + { + "description": "LF before local part is not valid", + "data": "\ntest@iana.org", + "valid": false + }, + { + "description": "BEL character as local part is not valid", + "data": "\u0007@iana.org", + "valid": false + }, + { + "description": "CRLF before local part is not valid", + "data": "\r\ntest@iana.org", + "valid": false + }, + { + "description": "SP then CRLF before local part is not valid", + "data": " \r\ntest@iana.org", + "valid": false + }, + { + "description": "basic quoted string local part is valid", + "data": "\"test\"@iana.org", + "valid": true + }, + { + "description": "empty quoted string local part is valid", + "data": "\"\"@iana.org", + "valid": true + }, + { + "description": "quoted pair with letter is valid", + "data": "\"\\a\"@iana.org", + "valid": true + }, + { + "description": "escaped double-quote in quoted string is valid", + "data": "\"\\\"\"@iana.org", + "valid": true + }, + { + "description": "escaped backslash in quoted string is valid", + "data": "\"\\\\\"@iana.org", + "valid": true + }, + { + "description": "space via quoted pair in quoted string is valid", + "data": "\"test\\ test\"@iana.org", + "valid": true + }, + { + "description": "@ inside quoted string local part is valid", + "data": "\"a@b\"@iana.org", + "valid": true + }, + { + "description": "quoted string containing only @ is valid", + "data": "\"@\"@iana.org", + "valid": true + }, + { + "description": "multiple @ signs inside quoted string is valid", + "data": "\"a@b@c\"@iana.org", + "valid": true + }, + { + "description": "three consecutive double-quotes is not valid", + "data": "\"\"\"@iana.org", + "valid": false + }, + { + "description": "backslash before closing double-quote eats the delimiter", + "data": "\"\\\"@iana.org", + "valid": false + }, + { + "description": "unclosed double-quote in local part is not valid", + "data": "\"test@iana.org", + "valid": false + }, + { + "description": "text after closing double-quote in local part is not valid", + "data": "\"test\"test@iana.org", + "valid": false + }, + { + "description": "two adjacent quoted strings in local part is not valid", + "data": "\"test\"\"test\"@iana.org", + "valid": false + }, + { + "description": "NUL inside quoted string is not valid", + "data": "\"test\u0000\"@iana.org", + "valid": false + }, + { + "description": "trailing backslash eats closing double-quote making it not valid", + "data": "\"test\\\"@iana.org", + "valid": false + }, + { + "description": "CR inside quoted string is not valid", + "data": "\"\rtest\"@iana.org", + "valid": false + }, + { + "description": "LF inside quoted string is not valid", + "data": "\"\n\"@iana.org", + "valid": false + }, + { + "description": "domain label starting with hyphen is not valid", + "data": "test@-iana.org", + "valid": false + }, + { + "description": "domain label ending with hyphen is not valid", + "data": "test@iana-.com", + "valid": false + }, + { + "description": "leading dot in domain is not valid", + "data": "test@.iana.org", + "valid": false + }, + { + "description": "trailing dot in domain is not valid", + "data": "test@iana.org.", + "valid": false + }, + { + "description": "consecutive dots in domain are not valid", + "data": "test@iana..com", + "valid": false + }, + { + "description": "letter immediately before bracket in domain is not valid", + "data": "test@a[255.255.255.255]", + "valid": false + }, + { + "description": "LF after domain is not valid", + "data": "test@iana.org\n", + "valid": false + }, + { + "description": "trailing hyphen in TLD is not valid", + "data": "test@iana.org-", + "valid": false + }, + { + "description": "open parenthesis in domain is not valid", + "data": "test@(iana.org", + "valid": false + }, + { + "description": "DEL character in domain label is not valid", + "data": "test@\u007f.org", + "valid": false + }, + { + "description": "CR after domain is not valid", + "data": "test@iana.org\r", + "valid": false + }, + { + "description": "BEL character in domain label is not valid", + "data": "test@\u0007.org", + "valid": false + }, + { + "description": "two-character bare TLD is valid", + "data": "test@io", + "valid": true + }, + { + "description": "three-character bare TLD is valid", + "data": "test@org", + "valid": true + }, + { + "description": "common test domain is valid", + "data": "test@test.com", + "valid": true + }, + { + "description": "two-letter TLD with two-letter subdomain is valid", + "data": "test@nic.no", + "valid": true + }, + { + "description": "IPv4 address literal with max-value octets is valid", + "data": "test@[255.255.255.255]", + "valid": true + }, + { + "description": "full 8-group IPv6 address literal is valid", + "data": "test@[IPv6:1111:2222:3333:4444:5555:6666:7777:8888]", + "valid": true + }, + { + "description": "compressed IPv6 address literal is valid", + "data": "test@[IPv6:1111:2222:3333:4444:5555::8888]", + "valid": true + }, + { + "description": "IPv6 address literal with leading :: compression is valid", + "data": "test@[IPv6:::3333:4444:5555:6666:7777:8888]", + "valid": true + }, + { + "description": "IPv6 all-zeros address literal is valid", + "data": "test@[IPv6:::]", + "valid": true + }, + { + "description": "IPv6 address literal with embedded IPv4 suffix is valid", + "data": "test@[IPv6:1111:2222:3333:4444:5555:6666:255.255.255.255]", + "valid": true + }, + { + "description": "compressed IPv6 address literal with embedded IPv4 is valid", + "data": "test@[IPv6:1111:2222:3333:4444::255.255.255.255]", + "valid": true + }, + { + "description": "IPv4 address literal with all-zero octets is valid", + "data": "test@[0.0.0.0]", + "valid": true + }, + { + "description": "non-IP content inside address literal brackets is not valid", + "data": "test@[RFC-5322]-domain-literal]", + "valid": false + }, + { + "description": "nested bracket in address literal is not valid", + "data": "test@[RFC-5322-[domain-literal]", + "valid": false + }, + { + "description": "backslash before closing bracket in address literal is not valid", + "data": "test@[RFC-5322-domain-literal\\]", + "valid": false + }, + { + "description": "unclosed address literal with backslash is not valid", + "data": "test@[RFC-5322-domain-literal\\", + "valid": false + }, + { + "description": "63-character local part and domain label boundary is valid", + "data": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.com", + "valid": true + }, + { + "description": "NUL character in local part is not valid", + "data": "a\u0000b@iana.org", + "valid": false + }, + { + "description": "tab character in local part is not valid", + "data": "a\tb@iana.org", + "valid": false + }, + { + "description": "tab character in domain is not valid", + "data": "a@b\tc.com", + "valid": false + }, + { + "description": "non-ASCII UTF-8 character in local part is not valid", + "data": "aé@iana.org", + "valid": false + }, + { + "description": "non-ASCII UTF-8 character in domain is not valid", + "data": "a@é.org", + "valid": false + }, + { + "description": "unquoted space in local part is not valid", + "data": "a b@iana.org", + "valid": false + }, + { + "description": "trailing space is not valid", + "data": "a@iana.org ", + "valid": false + }, + { + "description": "leading space is not valid", + "data": " a@iana.org", + "valid": false + }, + { + "description": "single character on each side of @ is valid", + "data": "a@b", + "valid": true + }, + { + "description": "underscore in local part is valid", + "data": "a_b@iana.org", + "valid": true + }, + { + "description": "comma in local part is not valid", + "data": "a,b@iana.org", + "valid": false + }, + { + "description": "semicolon in local part is not valid", + "data": "a;b@iana.org", + "valid": false + }, + { + "description": "colon in local part is not valid", + "data": "a:b@iana.org", + "valid": false + }, + { + "description": "parenthesis in domain is not valid", + "data": "a@b(c).org", + "valid": false + }, + { + "description": "brackets in local part position are not valid", + "data": "[1.2.3.4]@iana.org", + "valid": false + }, + { + "description": "IPv4 address literal 0.0.0.0 is valid", + "data": "a@[0.0.0.0]", + "valid": true + }, + { + "description": "IPv4 octet value over 255 is not valid", + "data": "a@[256.0.0.0]", + "valid": false + }, + { + "description": "IPv4 literal with only three octets is not valid", + "data": "a@[1.2.3]", + "valid": false + }, + { + "description": "IPv6 address without 'IPv6:' prefix is not valid", + "data": "a@[1111:2222:3333:4444:5555:6666:7777:8888]", + "valid": false + }, + { + "description": "lowercase 'ipv6:' prefix in address literal is valid", + "data": "a@[ipv6:::]", + "valid": true + }, + { + "description": "empty brackets in domain are not valid", + "data": "a@[]", + "valid": false + }, + { + "description": "space inside address literal brackets is not valid", + "data": "a@[ 1.2.3.4]", + "valid": false + }, + { + "description": "64-character local part with all same characters is valid", + "data": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@iana.org", + "valid": true + }, + { + "description": "two @ signs in unquoted local part is not valid", + "data": "a@b@c.org", + "valid": false + }, + { + "description": "dot inside quoted string local part is valid", + "data": "\"a.b\"@iana.org", + "valid": true + }, + { + "description": "leading dot inside quoted string is valid", + "data": "\".test\"@iana.org", + "valid": true + }, + { + "description": "space-only quoted string local part is valid", + "data": "\" \"@iana.org", + "valid": true + }, + { + "description": "general address literal with unregistered tag is not valid", + "data": "a@[extn:test]", + "valid": false + }, + { + "description": "long domain with multiple max-length labels is valid", + "data": "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghiklm@abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghikl.abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghikl.abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghi", + "valid": true + }, + { + "description": "comment-like parentheses after domain are not valid", + "data": "test@iana.org(comment\\)", + "valid": false + }, + { + "description": "open parenthesis with backslash after domain is not valid", + "data": "test@iana.org(comment\\", + "valid": false + }, + { + "description": "CR inside parentheses after domain is not valid", + "data": "test@iana.org(\r)", + "valid": false + }, + { + "description": "CR inside parentheses before address is not valid", + "data": "(\r)test@iana.org", + "valid": false + }, + { + "description": "LF inside parentheses before address is not valid", + "data": "(\n)test@iana.org", + "valid": false + }, + { + "description": "CRLF SP CRLF sequence before address is not valid", + "data": "\r\n \r\ntest@iana.org", + "valid": false + }, + { + "description": "SP CRLF SP CRLF sequence before address is not valid", + "data": " \r\n \r\ntest@iana.org", + "valid": false + }, + { + "description": "SP CRLF CRLF sequence before address is not valid", + "data": " \r\n\r\ntest@iana.org", + "valid": false + }, + { + "description": "SP CRLF CRLF SP sequence before address is not valid", + "data": " \r\n\r\n test@iana.org", + "valid": false + }, + { + "description": "CRLF after domain is not valid", + "data": "test@iana.org\r\n", + "valid": false + }, + { + "description": "CRLF SP CRLF after domain is not valid", + "data": "test@iana.org\r\n \r\n", + "valid": false + }, + { + "description": "SP CRLF after domain is not valid", + "data": "test@iana.org \r\n", + "valid": false + }, + { + "description": "SP CRLF SP CRLF after domain is not valid", + "data": "test@iana.org \r\n \r\n", + "valid": false + }, + { + "description": "SP CRLF CRLF after domain is not valid", + "data": "test@iana.org \r\n\r\n", + "valid": false + }, + { + "description": "SP CRLF CRLF SP after domain is not valid", + "data": "test@iana.org \r\n\r\n ", + "valid": false + }, + { + "description": "non-ASCII character in quoted pair is not valid", + "data": "\"test\\©\"@iana.org", + "valid": false + }, + { + "description": "fullwidth @ sign (U+FF20) is not a valid separator", + "data": "a@iana.org", + "valid": false + }, + { + "description": "US control character (U+001F) in local part is not valid", + "data": "a\u001fb@iana.org", + "valid": false + }, + { + "description": "SOH control character (U+0001) in local part is not valid", + "data": "a\u0001b@iana.org", + "valid": false + }, + { + "description": "dot as entire local part is not valid", + "data": ".@iana.org", + "valid": false + }, + { + "description": "two dots as entire local part is not valid", + "data": "..@iana.org", + "valid": false + }, + { + "description": "IPv4 literal with five octets is not valid", + "data": "a@[1.2.3.4.5]", + "valid": false + }, + { + "description": "dot-string then quoted-string as local part is not valid", + "data": "a.\"b\"@iana.org", + "valid": false + }, + { + "description": "quoted-string then dot-string as local part is not valid", + "data": "\"a\".b@iana.org", + "valid": false + }, + { + "description": "leading dot in local with leading hyphen in domain is not valid", + "data": ".@-iana.org", + "valid": false + }, + { + "description": "leading hyphen and consecutive dots in domain are not valid", + "data": "test@-iana..org", + "valid": false } ] } From d049ee26b4d6a841c3d29107bb6443653b362907 Mon Sep 17 00:00:00 2001 From: Tushar Verma Date: Mon, 13 Apr 2026 23:37:32 +0530 Subject: [PATCH 06/10] test(email): extend draft2020-12 email format tests --- tests/draft2020-12/optional/format/email.json | 730 ++++++++++++++++++ 1 file changed, 730 insertions(+) diff --git a/tests/draft2020-12/optional/format/email.json b/tests/draft2020-12/optional/format/email.json index 7055fbb7..ad91b93a 100644 --- a/tests/draft2020-12/optional/format/email.json +++ b/tests/draft2020-12/optional/format/email.json @@ -140,6 +140,736 @@ "description": "unquoted space in local part is invalid", "data": "joe bloggs@example.com", "valid": false + }, + { + "description": "simple local part with standard domain is valid", + "data": "test@iana.org", + "valid": true + }, + { + "description": "subdomain with country-code TLD is valid", + "data": "test@nominet.org.uk", + "valid": true + }, + { + "description": "six-letter TLD is valid", + "data": "test@about.museum", + "valid": true + }, + { + "description": "single-character local part is valid", + "data": "a@iana.org", + "valid": true + }, + { + "description": "single-character subdomain is valid", + "data": "test@e.com", + "valid": true + }, + { + "description": "single-character TLD is valid", + "data": "test@iana.a", + "valid": true + }, + { + "description": "dotted local part is valid", + "data": "test.test@iana.org", + "valid": true + }, + { + "description": "atext special characters in local part are valid", + "data": "!#$%&'*+/=?^_{|}~@iana.org", + "valid": true + }, + { + "description": "all-digit local part is valid", + "data": "123@iana.org", + "valid": true + }, + { + "description": "digit at start of subdomain is valid", + "data": "test@123.com", + "valid": true + }, + { + "description": "all-digit TLD is valid", + "data": "test@iana.123", + "valid": true + }, + { + "description": "domain that looks like an IPv4 address without brackets is valid", + "data": "test@255.255.255.255", + "valid": true + }, + { + "description": "64-character local part is valid", + "data": "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghiklm@iana.org", + "valid": true + }, + { + "description": "63-character domain label is valid", + "data": "test@abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghikl.com", + "valid": true + }, + { + "description": "hyphen in subdomain is valid", + "data": "test@mason-dixon.com", + "valid": true + }, + { + "description": "consecutive hyphens in subdomain are valid", + "data": "test@c--n.com", + "valid": true + }, + { + "description": "hyphen in TLD is valid", + "data": "test@iana.co-uk", + "valid": true + }, + { + "description": "domain with many labels is valid", + "data": "a@a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.q.r.s.t.u.v.w.x.y.z.a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.q.r.s.t.u.v.w.x.y.z.a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.q.r.s.t.u.v.w.x.y.z.a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.q.r.s.t.u.v", + "valid": true + }, + { + "description": "punycode-encoded domain is valid", + "data": "test@xn--hxajbheg2az3al.xn--jxalpdlp", + "valid": true + }, + { + "description": "punycode-like prefix in local part is valid", + "data": "xn--test@iana.org", + "valid": true + }, + { + "description": "empty string is not valid", + "data": "", + "valid": false + }, + { + "description": "no @ sign is not valid", + "data": "test", + "valid": false + }, + { + "description": "dotted string without @ is not valid", + "data": "test..iana.org", + "valid": false + }, + { + "description": "domain-like string without @ is not valid", + "data": "test_exa-mple.com", + "valid": false + }, + { + "description": "missing domain is not valid", + "data": "test@", + "valid": false + }, + { + "description": "unclosed bracket in domain is not valid", + "data": "test@[1.2.3.4", + "valid": false + }, + { + "description": "bare @ sign is not valid", + "data": "@", + "valid": false + }, + { + "description": "@ with TLD but no local part is not valid", + "data": "@io", + "valid": false + }, + { + "description": "@ with domain but no local part is not valid", + "data": "@iana.org", + "valid": false + }, + { + "description": "leading dot in local part is not valid", + "data": ".test@iana.org", + "valid": false + }, + { + "description": "trailing dot in local part is not valid", + "data": "test.@iana.org", + "valid": false + }, + { + "description": "backslash in unquoted local part is not valid", + "data": "test\\@test@iana.org", + "valid": false + }, + { + "description": "double-quote in unquoted local part is not valid", + "data": "test\"@iana.org", + "valid": false + }, + { + "description": "text followed by quoted string in local part is not valid", + "data": "test\"text\"@iana.org", + "valid": false + }, + { + "description": "parentheses before local part are not valid", + "data": "((comment)test@iana.org", + "valid": false + }, + { + "description": "parentheses in middle of local part are not valid", + "data": "test(comment)test@iana.org", + "valid": false + }, + { + "description": "open parenthesis before local part is not valid", + "data": "(test@iana.org", + "valid": false + }, + { + "description": "backslash-parenthesis before local part is not valid", + "data": "(comment\\)test@iana.org", + "valid": false + }, + { + "description": "DEL character in local part is not valid", + "data": "\u007f@iana.org", + "valid": false + }, + { + "description": "CR before local part is not valid", + "data": "\rtest@iana.org", + "valid": false + }, + { + "description": "LF before local part is not valid", + "data": "\ntest@iana.org", + "valid": false + }, + { + "description": "BEL character as local part is not valid", + "data": "\u0007@iana.org", + "valid": false + }, + { + "description": "CRLF before local part is not valid", + "data": "\r\ntest@iana.org", + "valid": false + }, + { + "description": "SP then CRLF before local part is not valid", + "data": " \r\ntest@iana.org", + "valid": false + }, + { + "description": "basic quoted string local part is valid", + "data": "\"test\"@iana.org", + "valid": true + }, + { + "description": "empty quoted string local part is valid", + "data": "\"\"@iana.org", + "valid": true + }, + { + "description": "quoted pair with letter is valid", + "data": "\"\\a\"@iana.org", + "valid": true + }, + { + "description": "escaped double-quote in quoted string is valid", + "data": "\"\\\"\"@iana.org", + "valid": true + }, + { + "description": "escaped backslash in quoted string is valid", + "data": "\"\\\\\"@iana.org", + "valid": true + }, + { + "description": "space via quoted pair in quoted string is valid", + "data": "\"test\\ test\"@iana.org", + "valid": true + }, + { + "description": "@ inside quoted string local part is valid", + "data": "\"a@b\"@iana.org", + "valid": true + }, + { + "description": "quoted string containing only @ is valid", + "data": "\"@\"@iana.org", + "valid": true + }, + { + "description": "multiple @ signs inside quoted string is valid", + "data": "\"a@b@c\"@iana.org", + "valid": true + }, + { + "description": "three consecutive double-quotes is not valid", + "data": "\"\"\"@iana.org", + "valid": false + }, + { + "description": "backslash before closing double-quote eats the delimiter", + "data": "\"\\\"@iana.org", + "valid": false + }, + { + "description": "unclosed double-quote in local part is not valid", + "data": "\"test@iana.org", + "valid": false + }, + { + "description": "text after closing double-quote in local part is not valid", + "data": "\"test\"test@iana.org", + "valid": false + }, + { + "description": "two adjacent quoted strings in local part is not valid", + "data": "\"test\"\"test\"@iana.org", + "valid": false + }, + { + "description": "NUL inside quoted string is not valid", + "data": "\"test\u0000\"@iana.org", + "valid": false + }, + { + "description": "trailing backslash eats closing double-quote making it not valid", + "data": "\"test\\\"@iana.org", + "valid": false + }, + { + "description": "CR inside quoted string is not valid", + "data": "\"\rtest\"@iana.org", + "valid": false + }, + { + "description": "LF inside quoted string is not valid", + "data": "\"\n\"@iana.org", + "valid": false + }, + { + "description": "domain label starting with hyphen is not valid", + "data": "test@-iana.org", + "valid": false + }, + { + "description": "domain label ending with hyphen is not valid", + "data": "test@iana-.com", + "valid": false + }, + { + "description": "leading dot in domain is not valid", + "data": "test@.iana.org", + "valid": false + }, + { + "description": "trailing dot in domain is not valid", + "data": "test@iana.org.", + "valid": false + }, + { + "description": "consecutive dots in domain are not valid", + "data": "test@iana..com", + "valid": false + }, + { + "description": "letter immediately before bracket in domain is not valid", + "data": "test@a[255.255.255.255]", + "valid": false + }, + { + "description": "LF after domain is not valid", + "data": "test@iana.org\n", + "valid": false + }, + { + "description": "trailing hyphen in TLD is not valid", + "data": "test@iana.org-", + "valid": false + }, + { + "description": "open parenthesis in domain is not valid", + "data": "test@(iana.org", + "valid": false + }, + { + "description": "DEL character in domain label is not valid", + "data": "test@\u007f.org", + "valid": false + }, + { + "description": "CR after domain is not valid", + "data": "test@iana.org\r", + "valid": false + }, + { + "description": "BEL character in domain label is not valid", + "data": "test@\u0007.org", + "valid": false + }, + { + "description": "two-character bare TLD is valid", + "data": "test@io", + "valid": true + }, + { + "description": "three-character bare TLD is valid", + "data": "test@org", + "valid": true + }, + { + "description": "common test domain is valid", + "data": "test@test.com", + "valid": true + }, + { + "description": "two-letter TLD with two-letter subdomain is valid", + "data": "test@nic.no", + "valid": true + }, + { + "description": "IPv4 address literal with max-value octets is valid", + "data": "test@[255.255.255.255]", + "valid": true + }, + { + "description": "full 8-group IPv6 address literal is valid", + "data": "test@[IPv6:1111:2222:3333:4444:5555:6666:7777:8888]", + "valid": true + }, + { + "description": "compressed IPv6 address literal is valid", + "data": "test@[IPv6:1111:2222:3333:4444:5555::8888]", + "valid": true + }, + { + "description": "IPv6 address literal with leading :: compression is valid", + "data": "test@[IPv6:::3333:4444:5555:6666:7777:8888]", + "valid": true + }, + { + "description": "IPv6 all-zeros address literal is valid", + "data": "test@[IPv6:::]", + "valid": true + }, + { + "description": "IPv6 address literal with embedded IPv4 suffix is valid", + "data": "test@[IPv6:1111:2222:3333:4444:5555:6666:255.255.255.255]", + "valid": true + }, + { + "description": "compressed IPv6 address literal with embedded IPv4 is valid", + "data": "test@[IPv6:1111:2222:3333:4444::255.255.255.255]", + "valid": true + }, + { + "description": "IPv4 address literal with all-zero octets is valid", + "data": "test@[0.0.0.0]", + "valid": true + }, + { + "description": "non-IP content inside address literal brackets is not valid", + "data": "test@[RFC-5322]-domain-literal]", + "valid": false + }, + { + "description": "nested bracket in address literal is not valid", + "data": "test@[RFC-5322-[domain-literal]", + "valid": false + }, + { + "description": "backslash before closing bracket in address literal is not valid", + "data": "test@[RFC-5322-domain-literal\\]", + "valid": false + }, + { + "description": "unclosed address literal with backslash is not valid", + "data": "test@[RFC-5322-domain-literal\\", + "valid": false + }, + { + "description": "63-character local part and domain label boundary is valid", + "data": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.com", + "valid": true + }, + { + "description": "NUL character in local part is not valid", + "data": "a\u0000b@iana.org", + "valid": false + }, + { + "description": "tab character in local part is not valid", + "data": "a\tb@iana.org", + "valid": false + }, + { + "description": "tab character in domain is not valid", + "data": "a@b\tc.com", + "valid": false + }, + { + "description": "non-ASCII UTF-8 character in local part is not valid", + "data": "aé@iana.org", + "valid": false + }, + { + "description": "non-ASCII UTF-8 character in domain is not valid", + "data": "a@é.org", + "valid": false + }, + { + "description": "unquoted space in local part is not valid", + "data": "a b@iana.org", + "valid": false + }, + { + "description": "trailing space is not valid", + "data": "a@iana.org ", + "valid": false + }, + { + "description": "leading space is not valid", + "data": " a@iana.org", + "valid": false + }, + { + "description": "single character on each side of @ is valid", + "data": "a@b", + "valid": true + }, + { + "description": "underscore in local part is valid", + "data": "a_b@iana.org", + "valid": true + }, + { + "description": "comma in local part is not valid", + "data": "a,b@iana.org", + "valid": false + }, + { + "description": "semicolon in local part is not valid", + "data": "a;b@iana.org", + "valid": false + }, + { + "description": "colon in local part is not valid", + "data": "a:b@iana.org", + "valid": false + }, + { + "description": "parenthesis in domain is not valid", + "data": "a@b(c).org", + "valid": false + }, + { + "description": "brackets in local part position are not valid", + "data": "[1.2.3.4]@iana.org", + "valid": false + }, + { + "description": "IPv4 address literal 0.0.0.0 is valid", + "data": "a@[0.0.0.0]", + "valid": true + }, + { + "description": "IPv4 octet value over 255 is not valid", + "data": "a@[256.0.0.0]", + "valid": false + }, + { + "description": "IPv4 literal with only three octets is not valid", + "data": "a@[1.2.3]", + "valid": false + }, + { + "description": "IPv6 address without 'IPv6:' prefix is not valid", + "data": "a@[1111:2222:3333:4444:5555:6666:7777:8888]", + "valid": false + }, + { + "description": "lowercase 'ipv6:' prefix in address literal is valid", + "data": "a@[ipv6:::]", + "valid": true + }, + { + "description": "empty brackets in domain are not valid", + "data": "a@[]", + "valid": false + }, + { + "description": "space inside address literal brackets is not valid", + "data": "a@[ 1.2.3.4]", + "valid": false + }, + { + "description": "64-character local part with all same characters is valid", + "data": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@iana.org", + "valid": true + }, + { + "description": "two @ signs in unquoted local part is not valid", + "data": "a@b@c.org", + "valid": false + }, + { + "description": "dot inside quoted string local part is valid", + "data": "\"a.b\"@iana.org", + "valid": true + }, + { + "description": "leading dot inside quoted string is valid", + "data": "\".test\"@iana.org", + "valid": true + }, + { + "description": "space-only quoted string local part is valid", + "data": "\" \"@iana.org", + "valid": true + }, + { + "description": "general address literal with unregistered tag is not valid", + "data": "a@[extn:test]", + "valid": false + }, + { + "description": "long domain with multiple max-length labels is valid", + "data": "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghiklm@abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghikl.abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghikl.abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghi", + "valid": true + }, + { + "description": "comment-like parentheses after domain are not valid", + "data": "test@iana.org(comment\\)", + "valid": false + }, + { + "description": "open parenthesis with backslash after domain is not valid", + "data": "test@iana.org(comment\\", + "valid": false + }, + { + "description": "CR inside parentheses after domain is not valid", + "data": "test@iana.org(\r)", + "valid": false + }, + { + "description": "CR inside parentheses before address is not valid", + "data": "(\r)test@iana.org", + "valid": false + }, + { + "description": "LF inside parentheses before address is not valid", + "data": "(\n)test@iana.org", + "valid": false + }, + { + "description": "CRLF SP CRLF sequence before address is not valid", + "data": "\r\n \r\ntest@iana.org", + "valid": false + }, + { + "description": "SP CRLF SP CRLF sequence before address is not valid", + "data": " \r\n \r\ntest@iana.org", + "valid": false + }, + { + "description": "SP CRLF CRLF sequence before address is not valid", + "data": " \r\n\r\ntest@iana.org", + "valid": false + }, + { + "description": "SP CRLF CRLF SP sequence before address is not valid", + "data": " \r\n\r\n test@iana.org", + "valid": false + }, + { + "description": "CRLF after domain is not valid", + "data": "test@iana.org\r\n", + "valid": false + }, + { + "description": "CRLF SP CRLF after domain is not valid", + "data": "test@iana.org\r\n \r\n", + "valid": false + }, + { + "description": "SP CRLF after domain is not valid", + "data": "test@iana.org \r\n", + "valid": false + }, + { + "description": "SP CRLF SP CRLF after domain is not valid", + "data": "test@iana.org \r\n \r\n", + "valid": false + }, + { + "description": "SP CRLF CRLF after domain is not valid", + "data": "test@iana.org \r\n\r\n", + "valid": false + }, + { + "description": "SP CRLF CRLF SP after domain is not valid", + "data": "test@iana.org \r\n\r\n ", + "valid": false + }, + { + "description": "non-ASCII character in quoted pair is not valid", + "data": "\"test\\©\"@iana.org", + "valid": false + }, + { + "description": "fullwidth @ sign (U+FF20) is not a valid separator", + "data": "a@iana.org", + "valid": false + }, + { + "description": "US control character (U+001F) in local part is not valid", + "data": "a\u001fb@iana.org", + "valid": false + }, + { + "description": "SOH control character (U+0001) in local part is not valid", + "data": "a\u0001b@iana.org", + "valid": false + }, + { + "description": "dot as entire local part is not valid", + "data": ".@iana.org", + "valid": false + }, + { + "description": "two dots as entire local part is not valid", + "data": "..@iana.org", + "valid": false + }, + { + "description": "IPv4 literal with five octets is not valid", + "data": "a@[1.2.3.4.5]", + "valid": false + }, + { + "description": "dot-string then quoted-string as local part is not valid", + "data": "a.\"b\"@iana.org", + "valid": false + }, + { + "description": "quoted-string then dot-string as local part is not valid", + "data": "\"a\".b@iana.org", + "valid": false + }, + { + "description": "leading dot in local with leading hyphen in domain is not valid", + "data": ".@-iana.org", + "valid": false + }, + { + "description": "leading hyphen and consecutive dots in domain are not valid", + "data": "test@-iana..org", + "valid": false } ] } From c44562d7e2ddfe446aa1a360655b8ab1ff8f10e1 Mon Sep 17 00:00:00 2001 From: Tushar Verma Date: Mon, 13 Apr 2026 23:37:35 +0530 Subject: [PATCH 07/10] test(email): add RFC 5321 email test coverage to v1 --- tests/v1/format/email.json | 730 +++++++++++++++++++++++++++++++++++++ 1 file changed, 730 insertions(+) diff --git a/tests/v1/format/email.json b/tests/v1/format/email.json index c514adaa..1e71cae9 100644 --- a/tests/v1/format/email.json +++ b/tests/v1/format/email.json @@ -140,6 +140,736 @@ "description": "unquoted space in local part is invalid", "data": "joe bloggs@example.com", "valid": false + }, + { + "description": "simple local part with standard domain is valid", + "data": "test@iana.org", + "valid": true + }, + { + "description": "subdomain with country-code TLD is valid", + "data": "test@nominet.org.uk", + "valid": true + }, + { + "description": "six-letter TLD is valid", + "data": "test@about.museum", + "valid": true + }, + { + "description": "single-character local part is valid", + "data": "a@iana.org", + "valid": true + }, + { + "description": "single-character subdomain is valid", + "data": "test@e.com", + "valid": true + }, + { + "description": "single-character TLD is valid", + "data": "test@iana.a", + "valid": true + }, + { + "description": "dotted local part is valid", + "data": "test.test@iana.org", + "valid": true + }, + { + "description": "atext special characters in local part are valid", + "data": "!#$%&'*+/=?^_{|}~@iana.org", + "valid": true + }, + { + "description": "all-digit local part is valid", + "data": "123@iana.org", + "valid": true + }, + { + "description": "digit at start of subdomain is valid", + "data": "test@123.com", + "valid": true + }, + { + "description": "all-digit TLD is valid", + "data": "test@iana.123", + "valid": true + }, + { + "description": "domain that looks like an IPv4 address without brackets is valid", + "data": "test@255.255.255.255", + "valid": true + }, + { + "description": "64-character local part is valid", + "data": "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghiklm@iana.org", + "valid": true + }, + { + "description": "63-character domain label is valid", + "data": "test@abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghikl.com", + "valid": true + }, + { + "description": "hyphen in subdomain is valid", + "data": "test@mason-dixon.com", + "valid": true + }, + { + "description": "consecutive hyphens in subdomain are valid", + "data": "test@c--n.com", + "valid": true + }, + { + "description": "hyphen in TLD is valid", + "data": "test@iana.co-uk", + "valid": true + }, + { + "description": "domain with many labels is valid", + "data": "a@a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.q.r.s.t.u.v.w.x.y.z.a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.q.r.s.t.u.v.w.x.y.z.a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.q.r.s.t.u.v.w.x.y.z.a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.q.r.s.t.u.v", + "valid": true + }, + { + "description": "punycode-encoded domain is valid", + "data": "test@xn--hxajbheg2az3al.xn--jxalpdlp", + "valid": true + }, + { + "description": "punycode-like prefix in local part is valid", + "data": "xn--test@iana.org", + "valid": true + }, + { + "description": "empty string is not valid", + "data": "", + "valid": false + }, + { + "description": "no @ sign is not valid", + "data": "test", + "valid": false + }, + { + "description": "dotted string without @ is not valid", + "data": "test..iana.org", + "valid": false + }, + { + "description": "domain-like string without @ is not valid", + "data": "test_exa-mple.com", + "valid": false + }, + { + "description": "missing domain is not valid", + "data": "test@", + "valid": false + }, + { + "description": "unclosed bracket in domain is not valid", + "data": "test@[1.2.3.4", + "valid": false + }, + { + "description": "bare @ sign is not valid", + "data": "@", + "valid": false + }, + { + "description": "@ with TLD but no local part is not valid", + "data": "@io", + "valid": false + }, + { + "description": "@ with domain but no local part is not valid", + "data": "@iana.org", + "valid": false + }, + { + "description": "leading dot in local part is not valid", + "data": ".test@iana.org", + "valid": false + }, + { + "description": "trailing dot in local part is not valid", + "data": "test.@iana.org", + "valid": false + }, + { + "description": "backslash in unquoted local part is not valid", + "data": "test\\@test@iana.org", + "valid": false + }, + { + "description": "double-quote in unquoted local part is not valid", + "data": "test\"@iana.org", + "valid": false + }, + { + "description": "text followed by quoted string in local part is not valid", + "data": "test\"text\"@iana.org", + "valid": false + }, + { + "description": "parentheses before local part are not valid", + "data": "((comment)test@iana.org", + "valid": false + }, + { + "description": "parentheses in middle of local part are not valid", + "data": "test(comment)test@iana.org", + "valid": false + }, + { + "description": "open parenthesis before local part is not valid", + "data": "(test@iana.org", + "valid": false + }, + { + "description": "backslash-parenthesis before local part is not valid", + "data": "(comment\\)test@iana.org", + "valid": false + }, + { + "description": "DEL character in local part is not valid", + "data": "\u007f@iana.org", + "valid": false + }, + { + "description": "CR before local part is not valid", + "data": "\rtest@iana.org", + "valid": false + }, + { + "description": "LF before local part is not valid", + "data": "\ntest@iana.org", + "valid": false + }, + { + "description": "BEL character as local part is not valid", + "data": "\u0007@iana.org", + "valid": false + }, + { + "description": "CRLF before local part is not valid", + "data": "\r\ntest@iana.org", + "valid": false + }, + { + "description": "SP then CRLF before local part is not valid", + "data": " \r\ntest@iana.org", + "valid": false + }, + { + "description": "basic quoted string local part is valid", + "data": "\"test\"@iana.org", + "valid": true + }, + { + "description": "empty quoted string local part is valid", + "data": "\"\"@iana.org", + "valid": true + }, + { + "description": "quoted pair with letter is valid", + "data": "\"\\a\"@iana.org", + "valid": true + }, + { + "description": "escaped double-quote in quoted string is valid", + "data": "\"\\\"\"@iana.org", + "valid": true + }, + { + "description": "escaped backslash in quoted string is valid", + "data": "\"\\\\\"@iana.org", + "valid": true + }, + { + "description": "space via quoted pair in quoted string is valid", + "data": "\"test\\ test\"@iana.org", + "valid": true + }, + { + "description": "@ inside quoted string local part is valid", + "data": "\"a@b\"@iana.org", + "valid": true + }, + { + "description": "quoted string containing only @ is valid", + "data": "\"@\"@iana.org", + "valid": true + }, + { + "description": "multiple @ signs inside quoted string is valid", + "data": "\"a@b@c\"@iana.org", + "valid": true + }, + { + "description": "three consecutive double-quotes is not valid", + "data": "\"\"\"@iana.org", + "valid": false + }, + { + "description": "backslash before closing double-quote eats the delimiter", + "data": "\"\\\"@iana.org", + "valid": false + }, + { + "description": "unclosed double-quote in local part is not valid", + "data": "\"test@iana.org", + "valid": false + }, + { + "description": "text after closing double-quote in local part is not valid", + "data": "\"test\"test@iana.org", + "valid": false + }, + { + "description": "two adjacent quoted strings in local part is not valid", + "data": "\"test\"\"test\"@iana.org", + "valid": false + }, + { + "description": "NUL inside quoted string is not valid", + "data": "\"test\u0000\"@iana.org", + "valid": false + }, + { + "description": "trailing backslash eats closing double-quote making it not valid", + "data": "\"test\\\"@iana.org", + "valid": false + }, + { + "description": "CR inside quoted string is not valid", + "data": "\"\rtest\"@iana.org", + "valid": false + }, + { + "description": "LF inside quoted string is not valid", + "data": "\"\n\"@iana.org", + "valid": false + }, + { + "description": "domain label starting with hyphen is not valid", + "data": "test@-iana.org", + "valid": false + }, + { + "description": "domain label ending with hyphen is not valid", + "data": "test@iana-.com", + "valid": false + }, + { + "description": "leading dot in domain is not valid", + "data": "test@.iana.org", + "valid": false + }, + { + "description": "trailing dot in domain is not valid", + "data": "test@iana.org.", + "valid": false + }, + { + "description": "consecutive dots in domain are not valid", + "data": "test@iana..com", + "valid": false + }, + { + "description": "letter immediately before bracket in domain is not valid", + "data": "test@a[255.255.255.255]", + "valid": false + }, + { + "description": "LF after domain is not valid", + "data": "test@iana.org\n", + "valid": false + }, + { + "description": "trailing hyphen in TLD is not valid", + "data": "test@iana.org-", + "valid": false + }, + { + "description": "open parenthesis in domain is not valid", + "data": "test@(iana.org", + "valid": false + }, + { + "description": "DEL character in domain label is not valid", + "data": "test@\u007f.org", + "valid": false + }, + { + "description": "CR after domain is not valid", + "data": "test@iana.org\r", + "valid": false + }, + { + "description": "BEL character in domain label is not valid", + "data": "test@\u0007.org", + "valid": false + }, + { + "description": "two-character bare TLD is valid", + "data": "test@io", + "valid": true + }, + { + "description": "three-character bare TLD is valid", + "data": "test@org", + "valid": true + }, + { + "description": "common test domain is valid", + "data": "test@test.com", + "valid": true + }, + { + "description": "two-letter TLD with two-letter subdomain is valid", + "data": "test@nic.no", + "valid": true + }, + { + "description": "IPv4 address literal with max-value octets is valid", + "data": "test@[255.255.255.255]", + "valid": true + }, + { + "description": "full 8-group IPv6 address literal is valid", + "data": "test@[IPv6:1111:2222:3333:4444:5555:6666:7777:8888]", + "valid": true + }, + { + "description": "compressed IPv6 address literal is valid", + "data": "test@[IPv6:1111:2222:3333:4444:5555::8888]", + "valid": true + }, + { + "description": "IPv6 address literal with leading :: compression is valid", + "data": "test@[IPv6:::3333:4444:5555:6666:7777:8888]", + "valid": true + }, + { + "description": "IPv6 all-zeros address literal is valid", + "data": "test@[IPv6:::]", + "valid": true + }, + { + "description": "IPv6 address literal with embedded IPv4 suffix is valid", + "data": "test@[IPv6:1111:2222:3333:4444:5555:6666:255.255.255.255]", + "valid": true + }, + { + "description": "compressed IPv6 address literal with embedded IPv4 is valid", + "data": "test@[IPv6:1111:2222:3333:4444::255.255.255.255]", + "valid": true + }, + { + "description": "IPv4 address literal with all-zero octets is valid", + "data": "test@[0.0.0.0]", + "valid": true + }, + { + "description": "non-IP content inside address literal brackets is not valid", + "data": "test@[RFC-5322]-domain-literal]", + "valid": false + }, + { + "description": "nested bracket in address literal is not valid", + "data": "test@[RFC-5322-[domain-literal]", + "valid": false + }, + { + "description": "backslash before closing bracket in address literal is not valid", + "data": "test@[RFC-5322-domain-literal\\]", + "valid": false + }, + { + "description": "unclosed address literal with backslash is not valid", + "data": "test@[RFC-5322-domain-literal\\", + "valid": false + }, + { + "description": "63-character local part and domain label boundary is valid", + "data": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.com", + "valid": true + }, + { + "description": "NUL character in local part is not valid", + "data": "a\u0000b@iana.org", + "valid": false + }, + { + "description": "tab character in local part is not valid", + "data": "a\tb@iana.org", + "valid": false + }, + { + "description": "tab character in domain is not valid", + "data": "a@b\tc.com", + "valid": false + }, + { + "description": "non-ASCII UTF-8 character in local part is not valid", + "data": "aé@iana.org", + "valid": false + }, + { + "description": "non-ASCII UTF-8 character in domain is not valid", + "data": "a@é.org", + "valid": false + }, + { + "description": "unquoted space in local part is not valid", + "data": "a b@iana.org", + "valid": false + }, + { + "description": "trailing space is not valid", + "data": "a@iana.org ", + "valid": false + }, + { + "description": "leading space is not valid", + "data": " a@iana.org", + "valid": false + }, + { + "description": "single character on each side of @ is valid", + "data": "a@b", + "valid": true + }, + { + "description": "underscore in local part is valid", + "data": "a_b@iana.org", + "valid": true + }, + { + "description": "comma in local part is not valid", + "data": "a,b@iana.org", + "valid": false + }, + { + "description": "semicolon in local part is not valid", + "data": "a;b@iana.org", + "valid": false + }, + { + "description": "colon in local part is not valid", + "data": "a:b@iana.org", + "valid": false + }, + { + "description": "parenthesis in domain is not valid", + "data": "a@b(c).org", + "valid": false + }, + { + "description": "brackets in local part position are not valid", + "data": "[1.2.3.4]@iana.org", + "valid": false + }, + { + "description": "IPv4 address literal 0.0.0.0 is valid", + "data": "a@[0.0.0.0]", + "valid": true + }, + { + "description": "IPv4 octet value over 255 is not valid", + "data": "a@[256.0.0.0]", + "valid": false + }, + { + "description": "IPv4 literal with only three octets is not valid", + "data": "a@[1.2.3]", + "valid": false + }, + { + "description": "IPv6 address without 'IPv6:' prefix is not valid", + "data": "a@[1111:2222:3333:4444:5555:6666:7777:8888]", + "valid": false + }, + { + "description": "lowercase 'ipv6:' prefix in address literal is valid", + "data": "a@[ipv6:::]", + "valid": true + }, + { + "description": "empty brackets in domain are not valid", + "data": "a@[]", + "valid": false + }, + { + "description": "space inside address literal brackets is not valid", + "data": "a@[ 1.2.3.4]", + "valid": false + }, + { + "description": "64-character local part with all same characters is valid", + "data": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@iana.org", + "valid": true + }, + { + "description": "two @ signs in unquoted local part is not valid", + "data": "a@b@c.org", + "valid": false + }, + { + "description": "dot inside quoted string local part is valid", + "data": "\"a.b\"@iana.org", + "valid": true + }, + { + "description": "leading dot inside quoted string is valid", + "data": "\".test\"@iana.org", + "valid": true + }, + { + "description": "space-only quoted string local part is valid", + "data": "\" \"@iana.org", + "valid": true + }, + { + "description": "general address literal with unregistered tag is not valid", + "data": "a@[extn:test]", + "valid": false + }, + { + "description": "long domain with multiple max-length labels is valid", + "data": "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghiklm@abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghikl.abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghikl.abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghi", + "valid": true + }, + { + "description": "comment-like parentheses after domain are not valid", + "data": "test@iana.org(comment\\)", + "valid": false + }, + { + "description": "open parenthesis with backslash after domain is not valid", + "data": "test@iana.org(comment\\", + "valid": false + }, + { + "description": "CR inside parentheses after domain is not valid", + "data": "test@iana.org(\r)", + "valid": false + }, + { + "description": "CR inside parentheses before address is not valid", + "data": "(\r)test@iana.org", + "valid": false + }, + { + "description": "LF inside parentheses before address is not valid", + "data": "(\n)test@iana.org", + "valid": false + }, + { + "description": "CRLF SP CRLF sequence before address is not valid", + "data": "\r\n \r\ntest@iana.org", + "valid": false + }, + { + "description": "SP CRLF SP CRLF sequence before address is not valid", + "data": " \r\n \r\ntest@iana.org", + "valid": false + }, + { + "description": "SP CRLF CRLF sequence before address is not valid", + "data": " \r\n\r\ntest@iana.org", + "valid": false + }, + { + "description": "SP CRLF CRLF SP sequence before address is not valid", + "data": " \r\n\r\n test@iana.org", + "valid": false + }, + { + "description": "CRLF after domain is not valid", + "data": "test@iana.org\r\n", + "valid": false + }, + { + "description": "CRLF SP CRLF after domain is not valid", + "data": "test@iana.org\r\n \r\n", + "valid": false + }, + { + "description": "SP CRLF after domain is not valid", + "data": "test@iana.org \r\n", + "valid": false + }, + { + "description": "SP CRLF SP CRLF after domain is not valid", + "data": "test@iana.org \r\n \r\n", + "valid": false + }, + { + "description": "SP CRLF CRLF after domain is not valid", + "data": "test@iana.org \r\n\r\n", + "valid": false + }, + { + "description": "SP CRLF CRLF SP after domain is not valid", + "data": "test@iana.org \r\n\r\n ", + "valid": false + }, + { + "description": "non-ASCII character in quoted pair is not valid", + "data": "\"test\\©\"@iana.org", + "valid": false + }, + { + "description": "fullwidth @ sign (U+FF20) is not a valid separator", + "data": "a@iana.org", + "valid": false + }, + { + "description": "US control character (U+001F) in local part is not valid", + "data": "a\u001fb@iana.org", + "valid": false + }, + { + "description": "SOH control character (U+0001) in local part is not valid", + "data": "a\u0001b@iana.org", + "valid": false + }, + { + "description": "dot as entire local part is not valid", + "data": ".@iana.org", + "valid": false + }, + { + "description": "two dots as entire local part is not valid", + "data": "..@iana.org", + "valid": false + }, + { + "description": "IPv4 literal with five octets is not valid", + "data": "a@[1.2.3.4.5]", + "valid": false + }, + { + "description": "dot-string then quoted-string as local part is not valid", + "data": "a.\"b\"@iana.org", + "valid": false + }, + { + "description": "quoted-string then dot-string as local part is not valid", + "data": "\"a\".b@iana.org", + "valid": false + }, + { + "description": "leading dot in local with leading hyphen in domain is not valid", + "data": ".@-iana.org", + "valid": false + }, + { + "description": "leading hyphen and consecutive dots in domain are not valid", + "data": "test@-iana..org", + "valid": false } ] } From 391483cd755b7fe32c462718c2e06428c6733e48 Mon Sep 17 00:00:00 2001 From: Tushar Verma Date: Tue, 14 Apr 2026 08:10:36 +0530 Subject: [PATCH 08/10] correct invalid email format test cases across multiple drafts --- tests/draft2019-09/optional/format/email.json | 2 +- tests/draft2020-12/optional/format/email.json | 2 +- tests/draft3/optional/format/email.json | 2 +- tests/draft4/optional/format/email.json | 2 +- tests/draft6/optional/format/email.json | 2 +- tests/draft7/optional/format/email.json | 2 +- tests/v1/format/email.json | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/tests/draft2019-09/optional/format/email.json b/tests/draft2019-09/optional/format/email.json index 9414eac4..56f01b07 100644 --- a/tests/draft2019-09/optional/format/email.json +++ b/tests/draft2019-09/optional/format/email.json @@ -538,7 +538,7 @@ }, { "description": "non-IP content inside address literal brackets is not valid", - "data": "test@[RFC-5322]-domain-literal]", + "data": "test@[RFC-5322-domain-literal]", "valid": false }, { diff --git a/tests/draft2020-12/optional/format/email.json b/tests/draft2020-12/optional/format/email.json index ad91b93a..d412cc12 100644 --- a/tests/draft2020-12/optional/format/email.json +++ b/tests/draft2020-12/optional/format/email.json @@ -573,7 +573,7 @@ }, { "description": "non-IP content inside address literal brackets is not valid", - "data": "test@[RFC-5322]-domain-literal]", + "data": "test@[RFC-5322-domain-literal]", "valid": false }, { diff --git a/tests/draft3/optional/format/email.json b/tests/draft3/optional/format/email.json index 02a5104b..c7fec47a 100644 --- a/tests/draft3/optional/format/email.json +++ b/tests/draft3/optional/format/email.json @@ -490,7 +490,7 @@ }, { "description": "non-IP content inside address literal brackets is not valid", - "data": "test@[RFC-5322]-domain-literal]", + "data": "test@[RFC-5322-domain-literal]", "valid": false }, { diff --git a/tests/draft4/optional/format/email.json b/tests/draft4/optional/format/email.json index d0ec6a2a..2ab363c8 100644 --- a/tests/draft4/optional/format/email.json +++ b/tests/draft4/optional/format/email.json @@ -535,7 +535,7 @@ }, { "description": "non-IP content inside address literal brackets is not valid", - "data": "test@[RFC-5322]-domain-literal]", + "data": "test@[RFC-5322-domain-literal]", "valid": false }, { diff --git a/tests/draft6/optional/format/email.json b/tests/draft6/optional/format/email.json index d0ec6a2a..2ab363c8 100644 --- a/tests/draft6/optional/format/email.json +++ b/tests/draft6/optional/format/email.json @@ -535,7 +535,7 @@ }, { "description": "non-IP content inside address literal brackets is not valid", - "data": "test@[RFC-5322]-domain-literal]", + "data": "test@[RFC-5322-domain-literal]", "valid": false }, { diff --git a/tests/draft7/optional/format/email.json b/tests/draft7/optional/format/email.json index d0ec6a2a..2ab363c8 100644 --- a/tests/draft7/optional/format/email.json +++ b/tests/draft7/optional/format/email.json @@ -535,7 +535,7 @@ }, { "description": "non-IP content inside address literal brackets is not valid", - "data": "test@[RFC-5322]-domain-literal]", + "data": "test@[RFC-5322-domain-literal]", "valid": false }, { diff --git a/tests/v1/format/email.json b/tests/v1/format/email.json index 1e71cae9..4886b5c4 100644 --- a/tests/v1/format/email.json +++ b/tests/v1/format/email.json @@ -573,7 +573,7 @@ }, { "description": "non-IP content inside address literal brackets is not valid", - "data": "test@[RFC-5322]-domain-literal]", + "data": "test@[RFC-5322-domain-literal]", "valid": false }, { From e4e80779ec583d528d6ba9910248f8769d7dde20 Mon Sep 17 00:00:00 2001 From: Tushar Verma Date: Tue, 14 Apr 2026 08:27:43 +0530 Subject: [PATCH 09/10] test(email): add backtick atext coverage --- tests/draft2019-09/optional/format/email.json | 5 +++++ tests/draft2020-12/optional/format/email.json | 5 +++++ tests/draft3/optional/format/email.json | 5 +++++ tests/draft4/optional/format/email.json | 5 +++++ tests/draft6/optional/format/email.json | 5 +++++ tests/draft7/optional/format/email.json | 5 +++++ tests/v1/format/email.json | 5 +++++ 7 files changed, 35 insertions(+) diff --git a/tests/draft2019-09/optional/format/email.json b/tests/draft2019-09/optional/format/email.json index 56f01b07..27de2c8a 100644 --- a/tests/draft2019-09/optional/format/email.json +++ b/tests/draft2019-09/optional/format/email.json @@ -835,6 +835,11 @@ "description": "leading hyphen and consecutive dots in domain are not valid", "data": "test@-iana..org", "valid": false + }, + { + "description": "backtick in local part is valid", + "data": "`test`@iana.org", + "valid": true } ] } diff --git a/tests/draft2020-12/optional/format/email.json b/tests/draft2020-12/optional/format/email.json index d412cc12..a67c0d36 100644 --- a/tests/draft2020-12/optional/format/email.json +++ b/tests/draft2020-12/optional/format/email.json @@ -870,6 +870,11 @@ "description": "leading hyphen and consecutive dots in domain are not valid", "data": "test@-iana..org", "valid": false + }, + { + "description": "backtick in local part is valid", + "data": "`test`@iana.org", + "valid": true } ] } diff --git a/tests/draft3/optional/format/email.json b/tests/draft3/optional/format/email.json index c7fec47a..db50ce43 100644 --- a/tests/draft3/optional/format/email.json +++ b/tests/draft3/optional/format/email.json @@ -787,6 +787,11 @@ "description": "leading hyphen and consecutive dots in domain are not valid", "data": "test@-iana..org", "valid": false + }, + { + "description": "backtick in local part is valid", + "data": "`test`@iana.org", + "valid": true } ] } diff --git a/tests/draft4/optional/format/email.json b/tests/draft4/optional/format/email.json index 2ab363c8..9a557a2e 100644 --- a/tests/draft4/optional/format/email.json +++ b/tests/draft4/optional/format/email.json @@ -832,6 +832,11 @@ "description": "leading hyphen and consecutive dots in domain are not valid", "data": "test@-iana..org", "valid": false + }, + { + "description": "backtick in local part is valid", + "data": "`test`@iana.org", + "valid": true } ] } diff --git a/tests/draft6/optional/format/email.json b/tests/draft6/optional/format/email.json index 2ab363c8..9a557a2e 100644 --- a/tests/draft6/optional/format/email.json +++ b/tests/draft6/optional/format/email.json @@ -832,6 +832,11 @@ "description": "leading hyphen and consecutive dots in domain are not valid", "data": "test@-iana..org", "valid": false + }, + { + "description": "backtick in local part is valid", + "data": "`test`@iana.org", + "valid": true } ] } diff --git a/tests/draft7/optional/format/email.json b/tests/draft7/optional/format/email.json index 2ab363c8..9a557a2e 100644 --- a/tests/draft7/optional/format/email.json +++ b/tests/draft7/optional/format/email.json @@ -832,6 +832,11 @@ "description": "leading hyphen and consecutive dots in domain are not valid", "data": "test@-iana..org", "valid": false + }, + { + "description": "backtick in local part is valid", + "data": "`test`@iana.org", + "valid": true } ] } diff --git a/tests/v1/format/email.json b/tests/v1/format/email.json index 4886b5c4..bfe03202 100644 --- a/tests/v1/format/email.json +++ b/tests/v1/format/email.json @@ -870,6 +870,11 @@ "description": "leading hyphen and consecutive dots in domain are not valid", "data": "test@-iana..org", "valid": false + }, + { + "description": "backtick in local part is valid", + "data": "`test`@iana.org", + "valid": true } ] } From a9a4e09afa8d57018ffa7866ecee6082b1768a51 Mon Sep 17 00:00:00 2001 From: Tushar Verma Date: Thu, 16 Apr 2026 18:54:56 +0530 Subject: [PATCH 10/10] removed duplicated test --- tests/draft2019-09/optional/format/email.json | 5 ----- tests/draft2020-12/optional/format/email.json | 5 ----- tests/draft3/optional/format/email.json | 5 ----- tests/draft4/optional/format/email.json | 5 ----- tests/draft6/optional/format/email.json | 5 ----- tests/draft7/optional/format/email.json | 5 ----- tests/v1/format/email.json | 5 ----- 7 files changed, 35 deletions(-) diff --git a/tests/draft2019-09/optional/format/email.json b/tests/draft2019-09/optional/format/email.json index 27de2c8a..f058f162 100644 --- a/tests/draft2019-09/optional/format/email.json +++ b/tests/draft2019-09/optional/format/email.json @@ -636,11 +636,6 @@ "data": "[1.2.3.4]@iana.org", "valid": false }, - { - "description": "IPv4 address literal 0.0.0.0 is valid", - "data": "a@[0.0.0.0]", - "valid": true - }, { "description": "IPv4 octet value over 255 is not valid", "data": "a@[256.0.0.0]", diff --git a/tests/draft2020-12/optional/format/email.json b/tests/draft2020-12/optional/format/email.json index a67c0d36..f215e9f6 100644 --- a/tests/draft2020-12/optional/format/email.json +++ b/tests/draft2020-12/optional/format/email.json @@ -671,11 +671,6 @@ "data": "[1.2.3.4]@iana.org", "valid": false }, - { - "description": "IPv4 address literal 0.0.0.0 is valid", - "data": "a@[0.0.0.0]", - "valid": true - }, { "description": "IPv4 octet value over 255 is not valid", "data": "a@[256.0.0.0]", diff --git a/tests/draft3/optional/format/email.json b/tests/draft3/optional/format/email.json index db50ce43..75527888 100644 --- a/tests/draft3/optional/format/email.json +++ b/tests/draft3/optional/format/email.json @@ -588,11 +588,6 @@ "data": "[1.2.3.4]@iana.org", "valid": false }, - { - "description": "IPv4 address literal 0.0.0.0 is valid", - "data": "a@[0.0.0.0]", - "valid": true - }, { "description": "IPv4 octet value over 255 is not valid", "data": "a@[256.0.0.0]", diff --git a/tests/draft4/optional/format/email.json b/tests/draft4/optional/format/email.json index 9a557a2e..15fb2482 100644 --- a/tests/draft4/optional/format/email.json +++ b/tests/draft4/optional/format/email.json @@ -633,11 +633,6 @@ "data": "[1.2.3.4]@iana.org", "valid": false }, - { - "description": "IPv4 address literal 0.0.0.0 is valid", - "data": "a@[0.0.0.0]", - "valid": true - }, { "description": "IPv4 octet value over 255 is not valid", "data": "a@[256.0.0.0]", diff --git a/tests/draft6/optional/format/email.json b/tests/draft6/optional/format/email.json index 9a557a2e..15fb2482 100644 --- a/tests/draft6/optional/format/email.json +++ b/tests/draft6/optional/format/email.json @@ -633,11 +633,6 @@ "data": "[1.2.3.4]@iana.org", "valid": false }, - { - "description": "IPv4 address literal 0.0.0.0 is valid", - "data": "a@[0.0.0.0]", - "valid": true - }, { "description": "IPv4 octet value over 255 is not valid", "data": "a@[256.0.0.0]", diff --git a/tests/draft7/optional/format/email.json b/tests/draft7/optional/format/email.json index 9a557a2e..15fb2482 100644 --- a/tests/draft7/optional/format/email.json +++ b/tests/draft7/optional/format/email.json @@ -633,11 +633,6 @@ "data": "[1.2.3.4]@iana.org", "valid": false }, - { - "description": "IPv4 address literal 0.0.0.0 is valid", - "data": "a@[0.0.0.0]", - "valid": true - }, { "description": "IPv4 octet value over 255 is not valid", "data": "a@[256.0.0.0]", diff --git a/tests/v1/format/email.json b/tests/v1/format/email.json index bfe03202..e03ee28a 100644 --- a/tests/v1/format/email.json +++ b/tests/v1/format/email.json @@ -671,11 +671,6 @@ "data": "[1.2.3.4]@iana.org", "valid": false }, - { - "description": "IPv4 address literal 0.0.0.0 is valid", - "data": "a@[0.0.0.0]", - "valid": true - }, { "description": "IPv4 octet value over 255 is not valid", "data": "a@[256.0.0.0]",