[ Index ] |
PHP Cross Reference of DokuWiki |
[Summary view] [Print] [Text view]
1 <?php 2 3 namespace tests\inc\File; 4 5 use dokuwiki\File\PageResolver; 6 7 /** 8 * @todo tests that make use of revisions might be wanted 9 */ 10 class PageResolverTest extends \DokuWikiTest 11 { 12 /** 13 * @return \Generator|array 14 * @see testResolveID 15 */ 16 public function provideResolveData() 17 { 18 $data = [ 19 // relative current in root 20 ['context', 'page', 'page'], 21 ['context', '.page', 'page'], 22 ['context', '.:page', 'page'], 23 24 // relative current in namespace 25 ['lev1:lev2:context', 'page', 'lev1:lev2:page'], 26 ['lev1:lev2:context', '.page', 'lev1:lev2:page'], 27 ['lev1:lev2:context', '.:page', 'lev1:lev2:page'], 28 29 // relative upper in root 30 ['context', '..page', 'page'], 31 ['context', '..:page', 'page'], 32 33 // relative upper in namespace 34 ['lev1:lev2:context', '..page', 'lev1:page'], 35 ['lev1:lev2:context', '..:page', 'lev1:page'], 36 ['lev1:lev2:context', '..:..:page', 'page'], 37 ['lev1:lev2:context', '..:..:..:page', 'page'], 38 39 // deeper nesting 40 ['lev1:lev2:lev3:context', '..page', 'lev1:lev2:page'], 41 ['lev1:lev2:lev3:context', '..:page', 'lev1:lev2:page'], 42 ['lev1:lev2:lev3:context', '..:..page', 'lev1:page'], 43 ['lev1:lev2:lev3:context', '..:..:page', 'lev1:page'], 44 ['lev1:lev2:lev3:context', '..:..:..page', 'page'], 45 ['lev1:lev2:lev3:context', '..:..:..:page', 'page'], 46 ['lev1:lev2:lev3:context', '..:..:..:..page', 'page'], 47 ['lev1:lev2:lev3:context', '..:..:..:..:page', 'page'], 48 49 // strange and broken ones 50 ['lev1:lev2:context', '....:....:page', 'lev1:lev2:page'], 51 ['lev1:lev2:context', '..:..:lev3:page', 'lev3:page'], 52 ['lev1:lev2:context', '..:..:lev3:..:page', 'page'], 53 ['lev1:lev2:context', '..:..:lev3:..:page:....:...', 'page'], 54 55 // relative to current page 56 ['context', '~page', 'context:page'], 57 ['context', '~:page', 'context:page'], 58 ['lev1:lev2:context', '~page', 'lev1:lev2:context:page'], 59 ['lev1:lev2:context', '~:page', 'lev1:lev2:context:page'], 60 61 // start pages 62 ['context', '.:', 'start'], 63 ['foo:context', '.:', 'foo:start'], 64 ['context', 'foo:', 'foo:start'], 65 ['foo:context', 'foo:', 'foo:start'], 66 ['context', '~foo:', 'context:foo:start'], 67 ['foo:context', '~foo:', 'foo:context:foo:start'], 68 69 // empty page links to itself 70 ['context', '', 'context'], 71 ['foo:context', '', 'foo:context'], 72 ]; 73 74 // run each test without a hash 75 foreach ($data as $row) { 76 yield $row; 77 } 78 79 // run each test with a hash 80 foreach ($data as $row) { 81 $row[1] .= '#somehash'; 82 $row[2] .= '#somehash'; 83 yield $row; 84 } 85 } 86 87 /** 88 * @dataProvider provideResolveData 89 * @param string $context 90 * @param string $id 91 * @param string $expected 92 */ 93 public function testResolveID($context, $id, $expected) 94 { 95 $resolver = new PageResolver($context); 96 $this->assertEquals($expected, $resolver->resolveId($id)); 97 } 98 99 /** 100 * Tilde start page bahaviour 101 * 102 * Please note that a ~ alone is the same as ~: 103 */ 104 public function testTildeStartPage() { 105 $context = 'foo:context'; 106 $resolver = new PageResolver($context); 107 108 // the $context page itself does not exist 109 // a link like that is usually not possible, but we fall back to standard start 110 // page behaviour 111 $this->assertEquals("$context:start", $resolver->resolveId('~:')); 112 $this->assertEquals("$context:start", $resolver->resolveId('~')); 113 114 // now $context has become the start page 115 saveWikiText($context, 'test', 'test'); 116 $this->assertEquals($context, $resolver->resolveId('~:')); 117 118 // now we have a startpage named like the namespace 119 saveWikiText("$context:context", 'test', 'test'); 120 $this->assertEquals("$context:context", $resolver->resolveId('~:')); 121 $this->assertEquals("$context:context", $resolver->resolveId('~')); 122 123 // now we have a dedicated start page 124 saveWikiText("$context:start", 'test', 'test'); 125 $this->assertEquals("$context:start", $resolver->resolveId('~:')); 126 $this->assertEquals("$context:start", $resolver->resolveId('~')); 127 } 128 129 public function testResolveStartPage() { 130 131 $resolver = new PageResolver('arbitrary'); 132 133 $expect = 'foo:start'; 134 $actual = $this->callInaccessibleMethod($resolver, 'resolveStartPage', ['foo:', false, false]); 135 $this->assertEquals($expect, $actual, 'default non-existing'); 136 137 saveWikiText('foo', 'test', 'test'); 138 $expect = 'foo'; 139 $actual = $this->callInaccessibleMethod($resolver, 'resolveStartPage', ['foo:', false, false]); 140 $this->assertEquals($expect, $actual, 'page like namespace outside'); 141 142 saveWikiText('foo:foo', 'test', 'test'); 143 $expect = 'foo:foo'; 144 $actual = $this->callInaccessibleMethod($resolver, 'resolveStartPage', ['foo:', false, false]); 145 $this->assertEquals($expect, $actual, 'page like namespace inside'); 146 147 saveWikiText('foo:start', 'test', 'test'); 148 $expect = 'foo:start'; 149 $actual = $this->callInaccessibleMethod($resolver, 'resolveStartPage', ['foo:', false, false]); 150 $this->assertEquals($expect, $actual, 'default existing'); 151 } 152 153 /** 154 * @return array 155 * @see testResolveRelatives 156 */ 157 public function provideResolveRelatives() { 158 return [ 159 ['foo', 'foo'], 160 ['foo:bar', 'foo:bar'], 161 ['foo:..:bar', 'bar'], 162 ['foo:..:..:bar', 'bar'], 163 ['foo:.:bar', 'foo:bar'], 164 ['foo:.:..:.:bar', 'bar'], 165 ['foo:.:.:.:bar', 'foo:bar'], 166 ['foo::::bar', 'foo:bar'], 167 ['foo::::bar:', 'foo:bar:'], 168 ['foo:bar:', 'foo:bar:'], 169 ]; 170 } 171 172 /** 173 * @dataProvider provideResolveRelatives 174 * @param string $input 175 * @param string $expected 176 */ 177 public function testResolveRelatives($input, $expected) { 178 $resolver = new PageResolver('arbitrary'); 179 180 $actual = $this->callInaccessibleMethod($resolver, 'resolveRelatives', [$input]); 181 $this->assertEquals($expected, $actual); 182 } 183 184 public function testAutoPlural() 185 { 186 $resolver = new PageResolver('arbitrary'); 187 188 $singular = 'some:page'; 189 $plural = 'some:pages'; 190 191 192 $actual = $this->callInaccessibleMethod($resolver, 'resolveAutoPlural', [$singular, '', false]); 193 $this->assertEquals($singular, $actual); // no pages exist 194 195 saveWikiText($plural, 'plural', 'plural'); 196 $actual = $this->callInaccessibleMethod($resolver, 'resolveAutoPlural', [$singular, '', false]); 197 $this->assertEquals($plural, $actual); // plural exists 198 199 saveWikiText($singular, 'singular', 'singular'); 200 $actual = $this->callInaccessibleMethod($resolver, 'resolveAutoPlural', [$singular, '', false]); 201 $this->assertEquals($singular, $actual); // requested singular has preference 202 } 203 }
title
Description
Body
title
Description
Body
title
Description
Body
title
Body