Separation of tests to prepare for strictier domain validation

This commit is contained in:
Eduardo Gulias Davis
2020-11-10 10:36:53 +01:00
parent 729ecb2a35
commit c0e4efaeb0
3 changed files with 270 additions and 173 deletions
+31 -20
View File
@@ -41,6 +41,9 @@ class DomainPart extends Parser
return $domainChecks;
}
if ($this->lexer->token['type'] === EmailLexer::S_AT) {
return new InvalidEmail(new ConsecutiveAt(), $this->lexer->token['value']);
}
$domain = $this->doParseDomainPart();
if ($domain->isInvalid()) {
return $domain;
@@ -139,6 +142,7 @@ class DomainPart extends Parser
protected function doParseDomainPart() : Result
{
$tldMissing = true;
$hasComments = false;
$domain = '';
do {
$prev = $this->lexer->getPrevious();
@@ -150,6 +154,7 @@ class DomainPart extends Parser
if ($this->lexer->token['type'] === EmailLexer::S_OPENPARENTHESIS ||
$this->lexer->token['type'] === EmailLexer::S_CLOSEPARENTHESIS ) {
$hasComments = true;
$commentsResult = $this->parseComments();
//Invalid comment parsing
@@ -162,17 +167,16 @@ class DomainPart extends Parser
if ($dotsResult->isInvalid()) {
return $dotsResult;
}
$exceptionsResult = $this->checkDomainPartExceptions($prev);
if ($exceptionsResult->isInvalid()) {
return $exceptionsResult;
}
if ($this->lexer->token['type'] === EmailLexer::S_OPENBRACKET) {
$literalResult = $this->parseDomainLiteral();
$this->addTLDWarnings($tldMissing);
//Invalid literal parsing
if($literalResult->isInvalid()) {
return $literalResult;
}
//if($literalResult->isInvalid()) {
// return $literalResult;
//}
return $literalResult;
}
$this->checkLabelLength($prev);
@@ -188,10 +192,14 @@ class DomainPart extends Parser
$tldMissing = false;
}
$this->lexer->moveNext();
if ($this->lexer->token['type'] === EmailLexer::S_SP) {
return new InvalidEmail(new CharNotAllowed(), $this->lexer->token['value']);
$exceptionsResult = $this->checkDomainPartExceptions($prev, $hasComments);
if ($exceptionsResult->isInvalid()) {
return $exceptionsResult;
}
$this->lexer->moveNext();
//if ($this->lexer->token['type'] === EmailLexer::S_SP) {
// return new InvalidEmail(new CharNotAllowed(), $this->lexer->token['value']);
//}
} while (null !== $this->lexer->token['type']);
@@ -231,7 +239,7 @@ class DomainPart extends Parser
/**
* @return InvalidEmail|ValidEmail
*/
protected function checkDomainPartExceptions(array $prev) : Result
protected function checkDomainPartExceptions(array $prev, bool $hasComments) : Result
{
$invalidDomainTokens = array(
EmailLexer::S_DQUOTE => true,
@@ -241,16 +249,15 @@ class DomainPart extends Parser
EmailLexer::S_LOWERTHAN => true,
);
if (isset($invalidDomainTokens[$this->lexer->token['type']])) {
return new InvalidEmail(new ExpectingATEXT('Invalid token in domain'), $this->lexer->token['value']);
}
$validDomainTokens = array(
EmailLexer::GENERIC => true,
EmailLexer::S_HYPHEN => true,
EmailLexer::S_DOT => true,
);
if ($this->lexer->token['type'] === EmailLexer::S_COMMA) {
return new InvalidEmail(new CommaInDomain(), $this->lexer->token['value']);
}
if ($this->lexer->token['type'] === EmailLexer::S_AT) {
return new InvalidEmail(new ConsecutiveAt(), $this->lexer->token['value']);
if ($hasComments) {
$validDomainTokens[EmailLexer::S_OPENPARENTHESIS] = true;
$validDomainTokens[EmailLexer::S_CLOSEPARENTHESIS] = true;
}
if ($this->lexer->token['type'] === EmailLexer::S_OPENQBRACKET && $prev['type'] !== EmailLexer::S_AT) {
@@ -266,6 +273,10 @@ class DomainPart extends Parser
return new InvalidEmail(new ExpectingATEXT('Escaping following "ATOM"'), $this->lexer->token['value']);
}
if (!isset($validDomainTokens[$this->lexer->token['type']])) {
return new InvalidEmail(new ExpectingATEXT('Invalid token in domain: ' . $this->lexer->token['value']), $this->lexer->token['value']);
}
return new ValidEmail();
}
@@ -0,0 +1,229 @@
<?php
namespace Egulias\EmailValidator\Tests\EmailValidator\Validation;
use PHPUnit\Framework\TestCase;
use Egulias\EmailValidator\EmailLexer;
use Egulias\EmailValidator\Warning\TLD;
use Egulias\EmailValidator\Warning\Comment;
use Egulias\EmailValidator\Warning\CFWSNearAt;
use Egulias\EmailValidator\Result\InvalidEmail;
use Egulias\EmailValidator\Warning\CFWSWithFWS;
use Egulias\EmailValidator\Warning\IPV6BadChar;
use Egulias\EmailValidator\Result\Reason\CRNoLF;
use Egulias\EmailValidator\Warning\IPV6ColonEnd;
use Egulias\EmailValidator\Warning\LabelTooLong;
use Egulias\EmailValidator\Warning\QuotedString;
use Egulias\EmailValidator\Warning\DomainLiteral;
use Egulias\EmailValidator\Warning\DomainTooLong;
use Egulias\EmailValidator\Warning\IPV6MaxGroups;
use Egulias\EmailValidator\Warning\ObsoleteDTEXT;
use Egulias\EmailValidator\Result\Reason\DotAtEnd;
use Egulias\EmailValidator\Warning\AddressLiteral;
use Egulias\EmailValidator\Warning\IPV6ColonStart;
use Egulias\EmailValidator\Warning\IPV6Deprecated;
use Egulias\EmailValidator\Warning\IPV6GroupCount;
use Egulias\EmailValidator\Warning\IPV6DoubleColon;
use Egulias\EmailValidator\Result\Reason\DotAtStart;
use Egulias\EmailValidator\Validation\RFCValidation;
use Egulias\EmailValidator\Result\Reason\NoDomainPart;
use Egulias\EmailValidator\Result\Reason\ConsecutiveAt;
use Egulias\EmailValidator\Result\Reason\ConsecutiveDot;
use Egulias\EmailValidator\Result\Reason\DomainHyphened;
use Egulias\EmailValidator\Result\Reason\ExpectingATEXT;
use Egulias\EmailValidator\Result\Reason\ExpectingDTEXT;
use Egulias\EmailValidator\Result\Reason\UnOpenedComment;
class RFCValidationDomainPartTest extends TestCase
{
/**
* @var RFCValidation
*/
protected $validator;
/**
* @var EmailLexer
*/
protected $lexer;
protected function setUp() : void
{
$this->validator = new RFCValidation();
$this->lexer = new EmailLexer();
}
protected function tearDown() : void
{
$this->validator = null;
}
/**
* @dataProvider getValidEmails
*/
public function testValidEmails($email)
{
$this->assertTrue($this->validator->isValid($email, $this->lexer));
}
public function getValidEmails()
{
return array(
['fabien@symfony.com'],
['example@example.co.uk'],
['example@localhost'],
['example@faked(fake).co.uk'],
['инфо@письмо.рф'],
['müller@möller.de'],
['test@email*'],
['test@email!'],
['test@email&'],
['test@email^'],
['test@email%'],
['test@email$'],
["1500111@профи-инвест.рф"],
['validipv6@[IPv6:2001:db8:1ff::a0b:dbd0]'],
['validipv4@[127.0.0.0]'],
['validipv4@127.0.0.0'],
['withhyphen@domain-exam.com'],
);
}
/**
* @dataProvider getInvalidEmails
*/
public function testInvalidEmails($email)
{
$this->assertFalse($this->validator->isValid($email, $this->lexer));
}
public function getInvalidEmails()
{
return [
['test@example.com test'],
['example@example@example.co.uk'],
['test_exampel@example.fr]'],
['example@local\host'],
['example@localhost\\'],
['example@localhost.'],
['username@ example . com'],
['example@(fake].com'],
['example@(fake.com'],
['username@example,com'],
['test@' . chr(226) . '.org'],
['test@iana.org \r\n'],
['test@iana.org \r\n '],
['test@iana.org \r\n \r\n'],
['test@iana.org \r\n\r\n'],
['test@iana.org \r\n\r\n '],
['test@iana/icann.org'],
['test@foo;bar.com'],
['test@example..com'],
["test@examp'le.com"],
['email.email@email."'],
['test@email>'],
['test@email<'],
['test@email{'],
['username@examp,le.com'],
['test@ '],
['invalidipv4@[127.\0.0.0]'],
['test@example.com []'],
['test@example.com. []'],
['test@test. example.com'],
];
}
/**
* @dataProvider getInvalidEmailsWithErrors
*/
public function testInvalidEmailsWithErrorsCheck($error, $email)
{
$this->assertFalse($this->validator->isValid($email, $this->lexer));
$this->assertEquals($error, $this->validator->getError());
}
public function getInvalidEmailsWithErrors()
{
return [
[new InvalidEmail(new NoDomainPart(), ''), 'example@'],
[new InvalidEmail(new DomainHyphened('Hypen found near DOT'), '-'), 'example@example-.co.uk'], [new InvalidEmail(new CRNoLF(), "\r"), "example@example\r.com"],
[new InvalidEmail(new DomainHyphened('Hypen found at the end of the domain'), '-'), 'example@example-'],
[new InvalidEmail(new ConsecutiveAt(), '@'), 'example@@example.co.uk'],
[new InvalidEmail(new ConsecutiveDot(), '.'), 'example@example..co.uk'],
[new InvalidEmail(new DotAtStart(), '.'), 'example@.localhost'],
[new InvalidEmail(new DomainHyphened('After AT'), '-'), 'example@-localhost'],
[new InvalidEmail(new DotAtEnd(), ''), 'example@localhost.'],
[new InvalidEmail(new UnOpenedComment(), ')'), 'example@comment)localhost'],
[new InvalidEmail(new UnOpenedComment(), ')'), 'example@localhost(comment))'],
[new InvalidEmail(new UnOpenedComment(), 'com'), 'example@(comment))example.com'],
[new InvalidEmail(new ExpectingDTEXT(), '['), "example@[[]"],
[new InvalidEmail(new CRNoLF(), "\r"), "example@exa\rmple.co.uk"],
[new InvalidEmail(new CRNoLF(), "["), "example@[\r]"],
[new InvalidEmail(new ExpectingATEXT('Invalid token in domain: ,'), ','), 'example@exam,ple.com'],
[new InvalidEmail(new ExpectingATEXT("Invalid token in domain: '"), "'"), "test@example.com'"],
];
}
/**
* @dataProvider getValidEmailsWithWarnings
*/
public function testValidEmailsWithWarningsCheck($expectedWarnings, $email)
{
$this->assertTrue($this->validator->isValid($email, $this->lexer));
$warnings = $this->validator->getWarnings();
$this->assertCount(
count($expectedWarnings), $warnings,
"Expected: " . implode(",", $expectedWarnings) . " and got: " . PHP_EOL . implode(PHP_EOL, $warnings)
);
foreach ($warnings as $warning) {
$this->assertArrayHasKey($warning->code(), $expectedWarnings);
}
}
public function getValidEmailsWithWarnings()
{
return [
[[CFWSNearAt::CODE], 'example@ invalid.example.com'],
[[Comment::CODE], 'example@invalid.example(examplecomment).com'],
[[AddressLiteral::CODE, TLD::CODE], 'example@[127.0.0.1]'],
[[AddressLiteral::CODE, TLD::CODE], 'example@[IPv6:2001:0db8:85a3:0000:0000:8a2e:0370:7334]'],
[[AddressLiteral::CODE, IPV6Deprecated::CODE, TLD::CODE], 'example@[IPv6:2001:0db8:85a3:0000:0000:8a2e:0370::]'],
[[AddressLiteral::CODE, IPV6MaxGroups::CODE, TLD::CODE], 'example@[IPv6:2001:0db8:85a3:0000:0000:8a2e:0370:7334::]'],
[[AddressLiteral::CODE, IPV6DoubleColon::CODE, TLD::CODE], 'example@[IPv6:1::1::1]'],
[[ObsoleteDTEXT::CODE, DomainLiteral::CODE, TLD::CODE], "example@[\n]"],
[[DomainLiteral::CODE, TLD::CODE], 'example@[::1]'],
[[DomainLiteral::CODE, TLD::CODE], 'example@[::123.45.67.178]'],
[
[IPV6ColonStart::CODE, AddressLiteral::CODE, IPV6GroupCount::CODE, TLD::CODE],
'example@[IPv6::2001:0db8:85a3:0000:0000:8a2e:0370:7334]'
],
[
[AddressLiteral::CODE, IPV6BadChar::CODE, TLD::CODE],
'example@[IPv6:z001:0db8:85a3:0000:0000:8a2e:0370:7334]'
],
[
[AddressLiteral::CODE, IPV6ColonEnd::CODE, TLD::CODE],
'example@[IPv6:2001:0db8:85a3:0000:0000:8a2e:0370:]'
],
[
[LabelTooLong::CODE,],
'example@toolonglocalparttoolonglocalparttoolonglocalparttoolonglocalpart.co.uk'
],
[
[DomainTooLong::CODE, LabelTooLong::CODE, TLD::CODE],
'example2@toolonglocalparttoolonglocalparttoolonglocalparttoolonglocalparttoolonglocalparttoolonglocal'.
'parttoolonglocalparttoolonglocalparttoolonglocalparttoolonglocalparttoolonglocalparttoolonglocalpart'.
'toolonglocalparttoolonglocalparttoolonglocalparttoolonglocalpart'
],
[
[DomainTooLong::CODE, LabelTooLong::CODE, TLD::CODE],
'example@toolonglocalparttoolonglocalparttoolonglocalparttoolonglocalparttoolonglocalparttoolonglocal'.
'parttoolonglocalparttoolonglocalparttoolonglocalparttoolonglocalparttoolonglocalparttoolonglocalpart'.
'toolonglocalparttoolonglocalparttoolonglocalparttoolonglocalpar'
],
];
}
}
@@ -8,35 +8,18 @@ use Egulias\EmailValidator\Warning\Comment;
use Egulias\EmailValidator\Warning\CFWSNearAt;
use Egulias\EmailValidator\Result\InvalidEmail;
use Egulias\EmailValidator\Warning\CFWSWithFWS;
use Egulias\EmailValidator\Warning\IPV6BadChar;
use Egulias\EmailValidator\Warning\IPV6ColonEnd;
use Egulias\EmailValidator\Warning\LabelTooLong;
use Egulias\EmailValidator\Warning\LocalTooLong;
use Egulias\EmailValidator\Warning\QuotedString;
use Egulias\EmailValidator\Warning\DomainLiteral;
use Egulias\EmailValidator\Warning\DomainTooLong;
use Egulias\EmailValidator\Warning\IPV6MaxGroups;
use Egulias\EmailValidator\Warning\ObsoleteDTEXT;
use Egulias\EmailValidator\Warning\AddressLiteral;
use Egulias\EmailValidator\Warning\IPV6ColonStart;
use Egulias\EmailValidator\Warning\IPV6Deprecated;
use Egulias\EmailValidator\Warning\IPV6GroupCount;
use Egulias\EmailValidator\Warning\IPV6DoubleColon;
use Egulias\EmailValidator\Validation\RFCValidation;
use Egulias\EmailValidator\Result\Reason\NoLocalPart;
use Egulias\EmailValidator\Result\Reason\AtextAfterCFWS;
use Egulias\EmailValidator\Result\Reason\CommaInDomain;
use Egulias\EmailValidator\Result\Reason\ConsecutiveAt;
use Egulias\EmailValidator\Result\Reason\UnOpenedComment;
use Egulias\EmailValidator\Result\Reason\UnclosedQuotedString;
use Egulias\EmailValidator\Result\Reason\CRNoLF;
use Egulias\EmailValidator\Result\Reason\DotAtEnd;
use Egulias\EmailValidator\Result\Reason\DotAtStart;
use Egulias\EmailValidator\Result\Reason\NoDomainPart;
use Egulias\EmailValidator\Result\Reason\ConsecutiveDot;
use Egulias\EmailValidator\Result\Reason\DomainHyphened;
use Egulias\EmailValidator\Result\Reason\ExpectingATEXT;
use Egulias\EmailValidator\Result\Reason\ExpectingDTEXT;
use Egulias\EmailValidator\Result\Reason\UnclosedComment;
use Egulias\EmailValidator\Warning\TLD;
@@ -78,11 +61,9 @@ class RFCValidationTest extends TestCase
['fabien@symfony.com'],
['example@example.co.uk'],
['fabien_potencier@example.fr'],
['example@localhost'],
['fab\'ien@symfony.com'],
['fab\ ien@symfony.com'],
['example((example))@fakedfake.co.uk'],
['example@faked(fake).co.uk'],
['fabien+@symfony.com'],
['инфо@письмо.рф'],
['"username"@example.com'],
@@ -95,18 +76,7 @@ class RFCValidationTest extends TestCase
['""@iana.org'],
['"\""@iana.org'],
['müller@möller.de'],
['test@email*'],
['test@email!'],
['test@email&'],
['test@email^'],
['test@email%'],
['test@email$'],
["1500111@профи-инвест.рф"],
['validipv6@[IPv6:2001:db8:1ff::a0b:dbd0]'],
['validipv4@[127.0.0.0]'],
['validipv4@127.0.0.0'],
['withhyphen@domain-exam.com'],
);
}
@@ -123,7 +93,14 @@ class RFCValidationTest extends TestCase
{
return [
['a5aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@example.com', [new LocalTooLong()]],
['example@example', [new TLD()]]
['example@example', [new TLD()]],
['example @invalid.example.com', [new CFWSNearAt()]],
['example(examplecomment)@invalid.example.com',[new Comment(), new CFWSNearAt()]],
["\"\t\"@invalid.example.com", [new QuotedString("", '"'), new CFWSWithFWS(),]],
["\"\r\"@invalid.example.com", [new QuotedString('', '"'), new CFWSWithFWS(),]],
['"example"@invalid.example.com', [new QuotedString('', '"')]],
['too_long_localpart_too_long_localpart_too_long_localpart_too_long_localpart@invalid.example.com',
[new LocalTooLong()]],
];
}
@@ -144,23 +121,15 @@ class RFCValidationTest extends TestCase
public function getInvalidEmails()
{
return [
['test@example.com test'],
['user name@example.com'],
['user name@example.com'],
['example.@example.co.uk'],
['example@example@example.co.uk'],
['(test_exampel@example.fr]'],
['(test_exampel@example.fr'],
['example(example]example@example.co.uk'],
['.example@localhost'],
['ex\ample@localhost'],
['example@local\host'],
['example@localhost\\'],
['example@localhost.'],
['user name@example.com'],
['username@ example . com'],
['example@(fake].com'],
['example@(fake.com'],
['username@example,com'],
['usern,ame@example.com'],
['user[na]me@example.com'],
['"""@iana.org'],
@@ -172,32 +141,12 @@ class RFCValidationTest extends TestCase
['"test"' . chr(0) . '@iana.org'],
['"test\"@iana.org'],
[chr(226) . '@iana.org'],
['test@' . chr(226) . '.org'],
['\r\ntest@iana.org'],
['\r\n test@iana.org'],
['\r\n \r\ntest@iana.org'],
['\r\n \r\ntest@iana.org'],
['\r\n \r\n test@iana.org'],
['test@iana.org \r\n'],
['test@iana.org \r\n '],
['test@iana.org \r\n \r\n'],
['test@iana.org \r\n\r\n'],
['test@iana.org \r\n\r\n '],
['test@iana/icann.org'],
['test@foo;bar.com'],
['test;123@foobar.com'],
['test@example..com'],
["test@examp'le.com"],
['email.email@email."'],
['test@email>'],
['test@email<'],
['test@email{'],
['username@examp,le.com'],
['test@ '],
['validipv4@[127.\0.0.0]'],
['test@example.com []'],
['test@example.com. []'],
['test@test. example.com'],
];
}
@@ -214,17 +163,9 @@ class RFCValidationTest extends TestCase
{
return [
[new InvalidEmail(new NoLocalPart(), "@"), '@example.co.uk'],
[new InvalidEmail(new NoDomainPart(), ''), 'example@'],
[new InvalidEmail(new DomainHyphened('Hypen found near DOT'), '-'), 'example@example-.co.uk'], [new InvalidEmail(new CRNoLF(), "\r"), "example@example\r.com"],
[new InvalidEmail(new DomainHyphened('Hypen found at the end of the domain'), '-'), 'example@example-'],
[new InvalidEmail(new ConsecutiveAt(), '@'), 'example@@example.co.uk'],
[new InvalidEmail(new ConsecutiveDot(), '.'), 'example..example@example.co.uk'],
[new InvalidEmail(new ConsecutiveDot(), '.'), 'example@example..co.uk'],
[new InvalidEmail(new ExpectingATEXT('Invalid token found'), '<'), '<example_example>@example.fr'],
[new InvalidEmail(new DotAtStart(), '.'), '.example@localhost'],
[new InvalidEmail(new DotAtStart(), '.'), 'example@.localhost'],
[new InvalidEmail(new DomainHyphened('After AT'), '-'), 'example@-localhost'],
[new InvalidEmail(new DotAtEnd(), ''), 'example@localhost.'],
[new InvalidEmail(new DotAtEnd(), '.'), 'example.@example.co.uk'],
[new InvalidEmail(new UnclosedComment(), '('), '(example@localhost'],
[new InvalidEmail(new UnclosedQuotedString(), '"'), '"example@localhost'],
@@ -236,93 +177,9 @@ class RFCValidationTest extends TestCase
],
[new InvalidEmail(new UnOpenedComment(), ')'), 'comment)example@localhost'],
[new InvalidEmail(new UnOpenedComment(), ')'), 'example(comment))@localhost'],
[new InvalidEmail(new UnOpenedComment(), ')'), 'example@comment)localhost'],
[new InvalidEmail(new UnOpenedComment(), ')'), 'example@localhost(comment))'],
[new InvalidEmail(new UnOpenedComment(), 'com'), 'example@(comment))example.com'],
//This was the original. But atext is not allowed after \n
//array(EmailValidator::ERR_EXPECTING_ATEXT, "exampl\ne@example.co.uk"),
[new InvalidEmail(new AtextAfterCFWS(), "\n"), "exampl\ne@example.co.uk"],
[new InvalidEmail(new ExpectingDTEXT(), '['), "example@[[]"],
[new InvalidEmail(new AtextAfterCFWS(), "\t"), "exampl\te@example.co.uk"],
[new InvalidEmail(new CRNoLF(), "\r"), "example@exa\rmple.co.uk"],
[new InvalidEmail(new CRNoLF(), "["), "example@[\r]"],
[new InvalidEmail(new CRNoLF(), "\r"), "exam\rple@example.co.uk"],
[new InvalidEmail(new CommaInDomain(), ','), 'example@exam,ple.com'],
[new InvalidEmail(new ExpectingATEXT('Invalid token in domain'), "'"), "test@example.com'"],
];
}
/**
* @dataProvider getInvalidEmailsWithWarnings
*/
public function testInvalidEmailsWithWarningsCheck($expectedWarnings, $email)
{
$this->assertTrue($this->validator->isValid($email, $this->lexer));
$warnings = $this->validator->getWarnings();
$this->assertCount(
count($expectedWarnings), $warnings,
"Expected: " . implode(",", $expectedWarnings) . " and got: " . PHP_EOL . implode(PHP_EOL, $warnings)
);
foreach ($warnings as $warning) {
$this->assertArrayHasKey($warning->code(), $expectedWarnings);
}
}
public function getInvalidEmailsWithWarnings()
{
return [
[[CFWSNearAt::CODE], 'example @invalid.example.com'],
[[CFWSNearAt::CODE], 'example@ invalid.example.com'],
[[Comment::CODE], 'example@invalid.example(examplecomment).com'],
[[Comment::CODE,CFWSNearAt::CODE], 'example(examplecomment)@invalid.example.com'],
[[QuotedString::CODE, CFWSWithFWS::CODE,], "\"\t\"@invalid.example.com"],
[[QuotedString::CODE, CFWSWithFWS::CODE,], "\"\r\"@invalid.example.com"],
[[AddressLiteral::CODE, TLD::CODE], 'example@[127.0.0.1]'],
[[AddressLiteral::CODE, TLD::CODE], 'example@[IPv6:2001:0db8:85a3:0000:0000:8a2e:0370:7334]'],
[[AddressLiteral::CODE, IPV6Deprecated::CODE, TLD::CODE], 'example@[IPv6:2001:0db8:85a3:0000:0000:8a2e:0370::]'],
[[AddressLiteral::CODE, IPV6MaxGroups::CODE, TLD::CODE], 'example@[IPv6:2001:0db8:85a3:0000:0000:8a2e:0370:7334::]'],
[[AddressLiteral::CODE, IPV6DoubleColon::CODE, TLD::CODE], 'example@[IPv6:1::1::1]'],
[[ObsoleteDTEXT::CODE, DomainLiteral::CODE, TLD::CODE], "example@[\n]"],
[[DomainLiteral::CODE, TLD::CODE], 'example@[::1]'],
[[DomainLiteral::CODE, TLD::CODE], 'example@[::123.45.67.178]'],
[
[IPV6ColonStart::CODE, AddressLiteral::CODE, IPV6GroupCount::CODE, TLD::CODE],
'example@[IPv6::2001:0db8:85a3:0000:0000:8a2e:0370:7334]'
],
[
[AddressLiteral::CODE, IPV6BadChar::CODE, TLD::CODE],
'example@[IPv6:z001:0db8:85a3:0000:0000:8a2e:0370:7334]'
],
[
[AddressLiteral::CODE, IPV6ColonEnd::CODE, TLD::CODE],
'example@[IPv6:2001:0db8:85a3:0000:0000:8a2e:0370:]'
],
[[QuotedString::CODE,], '"example"@invalid.example.com'],
[
[LocalTooLong::CODE,],
'too_long_localpart_too_long_localpart_too_long_localpart_too_long_localpart@invalid.example.com'
],
[
[LocalTooLong::CODE],
'too_long_localpart_too_long_localpart_123_too_long_localpart_too_long_localpart@example.com'
],
[
[LabelTooLong::CODE,],
'example@toolonglocalparttoolonglocalparttoolonglocalparttoolonglocalpart.co.uk'
],
[
[DomainTooLong::CODE, LabelTooLong::CODE, TLD::CODE],
'example2@toolonglocalparttoolonglocalparttoolonglocalparttoolonglocalparttoolonglocalparttoolonglocal'.
'parttoolonglocalparttoolonglocalparttoolonglocalparttoolonglocalparttoolonglocalparttoolonglocalpart'.
'toolonglocalparttoolonglocalparttoolonglocalparttoolonglocalpart'
],
[
[DomainTooLong::CODE, LabelTooLong::CODE, TLD::CODE],
'example@toolonglocalparttoolonglocalparttoolonglocalparttoolonglocalparttoolonglocalparttoolonglocal'.
'parttoolonglocalparttoolonglocalparttoolonglocalparttoolonglocalparttoolonglocalparttoolonglocalpart'.
'toolonglocalparttoolonglocalparttoolonglocalparttoolonglocalpar'
],
];
}
}
}