1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93
|
<?php
declare(strict_types=1);
namespace libphonenumber\Tests\core;
use libphonenumber\MatcherAPIInterface;
use libphonenumber\PhoneNumberDesc;
use libphonenumber\RegexBasedMatcher;
use PHPUnit\Framework\TestCase;
use function strlen;
class MatcherTest extends TestCase
{
public function testRegexBasedMatcher(): void
{
$this->checkMatcherBehavesAsExpected(new RegexBasedMatcher());
}
private function checkMatcherBehavesAsExpected(MatcherAPIInterface $matcher): void
{
$desc = $this->createDesc('');
// Test if there is no matcher data.
self::assertInvalid($matcher, '1', $desc);
$desc = $this->createDesc('9\\d{2}');
self::assertInvalid($matcher, '91', $desc);
self::assertInvalid($matcher, '81', $desc);
self::assertMatched($matcher, '911', $desc);
self::assertInvalid($matcher, '811', $desc);
self::assertTooLong($matcher, '9111', $desc);
self::assertInvalid($matcher, '8111', $desc);
$desc = $this->createDesc('\\d{1,2}');
self::assertMatched($matcher, '2', $desc);
self::assertMatched($matcher, '20', $desc);
$desc = $this->createDesc('20?');
self::assertMatched($matcher, '2', $desc);
self::assertMatched($matcher, '20', $desc);
$desc = $this->createDesc('2|20');
self::assertMatched($matcher, '2', $desc);
// Subtle case where lookingAt() and matches() result in different ends().
self::assertMatched($matcher, '20', $desc);
}
/**
* Helper method to set national number fields in the PhoneNumberDesc proto. Empty fields won't be
* set.
*/
private function createDesc(string $nationalNumberPattern): PhoneNumberDesc
{
$desc = new PhoneNumberDesc();
if (strlen($nationalNumberPattern) > 0) {
$desc->setNationalNumberPattern($nationalNumberPattern);
}
return $desc;
}
private function assertMatched(MatcherAPIInterface $matcher, string $number, PhoneNumberDesc $desc): void
{
self::assertTrue($matcher->matchNationalNumber($number, $desc, false), "{$number} should have matched {$this->descToString($desc)}");
self::assertTrue($matcher->matchNationalNumber($number, $desc, true), "{$number} should have matched {$this->descToString($desc)}");
}
private function assertInvalid(MatcherAPIInterface $matcher, string $number, PhoneNumberDesc $desc): void
{
self::assertFalse($matcher->matchNationalNumber($number, $desc, false), "{$number} should not have matched {$this->descToString($desc)}");
self::assertFalse($matcher->matchNationalNumber($number, $desc, true), "{$number} should not have matched {$this->descToString($desc)}");
}
private function assertTooLong(MatcherAPIInterface $matcher, string $number, PhoneNumberDesc $desc): void
{
self::assertFalse($matcher->matchNationalNumber($number, $desc, false), "{$number} should have been too long for {$this->descToString($desc)}");
self::assertTrue($matcher->matchNationalNumber($number, $desc, true), "{$number} should have been too long for {$this->descToString($desc)}");
}
private function descToString(PhoneNumberDesc $desc): string
{
$string = 'pattern: ';
if ($desc->hasNationalNumberPattern()) {
$string .= $desc->getNationalNumberPattern();
} else {
$string .= 'none';
}
return $string;
}
}
|