File: MatcherTest.php

package info (click to toggle)
php-giggsey-libphonenumber 9.0.23-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 22,492 kB
  • sloc: php: 485,443; sh: 107; makefile: 37
file content (93 lines) | stat: -rw-r--r-- 3,504 bytes parent folder | download | duplicates (2)
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;
    }
}