'Александр', 'text-212' => '+79776277470', ]); self::assertSame('Александр', $r); } public function test_finds_multiword_cyrillic_name(): void { $r = FieldDetector::find_name(['x' => 'Анна Петровна']); self::assertSame('Анна Петровна', $r); } public function test_finds_latin_name(): void { $r = FieldDetector::find_name(['x' => 'John Smith']); self::assertSame('John Smith', $r); } public function test_skips_values_with_digits(): void { $r = FieldDetector::find_name([ 'a' => '+79776277470', 'b' => 'Ольга', ]); self::assertSame('Ольга', $r); } public function test_skips_urls(): void { $r = FieldDetector::find_name([ 'a' => 'https://evil.com', 'b' => 'Павел', ]); self::assertSame('Павел', $r); } public function test_skips_emails(): void { $r = FieldDetector::find_name([ 'a' => 'anna@mail.ru', 'b' => 'Анна', ]); self::assertSame('Анна', $r); } public function test_skips_too_short(): void { $r = FieldDetector::find_name([ 'a' => 'X', 'b' => 'Дарья', ]); self::assertSame('Дарья', $r); } public function test_skips_too_long(): void { $r = FieldDetector::find_name([ 'a' => str_repeat('а', 200), 'b' => 'Лена', ]); self::assertSame('Лена', $r); } public function test_no_name_returns_empty(): void { $r = FieldDetector::find_name([ 'a' => '+79031234567', 'b' => '1', 'c' => 'http://x.y', ]); self::assertSame('', $r); } public function test_finds_email(): void { $r = FieldDetector::find_email(['x-1' => 'user@example.com']); self::assertSame('user@example.com', $r); } public function test_no_email_returns_empty_when_only_phone(): void { $r = FieldDetector::find_email([ 'x' => 'Иван', 'y' => '+79031234567', ]); self::assertSame('', $r); } public function test_email_is_trimmed(): void { $r = FieldDetector::find_email(['x' => ' anna@mail.ru ']); self::assertSame('anna@mail.ru', $r); } public function test_first_email_wins_when_multiple(): void { $r = FieldDetector::find_email([ 'a' => 'first@a.ru', 'b' => 'second@b.ru', ]); self::assertSame('first@a.ru', $r); } }