- foreach (
- [
- '/Foo' => [ 'title' => 'Foo' ],
- '/Bar' => [ 'ping' => 'pong' ],
- '/Baz' => [ 'marco' => 'polo' ],
- '/asdf-foo' => [ 'title' => 'qwerty-foo' ],
- '/qwerty-bar' => [ 'title' => 'asdf-bar' ],
- '/a/Foo' => [ 'title' => 'Foo' ],
- '/asdf/Foo' => [ 'title' => 'Foo' ],
- '/qwerty/Foo' => [ 'title' => 'Foo', 'qwerty' => 'qwerty' ],
- '/baz/Foo' => [ 'title' => 'Foo', 'unrestricted' => 'baz' ],
- '/y/Foo' => [ 'title' => 'Foo', 'restricted-to-y' => 'y' ],
- ] as $path => $result
- ) {
- $this->assertEquals( $router->parse( $path ), $result );
- }
- }
-
- /**
- * Make sure the router handles titles like Special:Recentchanges correctly
- */
- public function testSpecial() {
- $matches = $this->basicRouter->parse( "/wiki/Special:Recentchanges" );
- $this->assertEquals( $matches, [ 'title' => "Special:Recentchanges" ] );
- }
-
- /**
- * Make sure the router decodes urlencoding properly
- */
- public function testUrlencoding() {
- $matches = $this->basicRouter->parse( "/wiki/Title_With%20Space" );
- $this->assertEquals( $matches, [ 'title' => "Title_With Space" ] );
- }
-
- public static function provideRegexpChars() {
- return [
- [ "$" ],
- [ "$1" ],
- [ "\\" ],
- [ "\\$1" ],
- ];
- }
-
- /**
- * Make sure the router doesn't break on special characters like $ used in regexp replacements
- * @dataProvider provideRegexpChars
- */
- public function testRegexpChars( $char ) {
- $matches = $this->basicRouter->parse( "/wiki/$char" );
- $this->assertEquals( $matches, [ 'title' => "$char" ] );
- }
-
- /**
- * Make sure the router handles characters like +&() properly
- */
- public function testCharacters() {
- $matches = $this->basicRouter->parse( "/wiki/Plus+And&Dollar\\Stuff();[]{}*" );
- $this->assertEquals( $matches, [ 'title' => "Plus+And&Dollar\\Stuff();[]{}*" ] );
- }
-
- /**
- * Make sure the router handles unicode characters correctly
- * @depends testSpecial
- * @depends testUrlencoding
- * @depends testCharacters
- */
- public function testUnicode() {
- $matches = $this->basicRouter->parse( "/wiki/Spécial:Modifications_récentes" );
- $this->assertEquals( $matches, [ 'title' => "Spécial:Modifications_récentes" ] );
-
- $matches = $this->basicRouter->parse( "/wiki/Sp%C3%A9cial:Modifications_r%C3%A9centes" );
- $this->assertEquals( $matches, [ 'title' => "Spécial:Modifications_récentes" ] );
- }
-
- /**
- * Ensure the router doesn't choke on long paths.
- */
- public function testLength() {
- // phpcs:disable Generic.Files.LineLength
- $matches = $this->basicRouter->parse(
- "/wiki/Lorem_ipsum_dolor_sit_amet,_consectetur_adipisicing_elit,_sed_do_eiusmod_tempor_incididunt_ut_labore_et_dolore_magna_aliqua._Ut_enim_ad_minim_veniam,_quis_nostrud_exercitation_ullamco_laboris_nisi_ut_aliquip_ex_ea_commodo_consequat._Duis_aute_irure_dolor_in_reprehenderit_in_voluptate_velit_esse_cillum_dolore_eu_fugiat_nulla_pariatur._Excepteur_sint_occaecat_cupidatat_non_proident,_sunt_in_culpa_qui_officia_deserunt_mollit_anim_id_est_laborum."
- );
- $this->assertEquals(
- $matches,
- [ 'title' => "Lorem_ipsum_dolor_sit_amet,_consectetur_adipisicing_elit,_sed_do_eiusmod_tempor_incididunt_ut_labore_et_dolore_magna_aliqua._Ut_enim_ad_minim_veniam,_quis_nostrud_exercitation_ullamco_laboris_nisi_ut_aliquip_ex_ea_commodo_consequat._Duis_aute_irure_dolor_in_reprehenderit_in_voluptate_velit_esse_cillum_dolore_eu_fugiat_nulla_pariatur._Excepteur_sint_occaecat_cupidatat_non_proident,_sunt_in_culpa_qui_officia_deserunt_mollit_anim_id_est_laborum." ]
- );
- // phpcs:enable
- }
-
- /**
- * Ensure that the php passed site of parameter values are not urldecoded
- */
- public function testPatternUrlencoding() {
- $router = new PathRouter;
- $router->add( "/wiki/$1", [ 'title' => '%20:$1' ] );
- $matches = $router->parse( "/wiki/Foo" );
- $this->assertEquals( $matches, [ 'title' => '%20:Foo' ] );
- }
-
- /**
- * Ensure that raw parameter values do not have any variable replacements or urldecoding
- */
- public function testRawParamValue() {
- $router = new PathRouter;
- $router->add( "/wiki/$1", [ 'title' => [ 'value' => 'bar%20$1' ] ] );
- $matches = $router->parse( "/wiki/Foo" );
- $this->assertEquals( $matches, [ 'title' => 'bar%20$1' ] );