1*8fed17f3SAndreas Gohr<?php 2*8fed17f3SAndreas Gohr 3*8fed17f3SAndreas Gohrnamespace dokuwiki\plugin\struct\test; 4*8fed17f3SAndreas Gohr 5*8fed17f3SAndreas Gohr/** 6*8fed17f3SAndreas Gohr * @group plugin_struct 7*8fed17f3SAndreas Gohr * @group plugins 8*8fed17f3SAndreas Gohr * 9*8fed17f3SAndreas Gohr */ 10*8fed17f3SAndreas Gohrclass AssignmentsTest extends StructTest 11*8fed17f3SAndreas Gohr{ 12*8fed17f3SAndreas Gohr 13*8fed17f3SAndreas Gohr public function test_patternmatching() 14*8fed17f3SAndreas Gohr { 15*8fed17f3SAndreas Gohr $ass = mock\Assignments::getInstance(); 16*8fed17f3SAndreas Gohr 17*8fed17f3SAndreas Gohr $this->assertTrue($ass->matchPagePattern('some:ns:page', 'some:ns:page')); 18*8fed17f3SAndreas Gohr $this->assertTrue($ass->matchPagePattern('some:ns:*', 'some:ns:page')); 19*8fed17f3SAndreas Gohr $this->assertTrue($ass->matchPagePattern('some:**', 'some:ns:page')); 20*8fed17f3SAndreas Gohr $this->assertTrue($ass->matchPagePattern('**', 'some:ns:page')); 21*8fed17f3SAndreas Gohr 22*8fed17f3SAndreas Gohr $this->assertFalse($ass->matchPagePattern('some:ns:page', 'some:ns:other')); 23*8fed17f3SAndreas Gohr $this->assertFalse($ass->matchPagePattern('some:ns:*', 'some:ns:deep:other')); 24*8fed17f3SAndreas Gohr 25*8fed17f3SAndreas Gohr // some regexes 26*8fed17f3SAndreas Gohr $this->assertTrue($ass->matchPagePattern('/page/', 'somepagehere')); 27*8fed17f3SAndreas Gohr $this->assertFalse($ass->matchPagePattern('/:page/', 'somepagehere')); 28*8fed17f3SAndreas Gohr $this->assertTrue($ass->matchPagePattern('/:page/', 'some:pagehere')); 29*8fed17f3SAndreas Gohr $this->assertTrue($ass->matchPagePattern('/:page/', 'pagehere')); 30*8fed17f3SAndreas Gohr } 31*8fed17f3SAndreas Gohr 32*8fed17f3SAndreas Gohr /** 33*8fed17f3SAndreas Gohr * check clearing works 34*8fed17f3SAndreas Gohr */ 35*8fed17f3SAndreas Gohr public function test_clear() 36*8fed17f3SAndreas Gohr { 37*8fed17f3SAndreas Gohr $ass = mock\Assignments::getInstance(); 38*8fed17f3SAndreas Gohr $this->assertTrue($ass->clear()); 39*8fed17f3SAndreas Gohr $ass->addPattern('foo', 'foo'); 40*8fed17f3SAndreas Gohr $ass->assignPageSchema('foo', 'foo'); 41*8fed17f3SAndreas Gohr $this->assertTrue($ass->clear()); 42*8fed17f3SAndreas Gohr 43*8fed17f3SAndreas Gohr $this->assertEquals([], $ass->getAllPatterns()); 44*8fed17f3SAndreas Gohr $this->assertEquals([], $ass->getPageAssignments('foo', true)); 45*8fed17f3SAndreas Gohr $this->assertEquals([], $ass->getPageAssignments('foo', false)); 46*8fed17f3SAndreas Gohr 47*8fed17f3SAndreas Gohr // old page is still known 48*8fed17f3SAndreas Gohr $this->assertEquals(['foo' => ['foo' => false]], $ass->getPages()); 49*8fed17f3SAndreas Gohr 50*8fed17f3SAndreas Gohr // now it's gone 51*8fed17f3SAndreas Gohr $ass->clear(true); 52*8fed17f3SAndreas Gohr $this->assertEquals([], $ass->getPages()); 53*8fed17f3SAndreas Gohr } 54*8fed17f3SAndreas Gohr 55*8fed17f3SAndreas Gohr /** 56*8fed17f3SAndreas Gohr * basic usage 57*8fed17f3SAndreas Gohr */ 58*8fed17f3SAndreas Gohr public function test_patternassigns() 59*8fed17f3SAndreas Gohr { 60*8fed17f3SAndreas Gohr $ass = mock\Assignments::getInstance(); 61*8fed17f3SAndreas Gohr $ass->clear(true); 62*8fed17f3SAndreas Gohr 63*8fed17f3SAndreas Gohr $ass->addPattern('a:single:page', 'singlepage'); 64*8fed17f3SAndreas Gohr $ass->addPattern('the:namespace:*', 'singlens'); 65*8fed17f3SAndreas Gohr $ass->addPattern('another:namespace:**', 'deepns'); 66*8fed17f3SAndreas Gohr 67*8fed17f3SAndreas Gohr $this->assertEquals( 68*8fed17f3SAndreas Gohr [ 69*8fed17f3SAndreas Gohr [ 70*8fed17f3SAndreas Gohr 'pattern' => 'a:single:page', 71*8fed17f3SAndreas Gohr 'tbl' => 'singlepage' 72*8fed17f3SAndreas Gohr ], 73*8fed17f3SAndreas Gohr [ 74*8fed17f3SAndreas Gohr 'pattern' => 'another:namespace:**', 75*8fed17f3SAndreas Gohr 'tbl' => 'deepns' 76*8fed17f3SAndreas Gohr ], 77*8fed17f3SAndreas Gohr [ 78*8fed17f3SAndreas Gohr 'pattern' => 'the:namespace:*', 79*8fed17f3SAndreas Gohr 'tbl' => 'singlens' 80*8fed17f3SAndreas Gohr ] 81*8fed17f3SAndreas Gohr ], 82*8fed17f3SAndreas Gohr $ass->getAllPatterns() 83*8fed17f3SAndreas Gohr ); 84*8fed17f3SAndreas Gohr 85*8fed17f3SAndreas Gohr $this->assertEquals([], $ass->getPageAssignments('foo')); 86*8fed17f3SAndreas Gohr $this->assertEquals([], $ass->getPageAssignments('a:single')); 87*8fed17f3SAndreas Gohr $this->assertEquals(['singlepage'], $ass->getPageAssignments('a:single:page')); 88*8fed17f3SAndreas Gohr 89*8fed17f3SAndreas Gohr $this->assertEquals([], $ass->getPageAssignments('the:foo')); 90*8fed17f3SAndreas Gohr $this->assertEquals(['singlens'], $ass->getPageAssignments('the:namespace:foo')); 91*8fed17f3SAndreas Gohr $this->assertEquals([], $ass->getPageAssignments('the:namespace:foo:bar')); 92*8fed17f3SAndreas Gohr 93*8fed17f3SAndreas Gohr $this->assertEquals([], $ass->getPageAssignments('another:foo')); 94*8fed17f3SAndreas Gohr $this->assertEquals(['deepns'], $ass->getPageAssignments('another:namespace:foo')); 95*8fed17f3SAndreas Gohr $this->assertEquals(['deepns'], $ass->getPageAssignments('another:namespace:foo:bar')); 96*8fed17f3SAndreas Gohr $this->assertEquals(['deepns'], $ass->getPageAssignments('another:namespace:foo:bar:baz')); 97*8fed17f3SAndreas Gohr 98*8fed17f3SAndreas Gohr $ass->removePattern('a:single:page', 'singlepage'); 99*8fed17f3SAndreas Gohr $ass->removePattern('the:namespace:*', 'singlens'); 100*8fed17f3SAndreas Gohr $ass->removePattern('another:namespace:**', 'deepns'); 101*8fed17f3SAndreas Gohr 102*8fed17f3SAndreas Gohr $this->assertEquals([], $ass->getAllPatterns()); 103*8fed17f3SAndreas Gohr } 104*8fed17f3SAndreas Gohr 105*8fed17f3SAndreas Gohr /** 106*8fed17f3SAndreas Gohr * Check reevaluation of patterns for a specific page works 107*8fed17f3SAndreas Gohr */ 108*8fed17f3SAndreas Gohr public function test_pagereassign() 109*8fed17f3SAndreas Gohr { 110*8fed17f3SAndreas Gohr $ass = mock\Assignments::getInstance(); 111*8fed17f3SAndreas Gohr $ass->clear(true); 112*8fed17f3SAndreas Gohr 113*8fed17f3SAndreas Gohr // no assignment 114*8fed17f3SAndreas Gohr $this->assertEquals([], $ass->getPageAssignments('wiki:syntax', false)); 115*8fed17f3SAndreas Gohr 116*8fed17f3SAndreas Gohr // fake assign the page to some schema 117*8fed17f3SAndreas Gohr $ass->assignPageSchema('wiki:syntax', 'foo'); 118*8fed17f3SAndreas Gohr $this->assertEquals(['foo'], $ass->getPageAssignments('wiki:syntax', false)); 119*8fed17f3SAndreas Gohr 120*8fed17f3SAndreas Gohr // reevaluate should deassign 121*8fed17f3SAndreas Gohr $ass->reevaluatePageAssignments('wiki:syntax'); 122*8fed17f3SAndreas Gohr $this->assertEquals([], $ass->getPageAssignments('wiki:syntax', false)); 123*8fed17f3SAndreas Gohr 124*8fed17f3SAndreas Gohr // add a pattern and deliberately deassign the page 125*8fed17f3SAndreas Gohr $ass->addPattern('wiki:*', 'foo'); 126*8fed17f3SAndreas Gohr $ass->deassignPageSchema('wiki:syntax', 'foo'); 127*8fed17f3SAndreas Gohr $this->assertEquals([], $ass->getPageAssignments('wiki:syntax', false)); 128*8fed17f3SAndreas Gohr 129*8fed17f3SAndreas Gohr // reevaluate should assign 130*8fed17f3SAndreas Gohr $ass->reevaluatePageAssignments('wiki:syntax'); 131*8fed17f3SAndreas Gohr $this->assertEquals(['foo'], $ass->getPageAssignments('wiki:syntax', false)); 132*8fed17f3SAndreas Gohr } 133*8fed17f3SAndreas Gohr 134*8fed17f3SAndreas Gohr /** 135*8fed17f3SAndreas Gohr * Check the direct page assignments 136*8fed17f3SAndreas Gohr */ 137*8fed17f3SAndreas Gohr public function test_pageassign() 138*8fed17f3SAndreas Gohr { 139*8fed17f3SAndreas Gohr $ass = mock\Assignments::getInstance(); 140*8fed17f3SAndreas Gohr $ass->clear(true); 141*8fed17f3SAndreas Gohr 142*8fed17f3SAndreas Gohr // no assignment 143*8fed17f3SAndreas Gohr $this->assertEquals([], $ass->getPageAssignments('wiki:syntax', false)); 144*8fed17f3SAndreas Gohr 145*8fed17f3SAndreas Gohr // fake assign the page to some schema 146*8fed17f3SAndreas Gohr $ass->assignPageSchema('wiki:syntax', 'foo'); 147*8fed17f3SAndreas Gohr $this->assertEquals(['foo'], $ass->getPageAssignments('wiki:syntax', false)); 148*8fed17f3SAndreas Gohr 149*8fed17f3SAndreas Gohr // removing any pattern of the same schema should recheck all existing assignments 150*8fed17f3SAndreas Gohr $ass->removePattern('anything', 'foo'); 151*8fed17f3SAndreas Gohr $this->assertEquals([], $ass->getPageAssignments('wiki:syntax', false)); 152*8fed17f3SAndreas Gohr 153*8fed17f3SAndreas Gohr // now the page is known to once have had data for that schema, a new pattern will reassign it 154*8fed17f3SAndreas Gohr $ass->addPattern('wiki:*', 'foo'); 155*8fed17f3SAndreas Gohr $this->assertEquals(['foo'], $ass->getPageAssignments('wiki:syntax', false)); 156*8fed17f3SAndreas Gohr 157*8fed17f3SAndreas Gohr // adding another pattern 158*8fed17f3SAndreas Gohr $ass->addPattern('**', 'foo'); 159*8fed17f3SAndreas Gohr $this->assertEquals(['foo'], $ass->getPageAssignments('wiki:syntax', false)); 160*8fed17f3SAndreas Gohr 161*8fed17f3SAndreas Gohr // removing one of the patterns, while the other still covers the same schema 162*8fed17f3SAndreas Gohr $ass->removePattern('wiki:*', 'foo'); 163*8fed17f3SAndreas Gohr $this->assertEquals(['foo'], $ass->getPageAssignments('wiki:syntax', false)); 164*8fed17f3SAndreas Gohr 165*8fed17f3SAndreas Gohr // new pattern will also update all known struct pages 166*8fed17f3SAndreas Gohr $ass->addPattern('wiki:*', 'bar'); 167*8fed17f3SAndreas Gohr $this->assertEquals(['bar', 'foo'], $ass->getPageAssignments('wiki:syntax', false)); 168*8fed17f3SAndreas Gohr 169*8fed17f3SAndreas Gohr // page should deassign again 170*8fed17f3SAndreas Gohr $ass->addPattern('*', 'baz'); 171*8fed17f3SAndreas Gohr $ass->assignPageSchema('attoplevel', 'baz'); 172*8fed17f3SAndreas Gohr $ass->assignPageSchema('attoplevel', 'foo'); 173*8fed17f3SAndreas Gohr $ass->removePattern('*', 'baz'); 174*8fed17f3SAndreas Gohr $ass->removePattern('**', 'foo'); 175*8fed17f3SAndreas Gohr 176*8fed17f3SAndreas Gohr // check that all pages are known 177*8fed17f3SAndreas Gohr $expect = [ 178*8fed17f3SAndreas Gohr 'attoplevel' => [ 179*8fed17f3SAndreas Gohr 'baz' => false, 180*8fed17f3SAndreas Gohr 'foo' => false 181*8fed17f3SAndreas Gohr ], 182*8fed17f3SAndreas Gohr 'wiki:syntax' => [ 183*8fed17f3SAndreas Gohr 'bar' => true, 184*8fed17f3SAndreas Gohr 'foo' => false 185*8fed17f3SAndreas Gohr ] 186*8fed17f3SAndreas Gohr ]; 187*8fed17f3SAndreas Gohr $this->assertEquals($expect, $ass->getPages()); 188*8fed17f3SAndreas Gohr 189*8fed17f3SAndreas Gohr // limit to certain schema 190*8fed17f3SAndreas Gohr $expect = [ 191*8fed17f3SAndreas Gohr 'attoplevel' => [ 192*8fed17f3SAndreas Gohr 'baz' => false, 193*8fed17f3SAndreas Gohr ], 194*8fed17f3SAndreas Gohr ]; 195*8fed17f3SAndreas Gohr $this->assertEquals($expect, $ass->getPages('baz')); 196*8fed17f3SAndreas Gohr 197*8fed17f3SAndreas Gohr // show current assignments only 198*8fed17f3SAndreas Gohr $expect = [ 199*8fed17f3SAndreas Gohr 'wiki:syntax' => [ 200*8fed17f3SAndreas Gohr 'bar' => true, 201*8fed17f3SAndreas Gohr ] 202*8fed17f3SAndreas Gohr ]; 203*8fed17f3SAndreas Gohr $this->assertEquals($expect, $ass->getPages(null, true)); 204*8fed17f3SAndreas Gohr } 205*8fed17f3SAndreas Gohr} 206