]> git.openstreetmap.org Git - nominatim.git/blob - test/php/Nominatim/PhraseTest.php
switch to a more flexible variant description format
[nominatim.git] / test / php / Nominatim / PhraseTest.php
1 <?php
2
3 namespace Nominatim;
4
5 require_once(CONST_LibDir.'/Phrase.php');
6
7 class TokensFullSet
8 {
9     public function containsAny($sTerm)
10     {
11         return true;
12     }
13 }
14
15 // phpcs:ignore PSR1.Classes.ClassDeclaration.MultipleClasses
16 class TokensPartialSet
17 {
18     public function __construct($aTokens)
19     {
20         $this->aTokens = array_flip($aTokens);
21     }
22
23     public function containsAny($sTerm)
24     {
25         return isset($this->aTokens[$sTerm]);
26     }
27 }
28
29 // phpcs:ignore PSR1.Classes.ClassDeclaration.MultipleClasses
30 class PhraseTest extends \PHPUnit\Framework\TestCase
31 {
32
33
34     private function serializeSets($aSets)
35     {
36         $aParts = array();
37         foreach ($aSets as $aSet) {
38             $aParts[] = '(' . join('|', $aSet) . ')';
39         }
40         return join(',', $aParts);
41     }
42
43
44     public function testEmptyPhrase()
45     {
46         $oPhrase = new Phrase('', '');
47         $oPhrase->computeWordSets(array(), new TokensFullSet());
48
49         $this->assertNull($oPhrase->getWordSets());
50     }
51
52
53     public function testSingleWordPhrase()
54     {
55         $oPhrase = new Phrase('a', '');
56         $oPhrase->computeWordSets(array('a'), new TokensFullSet());
57
58         $this->assertEquals(
59             '(a)',
60             $this->serializeSets($oPhrase->getWordSets())
61         );
62     }
63
64
65     public function testMultiWordPhrase()
66     {
67         $oPhrase = new Phrase('a b', '');
68         $oPhrase->computeWordSets(array('a', 'b'), new TokensFullSet());
69         $this->assertEquals(
70             '(a b),(a|b)',
71             $this->serializeSets($oPhrase->getWordSets())
72         );
73
74         $oPhrase = new Phrase('a b c', '');
75         $oPhrase->computeWordSets(array('a', 'b', 'c'), new TokensFullSet());
76         $this->assertEquals(
77             '(a b c),(a|b c),(a b|c),(a|b|c)',
78             $this->serializeSets($oPhrase->getWordSets())
79         );
80
81         $oPhrase = new Phrase('a b c d', '');
82         $oPhrase->computeWordSets(array('a', 'b', 'c', 'd'), new TokensFullSet());
83         $this->assertEquals(
84             '(a b c d),(a b c|d),(a b|c d),(a|b c d),(a b|c|d),(a|b c|d),(a|b|c d),(a|b|c|d)',
85             $this->serializeSets($oPhrase->getWordSets())
86         );
87     }
88
89
90     public function testInverseWordSets()
91     {
92         $oPhrase = new Phrase('a b c', '');
93         $oPhrase->computeWordSets(array('a', 'b', 'c'), new TokensFullSet());
94         $oPhrase->invertWordSets();
95
96         $this->assertEquals(
97             '(a b c),(b c|a),(c|a b),(c|b|a)',
98             $this->serializeSets($oPhrase->getWordSets())
99         );
100     }
101
102
103     public function testMaxWordSets()
104     {
105         $aWords = array_fill(0, 4, 'a');
106         $oPhrase = new Phrase(join(' ', $aWords), '');
107         $oPhrase->computeWordSets($aWords, new TokensFullSet());
108         $this->assertEquals(8, count($oPhrase->getWordSets()));
109         $oPhrase->invertWordSets();
110         $this->assertEquals(8, count($oPhrase->getWordSets()));
111
112         $aWords = array_fill(0, 18, 'a');
113         $oPhrase = new Phrase(join(' ', $aWords), '');
114         $oPhrase->computeWordSets($aWords, new TokensFullSet());
115         $this->assertEquals(100, count($oPhrase->getWordSets()));
116         $oPhrase->invertWordSets();
117         $this->assertEquals(100, count($oPhrase->getWordSets()));
118     }
119
120
121     public function testPartialTokensShortTerm()
122     {
123         $oPhrase = new Phrase('a b c d', '');
124         $oPhrase->computeWordSets(array('a', 'b', 'c', 'd'), new TokensPartialSet(array('a', 'b', 'd', 'b c', 'b c d')));
125         $this->assertEquals(
126             '(a|b c d),(a|b c|d)',
127             $this->serializeSets($oPhrase->getWordSets())
128         );
129     }
130
131
132     public function testPartialTokensLongTerm()
133     {
134         $aWords = array_fill(0, 18, 'a');
135         $oPhrase = new Phrase(join(' ', $aWords), '');
136         $oPhrase->computeWordSets($aWords, new TokensPartialSet(array('a', 'a a a a a')));
137         $this->assertEquals(80, count($oPhrase->getWordSets()));
138     }
139 }