1*ede46466SAndreas Gohr<?php 2*ede46466SAndreas Gohr 3*ede46466SAndreas Gohrnamespace dokuwiki\test\Search\Query; 4*ede46466SAndreas Gohr 5*ede46466SAndreas Gohruse dokuwiki\Search\Query\NamespacePredicate; 6*ede46466SAndreas Gohruse dokuwiki\Search\Query\PageSet; 7*ede46466SAndreas Gohr 8*ede46466SAndreas Gohrclass NamespacePredicateTest extends \DokuWikiTest 9*ede46466SAndreas Gohr{ 10*ede46466SAndreas Gohr protected PageSet $pages; 11*ede46466SAndreas Gohr 12*ede46466SAndreas Gohr public function setUp(): void 13*ede46466SAndreas Gohr { 14*ede46466SAndreas Gohr parent::setUp(); 15*ede46466SAndreas Gohr $this->pages = new PageSet([ 16*ede46466SAndreas Gohr 'wiki:start' => 5, 17*ede46466SAndreas Gohr 'wiki:syntax' => 3, 18*ede46466SAndreas Gohr 'wiki:sub:page' => 2, 19*ede46466SAndreas Gohr 'other:page' => 4, 20*ede46466SAndreas Gohr 'other:deep:nested' => 1, 21*ede46466SAndreas Gohr 'toplevel' => 6, 22*ede46466SAndreas Gohr ]); 23*ede46466SAndreas Gohr } 24*ede46466SAndreas Gohr 25*ede46466SAndreas Gohr public function testGetPrefix() 26*ede46466SAndreas Gohr { 27*ede46466SAndreas Gohr $ns = new NamespacePredicate('wiki:'); 28*ede46466SAndreas Gohr $this->assertEquals('wiki:', $ns->getPrefix()); 29*ede46466SAndreas Gohr } 30*ede46466SAndreas Gohr 31*ede46466SAndreas Gohr public function testFilterKeepsMatchingNamespace() 32*ede46466SAndreas Gohr { 33*ede46466SAndreas Gohr $ns = new NamespacePredicate('wiki:'); 34*ede46466SAndreas Gohr $result = $ns->filter($this->pages); 35*ede46466SAndreas Gohr 36*ede46466SAndreas Gohr $this->assertEquals([ 37*ede46466SAndreas Gohr 'wiki:start' => 5, 38*ede46466SAndreas Gohr 'wiki:syntax' => 3, 39*ede46466SAndreas Gohr 'wiki:sub:page' => 2, 40*ede46466SAndreas Gohr ], $result->getPages()); 41*ede46466SAndreas Gohr } 42*ede46466SAndreas Gohr 43*ede46466SAndreas Gohr public function testFilterIncludesSubNamespaces() 44*ede46466SAndreas Gohr { 45*ede46466SAndreas Gohr $ns = new NamespacePredicate('wiki:'); 46*ede46466SAndreas Gohr $result = $ns->filter($this->pages); 47*ede46466SAndreas Gohr 48*ede46466SAndreas Gohr $this->assertArrayHasKey('wiki:sub:page', $result->getPages()); 49*ede46466SAndreas Gohr } 50*ede46466SAndreas Gohr 51*ede46466SAndreas Gohr public function testFilterDoesNotMatchPartialPrefix() 52*ede46466SAndreas Gohr { 53*ede46466SAndreas Gohr // "other:" must not match "otherstuff:page" 54*ede46466SAndreas Gohr $pages = new PageSet([ 55*ede46466SAndreas Gohr 'other:page' => 1, 56*ede46466SAndreas Gohr 'otherstuff:page' => 2, 57*ede46466SAndreas Gohr ]); 58*ede46466SAndreas Gohr $ns = new NamespacePredicate('other:'); 59*ede46466SAndreas Gohr $result = $ns->filter($pages); 60*ede46466SAndreas Gohr 61*ede46466SAndreas Gohr $this->assertEquals(['other:page' => 1], $result->getPages()); 62*ede46466SAndreas Gohr } 63*ede46466SAndreas Gohr 64*ede46466SAndreas Gohr public function testExcludeRemovesMatchingNamespace() 65*ede46466SAndreas Gohr { 66*ede46466SAndreas Gohr $ns = new NamespacePredicate('wiki:'); 67*ede46466SAndreas Gohr $result = $ns->exclude($this->pages); 68*ede46466SAndreas Gohr 69*ede46466SAndreas Gohr $this->assertEquals([ 70*ede46466SAndreas Gohr 'other:page' => 4, 71*ede46466SAndreas Gohr 'other:deep:nested' => 1, 72*ede46466SAndreas Gohr 'toplevel' => 6, 73*ede46466SAndreas Gohr ], $result->getPages()); 74*ede46466SAndreas Gohr } 75*ede46466SAndreas Gohr 76*ede46466SAndreas Gohr public function testFilterOnEmptyPageSet() 77*ede46466SAndreas Gohr { 78*ede46466SAndreas Gohr $ns = new NamespacePredicate('wiki:'); 79*ede46466SAndreas Gohr $result = $ns->filter(new PageSet()); 80*ede46466SAndreas Gohr 81*ede46466SAndreas Gohr $this->assertEquals([], $result->getPages()); 82*ede46466SAndreas Gohr } 83*ede46466SAndreas Gohr 84*ede46466SAndreas Gohr public function testFilterNoMatch() 85*ede46466SAndreas Gohr { 86*ede46466SAndreas Gohr $ns = new NamespacePredicate('nonexistent:'); 87*ede46466SAndreas Gohr $result = $ns->filter($this->pages); 88*ede46466SAndreas Gohr 89*ede46466SAndreas Gohr $this->assertEquals([], $result->getPages()); 90*ede46466SAndreas Gohr } 91*ede46466SAndreas Gohr 92*ede46466SAndreas Gohr public function testExcludeNoMatch() 93*ede46466SAndreas Gohr { 94*ede46466SAndreas Gohr $ns = new NamespacePredicate('nonexistent:'); 95*ede46466SAndreas Gohr $result = $ns->exclude($this->pages); 96*ede46466SAndreas Gohr 97*ede46466SAndreas Gohr // all pages should remain 98*ede46466SAndreas Gohr $this->assertEquals($this->pages->getPages(), $result->getPages()); 99*ede46466SAndreas Gohr } 100*ede46466SAndreas Gohr 101*ede46466SAndreas Gohr public function testPreservesScores() 102*ede46466SAndreas Gohr { 103*ede46466SAndreas Gohr $ns = new NamespacePredicate('other:'); 104*ede46466SAndreas Gohr $result = $ns->filter($this->pages); 105*ede46466SAndreas Gohr 106*ede46466SAndreas Gohr $this->assertEquals(4, $result->getPages()['other:page']); 107*ede46466SAndreas Gohr $this->assertEquals(1, $result->getPages()['other:deep:nested']); 108*ede46466SAndreas Gohr } 109*ede46466SAndreas Gohr} 110