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