expectException(InvalidArgumentException::class); $this->expectExceptionMessage('Invalid email address: inv alid @spa cing.co m'); new EmailAddress('inv alid @spa cing.co m'); } public function test_it_throws_on_invalid_email_format(): void { $this->expectException(InvalidArgumentException::class); $this->expectExceptionMessage('Invalid email address: invalid-email@format@com'); new EmailAddress('invalid-email@format@com'); } public function test_it_throws_on_empty_email(): void { $this->expectException(InvalidArgumentException::class); $this->expectExceptionMessage('Invalid email address: '); new EmailAddress(''); } public function test_it_trims_and_normalizes_domain_case(): void { $email = new EmailAddress(' tEsT@YaHoO.cOm '); $this->assertSame('tEsT@yahoo.com', $email->value()); } public function test_equality_is_by_normalized_value(): void { $first = new EmailAddress('test@TEST.COM'); $second = new EmailAddress('test@test.com'); $this->assertTrue($first->equals($second)); $this->assertTrue($second->equals($first)); } public function test_to_string_returns_normalized_email(): void { $email = new EmailAddress('Test@GMAIL.COM '); $this->assertSame('Test@gmail.com', $email->__toString()); } public function test_get_domain_returns_lowercased_domain(): void { $email = new EmailAddress('User@SubDomain.Example.COM'); $this->assertSame('subdomain.example.com', $email->getDomain()); } }