aboutsummaryrefslogtreecommitdiffhomepage
path: root/assets/php/vendor/symfony/routing/Tests
diff options
context:
space:
mode:
authormarvin-borner@live.com2018-04-10 21:50:16 +0200
committermarvin-borner@live.com2018-04-10 21:54:48 +0200
commitfc9401f04a3aca5abb22f87ebc210de8afe11d32 (patch)
treeb0b310f3581764ec3955f4e496a05137a32951c3 /assets/php/vendor/symfony/routing/Tests
parent286d643180672f20526f3dc3bd19d7b751e2fa97 (diff)
Initial Commit
Diffstat (limited to 'assets/php/vendor/symfony/routing/Tests')
-rw-r--r--assets/php/vendor/symfony/routing/Tests/Annotation/RouteTest.php50
-rw-r--r--assets/php/vendor/symfony/routing/Tests/CompiledRouteTest.php27
-rw-r--r--assets/php/vendor/symfony/routing/Tests/DependencyInjection/RoutingResolverPassTest.php36
-rw-r--r--assets/php/vendor/symfony/routing/Tests/Fixtures/AnnotatedClasses/AbstractClass.php16
-rw-r--r--assets/php/vendor/symfony/routing/Tests/Fixtures/AnnotatedClasses/BarClass.php19
-rw-r--r--assets/php/vendor/symfony/routing/Tests/Fixtures/AnnotatedClasses/BazClass.php19
-rw-r--r--assets/php/vendor/symfony/routing/Tests/Fixtures/AnnotatedClasses/FooClass.php16
-rw-r--r--assets/php/vendor/symfony/routing/Tests/Fixtures/AnnotatedClasses/FooTrait.php13
-rw-r--r--assets/php/vendor/symfony/routing/Tests/Fixtures/CustomCompiledRoute.php18
-rw-r--r--assets/php/vendor/symfony/routing/Tests/Fixtures/CustomRouteCompiler.php26
-rw-r--r--assets/php/vendor/symfony/routing/Tests/Fixtures/CustomXmlFileLoader.php26
-rw-r--r--assets/php/vendor/symfony/routing/Tests/Fixtures/OtherAnnotatedClasses/AnonymousClassInTrait.php24
-rw-r--r--assets/php/vendor/symfony/routing/Tests/Fixtures/OtherAnnotatedClasses/NoStartTagClass.php3
-rw-r--r--assets/php/vendor/symfony/routing/Tests/Fixtures/OtherAnnotatedClasses/VariadicClass.php19
-rw-r--r--assets/php/vendor/symfony/routing/Tests/Fixtures/RedirectableUrlMatcher.php30
-rw-r--r--assets/php/vendor/symfony/routing/Tests/Fixtures/annotated.php0
-rw-r--r--assets/php/vendor/symfony/routing/Tests/Fixtures/bad_format.yml3
-rw-r--r--assets/php/vendor/symfony/routing/Tests/Fixtures/bar.xml0
-rw-r--r--assets/php/vendor/symfony/routing/Tests/Fixtures/controller/import__controller.xml10
-rw-r--r--assets/php/vendor/symfony/routing/Tests/Fixtures/controller/import__controller.yml4
-rw-r--r--assets/php/vendor/symfony/routing/Tests/Fixtures/controller/import_controller.xml8
-rw-r--r--assets/php/vendor/symfony/routing/Tests/Fixtures/controller/import_controller.yml3
-rw-r--r--assets/php/vendor/symfony/routing/Tests/Fixtures/controller/import_override_defaults.xml10
-rw-r--r--assets/php/vendor/symfony/routing/Tests/Fixtures/controller/import_override_defaults.yml5
-rw-r--r--assets/php/vendor/symfony/routing/Tests/Fixtures/controller/override_defaults.xml10
-rw-r--r--assets/php/vendor/symfony/routing/Tests/Fixtures/controller/override_defaults.yml5
-rw-r--r--assets/php/vendor/symfony/routing/Tests/Fixtures/controller/routing.xml14
-rw-r--r--assets/php/vendor/symfony/routing/Tests/Fixtures/controller/routing.yml11
-rw-r--r--assets/php/vendor/symfony/routing/Tests/Fixtures/directory/recurse/routes1.yml2
-rw-r--r--assets/php/vendor/symfony/routing/Tests/Fixtures/directory/recurse/routes2.yml2
-rw-r--r--assets/php/vendor/symfony/routing/Tests/Fixtures/directory/routes3.yml2
-rw-r--r--assets/php/vendor/symfony/routing/Tests/Fixtures/directory_import/import.yml3
-rw-r--r--assets/php/vendor/symfony/routing/Tests/Fixtures/dumper/url_matcher0.php37
-rw-r--r--assets/php/vendor/symfony/routing/Tests/Fixtures/dumper/url_matcher1.php318
-rw-r--r--assets/php/vendor/symfony/routing/Tests/Fixtures/dumper/url_matcher2.php380
-rw-r--r--assets/php/vendor/symfony/routing/Tests/Fixtures/dumper/url_matcher3.php55
-rw-r--r--assets/php/vendor/symfony/routing/Tests/Fixtures/dumper/url_matcher4.php112
-rw-r--r--assets/php/vendor/symfony/routing/Tests/Fixtures/dumper/url_matcher5.php209
-rw-r--r--assets/php/vendor/symfony/routing/Tests/Fixtures/dumper/url_matcher6.php213
-rw-r--r--assets/php/vendor/symfony/routing/Tests/Fixtures/dumper/url_matcher7.php249
-rw-r--r--assets/php/vendor/symfony/routing/Tests/Fixtures/empty.yml0
-rw-r--r--assets/php/vendor/symfony/routing/Tests/Fixtures/file_resource.yml0
-rw-r--r--assets/php/vendor/symfony/routing/Tests/Fixtures/foo.xml0
-rw-r--r--assets/php/vendor/symfony/routing/Tests/Fixtures/foo1.xml0
-rw-r--r--assets/php/vendor/symfony/routing/Tests/Fixtures/glob/bar.xml8
-rw-r--r--assets/php/vendor/symfony/routing/Tests/Fixtures/glob/bar.yml4
-rw-r--r--assets/php/vendor/symfony/routing/Tests/Fixtures/glob/baz.xml8
-rw-r--r--assets/php/vendor/symfony/routing/Tests/Fixtures/glob/baz.yml4
-rw-r--r--assets/php/vendor/symfony/routing/Tests/Fixtures/glob/import_multiple.xml8
-rw-r--r--assets/php/vendor/symfony/routing/Tests/Fixtures/glob/import_multiple.yml2
-rw-r--r--assets/php/vendor/symfony/routing/Tests/Fixtures/glob/import_single.xml8
-rw-r--r--assets/php/vendor/symfony/routing/Tests/Fixtures/glob/import_single.yml2
-rw-r--r--assets/php/vendor/symfony/routing/Tests/Fixtures/glob/php_dsl.php7
-rw-r--r--assets/php/vendor/symfony/routing/Tests/Fixtures/glob/php_dsl_bar.php12
-rw-r--r--assets/php/vendor/symfony/routing/Tests/Fixtures/glob/php_dsl_baz.php12
-rw-r--r--assets/php/vendor/symfony/routing/Tests/Fixtures/incomplete.yml2
-rw-r--r--assets/php/vendor/symfony/routing/Tests/Fixtures/list_defaults.xml20
-rw-r--r--assets/php/vendor/symfony/routing/Tests/Fixtures/list_in_list_defaults.xml22
-rw-r--r--assets/php/vendor/symfony/routing/Tests/Fixtures/list_in_map_defaults.xml22
-rw-r--r--assets/php/vendor/symfony/routing/Tests/Fixtures/list_null_values.xml22
-rw-r--r--assets/php/vendor/symfony/routing/Tests/Fixtures/map_defaults.xml20
-rw-r--r--assets/php/vendor/symfony/routing/Tests/Fixtures/map_in_list_defaults.xml22
-rw-r--r--assets/php/vendor/symfony/routing/Tests/Fixtures/map_in_map_defaults.xml22
-rw-r--r--assets/php/vendor/symfony/routing/Tests/Fixtures/map_null_values.xml22
-rw-r--r--assets/php/vendor/symfony/routing/Tests/Fixtures/missing_id.xml8
-rw-r--r--assets/php/vendor/symfony/routing/Tests/Fixtures/missing_path.xml8
-rw-r--r--assets/php/vendor/symfony/routing/Tests/Fixtures/namespaceprefix.xml16
-rw-r--r--assets/php/vendor/symfony/routing/Tests/Fixtures/nonesense_resource_plus_path.yml3
-rw-r--r--assets/php/vendor/symfony/routing/Tests/Fixtures/nonesense_type_without_resource.yml3
-rw-r--r--assets/php/vendor/symfony/routing/Tests/Fixtures/nonvalid.xml10
-rw-r--r--assets/php/vendor/symfony/routing/Tests/Fixtures/nonvalid.yml1
-rw-r--r--assets/php/vendor/symfony/routing/Tests/Fixtures/nonvalid2.yml1
-rw-r--r--assets/php/vendor/symfony/routing/Tests/Fixtures/nonvalidkeys.yml3
-rw-r--r--assets/php/vendor/symfony/routing/Tests/Fixtures/nonvalidnode.xml8
-rw-r--r--assets/php/vendor/symfony/routing/Tests/Fixtures/nonvalidroute.xml12
-rw-r--r--assets/php/vendor/symfony/routing/Tests/Fixtures/null_values.xml12
-rw-r--r--assets/php/vendor/symfony/routing/Tests/Fixtures/php_dsl.php22
-rw-r--r--assets/php/vendor/symfony/routing/Tests/Fixtures/php_dsl_sub.php14
-rw-r--r--assets/php/vendor/symfony/routing/Tests/Fixtures/scalar_defaults.xml33
-rw-r--r--assets/php/vendor/symfony/routing/Tests/Fixtures/special_route_name.yml2
-rw-r--r--assets/php/vendor/symfony/routing/Tests/Fixtures/validpattern.php18
-rw-r--r--assets/php/vendor/symfony/routing/Tests/Fixtures/validpattern.xml15
-rw-r--r--assets/php/vendor/symfony/routing/Tests/Fixtures/validpattern.yml13
-rw-r--r--assets/php/vendor/symfony/routing/Tests/Fixtures/validresource.php18
-rw-r--r--assets/php/vendor/symfony/routing/Tests/Fixtures/validresource.xml13
-rw-r--r--assets/php/vendor/symfony/routing/Tests/Fixtures/validresource.yml8
-rw-r--r--assets/php/vendor/symfony/routing/Tests/Fixtures/with_define_path_variable.php5
-rw-r--r--assets/php/vendor/symfony/routing/Tests/Fixtures/withdoctype.xml3
-rw-r--r--assets/php/vendor/symfony/routing/Tests/Generator/Dumper/PhpGeneratorDumperTest.php181
-rw-r--r--assets/php/vendor/symfony/routing/Tests/Generator/UrlGeneratorTest.php724
-rw-r--r--assets/php/vendor/symfony/routing/Tests/Loader/AbstractAnnotationLoaderTest.php33
-rw-r--r--assets/php/vendor/symfony/routing/Tests/Loader/AnnotationClassLoaderTest.php255
-rw-r--r--assets/php/vendor/symfony/routing/Tests/Loader/AnnotationDirectoryLoaderTest.php98
-rw-r--r--assets/php/vendor/symfony/routing/Tests/Loader/AnnotationFileLoaderTest.php91
-rw-r--r--assets/php/vendor/symfony/routing/Tests/Loader/ClosureLoaderTest.php49
-rw-r--r--assets/php/vendor/symfony/routing/Tests/Loader/DirectoryLoaderTest.php74
-rw-r--r--assets/php/vendor/symfony/routing/Tests/Loader/GlobFileLoaderTest.php45
-rw-r--r--assets/php/vendor/symfony/routing/Tests/Loader/ObjectRouteLoaderTest.php123
-rw-r--r--assets/php/vendor/symfony/routing/Tests/Loader/PhpFileLoaderTest.php133
-rw-r--r--assets/php/vendor/symfony/routing/Tests/Loader/XmlFileLoaderTest.php385
-rw-r--r--assets/php/vendor/symfony/routing/Tests/Loader/YamlFileLoaderTest.php206
-rw-r--r--assets/php/vendor/symfony/routing/Tests/Matcher/DumpedRedirectableUrlMatcherTest.php43
-rw-r--r--assets/php/vendor/symfony/routing/Tests/Matcher/DumpedUrlMatcherTest.php48
-rw-r--r--assets/php/vendor/symfony/routing/Tests/Matcher/Dumper/DumperCollectionTest.php34
-rw-r--r--assets/php/vendor/symfony/routing/Tests/Matcher/Dumper/PhpMatcherDumperTest.php459
-rw-r--r--assets/php/vendor/symfony/routing/Tests/Matcher/Dumper/StaticPrefixCollectionTest.php175
-rw-r--r--assets/php/vendor/symfony/routing/Tests/Matcher/RedirectableUrlMatcherTest.php124
-rw-r--r--assets/php/vendor/symfony/routing/Tests/Matcher/TraceableUrlMatcherTest.php122
-rw-r--r--assets/php/vendor/symfony/routing/Tests/Matcher/UrlMatcherTest.php509
-rw-r--r--assets/php/vendor/symfony/routing/Tests/RequestContextTest.php160
-rw-r--r--assets/php/vendor/symfony/routing/Tests/RouteCollectionBuilderTest.php364
-rw-r--r--assets/php/vendor/symfony/routing/Tests/RouteCollectionTest.php305
-rw-r--r--assets/php/vendor/symfony/routing/Tests/RouteCompilerTest.php389
-rw-r--r--assets/php/vendor/symfony/routing/Tests/RouteTest.php258
-rw-r--r--assets/php/vendor/symfony/routing/Tests/RouterTest.php163
115 files changed, 8055 insertions, 0 deletions
diff --git a/assets/php/vendor/symfony/routing/Tests/Annotation/RouteTest.php b/assets/php/vendor/symfony/routing/Tests/Annotation/RouteTest.php
new file mode 100644
index 0000000..9af22f2
--- /dev/null
+++ b/assets/php/vendor/symfony/routing/Tests/Annotation/RouteTest.php
@@ -0,0 +1,50 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Routing\Tests\Annotation;
+
+use PHPUnit\Framework\TestCase;
+use Symfony\Component\Routing\Annotation\Route;
+
+class RouteTest extends TestCase
+{
+ /**
+ * @expectedException \BadMethodCallException
+ */
+ public function testInvalidRouteParameter()
+ {
+ $route = new Route(array('foo' => 'bar'));
+ }
+
+ /**
+ * @dataProvider getValidParameters
+ */
+ public function testRouteParameters($parameter, $value, $getter)
+ {
+ $route = new Route(array($parameter => $value));
+ $this->assertEquals($route->$getter(), $value);
+ }
+
+ public function getValidParameters()
+ {
+ return array(
+ array('value', '/Blog', 'getPath'),
+ array('requirements', array('locale' => 'en'), 'getRequirements'),
+ array('options', array('compiler_class' => 'RouteCompiler'), 'getOptions'),
+ array('name', 'blog_index', 'getName'),
+ array('defaults', array('_controller' => 'MyBlogBundle:Blog:index'), 'getDefaults'),
+ array('schemes', array('https'), 'getSchemes'),
+ array('methods', array('GET', 'POST'), 'getMethods'),
+ array('host', '{locale}.example.com', 'getHost'),
+ array('condition', 'context.getMethod() == "GET"', 'getCondition'),
+ );
+ }
+}
diff --git a/assets/php/vendor/symfony/routing/Tests/CompiledRouteTest.php b/assets/php/vendor/symfony/routing/Tests/CompiledRouteTest.php
new file mode 100644
index 0000000..5bec7bb
--- /dev/null
+++ b/assets/php/vendor/symfony/routing/Tests/CompiledRouteTest.php
@@ -0,0 +1,27 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Routing\Tests;
+
+use PHPUnit\Framework\TestCase;
+use Symfony\Component\Routing\CompiledRoute;
+
+class CompiledRouteTest extends TestCase
+{
+ public function testAccessors()
+ {
+ $compiled = new CompiledRoute('prefix', 'regex', array('tokens'), array(), null, array(), array(), array('variables'));
+ $this->assertEquals('prefix', $compiled->getStaticPrefix(), '__construct() takes a static prefix as its second argument');
+ $this->assertEquals('regex', $compiled->getRegex(), '__construct() takes a regexp as its third argument');
+ $this->assertEquals(array('tokens'), $compiled->getTokens(), '__construct() takes an array of tokens as its fourth argument');
+ $this->assertEquals(array('variables'), $compiled->getVariables(), '__construct() takes an array of variables as its ninth argument');
+ }
+}
diff --git a/assets/php/vendor/symfony/routing/Tests/DependencyInjection/RoutingResolverPassTest.php b/assets/php/vendor/symfony/routing/Tests/DependencyInjection/RoutingResolverPassTest.php
new file mode 100644
index 0000000..97a34c9
--- /dev/null
+++ b/assets/php/vendor/symfony/routing/Tests/DependencyInjection/RoutingResolverPassTest.php
@@ -0,0 +1,36 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Routing\Tests\DependencyInjection;
+
+use PHPUnit\Framework\TestCase;
+use Symfony\Component\Config\Loader\LoaderResolver;
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+use Symfony\Component\DependencyInjection\Reference;
+use Symfony\Component\Routing\DependencyInjection\RoutingResolverPass;
+
+class RoutingResolverPassTest extends TestCase
+{
+ public function testProcess()
+ {
+ $container = new ContainerBuilder();
+ $container->register('routing.resolver', LoaderResolver::class);
+ $container->register('loader1')->addTag('routing.loader');
+ $container->register('loader2')->addTag('routing.loader');
+
+ (new RoutingResolverPass())->process($container);
+
+ $this->assertEquals(
+ array(array('addLoader', array(new Reference('loader1'))), array('addLoader', array(new Reference('loader2')))),
+ $container->getDefinition('routing.resolver')->getMethodCalls()
+ );
+ }
+}
diff --git a/assets/php/vendor/symfony/routing/Tests/Fixtures/AnnotatedClasses/AbstractClass.php b/assets/php/vendor/symfony/routing/Tests/Fixtures/AnnotatedClasses/AbstractClass.php
new file mode 100644
index 0000000..56bcab2
--- /dev/null
+++ b/assets/php/vendor/symfony/routing/Tests/Fixtures/AnnotatedClasses/AbstractClass.php
@@ -0,0 +1,16 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Routing\Tests\Fixtures\AnnotatedClasses;
+
+abstract class AbstractClass
+{
+}
diff --git a/assets/php/vendor/symfony/routing/Tests/Fixtures/AnnotatedClasses/BarClass.php b/assets/php/vendor/symfony/routing/Tests/Fixtures/AnnotatedClasses/BarClass.php
new file mode 100644
index 0000000..a388277
--- /dev/null
+++ b/assets/php/vendor/symfony/routing/Tests/Fixtures/AnnotatedClasses/BarClass.php
@@ -0,0 +1,19 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Routing\Tests\Fixtures\AnnotatedClasses;
+
+class BarClass
+{
+ public function routeAction($arg1, $arg2 = 'defaultValue2', $arg3 = 'defaultValue3')
+ {
+ }
+}
diff --git a/assets/php/vendor/symfony/routing/Tests/Fixtures/AnnotatedClasses/BazClass.php b/assets/php/vendor/symfony/routing/Tests/Fixtures/AnnotatedClasses/BazClass.php
new file mode 100644
index 0000000..471968b
--- /dev/null
+++ b/assets/php/vendor/symfony/routing/Tests/Fixtures/AnnotatedClasses/BazClass.php
@@ -0,0 +1,19 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Routing\Tests\Fixtures\AnnotatedClasses;
+
+class BazClass
+{
+ public function __invoke()
+ {
+ }
+}
diff --git a/assets/php/vendor/symfony/routing/Tests/Fixtures/AnnotatedClasses/FooClass.php b/assets/php/vendor/symfony/routing/Tests/Fixtures/AnnotatedClasses/FooClass.php
new file mode 100644
index 0000000..320dc35
--- /dev/null
+++ b/assets/php/vendor/symfony/routing/Tests/Fixtures/AnnotatedClasses/FooClass.php
@@ -0,0 +1,16 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Routing\Tests\Fixtures\AnnotatedClasses;
+
+class FooClass
+{
+}
diff --git a/assets/php/vendor/symfony/routing/Tests/Fixtures/AnnotatedClasses/FooTrait.php b/assets/php/vendor/symfony/routing/Tests/Fixtures/AnnotatedClasses/FooTrait.php
new file mode 100644
index 0000000..ee8f4b0
--- /dev/null
+++ b/assets/php/vendor/symfony/routing/Tests/Fixtures/AnnotatedClasses/FooTrait.php
@@ -0,0 +1,13 @@
+<?php
+
+namespace Symfony\Component\Routing\Tests\Fixtures\AnnotatedClasses;
+
+trait FooTrait
+{
+ public function doBar()
+ {
+ $baz = self::class;
+ if (true) {
+ }
+ }
+}
diff --git a/assets/php/vendor/symfony/routing/Tests/Fixtures/CustomCompiledRoute.php b/assets/php/vendor/symfony/routing/Tests/Fixtures/CustomCompiledRoute.php
new file mode 100644
index 0000000..0f6e198
--- /dev/null
+++ b/assets/php/vendor/symfony/routing/Tests/Fixtures/CustomCompiledRoute.php
@@ -0,0 +1,18 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Routing\Tests\Fixtures;
+
+use Symfony\Component\Routing\CompiledRoute;
+
+class CustomCompiledRoute extends CompiledRoute
+{
+}
diff --git a/assets/php/vendor/symfony/routing/Tests/Fixtures/CustomRouteCompiler.php b/assets/php/vendor/symfony/routing/Tests/Fixtures/CustomRouteCompiler.php
new file mode 100644
index 0000000..c2e2afd
--- /dev/null
+++ b/assets/php/vendor/symfony/routing/Tests/Fixtures/CustomRouteCompiler.php
@@ -0,0 +1,26 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Routing\Tests\Fixtures;
+
+use Symfony\Component\Routing\Route;
+use Symfony\Component\Routing\RouteCompiler;
+
+class CustomRouteCompiler extends RouteCompiler
+{
+ /**
+ * {@inheritdoc}
+ */
+ public static function compile(Route $route)
+ {
+ return new CustomCompiledRoute('', '', array(), array());
+ }
+}
diff --git a/assets/php/vendor/symfony/routing/Tests/Fixtures/CustomXmlFileLoader.php b/assets/php/vendor/symfony/routing/Tests/Fixtures/CustomXmlFileLoader.php
new file mode 100644
index 0000000..9fd5754
--- /dev/null
+++ b/assets/php/vendor/symfony/routing/Tests/Fixtures/CustomXmlFileLoader.php
@@ -0,0 +1,26 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Routing\Tests\Fixtures;
+
+use Symfony\Component\Routing\Loader\XmlFileLoader;
+use Symfony\Component\Config\Util\XmlUtils;
+
+/**
+ * XmlFileLoader with schema validation turned off.
+ */
+class CustomXmlFileLoader extends XmlFileLoader
+{
+ protected function loadFile($file)
+ {
+ return XmlUtils::loadFile($file, function () { return true; });
+ }
+}
diff --git a/assets/php/vendor/symfony/routing/Tests/Fixtures/OtherAnnotatedClasses/AnonymousClassInTrait.php b/assets/php/vendor/symfony/routing/Tests/Fixtures/OtherAnnotatedClasses/AnonymousClassInTrait.php
new file mode 100644
index 0000000..de87895
--- /dev/null
+++ b/assets/php/vendor/symfony/routing/Tests/Fixtures/OtherAnnotatedClasses/AnonymousClassInTrait.php
@@ -0,0 +1,24 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Routing\Tests\Fixtures\OtherAnnotatedClasses;
+
+trait AnonymousClassInTrait
+{
+ public function test()
+ {
+ return new class() {
+ public function foo()
+ {
+ }
+ };
+ }
+}
diff --git a/assets/php/vendor/symfony/routing/Tests/Fixtures/OtherAnnotatedClasses/NoStartTagClass.php b/assets/php/vendor/symfony/routing/Tests/Fixtures/OtherAnnotatedClasses/NoStartTagClass.php
new file mode 100644
index 0000000..8900d34
--- /dev/null
+++ b/assets/php/vendor/symfony/routing/Tests/Fixtures/OtherAnnotatedClasses/NoStartTagClass.php
@@ -0,0 +1,3 @@
+class NoStartTagClass
+{
+}
diff --git a/assets/php/vendor/symfony/routing/Tests/Fixtures/OtherAnnotatedClasses/VariadicClass.php b/assets/php/vendor/symfony/routing/Tests/Fixtures/OtherAnnotatedClasses/VariadicClass.php
new file mode 100644
index 0000000..729c9b4
--- /dev/null
+++ b/assets/php/vendor/symfony/routing/Tests/Fixtures/OtherAnnotatedClasses/VariadicClass.php
@@ -0,0 +1,19 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Routing\Tests\Fixtures\OtherAnnotatedClasses;
+
+class VariadicClass
+{
+ public function routeAction(...$params)
+ {
+ }
+}
diff --git a/assets/php/vendor/symfony/routing/Tests/Fixtures/RedirectableUrlMatcher.php b/assets/php/vendor/symfony/routing/Tests/Fixtures/RedirectableUrlMatcher.php
new file mode 100644
index 0000000..15937bc
--- /dev/null
+++ b/assets/php/vendor/symfony/routing/Tests/Fixtures/RedirectableUrlMatcher.php
@@ -0,0 +1,30 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Routing\Tests\Fixtures;
+
+use Symfony\Component\Routing\Matcher\UrlMatcher;
+use Symfony\Component\Routing\Matcher\RedirectableUrlMatcherInterface;
+
+/**
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class RedirectableUrlMatcher extends UrlMatcher implements RedirectableUrlMatcherInterface
+{
+ public function redirect($path, $route, $scheme = null)
+ {
+ return array(
+ '_controller' => 'Some controller reference...',
+ 'path' => $path,
+ 'scheme' => $scheme,
+ );
+ }
+}
diff --git a/assets/php/vendor/symfony/routing/Tests/Fixtures/annotated.php b/assets/php/vendor/symfony/routing/Tests/Fixtures/annotated.php
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/assets/php/vendor/symfony/routing/Tests/Fixtures/annotated.php
diff --git a/assets/php/vendor/symfony/routing/Tests/Fixtures/bad_format.yml b/assets/php/vendor/symfony/routing/Tests/Fixtures/bad_format.yml
new file mode 100644
index 0000000..8ba50e2
--- /dev/null
+++ b/assets/php/vendor/symfony/routing/Tests/Fixtures/bad_format.yml
@@ -0,0 +1,3 @@
+blog_show:
+ path: /blog/{slug}
+ defaults: { _controller: "MyBundle:Blog:show" }
diff --git a/assets/php/vendor/symfony/routing/Tests/Fixtures/bar.xml b/assets/php/vendor/symfony/routing/Tests/Fixtures/bar.xml
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/assets/php/vendor/symfony/routing/Tests/Fixtures/bar.xml
diff --git a/assets/php/vendor/symfony/routing/Tests/Fixtures/controller/import__controller.xml b/assets/php/vendor/symfony/routing/Tests/Fixtures/controller/import__controller.xml
new file mode 100644
index 0000000..bbe727d
--- /dev/null
+++ b/assets/php/vendor/symfony/routing/Tests/Fixtures/controller/import__controller.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<routes xmlns="http://symfony.com/schema/routing"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://symfony.com/schema/routing
+ http://symfony.com/schema/routing/routing-1.0.xsd">
+
+ <import resource="routing.xml">
+ <default key="_controller">FrameworkBundle:Template:template</default>
+ </import>
+</routes>
diff --git a/assets/php/vendor/symfony/routing/Tests/Fixtures/controller/import__controller.yml b/assets/php/vendor/symfony/routing/Tests/Fixtures/controller/import__controller.yml
new file mode 100644
index 0000000..4240b74
--- /dev/null
+++ b/assets/php/vendor/symfony/routing/Tests/Fixtures/controller/import__controller.yml
@@ -0,0 +1,4 @@
+_static:
+ resource: routing.yml
+ defaults:
+ _controller: FrameworkBundle:Template:template
diff --git a/assets/php/vendor/symfony/routing/Tests/Fixtures/controller/import_controller.xml b/assets/php/vendor/symfony/routing/Tests/Fixtures/controller/import_controller.xml
new file mode 100644
index 0000000..378b9ca
--- /dev/null
+++ b/assets/php/vendor/symfony/routing/Tests/Fixtures/controller/import_controller.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<routes xmlns="http://symfony.com/schema/routing"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://symfony.com/schema/routing
+ http://symfony.com/schema/routing/routing-1.0.xsd">
+
+ <import resource="routing.xml" controller="FrameworkBundle:Template:template" />
+</routes>
diff --git a/assets/php/vendor/symfony/routing/Tests/Fixtures/controller/import_controller.yml b/assets/php/vendor/symfony/routing/Tests/Fixtures/controller/import_controller.yml
new file mode 100644
index 0000000..1a71c62
--- /dev/null
+++ b/assets/php/vendor/symfony/routing/Tests/Fixtures/controller/import_controller.yml
@@ -0,0 +1,3 @@
+_static:
+ resource: routing.yml
+ controller: FrameworkBundle:Template:template
diff --git a/assets/php/vendor/symfony/routing/Tests/Fixtures/controller/import_override_defaults.xml b/assets/php/vendor/symfony/routing/Tests/Fixtures/controller/import_override_defaults.xml
new file mode 100644
index 0000000..e3c755a
--- /dev/null
+++ b/assets/php/vendor/symfony/routing/Tests/Fixtures/controller/import_override_defaults.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<routes xmlns="http://symfony.com/schema/routing"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://symfony.com/schema/routing
+ http://symfony.com/schema/routing/routing-1.0.xsd">
+
+ <import resource="routing.xml" controller="FrameworkBundle:Template:template">
+ <default key="_controller">AppBundle:Blog:index</default>
+ </import>
+</routes>
diff --git a/assets/php/vendor/symfony/routing/Tests/Fixtures/controller/import_override_defaults.yml b/assets/php/vendor/symfony/routing/Tests/Fixtures/controller/import_override_defaults.yml
new file mode 100644
index 0000000..db1ab3c
--- /dev/null
+++ b/assets/php/vendor/symfony/routing/Tests/Fixtures/controller/import_override_defaults.yml
@@ -0,0 +1,5 @@
+_static:
+ resource: routing.yml
+ controller: FrameworkBundle:Template:template
+ defaults:
+ _controller: AppBundle:Homepage:show
diff --git a/assets/php/vendor/symfony/routing/Tests/Fixtures/controller/override_defaults.xml b/assets/php/vendor/symfony/routing/Tests/Fixtures/controller/override_defaults.xml
new file mode 100644
index 0000000..f47c57b
--- /dev/null
+++ b/assets/php/vendor/symfony/routing/Tests/Fixtures/controller/override_defaults.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<routes xmlns="http://symfony.com/schema/routing"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://symfony.com/schema/routing
+ http://symfony.com/schema/routing/routing-1.0.xsd">
+
+ <route id="app_blog" path="/blog" controller="AppBundle:Homepage:show">
+ <default key="_controller">AppBundle:Blog:index</default>
+ </route>
+</routes>
diff --git a/assets/php/vendor/symfony/routing/Tests/Fixtures/controller/override_defaults.yml b/assets/php/vendor/symfony/routing/Tests/Fixtures/controller/override_defaults.yml
new file mode 100644
index 0000000..00a2c0e
--- /dev/null
+++ b/assets/php/vendor/symfony/routing/Tests/Fixtures/controller/override_defaults.yml
@@ -0,0 +1,5 @@
+app_blog:
+ path: /blog
+ controller: AppBundle:Homepage:show
+ defaults:
+ _controller: AppBundle:Blog:index
diff --git a/assets/php/vendor/symfony/routing/Tests/Fixtures/controller/routing.xml b/assets/php/vendor/symfony/routing/Tests/Fixtures/controller/routing.xml
new file mode 100644
index 0000000..6420138
--- /dev/null
+++ b/assets/php/vendor/symfony/routing/Tests/Fixtures/controller/routing.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<routes xmlns="http://symfony.com/schema/routing"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://symfony.com/schema/routing
+ http://symfony.com/schema/routing/routing-1.0.xsd">
+
+ <route id="app_homepage" path="/" controller="AppBundle:Homepage:show" />
+
+ <route id="app_blog" path="/blog">
+ <default key="_controller">AppBundle:Blog:list</default>
+ </route>
+
+ <route id="app_logout" path="/logout" />
+</routes>
diff --git a/assets/php/vendor/symfony/routing/Tests/Fixtures/controller/routing.yml b/assets/php/vendor/symfony/routing/Tests/Fixtures/controller/routing.yml
new file mode 100644
index 0000000..cb71ec3
--- /dev/null
+++ b/assets/php/vendor/symfony/routing/Tests/Fixtures/controller/routing.yml
@@ -0,0 +1,11 @@
+app_homepage:
+ path: /
+ controller: AppBundle:Homepage:show
+
+app_blog:
+ path: /blog
+ defaults:
+ _controller: AppBundle:Blog:list
+
+app_logout:
+ path: /logout
diff --git a/assets/php/vendor/symfony/routing/Tests/Fixtures/directory/recurse/routes1.yml b/assets/php/vendor/symfony/routing/Tests/Fixtures/directory/recurse/routes1.yml
new file mode 100644
index 0000000..d078836
--- /dev/null
+++ b/assets/php/vendor/symfony/routing/Tests/Fixtures/directory/recurse/routes1.yml
@@ -0,0 +1,2 @@
+route1:
+ path: /route/1
diff --git a/assets/php/vendor/symfony/routing/Tests/Fixtures/directory/recurse/routes2.yml b/assets/php/vendor/symfony/routing/Tests/Fixtures/directory/recurse/routes2.yml
new file mode 100644
index 0000000..938fb24
--- /dev/null
+++ b/assets/php/vendor/symfony/routing/Tests/Fixtures/directory/recurse/routes2.yml
@@ -0,0 +1,2 @@
+route2:
+ path: /route/2
diff --git a/assets/php/vendor/symfony/routing/Tests/Fixtures/directory/routes3.yml b/assets/php/vendor/symfony/routing/Tests/Fixtures/directory/routes3.yml
new file mode 100644
index 0000000..088cfb4
--- /dev/null
+++ b/assets/php/vendor/symfony/routing/Tests/Fixtures/directory/routes3.yml
@@ -0,0 +1,2 @@
+route3:
+ path: /route/3
diff --git a/assets/php/vendor/symfony/routing/Tests/Fixtures/directory_import/import.yml b/assets/php/vendor/symfony/routing/Tests/Fixtures/directory_import/import.yml
new file mode 100644
index 0000000..af829e5
--- /dev/null
+++ b/assets/php/vendor/symfony/routing/Tests/Fixtures/directory_import/import.yml
@@ -0,0 +1,3 @@
+_directory:
+ resource: "../directory"
+ type: directory
diff --git a/assets/php/vendor/symfony/routing/Tests/Fixtures/dumper/url_matcher0.php b/assets/php/vendor/symfony/routing/Tests/Fixtures/dumper/url_matcher0.php
new file mode 100644
index 0000000..9e9b910
--- /dev/null
+++ b/assets/php/vendor/symfony/routing/Tests/Fixtures/dumper/url_matcher0.php
@@ -0,0 +1,37 @@
+<?php
+
+use Symfony\Component\Routing\Exception\MethodNotAllowedException;
+use Symfony\Component\Routing\Exception\ResourceNotFoundException;
+use Symfony\Component\Routing\RequestContext;
+
+/**
+ * This class has been auto-generated
+ * by the Symfony Routing Component.
+ */
+class ProjectUrlMatcher extends Symfony\Component\Routing\Matcher\UrlMatcher
+{
+ public function __construct(RequestContext $context)
+ {
+ $this->context = $context;
+ }
+
+ public function match($rawPathinfo)
+ {
+ $allow = array();
+ $pathinfo = rawurldecode($rawPathinfo);
+ $trimmedPathinfo = rtrim($pathinfo, '/');
+ $context = $this->context;
+ $request = $this->request ?: $this->createRequest($pathinfo);
+ $requestMethod = $canonicalMethod = $context->getMethod();
+
+ if ('HEAD' === $requestMethod) {
+ $canonicalMethod = 'GET';
+ }
+
+ if ('/' === $pathinfo && !$allow) {
+ throw new Symfony\Component\Routing\Exception\NoConfigurationException();
+ }
+
+ throw 0 < count($allow) ? new MethodNotAllowedException(array_unique($allow)) : new ResourceNotFoundException();
+ }
+}
diff --git a/assets/php/vendor/symfony/routing/Tests/Fixtures/dumper/url_matcher1.php b/assets/php/vendor/symfony/routing/Tests/Fixtures/dumper/url_matcher1.php
new file mode 100644
index 0000000..23a93c1
--- /dev/null
+++ b/assets/php/vendor/symfony/routing/Tests/Fixtures/dumper/url_matcher1.php
@@ -0,0 +1,318 @@
+<?php
+
+use Symfony\Component\Routing\Exception\MethodNotAllowedException;
+use Symfony\Component\Routing\Exception\ResourceNotFoundException;
+use Symfony\Component\Routing\RequestContext;
+
+/**
+ * This class has been auto-generated
+ * by the Symfony Routing Component.
+ */
+class ProjectUrlMatcher extends Symfony\Component\Routing\Matcher\UrlMatcher
+{
+ public function __construct(RequestContext $context)
+ {
+ $this->context = $context;
+ }
+
+ public function match($rawPathinfo)
+ {
+ $allow = array();
+ $pathinfo = rawurldecode($rawPathinfo);
+ $trimmedPathinfo = rtrim($pathinfo, '/');
+ $context = $this->context;
+ $request = $this->request ?: $this->createRequest($pathinfo);
+ $requestMethod = $canonicalMethod = $context->getMethod();
+
+ if ('HEAD' === $requestMethod) {
+ $canonicalMethod = 'GET';
+ }
+
+ if (0 === strpos($pathinfo, '/foo')) {
+ // foo
+ if (preg_match('#^/foo/(?P<bar>baz|symfony)$#sD', $pathinfo, $matches)) {
+ return $this->mergeDefaults(array_replace($matches, array('_route' => 'foo')), array ( 'def' => 'test',));
+ }
+
+ // foofoo
+ if ('/foofoo' === $pathinfo) {
+ return array ( 'def' => 'test', '_route' => 'foofoo',);
+ }
+
+ }
+
+ elseif (0 === strpos($pathinfo, '/bar')) {
+ // bar
+ if (preg_match('#^/bar/(?P<foo>[^/]++)$#sD', $pathinfo, $matches)) {
+ $ret = $this->mergeDefaults(array_replace($matches, array('_route' => 'bar')), array ());
+ if (!in_array($canonicalMethod, array('GET', 'HEAD'))) {
+ $allow = array_merge($allow, array('GET', 'HEAD'));
+ goto not_bar;
+ }
+
+ return $ret;
+ }
+ not_bar:
+
+ // barhead
+ if (0 === strpos($pathinfo, '/barhead') && preg_match('#^/barhead/(?P<foo>[^/]++)$#sD', $pathinfo, $matches)) {
+ $ret = $this->mergeDefaults(array_replace($matches, array('_route' => 'barhead')), array ());
+ if (!in_array($canonicalMethod, array('GET'))) {
+ $allow = array_merge($allow, array('GET'));
+ goto not_barhead;
+ }
+
+ return $ret;
+ }
+ not_barhead:
+
+ }
+
+ elseif (0 === strpos($pathinfo, '/test')) {
+ if (0 === strpos($pathinfo, '/test/baz')) {
+ // baz
+ if ('/test/baz' === $pathinfo) {
+ return array('_route' => 'baz');
+ }
+
+ // baz2
+ if ('/test/baz.html' === $pathinfo) {
+ return array('_route' => 'baz2');
+ }
+
+ // baz3
+ if ('/test/baz3/' === $pathinfo) {
+ return array('_route' => 'baz3');
+ }
+
+ }
+
+ // baz4
+ if (preg_match('#^/test/(?P<foo>[^/]++)/$#sD', $pathinfo, $matches)) {
+ return $this->mergeDefaults(array_replace($matches, array('_route' => 'baz4')), array ());
+ }
+
+ // baz5
+ if (preg_match('#^/test/(?P<foo>[^/]++)/$#sD', $pathinfo, $matches)) {
+ $ret = $this->mergeDefaults(array_replace($matches, array('_route' => 'baz5')), array ());
+ if (!in_array($requestMethod, array('POST'))) {
+ $allow = array_merge($allow, array('POST'));
+ goto not_baz5;
+ }
+
+ return $ret;
+ }
+ not_baz5:
+
+ // baz.baz6
+ if (preg_match('#^/test/(?P<foo>[^/]++)/$#sD', $pathinfo, $matches)) {
+ $ret = $this->mergeDefaults(array_replace($matches, array('_route' => 'baz.baz6')), array ());
+ if (!in_array($requestMethod, array('PUT'))) {
+ $allow = array_merge($allow, array('PUT'));
+ goto not_bazbaz6;
+ }
+
+ return $ret;
+ }
+ not_bazbaz6:
+
+ }
+
+ // quoter
+ if (preg_match('#^/(?P<quoter>[\']+)$#sD', $pathinfo, $matches)) {
+ return $this->mergeDefaults(array_replace($matches, array('_route' => 'quoter')), array ());
+ }
+
+ // space
+ if ('/spa ce' === $pathinfo) {
+ return array('_route' => 'space');
+ }
+
+ if (0 === strpos($pathinfo, '/a')) {
+ if (0 === strpos($pathinfo, '/a/b\'b')) {
+ // foo1
+ if (preg_match('#^/a/b\'b/(?P<foo>[^/]++)$#sD', $pathinfo, $matches)) {
+ return $this->mergeDefaults(array_replace($matches, array('_route' => 'foo1')), array ());
+ }
+
+ // bar1
+ if (preg_match('#^/a/b\'b/(?P<bar>[^/]++)$#sD', $pathinfo, $matches)) {
+ return $this->mergeDefaults(array_replace($matches, array('_route' => 'bar1')), array ());
+ }
+
+ }
+
+ // overridden
+ if (preg_match('#^/a/(?P<var>.*)$#sD', $pathinfo, $matches)) {
+ return $this->mergeDefaults(array_replace($matches, array('_route' => 'overridden')), array ());
+ }
+
+ if (0 === strpos($pathinfo, '/a/b\'b')) {
+ // foo2
+ if (preg_match('#^/a/b\'b/(?P<foo1>[^/]++)$#sD', $pathinfo, $matches)) {
+ return $this->mergeDefaults(array_replace($matches, array('_route' => 'foo2')), array ());
+ }
+
+ // bar2
+ if (preg_match('#^/a/b\'b/(?P<bar1>[^/]++)$#sD', $pathinfo, $matches)) {
+ return $this->mergeDefaults(array_replace($matches, array('_route' => 'bar2')), array ());
+ }
+
+ }
+
+ }
+
+ elseif (0 === strpos($pathinfo, '/multi')) {
+ // helloWorld
+ if (0 === strpos($pathinfo, '/multi/hello') && preg_match('#^/multi/hello(?:/(?P<who>[^/]++))?$#sD', $pathinfo, $matches)) {
+ return $this->mergeDefaults(array_replace($matches, array('_route' => 'helloWorld')), array ( 'who' => 'World!',));
+ }
+
+ // hey
+ if ('/multi/hey/' === $pathinfo) {
+ return array('_route' => 'hey');
+ }
+
+ // overridden2
+ if ('/multi/new' === $pathinfo) {
+ return array('_route' => 'overridden2');
+ }
+
+ }
+
+ // foo3
+ if (preg_match('#^/(?P<_locale>[^/]++)/b/(?P<foo>[^/]++)$#sD', $pathinfo, $matches)) {
+ return $this->mergeDefaults(array_replace($matches, array('_route' => 'foo3')), array ());
+ }
+
+ // bar3
+ if (preg_match('#^/(?P<_locale>[^/]++)/b/(?P<bar>[^/]++)$#sD', $pathinfo, $matches)) {
+ return $this->mergeDefaults(array_replace($matches, array('_route' => 'bar3')), array ());
+ }
+
+ if (0 === strpos($pathinfo, '/aba')) {
+ // ababa
+ if ('/ababa' === $pathinfo) {
+ return array('_route' => 'ababa');
+ }
+
+ // foo4
+ if (preg_match('#^/aba/(?P<foo>[^/]++)$#sD', $pathinfo, $matches)) {
+ return $this->mergeDefaults(array_replace($matches, array('_route' => 'foo4')), array ());
+ }
+
+ }
+
+ $host = $context->getHost();
+
+ if (preg_match('#^a\\.example\\.com$#sDi', $host, $hostMatches)) {
+ // route1
+ if ('/route1' === $pathinfo) {
+ return array('_route' => 'route1');
+ }
+
+ // route2
+ if ('/c2/route2' === $pathinfo) {
+ return array('_route' => 'route2');
+ }
+
+ }
+
+ if (preg_match('#^b\\.example\\.com$#sDi', $host, $hostMatches)) {
+ // route3
+ if ('/c2/route3' === $pathinfo) {
+ return array('_route' => 'route3');
+ }
+
+ }
+
+ if (preg_match('#^a\\.example\\.com$#sDi', $host, $hostMatches)) {
+ // route4
+ if ('/route4' === $pathinfo) {
+ return array('_route' => 'route4');
+ }
+
+ }
+
+ if (preg_match('#^c\\.example\\.com$#sDi', $host, $hostMatches)) {
+ // route5
+ if ('/route5' === $pathinfo) {
+ return array('_route' => 'route5');
+ }
+
+ }
+
+ // route6
+ if ('/route6' === $pathinfo) {
+ return array('_route' => 'route6');
+ }
+
+ if (preg_match('#^(?P<var1>[^\\.]++)\\.example\\.com$#sDi', $host, $hostMatches)) {
+ if (0 === strpos($pathinfo, '/route1')) {
+ // route11
+ if ('/route11' === $pathinfo) {
+ return $this->mergeDefaults(array_replace($hostMatches, array('_route' => 'route11')), array ());
+ }
+
+ // route12
+ if ('/route12' === $pathinfo) {
+ return $this->mergeDefaults(array_replace($hostMatches, array('_route' => 'route12')), array ( 'var1' => 'val',));
+ }
+
+ // route13
+ if (0 === strpos($pathinfo, '/route13') && preg_match('#^/route13/(?P<name>[^/]++)$#sD', $pathinfo, $matches)) {
+ return $this->mergeDefaults(array_replace($hostMatches, $matches, array('_route' => 'route13')), array ());
+ }
+
+ // route14
+ if (0 === strpos($pathinfo, '/route14') && preg_match('#^/route14/(?P<name>[^/]++)$#sD', $pathinfo, $matches)) {
+ return $this->mergeDefaults(array_replace($hostMatches, $matches, array('_route' => 'route14')), array ( 'var1' => 'val',));
+ }
+
+ }
+
+ }
+
+ if (preg_match('#^c\\.example\\.com$#sDi', $host, $hostMatches)) {
+ // route15
+ if (0 === strpos($pathinfo, '/route15') && preg_match('#^/route15/(?P<name>[^/]++)$#sD', $pathinfo, $matches)) {
+ return $this->mergeDefaults(array_replace($matches, array('_route' => 'route15')), array ());
+ }
+
+ }
+
+ // route16
+ if (0 === strpos($pathinfo, '/route16') && preg_match('#^/route16/(?P<name>[^/]++)$#sD', $pathinfo, $matches)) {
+ return $this->mergeDefaults(array_replace($matches, array('_route' => 'route16')), array ( 'var1' => 'val',));
+ }
+
+ // route17
+ if ('/route17' === $pathinfo) {
+ return array('_route' => 'route17');
+ }
+
+ // a
+ if ('/a/a...' === $pathinfo) {
+ return array('_route' => 'a');
+ }
+
+ if (0 === strpos($pathinfo, '/a/b')) {
+ // b
+ if (preg_match('#^/a/b/(?P<var>[^/]++)$#sD', $pathinfo, $matches)) {
+ return $this->mergeDefaults(array_replace($matches, array('_route' => 'b')), array ());
+ }
+
+ // c
+ if (0 === strpos($pathinfo, '/a/b/c') && preg_match('#^/a/b/c/(?P<var>[^/]++)$#sD', $pathinfo, $matches)) {
+ return $this->mergeDefaults(array_replace($matches, array('_route' => 'c')), array ());
+ }
+
+ }
+
+ if ('/' === $pathinfo && !$allow) {
+ throw new Symfony\Component\Routing\Exception\NoConfigurationException();
+ }
+
+ throw 0 < count($allow) ? new MethodNotAllowedException(array_unique($allow)) : new ResourceNotFoundException();
+ }
+}
diff --git a/assets/php/vendor/symfony/routing/Tests/Fixtures/dumper/url_matcher2.php b/assets/php/vendor/symfony/routing/Tests/Fixtures/dumper/url_matcher2.php
new file mode 100644
index 0000000..e430adb
--- /dev/null
+++ b/assets/php/vendor/symfony/routing/Tests/Fixtures/dumper/url_matcher2.php
@@ -0,0 +1,380 @@
+<?php
+
+use Symfony\Component\Routing\Exception\MethodNotAllowedException;
+use Symfony\Component\Routing\Exception\ResourceNotFoundException;
+use Symfony\Component\Routing\RequestContext;
+
+/**
+ * This class has been auto-generated
+ * by the Symfony Routing Component.
+ */
+class ProjectUrlMatcher extends Symfony\Component\Routing\Tests\Fixtures\RedirectableUrlMatcher
+{
+ public function __construct(RequestContext $context)
+ {
+ $this->context = $context;
+ }
+
+ public function match($rawPathinfo)
+ {
+ $allow = array();
+ $pathinfo = rawurldecode($rawPathinfo);
+ $trimmedPathinfo = rtrim($pathinfo, '/');
+ $context = $this->context;
+ $request = $this->request ?: $this->createRequest($pathinfo);
+ $requestMethod = $canonicalMethod = $context->getMethod();
+
+ if ('HEAD' === $requestMethod) {
+ $canonicalMethod = 'GET';
+ }
+
+ if (0 === strpos($pathinfo, '/foo')) {
+ // foo
+ if (preg_match('#^/foo/(?P<bar>baz|symfony)$#sD', $pathinfo, $matches)) {
+ return $this->mergeDefaults(array_replace($matches, array('_route' => 'foo')), array ( 'def' => 'test',));
+ }
+
+ // foofoo
+ if ('/foofoo' === $pathinfo) {
+ return array ( 'def' => 'test', '_route' => 'foofoo',);
+ }
+
+ }
+
+ elseif (0 === strpos($pathinfo, '/bar')) {
+ // bar
+ if (preg_match('#^/bar/(?P<foo>[^/]++)$#sD', $pathinfo, $matches)) {
+ $ret = $this->mergeDefaults(array_replace($matches, array('_route' => 'bar')), array ());
+ if (!in_array($canonicalMethod, array('GET', 'HEAD'))) {
+ $allow = array_merge($allow, array('GET', 'HEAD'));
+ goto not_bar;
+ }
+
+ return $ret;
+ }
+ not_bar:
+
+ // barhead
+ if (0 === strpos($pathinfo, '/barhead') && preg_match('#^/barhead/(?P<foo>[^/]++)$#sD', $pathinfo, $matches)) {
+ $ret = $this->mergeDefaults(array_replace($matches, array('_route' => 'barhead')), array ());
+ if (!in_array($canonicalMethod, array('GET'))) {
+ $allow = array_merge($allow, array('GET'));
+ goto not_barhead;
+ }
+
+ return $ret;
+ }
+ not_barhead:
+
+ }
+
+ elseif (0 === strpos($pathinfo, '/test')) {
+ if (0 === strpos($pathinfo, '/test/baz')) {
+ // baz
+ if ('/test/baz' === $pathinfo) {
+ return array('_route' => 'baz');
+ }
+
+ // baz2
+ if ('/test/baz.html' === $pathinfo) {
+ return array('_route' => 'baz2');
+ }
+
+ // baz3
+ if ('/test/baz3' === $trimmedPathinfo) {
+ $ret = array('_route' => 'baz3');
+ if ('/' === substr($pathinfo, -1)) {
+ // no-op
+ } elseif ('GET' !== $canonicalMethod) {
+ goto not_baz3;
+ } else {
+ return array_replace($ret, $this->redirect($rawPathinfo.'/', 'baz3'));
+ }
+
+ return $ret;
+ }
+ not_baz3:
+
+ }
+
+ // baz4
+ if (preg_match('#^/test/(?P<foo>[^/]++)/?$#sD', $pathinfo, $matches)) {
+ $ret = $this->mergeDefaults(array_replace($matches, array('_route' => 'baz4')), array ());
+ if ('/' === substr($pathinfo, -1)) {
+ // no-op
+ } elseif ('GET' !== $canonicalMethod) {
+ goto not_baz4;
+ } else {
+ return array_replace($ret, $this->redirect($rawPathinfo.'/', 'baz4'));
+ }
+
+ return $ret;
+ }
+ not_baz4:
+
+ // baz5
+ if (preg_match('#^/test/(?P<foo>[^/]++)/$#sD', $pathinfo, $matches)) {
+ $ret = $this->mergeDefaults(array_replace($matches, array('_route' => 'baz5')), array ());
+ if (!in_array($requestMethod, array('POST'))) {
+ $allow = array_merge($allow, array('POST'));
+ goto not_baz5;
+ }
+
+ return $ret;
+ }
+ not_baz5:
+
+ // baz.baz6
+ if (preg_match('#^/test/(?P<foo>[^/]++)/$#sD', $pathinfo, $matches)) {
+ $ret = $this->mergeDefaults(array_replace($matches, array('_route' => 'baz.baz6')), array ());
+ if (!in_array($requestMethod, array('PUT'))) {
+ $allow = array_merge($allow, array('PUT'));
+ goto not_bazbaz6;
+ }
+
+ return $ret;
+ }
+ not_bazbaz6:
+
+ }
+
+ // quoter
+ if (preg_match('#^/(?P<quoter>[\']+)$#sD', $pathinfo, $matches)) {
+ return $this->mergeDefaults(array_replace($matches, array('_route' => 'quoter')), array ());
+ }
+
+ // space
+ if ('/spa ce' === $pathinfo) {
+ return array('_route' => 'space');
+ }
+
+ if (0 === strpos($pathinfo, '/a')) {
+ if (0 === strpos($pathinfo, '/a/b\'b')) {
+ // foo1
+ if (preg_match('#^/a/b\'b/(?P<foo>[^/]++)$#sD', $pathinfo, $matches)) {
+ return $this->mergeDefaults(array_replace($matches, array('_route' => 'foo1')), array ());
+ }
+
+ // bar1
+ if (preg_match('#^/a/b\'b/(?P<bar>[^/]++)$#sD', $pathinfo, $matches)) {
+ return $this->mergeDefaults(array_replace($matches, array('_route' => 'bar1')), array ());
+ }
+
+ }
+
+ // overridden
+ if (preg_match('#^/a/(?P<var>.*)$#sD', $pathinfo, $matches)) {
+ return $this->mergeDefaults(array_replace($matches, array('_route' => 'overridden')), array ());
+ }
+
+ if (0 === strpos($pathinfo, '/a/b\'b')) {
+ // foo2
+ if (preg_match('#^/a/b\'b/(?P<foo1>[^/]++)$#sD', $pathinfo, $matches)) {
+ return $this->mergeDefaults(array_replace($matches, array('_route' => 'foo2')), array ());
+ }
+
+ // bar2
+ if (preg_match('#^/a/b\'b/(?P<bar1>[^/]++)$#sD', $pathinfo, $matches)) {
+ return $this->mergeDefaults(array_replace($matches, array('_route' => 'bar2')), array ());
+ }
+
+ }
+
+ }
+
+ elseif (0 === strpos($pathinfo, '/multi')) {
+ // helloWorld
+ if (0 === strpos($pathinfo, '/multi/hello') && preg_match('#^/multi/hello(?:/(?P<who>[^/]++))?$#sD', $pathinfo, $matches)) {
+ return $this->mergeDefaults(array_replace($matches, array('_route' => 'helloWorld')), array ( 'who' => 'World!',));
+ }
+
+ // hey
+ if ('/multi/hey' === $trimmedPathinfo) {
+ $ret = array('_route' => 'hey');
+ if ('/' === substr($pathinfo, -1)) {
+ // no-op
+ } elseif ('GET' !== $canonicalMethod) {
+ goto not_hey;
+ } else {
+ return array_replace($ret, $this->redirect($rawPathinfo.'/', 'hey'));
+ }
+
+ return $ret;
+ }
+ not_hey:
+
+ // overridden2
+ if ('/multi/new' === $pathinfo) {
+ return array('_route' => 'overridden2');
+ }
+
+ }
+
+ // foo3
+ if (preg_match('#^/(?P<_locale>[^/]++)/b/(?P<foo>[^/]++)$#sD', $pathinfo, $matches)) {
+ return $this->mergeDefaults(array_replace($matches, array('_route' => 'foo3')), array ());
+ }
+
+ // bar3
+ if (preg_match('#^/(?P<_locale>[^/]++)/b/(?P<bar>[^/]++)$#sD', $pathinfo, $matches)) {
+ return $this->mergeDefaults(array_replace($matches, array('_route' => 'bar3')), array ());
+ }
+
+ if (0 === strpos($pathinfo, '/aba')) {
+ // ababa
+ if ('/ababa' === $pathinfo) {
+ return array('_route' => 'ababa');
+ }
+
+ // foo4
+ if (preg_match('#^/aba/(?P<foo>[^/]++)$#sD', $pathinfo, $matches)) {
+ return $this->mergeDefaults(array_replace($matches, array('_route' => 'foo4')), array ());
+ }
+
+ }
+
+ $host = $context->getHost();
+
+ if (preg_match('#^a\\.example\\.com$#sDi', $host, $hostMatches)) {
+ // route1
+ if ('/route1' === $pathinfo) {
+ return array('_route' => 'route1');
+ }
+
+ // route2
+ if ('/c2/route2' === $pathinfo) {
+ return array('_route' => 'route2');
+ }
+
+ }
+
+ if (preg_match('#^b\\.example\\.com$#sDi', $host, $hostMatches)) {
+ // route3
+ if ('/c2/route3' === $pathinfo) {
+ return array('_route' => 'route3');
+ }
+
+ }
+
+ if (preg_match('#^a\\.example\\.com$#sDi', $host, $hostMatches)) {
+ // route4
+ if ('/route4' === $pathinfo) {
+ return array('_route' => 'route4');
+ }
+
+ }
+
+ if (preg_match('#^c\\.example\\.com$#sDi', $host, $hostMatches)) {
+ // route5
+ if ('/route5' === $pathinfo) {
+ return array('_route' => 'route5');
+ }
+
+ }
+
+ // route6
+ if ('/route6' === $pathinfo) {
+ return array('_route' => 'route6');
+ }
+
+ if (preg_match('#^(?P<var1>[^\\.]++)\\.example\\.com$#sDi', $host, $hostMatches)) {
+ if (0 === strpos($pathinfo, '/route1')) {
+ // route11
+ if ('/route11' === $pathinfo) {
+ return $this->mergeDefaults(array_replace($hostMatches, array('_route' => 'route11')), array ());
+ }
+
+ // route12
+ if ('/route12' === $pathinfo) {
+ return $this->mergeDefaults(array_replace($hostMatches, array('_route' => 'route12')), array ( 'var1' => 'val',));
+ }
+
+ // route13
+ if (0 === strpos($pathinfo, '/route13') && preg_match('#^/route13/(?P<name>[^/]++)$#sD', $pathinfo, $matches)) {
+ return $this->mergeDefaults(array_replace($hostMatches, $matches, array('_route' => 'route13')), array ());
+ }
+
+ // route14
+ if (0 === strpos($pathinfo, '/route14') && preg_match('#^/route14/(?P<name>[^/]++)$#sD', $pathinfo, $matches)) {
+ return $this->mergeDefaults(array_replace($hostMatches, $matches, array('_route' => 'route14')), array ( 'var1' => 'val',));
+ }
+
+ }
+
+ }
+
+ if (preg_match('#^c\\.example\\.com$#sDi', $host, $hostMatches)) {
+ // route15
+ if (0 === strpos($pathinfo, '/route15') && preg_match('#^/route15/(?P<name>[^/]++)$#sD', $pathinfo, $matches)) {
+ return $this->mergeDefaults(array_replace($matches, array('_route' => 'route15')), array ());
+ }
+
+ }
+
+ // route16
+ if (0 === strpos($pathinfo, '/route16') && preg_match('#^/route16/(?P<name>[^/]++)$#sD', $pathinfo, $matches)) {
+ return $this->mergeDefaults(array_replace($matches, array('_route' => 'route16')), array ( 'var1' => 'val',));
+ }
+
+ // route17
+ if ('/route17' === $pathinfo) {
+ return array('_route' => 'route17');
+ }
+
+ // a
+ if ('/a/a...' === $pathinfo) {
+ return array('_route' => 'a');
+ }
+
+ if (0 === strpos($pathinfo, '/a/b')) {
+ // b
+ if (preg_match('#^/a/b/(?P<var>[^/]++)$#sD', $pathinfo, $matches)) {
+ return $this->mergeDefaults(array_replace($matches, array('_route' => 'b')), array ());
+ }
+
+ // c
+ if (0 === strpos($pathinfo, '/a/b/c') && preg_match('#^/a/b/c/(?P<var>[^/]++)$#sD', $pathinfo, $matches)) {
+ return $this->mergeDefaults(array_replace($matches, array('_route' => 'c')), array ());
+ }
+
+ }
+
+ // secure
+ if ('/secure' === $pathinfo) {
+ $ret = array('_route' => 'secure');
+ $requiredSchemes = array ( 'https' => 0,);
+ if (!isset($requiredSchemes[$context->getScheme()])) {
+ if ('GET' !== $canonicalMethod) {
+ goto not_secure;
+ }
+
+ return array_replace($ret, $this->redirect($rawPathinfo, 'secure', key($requiredSchemes)));
+ }
+
+ return $ret;
+ }
+ not_secure:
+
+ // nonsecure
+ if ('/nonsecure' === $pathinfo) {
+ $ret = array('_route' => 'nonsecure');
+ $requiredSchemes = array ( 'http' => 0,);
+ if (!isset($requiredSchemes[$context->getScheme()])) {
+ if ('GET' !== $canonicalMethod) {
+ goto not_nonsecure;
+ }
+
+ return array_replace($ret, $this->redirect($rawPathinfo, 'nonsecure', key($requiredSchemes)));
+ }
+
+ return $ret;
+ }
+ not_nonsecure:
+
+ if ('/' === $pathinfo && !$allow) {
+ throw new Symfony\Component\Routing\Exception\NoConfigurationException();
+ }
+
+ throw 0 < count($allow) ? new MethodNotAllowedException(array_unique($allow)) : new ResourceNotFoundException();
+ }
+}
diff --git a/assets/php/vendor/symfony/routing/Tests/Fixtures/dumper/url_matcher3.php b/assets/php/vendor/symfony/routing/Tests/Fixtures/dumper/url_matcher3.php
new file mode 100644
index 0000000..67c4667
--- /dev/null
+++ b/assets/php/vendor/symfony/routing/Tests/Fixtures/dumper/url_matcher3.php
@@ -0,0 +1,55 @@
+<?php
+
+use Symfony\Component\Routing\Exception\MethodNotAllowedException;
+use Symfony\Component\Routing\Exception\ResourceNotFoundException;
+use Symfony\Component\Routing\RequestContext;
+
+/**
+ * This class has been auto-generated
+ * by the Symfony Routing Component.
+ */
+class ProjectUrlMatcher extends Symfony\Component\Routing\Matcher\UrlMatcher
+{
+ public function __construct(RequestContext $context)
+ {
+ $this->context = $context;
+ }
+
+ public function match($rawPathinfo)
+ {
+ $allow = array();
+ $pathinfo = rawurldecode($rawPathinfo);
+ $trimmedPathinfo = rtrim($pathinfo, '/');
+ $context = $this->context;
+ $request = $this->request ?: $this->createRequest($pathinfo);
+ $requestMethod = $canonicalMethod = $context->getMethod();
+
+ if ('HEAD' === $requestMethod) {
+ $canonicalMethod = 'GET';
+ }
+
+ if (0 === strpos($pathinfo, '/rootprefix')) {
+ // static
+ if ('/rootprefix/test' === $pathinfo) {
+ return array('_route' => 'static');
+ }
+
+ // dynamic
+ if (preg_match('#^/rootprefix/(?P<var>[^/]++)$#sD', $pathinfo, $matches)) {
+ return $this->mergeDefaults(array_replace($matches, array('_route' => 'dynamic')), array ());
+ }
+
+ }
+
+ // with-condition
+ if ('/with-condition' === $pathinfo && ($context->getMethod() == "GET")) {
+ return array('_route' => 'with-condition');
+ }
+
+ if ('/' === $pathinfo && !$allow) {
+ throw new Symfony\Component\Routing\Exception\NoConfigurationException();
+ }
+
+ throw 0 < count($allow) ? new MethodNotAllowedException(array_unique($allow)) : new ResourceNotFoundException();
+ }
+}
diff --git a/assets/php/vendor/symfony/routing/Tests/Fixtures/dumper/url_matcher4.php b/assets/php/vendor/symfony/routing/Tests/Fixtures/dumper/url_matcher4.php
new file mode 100644
index 0000000..ed07194
--- /dev/null
+++ b/assets/php/vendor/symfony/routing/Tests/Fixtures/dumper/url_matcher4.php
@@ -0,0 +1,112 @@
+<?php
+
+use Symfony\Component\Routing\Exception\MethodNotAllowedException;
+use Symfony\Component\Routing\Exception\ResourceNotFoundException;
+use Symfony\Component\Routing\RequestContext;
+
+/**
+ * This class has been auto-generated
+ * by the Symfony Routing Component.
+ */
+class ProjectUrlMatcher extends Symfony\Component\Routing\Matcher\UrlMatcher
+{
+ public function __construct(RequestContext $context)
+ {
+ $this->context = $context;
+ }
+
+ public function match($rawPathinfo)
+ {
+ $allow = array();
+ $pathinfo = rawurldecode($rawPathinfo);
+ $trimmedPathinfo = rtrim($pathinfo, '/');
+ $context = $this->context;
+ $request = $this->request ?: $this->createRequest($pathinfo);
+ $requestMethod = $canonicalMethod = $context->getMethod();
+
+ if ('HEAD' === $requestMethod) {
+ $canonicalMethod = 'GET';
+ }
+
+ // just_head
+ if ('/just_head' === $pathinfo) {
+ $ret = array('_route' => 'just_head');
+ if (!in_array($requestMethod, array('HEAD'))) {
+ $allow = array_merge($allow, array('HEAD'));
+ goto not_just_head;
+ }
+
+ return $ret;
+ }
+ not_just_head:
+
+ // head_and_get
+ if ('/head_and_get' === $pathinfo) {
+ $ret = array('_route' => 'head_and_get');
+ if (!in_array($canonicalMethod, array('HEAD', 'GET'))) {
+ $allow = array_merge($allow, array('HEAD', 'GET'));
+ goto not_head_and_get;
+ }
+
+ return $ret;
+ }
+ not_head_and_get:
+
+ // get_and_head
+ if ('/get_and_head' === $pathinfo) {
+ $ret = array('_route' => 'get_and_head');
+ if (!in_array($canonicalMethod, array('GET', 'HEAD'))) {
+ $allow = array_merge($allow, array('GET', 'HEAD'));
+ goto not_get_and_head;
+ }
+
+ return $ret;
+ }
+ not_get_and_head:
+
+ // post_and_head
+ if ('/post_and_head' === $pathinfo) {
+ $ret = array('_route' => 'post_and_head');
+ if (!in_array($requestMethod, array('POST', 'HEAD'))) {
+ $allow = array_merge($allow, array('POST', 'HEAD'));
+ goto not_post_and_head;
+ }
+
+ return $ret;
+ }
+ not_post_and_head:
+
+ if (0 === strpos($pathinfo, '/put_and_post')) {
+ // put_and_post
+ if ('/put_and_post' === $pathinfo) {
+ $ret = array('_route' => 'put_and_post');
+ if (!in_array($requestMethod, array('PUT', 'POST'))) {
+ $allow = array_merge($allow, array('PUT', 'POST'));
+ goto not_put_and_post;
+ }
+
+ return $ret;
+ }
+ not_put_and_post:
+
+ // put_and_get_and_head
+ if ('/put_and_post' === $pathinfo) {
+ $ret = array('_route' => 'put_and_get_and_head');
+ if (!in_array($canonicalMethod, array('PUT', 'GET', 'HEAD'))) {
+ $allow = array_merge($allow, array('PUT', 'GET', 'HEAD'));
+ goto not_put_and_get_and_head;
+ }
+
+ return $ret;
+ }
+ not_put_and_get_and_head:
+
+ }
+
+ if ('/' === $pathinfo && !$allow) {
+ throw new Symfony\Component\Routing\Exception\NoConfigurationException();
+ }
+
+ throw 0 < count($allow) ? new MethodNotAllowedException(array_unique($allow)) : new ResourceNotFoundException();
+ }
+}
diff --git a/assets/php/vendor/symfony/routing/Tests/Fixtures/dumper/url_matcher5.php b/assets/php/vendor/symfony/routing/Tests/Fixtures/dumper/url_matcher5.php
new file mode 100644
index 0000000..2b22513
--- /dev/null
+++ b/assets/php/vendor/symfony/routing/Tests/Fixtures/dumper/url_matcher5.php
@@ -0,0 +1,209 @@
+<?php
+
+use Symfony\Component\Routing\Exception\MethodNotAllowedException;
+use Symfony\Component\Routing\Exception\ResourceNotFoundException;
+use Symfony\Component\Routing\RequestContext;
+
+/**
+ * This class has been auto-generated
+ * by the Symfony Routing Component.
+ */
+class ProjectUrlMatcher extends Symfony\Component\Routing\Tests\Fixtures\RedirectableUrlMatcher
+{
+ public function __construct(RequestContext $context)
+ {
+ $this->context = $context;
+ }
+
+ public function match($rawPathinfo)
+ {
+ $allow = array();
+ $pathinfo = rawurldecode($rawPathinfo);
+ $trimmedPathinfo = rtrim($pathinfo, '/');
+ $context = $this->context;
+ $request = $this->request ?: $this->createRequest($pathinfo);
+ $requestMethod = $canonicalMethod = $context->getMethod();
+
+ if ('HEAD' === $requestMethod) {
+ $canonicalMethod = 'GET';
+ }
+
+ if (0 === strpos($pathinfo, '/a')) {
+ // a_first
+ if ('/a/11' === $pathinfo) {
+ return array('_route' => 'a_first');
+ }
+
+ // a_second
+ if ('/a/22' === $pathinfo) {
+ return array('_route' => 'a_second');
+ }
+
+ // a_third
+ if ('/a/333' === $pathinfo) {
+ return array('_route' => 'a_third');
+ }
+
+ }
+
+ // a_wildcard
+ if (preg_match('#^/(?P<param>[^/]++)$#sD', $pathinfo, $matches)) {
+ return $this->mergeDefaults(array_replace($matches, array('_route' => 'a_wildcard')), array ());
+ }
+
+ if (0 === strpos($pathinfo, '/a')) {
+ // a_fourth
+ if ('/a/44' === $trimmedPathinfo) {
+ $ret = array('_route' => 'a_fourth');
+ if ('/' === substr($pathinfo, -1)) {
+ // no-op
+ } elseif ('GET' !== $canonicalMethod) {
+ goto not_a_fourth;
+ } else {
+ return array_replace($ret, $this->redirect($rawPathinfo.'/', 'a_fourth'));
+ }
+
+ return $ret;
+ }
+ not_a_fourth:
+
+ // a_fifth
+ if ('/a/55' === $trimmedPathinfo) {
+ $ret = array('_route' => 'a_fifth');
+ if ('/' === substr($pathinfo, -1)) {
+ // no-op
+ } elseif ('GET' !== $canonicalMethod) {
+ goto not_a_fifth;
+ } else {
+ return array_replace($ret, $this->redirect($rawPathinfo.'/', 'a_fifth'));
+ }
+
+ return $ret;
+ }
+ not_a_fifth:
+
+ // a_sixth
+ if ('/a/66' === $trimmedPathinfo) {
+ $ret = array('_route' => 'a_sixth');
+ if ('/' === substr($pathinfo, -1)) {
+ // no-op
+ } elseif ('GET' !== $canonicalMethod) {
+ goto not_a_sixth;
+ } else {
+ return array_replace($ret, $this->redirect($rawPathinfo.'/', 'a_sixth'));
+ }
+
+ return $ret;
+ }
+ not_a_sixth:
+
+ }
+
+ // nested_wildcard
+ if (0 === strpos($pathinfo, '/nested') && preg_match('#^/nested/(?P<param>[^/]++)$#sD', $pathinfo, $matches)) {
+ return $this->mergeDefaults(array_replace($matches, array('_route' => 'nested_wildcard')), array ());
+ }
+
+ if (0 === strpos($pathinfo, '/nested/group')) {
+ // nested_a
+ if ('/nested/group/a' === $trimmedPathinfo) {
+ $ret = array('_route' => 'nested_a');
+ if ('/' === substr($pathinfo, -1)) {
+ // no-op
+ } elseif ('GET' !== $canonicalMethod) {
+ goto not_nested_a;
+ } else {
+ return array_replace($ret, $this->redirect($rawPathinfo.'/', 'nested_a'));
+ }
+
+ return $ret;
+ }
+ not_nested_a:
+
+ // nested_b
+ if ('/nested/group/b' === $trimmedPathinfo) {
+ $ret = array('_route' => 'nested_b');
+ if ('/' === substr($pathinfo, -1)) {
+ // no-op
+ } elseif ('GET' !== $canonicalMethod) {
+ goto not_nested_b;
+ } else {
+ return array_replace($ret, $this->redirect($rawPathinfo.'/', 'nested_b'));
+ }
+
+ return $ret;
+ }
+ not_nested_b:
+
+ // nested_c
+ if ('/nested/group/c' === $trimmedPathinfo) {
+ $ret = array('_route' => 'nested_c');
+ if ('/' === substr($pathinfo, -1)) {
+ // no-op
+ } elseif ('GET' !== $canonicalMethod) {
+ goto not_nested_c;
+ } else {
+ return array_replace($ret, $this->redirect($rawPathinfo.'/', 'nested_c'));
+ }
+
+ return $ret;
+ }
+ not_nested_c:
+
+ }
+
+ elseif (0 === strpos($pathinfo, '/slashed/group')) {
+ // slashed_a
+ if ('/slashed/group' === $trimmedPathinfo) {
+ $ret = array('_route' => 'slashed_a');
+ if ('/' === substr($pathinfo, -1)) {
+ // no-op
+ } elseif ('GET' !== $canonicalMethod) {
+ goto not_slashed_a;
+ } else {
+ return array_replace($ret, $this->redirect($rawPathinfo.'/', 'slashed_a'));
+ }
+
+ return $ret;
+ }
+ not_slashed_a:
+
+ // slashed_b
+ if ('/slashed/group/b' === $trimmedPathinfo) {
+ $ret = array('_route' => 'slashed_b');
+ if ('/' === substr($pathinfo, -1)) {
+ // no-op
+ } elseif ('GET' !== $canonicalMethod) {
+ goto not_slashed_b;
+ } else {
+ return array_replace($ret, $this->redirect($rawPathinfo.'/', 'slashed_b'));
+ }
+
+ return $ret;
+ }
+ not_slashed_b:
+
+ // slashed_c
+ if ('/slashed/group/c' === $trimmedPathinfo) {
+ $ret = array('_route' => 'slashed_c');
+ if ('/' === substr($pathinfo, -1)) {
+ // no-op
+ } elseif ('GET' !== $canonicalMethod) {
+ goto not_slashed_c;
+ } else {
+ return array_replace($ret, $this->redirect($rawPathinfo.'/', 'slashed_c'));
+ }
+
+ return $ret;
+ }
+ not_slashed_c:
+
+ }
+
+ if ('/' === $pathinfo && !$allow) {
+ throw new Symfony\Component\Routing\Exception\NoConfigurationException();
+ }
+
+ throw 0 < count($allow) ? new MethodNotAllowedException(array_unique($allow)) : new ResourceNotFoundException();
+ }
+}
diff --git a/assets/php/vendor/symfony/routing/Tests/Fixtures/dumper/url_matcher6.php b/assets/php/vendor/symfony/routing/Tests/Fixtures/dumper/url_matcher6.php
new file mode 100644
index 0000000..48ecdf8
--- /dev/null
+++ b/assets/php/vendor/symfony/routing/Tests/Fixtures/dumper/url_matcher6.php
@@ -0,0 +1,213 @@
+<?php
+
+use Symfony\Component\Routing\Exception\MethodNotAllowedException;
+use Symfony\Component\Routing\Exception\ResourceNotFoundException;
+use Symfony\Component\Routing\RequestContext;
+
+/**
+ * This class has been auto-generated
+ * by the Symfony Routing Component.
+ */
+class ProjectUrlMatcher extends Symfony\Component\Routing\Matcher\UrlMatcher
+{
+ public function __construct(RequestContext $context)
+ {
+ $this->context = $context;
+ }
+
+ public function match($rawPathinfo)
+ {
+ $allow = array();
+ $pathinfo = rawurldecode($rawPathinfo);
+ $trimmedPathinfo = rtrim($pathinfo, '/');
+ $context = $this->context;
+ $request = $this->request ?: $this->createRequest($pathinfo);
+ $requestMethod = $canonicalMethod = $context->getMethod();
+
+ if ('HEAD' === $requestMethod) {
+ $canonicalMethod = 'GET';
+ }
+
+ if (0 === strpos($pathinfo, '/trailing/simple')) {
+ // simple_trailing_slash_no_methods
+ if ('/trailing/simple/no-methods/' === $pathinfo) {
+ return array('_route' => 'simple_trailing_slash_no_methods');
+ }
+
+ // simple_trailing_slash_GET_method
+ if ('/trailing/simple/get-method/' === $pathinfo) {
+ $ret = array('_route' => 'simple_trailing_slash_GET_method');
+ if (!in_array($canonicalMethod, array('GET'))) {
+ $allow = array_merge($allow, array('GET'));
+ goto not_simple_trailing_slash_GET_method;
+ }
+
+ return $ret;
+ }
+ not_simple_trailing_slash_GET_method:
+
+ // simple_trailing_slash_HEAD_method
+ if ('/trailing/simple/head-method/' === $pathinfo) {
+ $ret = array('_route' => 'simple_trailing_slash_HEAD_method');
+ if (!in_array($requestMethod, array('HEAD'))) {
+ $allow = array_merge($allow, array('HEAD'));
+ goto not_simple_trailing_slash_HEAD_method;
+ }
+
+ return $ret;
+ }
+ not_simple_trailing_slash_HEAD_method:
+
+ // simple_trailing_slash_POST_method
+ if ('/trailing/simple/post-method/' === $pathinfo) {
+ $ret = array('_route' => 'simple_trailing_slash_POST_method');
+ if (!in_array($requestMethod, array('POST'))) {
+ $allow = array_merge($allow, array('POST'));
+ goto not_simple_trailing_slash_POST_method;
+ }
+
+ return $ret;
+ }
+ not_simple_trailing_slash_POST_method:
+
+ }
+
+ elseif (0 === strpos($pathinfo, '/trailing/regex')) {
+ // regex_trailing_slash_no_methods
+ if (0 === strpos($pathinfo, '/trailing/regex/no-methods') && preg_match('#^/trailing/regex/no\\-methods/(?P<param>[^/]++)/$#sD', $pathinfo, $matches)) {
+ return $this->mergeDefaults(array_replace($matches, array('_route' => 'regex_trailing_slash_no_methods')), array ());
+ }
+
+ // regex_trailing_slash_GET_method
+ if (0 === strpos($pathinfo, '/trailing/regex/get-method') && preg_match('#^/trailing/regex/get\\-method/(?P<param>[^/]++)/$#sD', $pathinfo, $matches)) {
+ $ret = $this->mergeDefaults(array_replace($matches, array('_route' => 'regex_trailing_slash_GET_method')), array ());
+ if (!in_array($canonicalMethod, array('GET'))) {
+ $allow = array_merge($allow, array('GET'));
+ goto not_regex_trailing_slash_GET_method;
+ }
+
+ return $ret;
+ }
+ not_regex_trailing_slash_GET_method:
+
+ // regex_trailing_slash_HEAD_method
+ if (0 === strpos($pathinfo, '/trailing/regex/head-method') && preg_match('#^/trailing/regex/head\\-method/(?P<param>[^/]++)/$#sD', $pathinfo, $matches)) {
+ $ret = $this->mergeDefaults(array_replace($matches, array('_route' => 'regex_trailing_slash_HEAD_method')), array ());
+ if (!in_array($requestMethod, array('HEAD'))) {
+ $allow = array_merge($allow, array('HEAD'));
+ goto not_regex_trailing_slash_HEAD_method;
+ }
+
+ return $ret;
+ }
+ not_regex_trailing_slash_HEAD_method:
+
+ // regex_trailing_slash_POST_method
+ if (0 === strpos($pathinfo, '/trailing/regex/post-method') && preg_match('#^/trailing/regex/post\\-method/(?P<param>[^/]++)/$#sD', $pathinfo, $matches)) {
+ $ret = $this->mergeDefaults(array_replace($matches, array('_route' => 'regex_trailing_slash_POST_method')), array ());
+ if (!in_array($requestMethod, array('POST'))) {
+ $allow = array_merge($allow, array('POST'));
+ goto not_regex_trailing_slash_POST_method;
+ }
+
+ return $ret;
+ }
+ not_regex_trailing_slash_POST_method:
+
+ }
+
+ elseif (0 === strpos($pathinfo, '/not-trailing/simple')) {
+ // simple_not_trailing_slash_no_methods
+ if ('/not-trailing/simple/no-methods' === $pathinfo) {
+ return array('_route' => 'simple_not_trailing_slash_no_methods');
+ }
+
+ // simple_not_trailing_slash_GET_method
+ if ('/not-trailing/simple/get-method' === $pathinfo) {
+ $ret = array('_route' => 'simple_not_trailing_slash_GET_method');
+ if (!in_array($canonicalMethod, array('GET'))) {
+ $allow = array_merge($allow, array('GET'));
+ goto not_simple_not_trailing_slash_GET_method;
+ }
+
+ return $ret;
+ }
+ not_simple_not_trailing_slash_GET_method:
+
+ // simple_not_trailing_slash_HEAD_method
+ if ('/not-trailing/simple/head-method' === $pathinfo) {
+ $ret = array('_route' => 'simple_not_trailing_slash_HEAD_method');
+ if (!in_array($requestMethod, array('HEAD'))) {
+ $allow = array_merge($allow, array('HEAD'));
+ goto not_simple_not_trailing_slash_HEAD_method;
+ }
+
+ return $ret;
+ }
+ not_simple_not_trailing_slash_HEAD_method:
+
+ // simple_not_trailing_slash_POST_method
+ if ('/not-trailing/simple/post-method' === $pathinfo) {
+ $ret = array('_route' => 'simple_not_trailing_slash_POST_method');
+ if (!in_array($requestMethod, array('POST'))) {
+ $allow = array_merge($allow, array('POST'));
+ goto not_simple_not_trailing_slash_POST_method;
+ }
+
+ return $ret;
+ }
+ not_simple_not_trailing_slash_POST_method:
+
+ }
+
+ elseif (0 === strpos($pathinfo, '/not-trailing/regex')) {
+ // regex_not_trailing_slash_no_methods
+ if (0 === strpos($pathinfo, '/not-trailing/regex/no-methods') && preg_match('#^/not\\-trailing/regex/no\\-methods/(?P<param>[^/]++)$#sD', $pathinfo, $matches)) {
+ return $this->mergeDefaults(array_replace($matches, array('_route' => 'regex_not_trailing_slash_no_methods')), array ());
+ }
+
+ // regex_not_trailing_slash_GET_method
+ if (0 === strpos($pathinfo, '/not-trailing/regex/get-method') && preg_match('#^/not\\-trailing/regex/get\\-method/(?P<param>[^/]++)$#sD', $pathinfo, $matches)) {
+ $ret = $this->mergeDefaults(array_replace($matches, array('_route' => 'regex_not_trailing_slash_GET_method')), array ());
+ if (!in_array($canonicalMethod, array('GET'))) {
+ $allow = array_merge($allow, array('GET'));
+ goto not_regex_not_trailing_slash_GET_method;
+ }
+
+ return $ret;
+ }
+ not_regex_not_trailing_slash_GET_method:
+
+ // regex_not_trailing_slash_HEAD_method
+ if (0 === strpos($pathinfo, '/not-trailing/regex/head-method') && preg_match('#^/not\\-trailing/regex/head\\-method/(?P<param>[^/]++)$#sD', $pathinfo, $matches)) {
+ $ret = $this->mergeDefaults(array_replace($matches, array('_route' => 'regex_not_trailing_slash_HEAD_method')), array ());
+ if (!in_array($requestMethod, array('HEAD'))) {
+ $allow = array_merge($allow, array('HEAD'));
+ goto not_regex_not_trailing_slash_HEAD_method;
+ }
+
+ return $ret;
+ }
+ not_regex_not_trailing_slash_HEAD_method:
+
+ // regex_not_trailing_slash_POST_method
+ if (0 === strpos($pathinfo, '/not-trailing/regex/post-method') && preg_match('#^/not\\-trailing/regex/post\\-method/(?P<param>[^/]++)$#sD', $pathinfo, $matches)) {
+ $ret = $this->mergeDefaults(array_replace($matches, array('_route' => 'regex_not_trailing_slash_POST_method')), array ());
+ if (!in_array($requestMethod, array('POST'))) {
+ $allow = array_merge($allow, array('POST'));
+ goto not_regex_not_trailing_slash_POST_method;
+ }
+
+ return $ret;
+ }
+ not_regex_not_trailing_slash_POST_method:
+
+ }
+
+ if ('/' === $pathinfo && !$allow) {
+ throw new Symfony\Component\Routing\Exception\NoConfigurationException();
+ }
+
+ throw 0 < count($allow) ? new MethodNotAllowedException(array_unique($allow)) : new ResourceNotFoundException();
+ }
+}
diff --git a/assets/php/vendor/symfony/routing/Tests/Fixtures/dumper/url_matcher7.php b/assets/php/vendor/symfony/routing/Tests/Fixtures/dumper/url_matcher7.php
new file mode 100644
index 0000000..81d76ea
--- /dev/null
+++ b/assets/php/vendor/symfony/routing/Tests/Fixtures/dumper/url_matcher7.php
@@ -0,0 +1,249 @@
+<?php
+
+use Symfony\Component\Routing\Exception\MethodNotAllowedException;
+use Symfony\Component\Routing\Exception\ResourceNotFoundException;
+use Symfony\Component\Routing\RequestContext;
+
+/**
+ * This class has been auto-generated
+ * by the Symfony Routing Component.
+ */
+class ProjectUrlMatcher extends Symfony\Component\Routing\Tests\Fixtures\RedirectableUrlMatcher
+{
+ public function __construct(RequestContext $context)
+ {
+ $this->context = $context;
+ }
+
+ public function match($rawPathinfo)
+ {
+ $allow = array();
+ $pathinfo = rawurldecode($rawPathinfo);
+ $trimmedPathinfo = rtrim($pathinfo, '/');
+ $context = $this->context;
+ $request = $this->request ?: $this->createRequest($pathinfo);
+ $requestMethod = $canonicalMethod = $context->getMethod();
+
+ if ('HEAD' === $requestMethod) {
+ $canonicalMethod = 'GET';
+ }
+
+ if (0 === strpos($pathinfo, '/trailing/simple')) {
+ // simple_trailing_slash_no_methods
+ if ('/trailing/simple/no-methods' === $trimmedPathinfo) {
+ $ret = array('_route' => 'simple_trailing_slash_no_methods');
+ if ('/' === substr($pathinfo, -1)) {
+ // no-op
+ } elseif ('GET' !== $canonicalMethod) {
+ goto not_simple_trailing_slash_no_methods;
+ } else {
+ return array_replace($ret, $this->redirect($rawPathinfo.'/', 'simple_trailing_slash_no_methods'));
+ }
+
+ return $ret;
+ }
+ not_simple_trailing_slash_no_methods:
+
+ // simple_trailing_slash_GET_method
+ if ('/trailing/simple/get-method' === $trimmedPathinfo) {
+ $ret = array('_route' => 'simple_trailing_slash_GET_method');
+ if ('/' === substr($pathinfo, -1)) {
+ // no-op
+ } elseif ('GET' !== $canonicalMethod) {
+ goto not_simple_trailing_slash_GET_method;
+ } else {
+ return array_replace($ret, $this->redirect($rawPathinfo.'/', 'simple_trailing_slash_GET_method'));
+ }
+
+ if (!in_array($canonicalMethod, array('GET'))) {
+ $allow = array_merge($allow, array('GET'));
+ goto not_simple_trailing_slash_GET_method;
+ }
+
+ return $ret;
+ }
+ not_simple_trailing_slash_GET_method:
+
+ // simple_trailing_slash_HEAD_method
+ if ('/trailing/simple/head-method/' === $pathinfo) {
+ $ret = array('_route' => 'simple_trailing_slash_HEAD_method');
+ if (!in_array($requestMethod, array('HEAD'))) {
+ $allow = array_merge($allow, array('HEAD'));
+ goto not_simple_trailing_slash_HEAD_method;
+ }
+
+ return $ret;
+ }
+ not_simple_trailing_slash_HEAD_method:
+
+ // simple_trailing_slash_POST_method
+ if ('/trailing/simple/post-method/' === $pathinfo) {
+ $ret = array('_route' => 'simple_trailing_slash_POST_method');
+ if (!in_array($requestMethod, array('POST'))) {
+ $allow = array_merge($allow, array('POST'));
+ goto not_simple_trailing_slash_POST_method;
+ }
+
+ return $ret;
+ }
+ not_simple_trailing_slash_POST_method:
+
+ }
+
+ elseif (0 === strpos($pathinfo, '/trailing/regex')) {
+ // regex_trailing_slash_no_methods
+ if (0 === strpos($pathinfo, '/trailing/regex/no-methods') && preg_match('#^/trailing/regex/no\\-methods/(?P<param>[^/]++)/?$#sD', $pathinfo, $matches)) {
+ $ret = $this->mergeDefaults(array_replace($matches, array('_route' => 'regex_trailing_slash_no_methods')), array ());
+ if ('/' === substr($pathinfo, -1)) {
+ // no-op
+ } elseif ('GET' !== $canonicalMethod) {
+ goto not_regex_trailing_slash_no_methods;
+ } else {
+ return array_replace($ret, $this->redirect($rawPathinfo.'/', 'regex_trailing_slash_no_methods'));
+ }
+
+ return $ret;
+ }
+ not_regex_trailing_slash_no_methods:
+
+ // regex_trailing_slash_GET_method
+ if (0 === strpos($pathinfo, '/trailing/regex/get-method') && preg_match('#^/trailing/regex/get\\-method/(?P<param>[^/]++)/?$#sD', $pathinfo, $matches)) {
+ $ret = $this->mergeDefaults(array_replace($matches, array('_route' => 'regex_trailing_slash_GET_method')), array ());
+ if ('/' === substr($pathinfo, -1)) {
+ // no-op
+ } elseif ('GET' !== $canonicalMethod) {
+ goto not_regex_trailing_slash_GET_method;
+ } else {
+ return array_replace($ret, $this->redirect($rawPathinfo.'/', 'regex_trailing_slash_GET_method'));
+ }
+
+ if (!in_array($canonicalMethod, array('GET'))) {
+ $allow = array_merge($allow, array('GET'));
+ goto not_regex_trailing_slash_GET_method;
+ }
+
+ return $ret;
+ }
+ not_regex_trailing_slash_GET_method:
+
+ // regex_trailing_slash_HEAD_method
+ if (0 === strpos($pathinfo, '/trailing/regex/head-method') && preg_match('#^/trailing/regex/head\\-method/(?P<param>[^/]++)/$#sD', $pathinfo, $matches)) {
+ $ret = $this->mergeDefaults(array_replace($matches, array('_route' => 'regex_trailing_slash_HEAD_method')), array ());
+ if (!in_array($requestMethod, array('HEAD'))) {
+ $allow = array_merge($allow, array('HEAD'));
+ goto not_regex_trailing_slash_HEAD_method;
+ }
+
+ return $ret;
+ }
+ not_regex_trailing_slash_HEAD_method:
+
+ // regex_trailing_slash_POST_method
+ if (0 === strpos($pathinfo, '/trailing/regex/post-method') && preg_match('#^/trailing/regex/post\\-method/(?P<param>[^/]++)/$#sD', $pathinfo, $matches)) {
+ $ret = $this->mergeDefaults(array_replace($matches, array('_route' => 'regex_trailing_slash_POST_method')), array ());
+ if (!in_array($requestMethod, array('POST'))) {
+ $allow = array_merge($allow, array('POST'));
+ goto not_regex_trailing_slash_POST_method;
+ }
+
+ return $ret;
+ }
+ not_regex_trailing_slash_POST_method:
+
+ }
+
+ elseif (0 === strpos($pathinfo, '/not-trailing/simple')) {
+ // simple_not_trailing_slash_no_methods
+ if ('/not-trailing/simple/no-methods' === $pathinfo) {
+ return array('_route' => 'simple_not_trailing_slash_no_methods');
+ }
+
+ // simple_not_trailing_slash_GET_method
+ if ('/not-trailing/simple/get-method' === $pathinfo) {
+ $ret = array('_route' => 'simple_not_trailing_slash_GET_method');
+ if (!in_array($canonicalMethod, array('GET'))) {
+ $allow = array_merge($allow, array('GET'));
+ goto not_simple_not_trailing_slash_GET_method;
+ }
+
+ return $ret;
+ }
+ not_simple_not_trailing_slash_GET_method:
+
+ // simple_not_trailing_slash_HEAD_method
+ if ('/not-trailing/simple/head-method' === $pathinfo) {
+ $ret = array('_route' => 'simple_not_trailing_slash_HEAD_method');
+ if (!in_array($requestMethod, array('HEAD'))) {
+ $allow = array_merge($allow, array('HEAD'));
+ goto not_simple_not_trailing_slash_HEAD_method;
+ }
+
+ return $ret;
+ }
+ not_simple_not_trailing_slash_HEAD_method:
+
+ // simple_not_trailing_slash_POST_method
+ if ('/not-trailing/simple/post-method' === $pathinfo) {
+ $ret = array('_route' => 'simple_not_trailing_slash_POST_method');
+ if (!in_array($requestMethod, array('POST'))) {
+ $allow = array_merge($allow, array('POST'));
+ goto not_simple_not_trailing_slash_POST_method;
+ }
+
+ return $ret;
+ }
+ not_simple_not_trailing_slash_POST_method:
+
+ }
+
+ elseif (0 === strpos($pathinfo, '/not-trailing/regex')) {
+ // regex_not_trailing_slash_no_methods
+ if (0 === strpos($pathinfo, '/not-trailing/regex/no-methods') && preg_match('#^/not\\-trailing/regex/no\\-methods/(?P<param>[^/]++)$#sD', $pathinfo, $matches)) {
+ return $this->mergeDefaults(array_replace($matches, array('_route' => 'regex_not_trailing_slash_no_methods')), array ());
+ }
+
+ // regex_not_trailing_slash_GET_method
+ if (0 === strpos($pathinfo, '/not-trailing/regex/get-method') && preg_match('#^/not\\-trailing/regex/get\\-method/(?P<param>[^/]++)$#sD', $pathinfo, $matches)) {
+ $ret = $this->mergeDefaults(array_replace($matches, array('_route' => 'regex_not_trailing_slash_GET_method')), array ());
+ if (!in_array($canonicalMethod, array('GET'))) {
+ $allow = array_merge($allow, array('GET'));
+ goto not_regex_not_trailing_slash_GET_method;
+ }
+
+ return $ret;
+ }
+ not_regex_not_trailing_slash_GET_method:
+
+ // regex_not_trailing_slash_HEAD_method
+ if (0 === strpos($pathinfo, '/not-trailing/regex/head-method') && preg_match('#^/not\\-trailing/regex/head\\-method/(?P<param>[^/]++)$#sD', $pathinfo, $matches)) {
+ $ret = $this->mergeDefaults(array_replace($matches, array('_route' => 'regex_not_trailing_slash_HEAD_method')), array ());
+ if (!in_array($requestMethod, array('HEAD'))) {
+ $allow = array_merge($allow, array('HEAD'));
+ goto not_regex_not_trailing_slash_HEAD_method;
+ }
+
+ return $ret;
+ }
+ not_regex_not_trailing_slash_HEAD_method:
+
+ // regex_not_trailing_slash_POST_method
+ if (0 === strpos($pathinfo, '/not-trailing/regex/post-method') && preg_match('#^/not\\-trailing/regex/post\\-method/(?P<param>[^/]++)$#sD', $pathinfo, $matches)) {
+ $ret = $this->mergeDefaults(array_replace($matches, array('_route' => 'regex_not_trailing_slash_POST_method')), array ());
+ if (!in_array($requestMethod, array('POST'))) {
+ $allow = array_merge($allow, array('POST'));
+ goto not_regex_not_trailing_slash_POST_method;
+ }
+
+ return $ret;
+ }
+ not_regex_not_trailing_slash_POST_method:
+
+ }
+
+ if ('/' === $pathinfo && !$allow) {
+ throw new Symfony\Component\Routing\Exception\NoConfigurationException();
+ }
+
+ throw 0 < count($allow) ? new MethodNotAllowedException(array_unique($allow)) : new ResourceNotFoundException();
+ }
+}
diff --git a/assets/php/vendor/symfony/routing/Tests/Fixtures/empty.yml b/assets/php/vendor/symfony/routing/Tests/Fixtures/empty.yml
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/assets/php/vendor/symfony/routing/Tests/Fixtures/empty.yml
diff --git a/assets/php/vendor/symfony/routing/Tests/Fixtures/file_resource.yml b/assets/php/vendor/symfony/routing/Tests/Fixtures/file_resource.yml
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/assets/php/vendor/symfony/routing/Tests/Fixtures/file_resource.yml
diff --git a/assets/php/vendor/symfony/routing/Tests/Fixtures/foo.xml b/assets/php/vendor/symfony/routing/Tests/Fixtures/foo.xml
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/assets/php/vendor/symfony/routing/Tests/Fixtures/foo.xml
diff --git a/assets/php/vendor/symfony/routing/Tests/Fixtures/foo1.xml b/assets/php/vendor/symfony/routing/Tests/Fixtures/foo1.xml
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/assets/php/vendor/symfony/routing/Tests/Fixtures/foo1.xml
diff --git a/assets/php/vendor/symfony/routing/Tests/Fixtures/glob/bar.xml b/assets/php/vendor/symfony/routing/Tests/Fixtures/glob/bar.xml
new file mode 100644
index 0000000..0d31eeb
--- /dev/null
+++ b/assets/php/vendor/symfony/routing/Tests/Fixtures/glob/bar.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<routes xmlns="http://symfony.com/schema/routing"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://symfony.com/schema/routing
+ http://symfony.com/schema/routing/routing-1.0.xsd">
+
+ <route id="bar_route" path="/bar" controller="AppBundle:Bar:view" />
+</routes>
diff --git a/assets/php/vendor/symfony/routing/Tests/Fixtures/glob/bar.yml b/assets/php/vendor/symfony/routing/Tests/Fixtures/glob/bar.yml
new file mode 100644
index 0000000..ba3bc22
--- /dev/null
+++ b/assets/php/vendor/symfony/routing/Tests/Fixtures/glob/bar.yml
@@ -0,0 +1,4 @@
+bar_route:
+ path: /bar
+ defaults:
+ _controller: AppBundle:Bar:view
diff --git a/assets/php/vendor/symfony/routing/Tests/Fixtures/glob/baz.xml b/assets/php/vendor/symfony/routing/Tests/Fixtures/glob/baz.xml
new file mode 100644
index 0000000..3abba1a
--- /dev/null
+++ b/assets/php/vendor/symfony/routing/Tests/Fixtures/glob/baz.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<routes xmlns="http://symfony.com/schema/routing"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://symfony.com/schema/routing
+ http://symfony.com/schema/routing/routing-1.0.xsd">
+
+ <route id="baz_route" path="/baz" controller="AppBundle:Baz:view" />
+</routes>
diff --git a/assets/php/vendor/symfony/routing/Tests/Fixtures/glob/baz.yml b/assets/php/vendor/symfony/routing/Tests/Fixtures/glob/baz.yml
new file mode 100644
index 0000000..f7d8c67
--- /dev/null
+++ b/assets/php/vendor/symfony/routing/Tests/Fixtures/glob/baz.yml
@@ -0,0 +1,4 @@
+baz_route:
+ path: /baz
+ defaults:
+ _controller: AppBundle:Baz:view
diff --git a/assets/php/vendor/symfony/routing/Tests/Fixtures/glob/import_multiple.xml b/assets/php/vendor/symfony/routing/Tests/Fixtures/glob/import_multiple.xml
new file mode 100644
index 0000000..ca6b1b5
--- /dev/null
+++ b/assets/php/vendor/symfony/routing/Tests/Fixtures/glob/import_multiple.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<routes xmlns="http://symfony.com/schema/routing"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://symfony.com/schema/routing
+ http://symfony.com/schema/routing/routing-1.0.xsd">
+
+ <import resource="ba?.xml" />
+</routes>
diff --git a/assets/php/vendor/symfony/routing/Tests/Fixtures/glob/import_multiple.yml b/assets/php/vendor/symfony/routing/Tests/Fixtures/glob/import_multiple.yml
new file mode 100644
index 0000000..d1ae585
--- /dev/null
+++ b/assets/php/vendor/symfony/routing/Tests/Fixtures/glob/import_multiple.yml
@@ -0,0 +1,2 @@
+_static:
+ resource: ba?.yml
diff --git a/assets/php/vendor/symfony/routing/Tests/Fixtures/glob/import_single.xml b/assets/php/vendor/symfony/routing/Tests/Fixtures/glob/import_single.xml
new file mode 100644
index 0000000..15f5698
--- /dev/null
+++ b/assets/php/vendor/symfony/routing/Tests/Fixtures/glob/import_single.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<routes xmlns="http://symfony.com/schema/routing"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://symfony.com/schema/routing
+ http://symfony.com/schema/routing/routing-1.0.xsd">
+
+ <import resource="b?r.xml" />
+</routes>
diff --git a/assets/php/vendor/symfony/routing/Tests/Fixtures/glob/import_single.yml b/assets/php/vendor/symfony/routing/Tests/Fixtures/glob/import_single.yml
new file mode 100644
index 0000000..f56ddbd
--- /dev/null
+++ b/assets/php/vendor/symfony/routing/Tests/Fixtures/glob/import_single.yml
@@ -0,0 +1,2 @@
+_static:
+ resource: b?r.yml
diff --git a/assets/php/vendor/symfony/routing/Tests/Fixtures/glob/php_dsl.php b/assets/php/vendor/symfony/routing/Tests/Fixtures/glob/php_dsl.php
new file mode 100644
index 0000000..897fa11
--- /dev/null
+++ b/assets/php/vendor/symfony/routing/Tests/Fixtures/glob/php_dsl.php
@@ -0,0 +1,7 @@
+<?php
+
+namespace Symfony\Component\Routing\Loader\Configurator;
+
+return function (RoutingConfigurator $routes) {
+ return $routes->import('php_dsl_ba?.php');
+};
diff --git a/assets/php/vendor/symfony/routing/Tests/Fixtures/glob/php_dsl_bar.php b/assets/php/vendor/symfony/routing/Tests/Fixtures/glob/php_dsl_bar.php
new file mode 100644
index 0000000..e2b91b1
--- /dev/null
+++ b/assets/php/vendor/symfony/routing/Tests/Fixtures/glob/php_dsl_bar.php
@@ -0,0 +1,12 @@
+<?php
+
+namespace Symfony\Component\Routing\Loader\Configurator;
+
+return function (RoutingConfigurator $routes) {
+ $collection = $routes->collection();
+
+ $collection->add('bar_route', '/bar')
+ ->defaults(array('_controller' => 'AppBundle:Bar:view'));
+
+ return $collection;
+};
diff --git a/assets/php/vendor/symfony/routing/Tests/Fixtures/glob/php_dsl_baz.php b/assets/php/vendor/symfony/routing/Tests/Fixtures/glob/php_dsl_baz.php
new file mode 100644
index 0000000..ca8f188
--- /dev/null
+++ b/assets/php/vendor/symfony/routing/Tests/Fixtures/glob/php_dsl_baz.php
@@ -0,0 +1,12 @@
+<?php
+
+namespace Symfony\Component\Routing\Loader\Configurator;
+
+return function (RoutingConfigurator $routes) {
+ $collection = $routes->collection();
+
+ $collection->add('baz_route', '/baz')
+ ->defaults(array('_controller' => 'AppBundle:Baz:view'));
+
+ return $collection;
+};
diff --git a/assets/php/vendor/symfony/routing/Tests/Fixtures/incomplete.yml b/assets/php/vendor/symfony/routing/Tests/Fixtures/incomplete.yml
new file mode 100644
index 0000000..df64d32
--- /dev/null
+++ b/assets/php/vendor/symfony/routing/Tests/Fixtures/incomplete.yml
@@ -0,0 +1,2 @@
+blog_show:
+ defaults: { _controller: MyBlogBundle:Blog:show }
diff --git a/assets/php/vendor/symfony/routing/Tests/Fixtures/list_defaults.xml b/assets/php/vendor/symfony/routing/Tests/Fixtures/list_defaults.xml
new file mode 100644
index 0000000..f93bf9c
--- /dev/null
+++ b/assets/php/vendor/symfony/routing/Tests/Fixtures/list_defaults.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<routes xmlns="http://symfony.com/schema/routing"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://symfony.com/schema/routing
+ http://symfony.com/schema/routing/routing-1.0.xsd">
+
+ <route id="blog" path="/blog">
+ <default key="_controller">
+ <string>AcmeBlogBundle:Blog:index</string>
+ </default>
+ <default key="values">
+ <list>
+ <bool>true</bool>
+ <int>1</int>
+ <float>3.5</float>
+ <string>foo</string>
+ </list>
+ </default>
+ </route>
+</routes>
diff --git a/assets/php/vendor/symfony/routing/Tests/Fixtures/list_in_list_defaults.xml b/assets/php/vendor/symfony/routing/Tests/Fixtures/list_in_list_defaults.xml
new file mode 100644
index 0000000..987086d
--- /dev/null
+++ b/assets/php/vendor/symfony/routing/Tests/Fixtures/list_in_list_defaults.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<routes xmlns="http://symfony.com/schema/routing"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://symfony.com/schema/routing
+ http://symfony.com/schema/routing/routing-1.0.xsd">
+
+ <route id="blog" path="/blog">
+ <default key="_controller">
+ <string>AcmeBlogBundle:Blog:index</string>
+ </default>
+ <default key="values">
+ <list>
+ <list>
+ <bool>true</bool>
+ <int>1</int>
+ <float>3.5</float>
+ <string>foo</string>
+ </list>
+ </list>
+ </default>
+ </route>
+</routes>
diff --git a/assets/php/vendor/symfony/routing/Tests/Fixtures/list_in_map_defaults.xml b/assets/php/vendor/symfony/routing/Tests/Fixtures/list_in_map_defaults.xml
new file mode 100644
index 0000000..32d393c
--- /dev/null
+++ b/assets/php/vendor/symfony/routing/Tests/Fixtures/list_in_map_defaults.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<routes xmlns="http://symfony.com/schema/routing"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://symfony.com/schema/routing
+ http://symfony.com/schema/routing/routing-1.0.xsd">
+
+ <route id="blog" path="/blog">
+ <default key="_controller">
+ <string>AcmeBlogBundle:Blog:index</string>
+ </default>
+ <default key="values">
+ <map>
+ <list key="list">
+ <bool>true</bool>
+ <int>1</int>
+ <float>3.5</float>
+ <string>foo</string>
+ </list>
+ </map>
+ </default>
+ </route>
+</routes>
diff --git a/assets/php/vendor/symfony/routing/Tests/Fixtures/list_null_values.xml b/assets/php/vendor/symfony/routing/Tests/Fixtures/list_null_values.xml
new file mode 100644
index 0000000..c70e03c
--- /dev/null
+++ b/assets/php/vendor/symfony/routing/Tests/Fixtures/list_null_values.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<routes xmlns="http://symfony.com/schema/routing"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://symfony.com/schema/routing
+ http://symfony.com/schema/routing/routing-1.0.xsd">
+
+ <route id="blog" path="/blog">
+ <default key="_controller">
+ <string>AcmeBlogBundle:Blog:index</string>
+ </default>
+ <default key="list">
+ <list>
+ <bool xsi:nil="true" />
+ <int xsi:nil="true" />
+ <float xsi:nil="1" />
+ <string xsi:nil="true" />
+ <list xsi:nil="true" />
+ <map xsi:nil="true" />
+ </list>
+ </default>
+ </route>
+</routes>
diff --git a/assets/php/vendor/symfony/routing/Tests/Fixtures/map_defaults.xml b/assets/php/vendor/symfony/routing/Tests/Fixtures/map_defaults.xml
new file mode 100644
index 0000000..47feb29
--- /dev/null
+++ b/assets/php/vendor/symfony/routing/Tests/Fixtures/map_defaults.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<routes xmlns="http://symfony.com/schema/routing"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://symfony.com/schema/routing
+ http://symfony.com/schema/routing/routing-1.0.xsd">
+
+ <route id="blog" path="/blog">
+ <default key="_controller">
+ <string>AcmeBlogBundle:Blog:index</string>
+ </default>
+ <default key="values">
+ <map>
+ <bool key="public">true</bool>
+ <int key="page">1</int>
+ <float key="price">3.5</float>
+ <string key="title">foo</string>
+ </map>
+ </default>
+ </route>
+</routes>
diff --git a/assets/php/vendor/symfony/routing/Tests/Fixtures/map_in_list_defaults.xml b/assets/php/vendor/symfony/routing/Tests/Fixtures/map_in_list_defaults.xml
new file mode 100644
index 0000000..6d77065
--- /dev/null
+++ b/assets/php/vendor/symfony/routing/Tests/Fixtures/map_in_list_defaults.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<routes xmlns="http://symfony.com/schema/routing"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://symfony.com/schema/routing
+ http://symfony.com/schema/routing/routing-1.0.xsd">
+
+ <route id="blog" path="/blog">
+ <default key="_controller">
+ <string>AcmeBlogBundle:Blog:index</string>
+ </default>
+ <default key="values">
+ <list>
+ <map>
+ <bool key="public">true</bool>
+ <int key="page">1</int>
+ <float key="price">3.5</float>
+ <string key="title">foo</string>
+ </map>
+ </list>
+ </default>
+ </route>
+</routes>
diff --git a/assets/php/vendor/symfony/routing/Tests/Fixtures/map_in_map_defaults.xml b/assets/php/vendor/symfony/routing/Tests/Fixtures/map_in_map_defaults.xml
new file mode 100644
index 0000000..2beee61
--- /dev/null
+++ b/assets/php/vendor/symfony/routing/Tests/Fixtures/map_in_map_defaults.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<routes xmlns="http://symfony.com/schema/routing"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://symfony.com/schema/routing
+ http://symfony.com/schema/routing/routing-1.0.xsd">
+
+ <route id="blog" path="/blog">
+ <default key="_controller">
+ <string>AcmeBlogBundle:Blog:index</string>
+ </default>
+ <default key="values">
+ <map>
+ <map key="map">
+ <bool key="public">true</bool>
+ <int key="page">1</int>
+ <float key="price">3.5</float>
+ <string key="title">foo</string>
+ </map>
+ </map>
+ </default>
+ </route>
+</routes>
diff --git a/assets/php/vendor/symfony/routing/Tests/Fixtures/map_null_values.xml b/assets/php/vendor/symfony/routing/Tests/Fixtures/map_null_values.xml
new file mode 100644
index 0000000..8fd8954
--- /dev/null
+++ b/assets/php/vendor/symfony/routing/Tests/Fixtures/map_null_values.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<routes xmlns="http://symfony.com/schema/routing"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://symfony.com/schema/routing
+ http://symfony.com/schema/routing/routing-1.0.xsd">
+
+ <route id="blog" path="/blog">
+ <default key="_controller">
+ <string>AcmeBlogBundle:Blog:index</string>
+ </default>
+ <default key="map">
+ <map>
+ <bool key="boolean" xsi:nil="true" />
+ <int key="integer" xsi:nil="true" />
+ <float key="float" xsi:nil="true" />
+ <string key="string" xsi:nil="1" />
+ <list key="list" xsi:nil="true" />
+ <map key="map" xsi:nil="true" />
+ </map>
+ </default>
+ </route>
+</routes>
diff --git a/assets/php/vendor/symfony/routing/Tests/Fixtures/missing_id.xml b/assets/php/vendor/symfony/routing/Tests/Fixtures/missing_id.xml
new file mode 100644
index 0000000..4ea4115
--- /dev/null
+++ b/assets/php/vendor/symfony/routing/Tests/Fixtures/missing_id.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<routes xmlns="http://symfony.com/schema/routing"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://symfony.com/schema/routing http://symfony.com/schema/routing/routing-1.0.xsd">
+
+ <route path="/test"></route>
+</routes>
diff --git a/assets/php/vendor/symfony/routing/Tests/Fixtures/missing_path.xml b/assets/php/vendor/symfony/routing/Tests/Fixtures/missing_path.xml
new file mode 100644
index 0000000..ef5bc08
--- /dev/null
+++ b/assets/php/vendor/symfony/routing/Tests/Fixtures/missing_path.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<routes xmlns="http://symfony.com/schema/routing"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://symfony.com/schema/routing http://symfony.com/schema/routing/routing-1.0.xsd">
+
+ <route id="myroute"></route>
+</routes>
diff --git a/assets/php/vendor/symfony/routing/Tests/Fixtures/namespaceprefix.xml b/assets/php/vendor/symfony/routing/Tests/Fixtures/namespaceprefix.xml
new file mode 100644
index 0000000..e33955a
--- /dev/null
+++ b/assets/php/vendor/symfony/routing/Tests/Fixtures/namespaceprefix.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<r:routes xmlns:r="http://symfony.com/schema/routing"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://symfony.com/schema/routing http://symfony.com/schema/routing/routing-1.0.xsd">
+
+ <r:route id="blog_show" path="/blog/{slug}" host="{_locale}.example.com">
+ <r:default key="_controller">MyBundle:Blog:show</r:default>
+ <requirement xmlns="http://symfony.com/schema/routing" key="slug">\w+</requirement>
+ <r2:requirement xmlns:r2="http://symfony.com/schema/routing" key="_locale">en|fr|de</r2:requirement>
+ <r:option key="compiler_class">RouteCompiler</r:option>
+ <r:default key="page">
+ <r3:int xmlns:r3="http://symfony.com/schema/routing">1</r3:int>
+ </r:default>
+ </r:route>
+</r:routes>
diff --git a/assets/php/vendor/symfony/routing/Tests/Fixtures/nonesense_resource_plus_path.yml b/assets/php/vendor/symfony/routing/Tests/Fixtures/nonesense_resource_plus_path.yml
new file mode 100644
index 0000000..a3e9473
--- /dev/null
+++ b/assets/php/vendor/symfony/routing/Tests/Fixtures/nonesense_resource_plus_path.yml
@@ -0,0 +1,3 @@
+blog_show:
+ resource: validpattern.yml
+ path: /test
diff --git a/assets/php/vendor/symfony/routing/Tests/Fixtures/nonesense_type_without_resource.yml b/assets/php/vendor/symfony/routing/Tests/Fixtures/nonesense_type_without_resource.yml
new file mode 100644
index 0000000..547cda3
--- /dev/null
+++ b/assets/php/vendor/symfony/routing/Tests/Fixtures/nonesense_type_without_resource.yml
@@ -0,0 +1,3 @@
+blog_show:
+ path: /blog/{slug}
+ type: custom
diff --git a/assets/php/vendor/symfony/routing/Tests/Fixtures/nonvalid.xml b/assets/php/vendor/symfony/routing/Tests/Fixtures/nonvalid.xml
new file mode 100644
index 0000000..dc147d2
--- /dev/null
+++ b/assets/php/vendor/symfony/routing/Tests/Fixtures/nonvalid.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<routes xmlns="http://symfony.com/schema/routing"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://symfony.com/schema/routing http://symfony.com/schema/routing/routing-1.0.xsd">
+
+ <route id="blog_show" path="/blog/{slug}">
+ <default key="_controller">MyBundle:Blog:show</default>
+ <!-- </route> -->
+</routes>
diff --git a/assets/php/vendor/symfony/routing/Tests/Fixtures/nonvalid.yml b/assets/php/vendor/symfony/routing/Tests/Fixtures/nonvalid.yml
new file mode 100644
index 0000000..257cc56
--- /dev/null
+++ b/assets/php/vendor/symfony/routing/Tests/Fixtures/nonvalid.yml
@@ -0,0 +1 @@
+foo
diff --git a/assets/php/vendor/symfony/routing/Tests/Fixtures/nonvalid2.yml b/assets/php/vendor/symfony/routing/Tests/Fixtures/nonvalid2.yml
new file mode 100644
index 0000000..cfa9992
--- /dev/null
+++ b/assets/php/vendor/symfony/routing/Tests/Fixtures/nonvalid2.yml
@@ -0,0 +1 @@
+route: string
diff --git a/assets/php/vendor/symfony/routing/Tests/Fixtures/nonvalidkeys.yml b/assets/php/vendor/symfony/routing/Tests/Fixtures/nonvalidkeys.yml
new file mode 100644
index 0000000..015e270
--- /dev/null
+++ b/assets/php/vendor/symfony/routing/Tests/Fixtures/nonvalidkeys.yml
@@ -0,0 +1,3 @@
+someroute:
+ resource: path/to/some.yml
+ name_prefix: test_
diff --git a/assets/php/vendor/symfony/routing/Tests/Fixtures/nonvalidnode.xml b/assets/php/vendor/symfony/routing/Tests/Fixtures/nonvalidnode.xml
new file mode 100644
index 0000000..863ef03
--- /dev/null
+++ b/assets/php/vendor/symfony/routing/Tests/Fixtures/nonvalidnode.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<routes xmlns="http://symfony.com/schema/routing"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://symfony.com/schema/routing http://symfony.com/schema/routing/routing-1.0.xsd">
+
+ <foo>bar</foo>
+</routes>
diff --git a/assets/php/vendor/symfony/routing/Tests/Fixtures/nonvalidroute.xml b/assets/php/vendor/symfony/routing/Tests/Fixtures/nonvalidroute.xml
new file mode 100644
index 0000000..908958c
--- /dev/null
+++ b/assets/php/vendor/symfony/routing/Tests/Fixtures/nonvalidroute.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<routes xmlns="http://symfony.com/schema/routing"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://symfony.com/schema/routing http://symfony.com/schema/routing/routing-1.0.xsd">
+
+ <route id="blog_show" path="/blog/{slug}">
+ <default key="_controller">MyBundle:Blog:show</default>
+ <option key="compiler_class">RouteCompiler</option>
+ <foo key="bar">baz</foo>
+ </route>
+</routes>
diff --git a/assets/php/vendor/symfony/routing/Tests/Fixtures/null_values.xml b/assets/php/vendor/symfony/routing/Tests/Fixtures/null_values.xml
new file mode 100644
index 0000000..f9e2aa2
--- /dev/null
+++ b/assets/php/vendor/symfony/routing/Tests/Fixtures/null_values.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<routes xmlns="http://symfony.com/schema/routing"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://symfony.com/schema/routing http://symfony.com/schema/routing/routing-1.0.xsd">
+
+ <route id="blog_show" path="/blog/{slug}">
+ <default key="foo" xsi:nil="true" />
+ <default key="bar" xsi:nil="1" />
+ <default key="foobar" xsi:nil="false">foo</default>
+ <default key="baz" xsi:nil="0">bar</default>
+ </route>
+</routes>
diff --git a/assets/php/vendor/symfony/routing/Tests/Fixtures/php_dsl.php b/assets/php/vendor/symfony/routing/Tests/Fixtures/php_dsl.php
new file mode 100644
index 0000000..0780c9f
--- /dev/null
+++ b/assets/php/vendor/symfony/routing/Tests/Fixtures/php_dsl.php
@@ -0,0 +1,22 @@
+<?php
+
+namespace Symfony\Component\Routing\Loader\Configurator;
+
+return function (RoutingConfigurator $routes) {
+ $routes
+ ->collection()
+ ->add('foo', '/foo')
+ ->condition('abc')
+ ->options(array('utf8' => true))
+ ->add('buz', 'zub')
+ ->controller('foo:act');
+
+ $routes->import('php_dsl_sub.php')
+ ->prefix('/sub')
+ ->requirements(array('id' => '\d+'));
+
+ $routes->add('ouf', '/ouf')
+ ->schemes(array('https'))
+ ->methods(array('GET'))
+ ->defaults(array('id' => 0));
+};
diff --git a/assets/php/vendor/symfony/routing/Tests/Fixtures/php_dsl_sub.php b/assets/php/vendor/symfony/routing/Tests/Fixtures/php_dsl_sub.php
new file mode 100644
index 0000000..9eb444d
--- /dev/null
+++ b/assets/php/vendor/symfony/routing/Tests/Fixtures/php_dsl_sub.php
@@ -0,0 +1,14 @@
+<?php
+
+namespace Symfony\Component\Routing\Loader\Configurator;
+
+return function (RoutingConfigurator $routes) {
+ $add = $routes->collection('c_')
+ ->prefix('pub');
+
+ $add('bar', '/bar');
+
+ $add->collection('pub_')
+ ->host('host')
+ ->add('buz', 'buz');
+};
diff --git a/assets/php/vendor/symfony/routing/Tests/Fixtures/scalar_defaults.xml b/assets/php/vendor/symfony/routing/Tests/Fixtures/scalar_defaults.xml
new file mode 100644
index 0000000..ecfde28
--- /dev/null
+++ b/assets/php/vendor/symfony/routing/Tests/Fixtures/scalar_defaults.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<routes xmlns="http://symfony.com/schema/routing"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://symfony.com/schema/routing
+ http://symfony.com/schema/routing/routing-1.0.xsd">
+
+ <route id="blog" path="/blog">
+ <default key="_controller">
+ <string>AcmeBlogBundle:Blog:index</string>
+ </default>
+ <default key="slug" xsi:nil="true" />
+ <default key="published">
+ <bool>true</bool>
+ </default>
+ <default key="page">
+ <int>1</int>
+ </default>
+ <default key="price">
+ <float>3.5</float>
+ </default>
+ <default key="archived">
+ <bool>false</bool>
+ </default>
+ <default key="free">
+ <bool>1</bool>
+ </default>
+ <default key="locked">
+ <bool>0</bool>
+ </default>
+ <default key="foo" xsi:nil="true" />
+ <default key="bar" xsi:nil="1" />
+ </route>
+</routes>
diff --git a/assets/php/vendor/symfony/routing/Tests/Fixtures/special_route_name.yml b/assets/php/vendor/symfony/routing/Tests/Fixtures/special_route_name.yml
new file mode 100644
index 0000000..78be239
--- /dev/null
+++ b/assets/php/vendor/symfony/routing/Tests/Fixtures/special_route_name.yml
@@ -0,0 +1,2 @@
+"#$péß^a|":
+ path: "true"
diff --git a/assets/php/vendor/symfony/routing/Tests/Fixtures/validpattern.php b/assets/php/vendor/symfony/routing/Tests/Fixtures/validpattern.php
new file mode 100644
index 0000000..edc16d8
--- /dev/null
+++ b/assets/php/vendor/symfony/routing/Tests/Fixtures/validpattern.php
@@ -0,0 +1,18 @@
+<?php
+
+use Symfony\Component\Routing\RouteCollection;
+use Symfony\Component\Routing\Route;
+
+$collection = new RouteCollection();
+$collection->add('blog_show', new Route(
+ '/blog/{slug}',
+ array('_controller' => 'MyBlogBundle:Blog:show'),
+ array('locale' => '\w+'),
+ array('compiler_class' => 'RouteCompiler'),
+ '{locale}.example.com',
+ array('https'),
+ array('GET', 'POST', 'put', 'OpTiOnS'),
+ 'context.getMethod() == "GET"'
+));
+
+return $collection;
diff --git a/assets/php/vendor/symfony/routing/Tests/Fixtures/validpattern.xml b/assets/php/vendor/symfony/routing/Tests/Fixtures/validpattern.xml
new file mode 100644
index 0000000..dbc72e4
--- /dev/null
+++ b/assets/php/vendor/symfony/routing/Tests/Fixtures/validpattern.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<routes xmlns="http://symfony.com/schema/routing"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://symfony.com/schema/routing http://symfony.com/schema/routing/routing-1.0.xsd">
+
+ <route id="blog_show" path="/blog/{slug}" host="{locale}.example.com" methods="GET|POST put,OpTiOnS" schemes="hTTps">
+ <default key="_controller">MyBundle:Blog:show</default>
+ <requirement key="locale">\w+</requirement>
+ <option key="compiler_class">RouteCompiler</option>
+ <condition>context.getMethod() == "GET"</condition>
+ </route>
+
+ <route id="blog_show_inherited" path="/blog/{slug}" />
+</routes>
diff --git a/assets/php/vendor/symfony/routing/Tests/Fixtures/validpattern.yml b/assets/php/vendor/symfony/routing/Tests/Fixtures/validpattern.yml
new file mode 100644
index 0000000..565abaa
--- /dev/null
+++ b/assets/php/vendor/symfony/routing/Tests/Fixtures/validpattern.yml
@@ -0,0 +1,13 @@
+blog_show:
+ path: /blog/{slug}
+ defaults: { _controller: "MyBundle:Blog:show" }
+ host: "{locale}.example.com"
+ requirements: { 'locale': '\w+' }
+ methods: ['GET','POST','put','OpTiOnS']
+ schemes: ['https']
+ condition: 'context.getMethod() == "GET"'
+ options:
+ compiler_class: RouteCompiler
+
+blog_show_inherited:
+ path: /blog/{slug}
diff --git a/assets/php/vendor/symfony/routing/Tests/Fixtures/validresource.php b/assets/php/vendor/symfony/routing/Tests/Fixtures/validresource.php
new file mode 100644
index 0000000..482c80b
--- /dev/null
+++ b/assets/php/vendor/symfony/routing/Tests/Fixtures/validresource.php
@@ -0,0 +1,18 @@
+<?php
+
+/** @var $loader \Symfony\Component\Routing\Loader\PhpFileLoader */
+/** @var \Symfony\Component\Routing\RouteCollection $collection */
+$collection = $loader->import('validpattern.php');
+$collection->addDefaults(array(
+ 'foo' => 123,
+));
+$collection->addRequirements(array(
+ 'foo' => '\d+',
+));
+$collection->addOptions(array(
+ 'foo' => 'bar',
+));
+$collection->setCondition('context.getMethod() == "POST"');
+$collection->addPrefix('/prefix');
+
+return $collection;
diff --git a/assets/php/vendor/symfony/routing/Tests/Fixtures/validresource.xml b/assets/php/vendor/symfony/routing/Tests/Fixtures/validresource.xml
new file mode 100644
index 0000000..b7a15dd
--- /dev/null
+++ b/assets/php/vendor/symfony/routing/Tests/Fixtures/validresource.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<routes xmlns="http://symfony.com/schema/routing"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://symfony.com/schema/routing http://symfony.com/schema/routing/routing-1.0.xsd">
+
+ <import resource="validpattern.xml" prefix="/{foo}" host="">
+ <default key="foo">123</default>
+ <requirement key="foo">\d+</requirement>
+ <option key="foo">bar</option>
+ <condition>context.getMethod() == "POST"</condition>
+ </import>
+</routes>
diff --git a/assets/php/vendor/symfony/routing/Tests/Fixtures/validresource.yml b/assets/php/vendor/symfony/routing/Tests/Fixtures/validresource.yml
new file mode 100644
index 0000000..faf2263
--- /dev/null
+++ b/assets/php/vendor/symfony/routing/Tests/Fixtures/validresource.yml
@@ -0,0 +1,8 @@
+_blog:
+ resource: validpattern.yml
+ prefix: /{foo}
+ defaults: { 'foo': '123' }
+ requirements: { 'foo': '\d+' }
+ options: { 'foo': 'bar' }
+ host: ""
+ condition: 'context.getMethod() == "POST"'
diff --git a/assets/php/vendor/symfony/routing/Tests/Fixtures/with_define_path_variable.php b/assets/php/vendor/symfony/routing/Tests/Fixtures/with_define_path_variable.php
new file mode 100644
index 0000000..5871420
--- /dev/null
+++ b/assets/php/vendor/symfony/routing/Tests/Fixtures/with_define_path_variable.php
@@ -0,0 +1,5 @@
+<?php
+
+$path = '/1/2/3';
+
+return new \Symfony\Component\Routing\RouteCollection();
diff --git a/assets/php/vendor/symfony/routing/Tests/Fixtures/withdoctype.xml b/assets/php/vendor/symfony/routing/Tests/Fixtures/withdoctype.xml
new file mode 100644
index 0000000..f217d5b
--- /dev/null
+++ b/assets/php/vendor/symfony/routing/Tests/Fixtures/withdoctype.xml
@@ -0,0 +1,3 @@
+<?xml version="1.0"?>
+<!DOCTYPE foo>
+<foo></foo>
diff --git a/assets/php/vendor/symfony/routing/Tests/Generator/Dumper/PhpGeneratorDumperTest.php b/assets/php/vendor/symfony/routing/Tests/Generator/Dumper/PhpGeneratorDumperTest.php
new file mode 100644
index 0000000..f84802b
--- /dev/null
+++ b/assets/php/vendor/symfony/routing/Tests/Generator/Dumper/PhpGeneratorDumperTest.php
@@ -0,0 +1,181 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Routing\Tests\Generator\Dumper;
+
+use PHPUnit\Framework\TestCase;
+use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
+use Symfony\Component\Routing\RouteCollection;
+use Symfony\Component\Routing\Route;
+use Symfony\Component\Routing\Generator\Dumper\PhpGeneratorDumper;
+use Symfony\Component\Routing\RequestContext;
+
+class PhpGeneratorDumperTest extends TestCase
+{
+ /**
+ * @var RouteCollection
+ */
+ private $routeCollection;
+
+ /**
+ * @var PhpGeneratorDumper
+ */
+ private $generatorDumper;
+
+ /**
+ * @var string
+ */
+ private $testTmpFilepath;
+
+ /**
+ * @var string
+ */
+ private $largeTestTmpFilepath;
+
+ protected function setUp()
+ {
+ parent::setUp();
+
+ $this->routeCollection = new RouteCollection();
+ $this->generatorDumper = new PhpGeneratorDumper($this->routeCollection);
+ $this->testTmpFilepath = sys_get_temp_dir().DIRECTORY_SEPARATOR.'php_generator.'.$this->getName().'.php';
+ $this->largeTestTmpFilepath = sys_get_temp_dir().DIRECTORY_SEPARATOR.'php_generator.'.$this->getName().'.large.php';
+ @unlink($this->testTmpFilepath);
+ @unlink($this->largeTestTmpFilepath);
+ }
+
+ protected function tearDown()
+ {
+ parent::tearDown();
+
+ @unlink($this->testTmpFilepath);
+
+ $this->routeCollection = null;
+ $this->generatorDumper = null;
+ $this->testTmpFilepath = null;
+ }
+
+ public function testDumpWithRoutes()
+ {
+ $this->routeCollection->add('Test', new Route('/testing/{foo}'));
+ $this->routeCollection->add('Test2', new Route('/testing2'));
+
+ file_put_contents($this->testTmpFilepath, $this->generatorDumper->dump());
+ include $this->testTmpFilepath;
+
+ $projectUrlGenerator = new \ProjectUrlGenerator(new RequestContext('/app.php'));
+
+ $absoluteUrlWithParameter = $projectUrlGenerator->generate('Test', array('foo' => 'bar'), UrlGeneratorInterface::ABSOLUTE_URL);
+ $absoluteUrlWithoutParameter = $projectUrlGenerator->generate('Test2', array(), UrlGeneratorInterface::ABSOLUTE_URL);
+ $relativeUrlWithParameter = $projectUrlGenerator->generate('Test', array('foo' => 'bar'), UrlGeneratorInterface::ABSOLUTE_PATH);
+ $relativeUrlWithoutParameter = $projectUrlGenerator->generate('Test2', array(), UrlGeneratorInterface::ABSOLUTE_PATH);
+
+ $this->assertEquals('http://localhost/app.php/testing/bar', $absoluteUrlWithParameter);
+ $this->assertEquals('http://localhost/app.php/testing2', $absoluteUrlWithoutParameter);
+ $this->assertEquals('/app.php/testing/bar', $relativeUrlWithParameter);
+ $this->assertEquals('/app.php/testing2', $relativeUrlWithoutParameter);
+ }
+
+ public function testDumpWithTooManyRoutes()
+ {
+ if (defined('HHVM_VERSION_ID')) {
+ $this->markTestSkipped('HHVM consumes too much memory on this test.');
+ }
+
+ $this->routeCollection->add('Test', new Route('/testing/{foo}'));
+ for ($i = 0; $i < 32769; ++$i) {
+ $this->routeCollection->add('route_'.$i, new Route('/route_'.$i));
+ }
+ $this->routeCollection->add('Test2', new Route('/testing2'));
+
+ file_put_contents($this->largeTestTmpFilepath, $this->generatorDumper->dump(array(
+ 'class' => 'ProjectLargeUrlGenerator',
+ )));
+ $this->routeCollection = $this->generatorDumper = null;
+ include $this->largeTestTmpFilepath;
+
+ $projectUrlGenerator = new \ProjectLargeUrlGenerator(new RequestContext('/app.php'));
+
+ $absoluteUrlWithParameter = $projectUrlGenerator->generate('Test', array('foo' => 'bar'), UrlGeneratorInterface::ABSOLUTE_URL);
+ $absoluteUrlWithoutParameter = $projectUrlGenerator->generate('Test2', array(), UrlGeneratorInterface::ABSOLUTE_URL);
+ $relativeUrlWithParameter = $projectUrlGenerator->generate('Test', array('foo' => 'bar'), UrlGeneratorInterface::ABSOLUTE_PATH);
+ $relativeUrlWithoutParameter = $projectUrlGenerator->generate('Test2', array(), UrlGeneratorInterface::ABSOLUTE_PATH);
+
+ $this->assertEquals('http://localhost/app.php/testing/bar', $absoluteUrlWithParameter);
+ $this->assertEquals('http://localhost/app.php/testing2', $absoluteUrlWithoutParameter);
+ $this->assertEquals('/app.php/testing/bar', $relativeUrlWithParameter);
+ $this->assertEquals('/app.php/testing2', $relativeUrlWithoutParameter);
+ }
+
+ /**
+ * @expectedException \InvalidArgumentException
+ */
+ public function testDumpWithoutRoutes()
+ {
+ file_put_contents($this->testTmpFilepath, $this->generatorDumper->dump(array('class' => 'WithoutRoutesUrlGenerator')));
+ include $this->testTmpFilepath;
+
+ $projectUrlGenerator = new \WithoutRoutesUrlGenerator(new RequestContext('/app.php'));
+
+ $projectUrlGenerator->generate('Test', array());
+ }
+
+ /**
+ * @expectedException \Symfony\Component\Routing\Exception\RouteNotFoundException
+ */
+ public function testGenerateNonExistingRoute()
+ {
+ $this->routeCollection->add('Test', new Route('/test'));
+
+ file_put_contents($this->testTmpFilepath, $this->generatorDumper->dump(array('class' => 'NonExistingRoutesUrlGenerator')));
+ include $this->testTmpFilepath;
+
+ $projectUrlGenerator = new \NonExistingRoutesUrlGenerator(new RequestContext());
+ $url = $projectUrlGenerator->generate('NonExisting', array());
+ }
+
+ public function testDumpForRouteWithDefaults()
+ {
+ $this->routeCollection->add('Test', new Route('/testing/{foo}', array('foo' => 'bar')));
+
+ file_put_contents($this->testTmpFilepath, $this->generatorDumper->dump(array('class' => 'DefaultRoutesUrlGenerator')));
+ include $this->testTmpFilepath;
+
+ $projectUrlGenerator = new \DefaultRoutesUrlGenerator(new RequestContext());
+ $url = $projectUrlGenerator->generate('Test', array());
+
+ $this->assertEquals('/testing', $url);
+ }
+
+ public function testDumpWithSchemeRequirement()
+ {
+ $this->routeCollection->add('Test1', new Route('/testing', array(), array(), array(), '', array('ftp', 'https')));
+
+ file_put_contents($this->testTmpFilepath, $this->generatorDumper->dump(array('class' => 'SchemeUrlGenerator')));
+ include $this->testTmpFilepath;
+
+ $projectUrlGenerator = new \SchemeUrlGenerator(new RequestContext('/app.php'));
+
+ $absoluteUrl = $projectUrlGenerator->generate('Test1', array(), UrlGeneratorInterface::ABSOLUTE_URL);
+ $relativeUrl = $projectUrlGenerator->generate('Test1', array(), UrlGeneratorInterface::ABSOLUTE_PATH);
+
+ $this->assertEquals('ftp://localhost/app.php/testing', $absoluteUrl);
+ $this->assertEquals('ftp://localhost/app.php/testing', $relativeUrl);
+
+ $projectUrlGenerator = new \SchemeUrlGenerator(new RequestContext('/app.php', 'GET', 'localhost', 'https'));
+
+ $absoluteUrl = $projectUrlGenerator->generate('Test1', array(), UrlGeneratorInterface::ABSOLUTE_URL);
+ $relativeUrl = $projectUrlGenerator->generate('Test1', array(), UrlGeneratorInterface::ABSOLUTE_PATH);
+
+ $this->assertEquals('https://localhost/app.php/testing', $absoluteUrl);
+ $this->assertEquals('/app.php/testing', $relativeUrl);
+ }
+}
diff --git a/assets/php/vendor/symfony/routing/Tests/Generator/UrlGeneratorTest.php b/assets/php/vendor/symfony/routing/Tests/Generator/UrlGeneratorTest.php
new file mode 100644
index 0000000..68add77
--- /dev/null
+++ b/assets/php/vendor/symfony/routing/Tests/Generator/UrlGeneratorTest.php
@@ -0,0 +1,724 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Routing\Tests\Generator;
+
+use PHPUnit\Framework\TestCase;
+use Symfony\Component\Routing\RouteCollection;
+use Symfony\Component\Routing\Route;
+use Symfony\Component\Routing\Generator\UrlGenerator;
+use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
+use Symfony\Component\Routing\RequestContext;
+
+class UrlGeneratorTest extends TestCase
+{
+ public function testAbsoluteUrlWithPort80()
+ {
+ $routes = $this->getRoutes('test', new Route('/testing'));
+ $url = $this->getGenerator($routes)->generate('test', array(), UrlGeneratorInterface::ABSOLUTE_URL);
+
+ $this->assertEquals('http://localhost/app.php/testing', $url);
+ }
+
+ public function testAbsoluteSecureUrlWithPort443()
+ {
+ $routes = $this->getRoutes('test', new Route('/testing'));
+ $url = $this->getGenerator($routes, array('scheme' => 'https'))->generate('test', array(), UrlGeneratorInterface::ABSOLUTE_URL);
+
+ $this->assertEquals('https://localhost/app.php/testing', $url);
+ }
+
+ public function testAbsoluteUrlWithNonStandardPort()
+ {
+ $routes = $this->getRoutes('test', new Route('/testing'));
+ $url = $this->getGenerator($routes, array('httpPort' => 8080))->generate('test', array(), UrlGeneratorInterface::ABSOLUTE_URL);
+
+ $this->assertEquals('http://localhost:8080/app.php/testing', $url);
+ }
+
+ public function testAbsoluteSecureUrlWithNonStandardPort()
+ {
+ $routes = $this->getRoutes('test', new Route('/testing'));
+ $url = $this->getGenerator($routes, array('httpsPort' => 8080, 'scheme' => 'https'))->generate('test', array(), UrlGeneratorInterface::ABSOLUTE_URL);
+
+ $this->assertEquals('https://localhost:8080/app.php/testing', $url);
+ }
+
+ public function testRelativeUrlWithoutParameters()
+ {
+ $routes = $this->getRoutes('test', new Route('/testing'));
+ $url = $this->getGenerator($routes)->generate('test', array(), UrlGeneratorInterface::ABSOLUTE_PATH);
+
+ $this->assertEquals('/app.php/testing', $url);
+ }
+
+ public function testRelativeUrlWithParameter()
+ {
+ $routes = $this->getRoutes('test', new Route('/testing/{foo}'));
+ $url = $this->getGenerator($routes)->generate('test', array('foo' => 'bar'), UrlGeneratorInterface::ABSOLUTE_PATH);
+
+ $this->assertEquals('/app.php/testing/bar', $url);
+ }
+
+ public function testRelativeUrlWithNullParameter()
+ {
+ $routes = $this->getRoutes('test', new Route('/testing.{format}', array('format' => null)));
+ $url = $this->getGenerator($routes)->generate('test', array(), UrlGeneratorInterface::ABSOLUTE_PATH);
+
+ $this->assertEquals('/app.php/testing', $url);
+ }
+
+ /**
+ * @expectedException \Symfony\Component\Routing\Exception\InvalidParameterException
+ */
+ public function testRelativeUrlWithNullParameterButNotOptional()
+ {
+ $routes = $this->getRoutes('test', new Route('/testing/{foo}/bar', array('foo' => null)));
+ // This must raise an exception because the default requirement for "foo" is "[^/]+" which is not met with these params.
+ // Generating path "/testing//bar" would be wrong as matching this route would fail.
+ $this->getGenerator($routes)->generate('test', array(), UrlGeneratorInterface::ABSOLUTE_PATH);
+ }
+
+ public function testRelativeUrlWithOptionalZeroParameter()
+ {
+ $routes = $this->getRoutes('test', new Route('/testing/{page}'));
+ $url = $this->getGenerator($routes)->generate('test', array('page' => 0), UrlGeneratorInterface::ABSOLUTE_PATH);
+
+ $this->assertEquals('/app.php/testing/0', $url);
+ }
+
+ public function testNotPassedOptionalParameterInBetween()
+ {
+ $routes = $this->getRoutes('test', new Route('/{slug}/{page}', array('slug' => 'index', 'page' => 0)));
+ $this->assertSame('/app.php/index/1', $this->getGenerator($routes)->generate('test', array('page' => 1)));
+ $this->assertSame('/app.php/', $this->getGenerator($routes)->generate('test'));
+ }
+
+ public function testRelativeUrlWithExtraParameters()
+ {
+ $routes = $this->getRoutes('test', new Route('/testing'));
+ $url = $this->getGenerator($routes)->generate('test', array('foo' => 'bar'), UrlGeneratorInterface::ABSOLUTE_PATH);
+
+ $this->assertEquals('/app.php/testing?foo=bar', $url);
+ }
+
+ public function testAbsoluteUrlWithExtraParameters()
+ {
+ $routes = $this->getRoutes('test', new Route('/testing'));
+ $url = $this->getGenerator($routes)->generate('test', array('foo' => 'bar'), UrlGeneratorInterface::ABSOLUTE_URL);
+
+ $this->assertEquals('http://localhost/app.php/testing?foo=bar', $url);
+ }
+
+ public function testUrlWithNullExtraParameters()
+ {
+ $routes = $this->getRoutes('test', new Route('/testing'));
+ $url = $this->getGenerator($routes)->generate('test', array('foo' => null), UrlGeneratorInterface::ABSOLUTE_URL);
+
+ $this->assertEquals('http://localhost/app.php/testing', $url);
+ }
+
+ public function testUrlWithExtraParametersFromGlobals()
+ {
+ $routes = $this->getRoutes('test', new Route('/testing'));
+ $generator = $this->getGenerator($routes);
+ $context = new RequestContext('/app.php');
+ $context->setParameter('bar', 'bar');
+ $generator->setContext($context);
+ $url = $generator->generate('test', array('foo' => 'bar'));
+
+ $this->assertEquals('/app.php/testing?foo=bar', $url);
+ }
+
+ public function testUrlWithGlobalParameter()
+ {
+ $routes = $this->getRoutes('test', new Route('/testing/{foo}'));
+ $generator = $this->getGenerator($routes);
+ $context = new RequestContext('/app.php');
+ $context->setParameter('foo', 'bar');
+ $generator->setContext($context);
+ $url = $generator->generate('test', array());
+
+ $this->assertEquals('/app.php/testing/bar', $url);
+ }
+
+ public function testGlobalParameterHasHigherPriorityThanDefault()
+ {
+ $routes = $this->getRoutes('test', new Route('/{_locale}', array('_locale' => 'en')));
+ $generator = $this->getGenerator($routes);
+ $context = new RequestContext('/app.php');
+ $context->setParameter('_locale', 'de');
+ $generator->setContext($context);
+ $url = $generator->generate('test', array());
+
+ $this->assertSame('/app.php/de', $url);
+ }
+
+ /**
+ * @expectedException \Symfony\Component\Routing\Exception\RouteNotFoundException
+ */
+ public function testGenerateWithoutRoutes()
+ {
+ $routes = $this->getRoutes('foo', new Route('/testing/{foo}'));
+ $this->getGenerator($routes)->generate('test', array(), UrlGeneratorInterface::ABSOLUTE_URL);
+ }
+
+ /**
+ * @expectedException \Symfony\Component\Routing\Exception\MissingMandatoryParametersException
+ */
+ public function testGenerateForRouteWithoutMandatoryParameter()
+ {
+ $routes = $this->getRoutes('test', new Route('/testing/{foo}'));
+ $this->getGenerator($routes)->generate('test', array(), UrlGeneratorInterface::ABSOLUTE_URL);
+ }
+
+ /**
+ * @expectedException \Symfony\Component\Routing\Exception\InvalidParameterException
+ */
+ public function testGenerateForRouteWithInvalidOptionalParameter()
+ {
+ $routes = $this->getRoutes('test', new Route('/testing/{foo}', array('foo' => '1'), array('foo' => 'd+')));
+ $this->getGenerator($routes)->generate('test', array('foo' => 'bar'), UrlGeneratorInterface::ABSOLUTE_URL);
+ }
+
+ /**
+ * @expectedException \Symfony\Component\Routing\Exception\InvalidParameterException
+ */
+ public function testGenerateForRouteWithInvalidParameter()
+ {
+ $routes = $this->getRoutes('test', new Route('/testing/{foo}', array(), array('foo' => '1|2')));
+ $this->getGenerator($routes)->generate('test', array('foo' => '0'), UrlGeneratorInterface::ABSOLUTE_URL);
+ }
+
+ public function testGenerateForRouteWithInvalidOptionalParameterNonStrict()
+ {
+ $routes = $this->getRoutes('test', new Route('/testing/{foo}', array('foo' => '1'), array('foo' => 'd+')));
+ $generator = $this->getGenerator($routes);
+ $generator->setStrictRequirements(false);
+ $this->assertNull($generator->generate('test', array('foo' => 'bar'), UrlGeneratorInterface::ABSOLUTE_URL));
+ }
+
+ public function testGenerateForRouteWithInvalidOptionalParameterNonStrictWithLogger()
+ {
+ $routes = $this->getRoutes('test', new Route('/testing/{foo}', array('foo' => '1'), array('foo' => 'd+')));
+ $logger = $this->getMockBuilder('Psr\Log\LoggerInterface')->getMock();
+ $logger->expects($this->once())
+ ->method('error');
+ $generator = $this->getGenerator($routes, array(), $logger);
+ $generator->setStrictRequirements(false);
+ $this->assertNull($generator->generate('test', array('foo' => 'bar'), UrlGeneratorInterface::ABSOLUTE_URL));
+ }
+
+ public function testGenerateForRouteWithInvalidParameterButDisabledRequirementsCheck()
+ {
+ $routes = $this->getRoutes('test', new Route('/testing/{foo}', array('foo' => '1'), array('foo' => 'd+')));
+ $generator = $this->getGenerator($routes);
+ $generator->setStrictRequirements(null);
+ $this->assertSame('/app.php/testing/bar', $generator->generate('test', array('foo' => 'bar')));
+ }
+
+ /**
+ * @expectedException \Symfony\Component\Routing\Exception\InvalidParameterException
+ */
+ public function testGenerateForRouteWithInvalidMandatoryParameter()
+ {
+ $routes = $this->getRoutes('test', new Route('/testing/{foo}', array(), array('foo' => 'd+')));
+ $this->getGenerator($routes)->generate('test', array('foo' => 'bar'), UrlGeneratorInterface::ABSOLUTE_URL);
+ }
+
+ /**
+ * @expectedException \Symfony\Component\Routing\Exception\InvalidParameterException
+ */
+ public function testGenerateForRouteWithInvalidUtf8Parameter()
+ {
+ $routes = $this->getRoutes('test', new Route('/testing/{foo}', array(), array('foo' => '\pL+'), array('utf8' => true)));
+ $this->getGenerator($routes)->generate('test', array('foo' => 'abc123'), UrlGeneratorInterface::ABSOLUTE_URL);
+ }
+
+ /**
+ * @expectedException \Symfony\Component\Routing\Exception\InvalidParameterException
+ */
+ public function testRequiredParamAndEmptyPassed()
+ {
+ $routes = $this->getRoutes('test', new Route('/{slug}', array(), array('slug' => '.+')));
+ $this->getGenerator($routes)->generate('test', array('slug' => ''));
+ }
+
+ public function testSchemeRequirementDoesNothingIfSameCurrentScheme()
+ {
+ $routes = $this->getRoutes('test', new Route('/', array(), array(), array(), '', array('http')));
+ $this->assertEquals('/app.php/', $this->getGenerator($routes)->generate('test'));
+
+ $routes = $this->getRoutes('test', new Route('/', array(), array(), array(), '', array('https')));
+ $this->assertEquals('/app.php/', $this->getGenerator($routes, array('scheme' => 'https'))->generate('test'));
+ }
+
+ public function testSchemeRequirementForcesAbsoluteUrl()
+ {
+ $routes = $this->getRoutes('test', new Route('/', array(), array(), array(), '', array('https')));
+ $this->assertEquals('https://localhost/app.php/', $this->getGenerator($routes)->generate('test'));
+
+ $routes = $this->getRoutes('test', new Route('/', array(), array(), array(), '', array('http')));
+ $this->assertEquals('http://localhost/app.php/', $this->getGenerator($routes, array('scheme' => 'https'))->generate('test'));
+ }
+
+ public function testSchemeRequirementCreatesUrlForFirstRequiredScheme()
+ {
+ $routes = $this->getRoutes('test', new Route('/', array(), array(), array(), '', array('Ftp', 'https')));
+ $this->assertEquals('ftp://localhost/app.php/', $this->getGenerator($routes)->generate('test'));
+ }
+
+ public function testPathWithTwoStartingSlashes()
+ {
+ $routes = $this->getRoutes('test', new Route('//path-and-not-domain'));
+
+ // this must not generate '//path-and-not-domain' because that would be a network path
+ $this->assertSame('/path-and-not-domain', $this->getGenerator($routes, array('BaseUrl' => ''))->generate('test'));
+ }
+
+ public function testNoTrailingSlashForMultipleOptionalParameters()
+ {
+ $routes = $this->getRoutes('test', new Route('/category/{slug1}/{slug2}/{slug3}', array('slug2' => null, 'slug3' => null)));
+
+ $this->assertEquals('/app.php/category/foo', $this->getGenerator($routes)->generate('test', array('slug1' => 'foo')));
+ }
+
+ public function testWithAnIntegerAsADefaultValue()
+ {
+ $routes = $this->getRoutes('test', new Route('/{default}', array('default' => 0)));
+
+ $this->assertEquals('/app.php/foo', $this->getGenerator($routes)->generate('test', array('default' => 'foo')));
+ }
+
+ public function testNullForOptionalParameterIsIgnored()
+ {
+ $routes = $this->getRoutes('test', new Route('/test/{default}', array('default' => 0)));
+
+ $this->assertEquals('/app.php/test', $this->getGenerator($routes)->generate('test', array('default' => null)));
+ }
+
+ public function testQueryParamSameAsDefault()
+ {
+ $routes = $this->getRoutes('test', new Route('/test', array('page' => 1)));
+
+ $this->assertSame('/app.php/test?page=2', $this->getGenerator($routes)->generate('test', array('page' => 2)));
+ $this->assertSame('/app.php/test', $this->getGenerator($routes)->generate('test', array('page' => 1)));
+ $this->assertSame('/app.php/test', $this->getGenerator($routes)->generate('test', array('page' => '1')));
+ $this->assertSame('/app.php/test', $this->getGenerator($routes)->generate('test'));
+ }
+
+ public function testArrayQueryParamSameAsDefault()
+ {
+ $routes = $this->getRoutes('test', new Route('/test', array('array' => array('foo', 'bar'))));
+
+ $this->assertSame('/app.php/test?array%5B0%5D=bar&array%5B1%5D=foo', $this->getGenerator($routes)->generate('test', array('array' => array('bar', 'foo'))));
+ $this->assertSame('/app.php/test?array%5Ba%5D=foo&array%5Bb%5D=bar', $this->getGenerator($routes)->generate('test', array('array' => array('a' => 'foo', 'b' => 'bar'))));
+ $this->assertSame('/app.php/test', $this->getGenerator($routes)->generate('test', array('array' => array('foo', 'bar'))));
+ $this->assertSame('/app.php/test', $this->getGenerator($routes)->generate('test', array('array' => array(1 => 'bar', 0 => 'foo'))));
+ $this->assertSame('/app.php/test', $this->getGenerator($routes)->generate('test'));
+ }
+
+ public function testGenerateWithSpecialRouteName()
+ {
+ $routes = $this->getRoutes('$péß^a|', new Route('/bar'));
+
+ $this->assertSame('/app.php/bar', $this->getGenerator($routes)->generate('$péß^a|'));
+ }
+
+ public function testUrlEncoding()
+ {
+ $expectedPath = '/app.php/@:%5B%5D/%28%29*%27%22%20+,;-._~%26%24%3C%3E|%7B%7D%25%5C%5E%60!%3Ffoo=bar%23id'
+ .'/@:%5B%5D/%28%29*%27%22%20+,;-._~%26%24%3C%3E|%7B%7D%25%5C%5E%60!%3Ffoo=bar%23id'
+ .'?query=%40%3A%5B%5D/%28%29%2A%27%22%20%2B%2C%3B-._~%26%24%3C%3E%7C%7B%7D%25%5C%5E%60%21%3Ffoo%3Dbar%23id';
+
+ // This tests the encoding of reserved characters that are used for delimiting of URI components (defined in RFC 3986)
+ // and other special ASCII chars. These chars are tested as static text path, variable path and query param.
+ $chars = '@:[]/()*\'" +,;-._~&$<>|{}%\\^`!?foo=bar#id';
+ $routes = $this->getRoutes('test', new Route("/$chars/{varpath}", array(), array('varpath' => '.+')));
+ $this->assertSame($expectedPath, $this->getGenerator($routes)->generate('test', array(
+ 'varpath' => $chars,
+ 'query' => $chars,
+ )));
+ }
+
+ public function testEncodingOfRelativePathSegments()
+ {
+ $routes = $this->getRoutes('test', new Route('/dir/../dir/..'));
+ $this->assertSame('/app.php/dir/%2E%2E/dir/%2E%2E', $this->getGenerator($routes)->generate('test'));
+ $routes = $this->getRoutes('test', new Route('/dir/./dir/.'));
+ $this->assertSame('/app.php/dir/%2E/dir/%2E', $this->getGenerator($routes)->generate('test'));
+ $routes = $this->getRoutes('test', new Route('/a./.a/a../..a/...'));
+ $this->assertSame('/app.php/a./.a/a../..a/...', $this->getGenerator($routes)->generate('test'));
+ }
+
+ public function testAdjacentVariables()
+ {
+ $routes = $this->getRoutes('test', new Route('/{x}{y}{z}.{_format}', array('z' => 'default-z', '_format' => 'html'), array('y' => '\d+')));
+ $generator = $this->getGenerator($routes);
+ $this->assertSame('/app.php/foo123', $generator->generate('test', array('x' => 'foo', 'y' => '123')));
+ $this->assertSame('/app.php/foo123bar.xml', $generator->generate('test', array('x' => 'foo', 'y' => '123', 'z' => 'bar', '_format' => 'xml')));
+
+ // The default requirement for 'x' should not allow the separator '.' in this case because it would otherwise match everything
+ // and following optional variables like _format could never match.
+ $this->{method_exists($this, $_ = 'expectException') ? $_ : 'setExpectedException'}('Symfony\Component\Routing\Exception\InvalidParameterException');
+ $generator->generate('test', array('x' => 'do.t', 'y' => '123', 'z' => 'bar', '_format' => 'xml'));
+ }
+
+ public function testOptionalVariableWithNoRealSeparator()
+ {
+ $routes = $this->getRoutes('test', new Route('/get{what}', array('what' => 'All')));
+ $generator = $this->getGenerator($routes);
+
+ $this->assertSame('/app.php/get', $generator->generate('test'));
+ $this->assertSame('/app.php/getSites', $generator->generate('test', array('what' => 'Sites')));
+ }
+
+ public function testRequiredVariableWithNoRealSeparator()
+ {
+ $routes = $this->getRoutes('test', new Route('/get{what}Suffix'));
+ $generator = $this->getGenerator($routes);
+
+ $this->assertSame('/app.php/getSitesSuffix', $generator->generate('test', array('what' => 'Sites')));
+ }
+
+ public function testDefaultRequirementOfVariable()
+ {
+ $routes = $this->getRoutes('test', new Route('/{page}.{_format}'));
+ $generator = $this->getGenerator($routes);
+
+ $this->assertSame('/app.php/index.mobile.html', $generator->generate('test', array('page' => 'index', '_format' => 'mobile.html')));
+ }
+
+ /**
+ * @expectedException \Symfony\Component\Routing\Exception\InvalidParameterException
+ */
+ public function testDefaultRequirementOfVariableDisallowsSlash()
+ {
+ $routes = $this->getRoutes('test', new Route('/{page}.{_format}'));
+ $this->getGenerator($routes)->generate('test', array('page' => 'index', '_format' => 'sl/ash'));
+ }
+
+ /**
+ * @expectedException \Symfony\Component\Routing\Exception\InvalidParameterException
+ */
+ public function testDefaultRequirementOfVariableDisallowsNextSeparator()
+ {
+ $routes = $this->getRoutes('test', new Route('/{page}.{_format}'));
+ $this->getGenerator($routes)->generate('test', array('page' => 'do.t', '_format' => 'html'));
+ }
+
+ public function testWithHostDifferentFromContext()
+ {
+ $routes = $this->getRoutes('test', new Route('/{name}', array(), array(), array(), '{locale}.example.com'));
+
+ $this->assertEquals('//fr.example.com/app.php/Fabien', $this->getGenerator($routes)->generate('test', array('name' => 'Fabien', 'locale' => 'fr')));
+ }
+
+ public function testWithHostSameAsContext()
+ {
+ $routes = $this->getRoutes('test', new Route('/{name}', array(), array(), array(), '{locale}.example.com'));
+
+ $this->assertEquals('/app.php/Fabien', $this->getGenerator($routes, array('host' => 'fr.example.com'))->generate('test', array('name' => 'Fabien', 'locale' => 'fr')));
+ }
+
+ public function testWithHostSameAsContextAndAbsolute()
+ {
+ $routes = $this->getRoutes('test', new Route('/{name}', array(), array(), array(), '{locale}.example.com'));
+
+ $this->assertEquals('http://fr.example.com/app.php/Fabien', $this->getGenerator($routes, array('host' => 'fr.example.com'))->generate('test', array('name' => 'Fabien', 'locale' => 'fr'), UrlGeneratorInterface::ABSOLUTE_URL));
+ }
+
+ /**
+ * @expectedException \Symfony\Component\Routing\Exception\InvalidParameterException
+ */
+ public function testUrlWithInvalidParameterInHost()
+ {
+ $routes = $this->getRoutes('test', new Route('/', array(), array('foo' => 'bar'), array(), '{foo}.example.com'));
+ $this->getGenerator($routes)->generate('test', array('foo' => 'baz'), UrlGeneratorInterface::ABSOLUTE_PATH);
+ }
+
+ /**
+ * @expectedException \Symfony\Component\Routing\Exception\InvalidParameterException
+ */
+ public function testUrlWithInvalidParameterInHostWhenParamHasADefaultValue()
+ {
+ $routes = $this->getRoutes('test', new Route('/', array('foo' => 'bar'), array('foo' => 'bar'), array(), '{foo}.example.com'));
+ $this->getGenerator($routes)->generate('test', array('foo' => 'baz'), UrlGeneratorInterface::ABSOLUTE_PATH);
+ }
+
+ /**
+ * @expectedException \Symfony\Component\Routing\Exception\InvalidParameterException
+ */
+ public function testUrlWithInvalidParameterEqualsDefaultValueInHost()
+ {
+ $routes = $this->getRoutes('test', new Route('/', array('foo' => 'baz'), array('foo' => 'bar'), array(), '{foo}.example.com'));
+ $this->getGenerator($routes)->generate('test', array('foo' => 'baz'), UrlGeneratorInterface::ABSOLUTE_PATH);
+ }
+
+ public function testUrlWithInvalidParameterInHostInNonStrictMode()
+ {
+ $routes = $this->getRoutes('test', new Route('/', array(), array('foo' => 'bar'), array(), '{foo}.example.com'));
+ $generator = $this->getGenerator($routes);
+ $generator->setStrictRequirements(false);
+ $this->assertNull($generator->generate('test', array('foo' => 'baz'), UrlGeneratorInterface::ABSOLUTE_PATH));
+ }
+
+ public function testHostIsCaseInsensitive()
+ {
+ $routes = $this->getRoutes('test', new Route('/', array(), array('locale' => 'en|de|fr'), array(), '{locale}.FooBar.com'));
+ $generator = $this->getGenerator($routes);
+ $this->assertSame('//EN.FooBar.com/app.php/', $generator->generate('test', array('locale' => 'EN'), UrlGeneratorInterface::NETWORK_PATH));
+ }
+
+ public function testDefaultHostIsUsedWhenContextHostIsEmpty()
+ {
+ $routes = $this->getRoutes('test', new Route('/route', array('domain' => 'my.fallback.host'), array('domain' => '.+'), array(), '{domain}', array('http')));
+
+ $generator = $this->getGenerator($routes);
+ $generator->getContext()->setHost('');
+
+ $this->assertSame('http://my.fallback.host/app.php/route', $generator->generate('test', array(), UrlGeneratorInterface::ABSOLUTE_URL));
+ }
+
+ public function testDefaultHostIsUsedWhenContextHostIsEmptyAndSchemeIsNot()
+ {
+ $routes = $this->getRoutes('test', new Route('/route', array('domain' => 'my.fallback.host'), array('domain' => '.+'), array(), '{domain}', array('http', 'https')));
+
+ $generator = $this->getGenerator($routes);
+ $generator->getContext()->setHost('');
+ $generator->getContext()->setScheme('https');
+
+ $this->assertSame('https://my.fallback.host/app.php/route', $generator->generate('test', array(), UrlGeneratorInterface::ABSOLUTE_URL));
+ }
+
+ public function testAbsoluteUrlFallbackToRelativeIfHostIsEmptyAndSchemeIsNot()
+ {
+ $routes = $this->getRoutes('test', new Route('/route', array(), array(), array(), '', array('http', 'https')));
+
+ $generator = $this->getGenerator($routes);
+ $generator->getContext()->setHost('');
+ $generator->getContext()->setScheme('https');
+
+ $this->assertSame('/app.php/route', $generator->generate('test', array(), UrlGeneratorInterface::ABSOLUTE_URL));
+ }
+
+ public function testGenerateNetworkPath()
+ {
+ $routes = $this->getRoutes('test', new Route('/{name}', array(), array(), array(), '{locale}.example.com', array('http')));
+
+ $this->assertSame('//fr.example.com/app.php/Fabien', $this->getGenerator($routes)->generate('test',
+ array('name' => 'Fabien', 'locale' => 'fr'), UrlGeneratorInterface::NETWORK_PATH), 'network path with different host'
+ );
+ $this->assertSame('//fr.example.com/app.php/Fabien?query=string', $this->getGenerator($routes, array('host' => 'fr.example.com'))->generate('test',
+ array('name' => 'Fabien', 'locale' => 'fr', 'query' => 'string'), UrlGeneratorInterface::NETWORK_PATH), 'network path although host same as context'
+ );
+ $this->assertSame('http://fr.example.com/app.php/Fabien', $this->getGenerator($routes, array('scheme' => 'https'))->generate('test',
+ array('name' => 'Fabien', 'locale' => 'fr'), UrlGeneratorInterface::NETWORK_PATH), 'absolute URL because scheme requirement does not match context'
+ );
+ $this->assertSame('http://fr.example.com/app.php/Fabien', $this->getGenerator($routes)->generate('test',
+ array('name' => 'Fabien', 'locale' => 'fr'), UrlGeneratorInterface::ABSOLUTE_URL), 'absolute URL with same scheme because it is requested'
+ );
+ }
+
+ public function testGenerateRelativePath()
+ {
+ $routes = new RouteCollection();
+ $routes->add('article', new Route('/{author}/{article}/'));
+ $routes->add('comments', new Route('/{author}/{article}/comments'));
+ $routes->add('host', new Route('/{article}', array(), array(), array(), '{author}.example.com'));
+ $routes->add('scheme', new Route('/{author}/blog', array(), array(), array(), '', array('https')));
+ $routes->add('unrelated', new Route('/about'));
+
+ $generator = $this->getGenerator($routes, array('host' => 'example.com', 'pathInfo' => '/fabien/symfony-is-great/'));
+
+ $this->assertSame('comments', $generator->generate('comments',
+ array('author' => 'fabien', 'article' => 'symfony-is-great'), UrlGeneratorInterface::RELATIVE_PATH)
+ );
+ $this->assertSame('comments?page=2', $generator->generate('comments',
+ array('author' => 'fabien', 'article' => 'symfony-is-great', 'page' => 2), UrlGeneratorInterface::RELATIVE_PATH)
+ );
+ $this->assertSame('../twig-is-great/', $generator->generate('article',
+ array('author' => 'fabien', 'article' => 'twig-is-great'), UrlGeneratorInterface::RELATIVE_PATH)
+ );
+ $this->assertSame('../../bernhard/forms-are-great/', $generator->generate('article',
+ array('author' => 'bernhard', 'article' => 'forms-are-great'), UrlGeneratorInterface::RELATIVE_PATH)
+ );
+ $this->assertSame('//bernhard.example.com/app.php/forms-are-great', $generator->generate('host',
+ array('author' => 'bernhard', 'article' => 'forms-are-great'), UrlGeneratorInterface::RELATIVE_PATH)
+ );
+ $this->assertSame('https://example.com/app.php/bernhard/blog', $generator->generate('scheme',
+ array('author' => 'bernhard'), UrlGeneratorInterface::RELATIVE_PATH)
+ );
+ $this->assertSame('../../about', $generator->generate('unrelated',
+ array(), UrlGeneratorInterface::RELATIVE_PATH)
+ );
+ }
+
+ /**
+ * @dataProvider provideRelativePaths
+ */
+ public function testGetRelativePath($sourcePath, $targetPath, $expectedPath)
+ {
+ $this->assertSame($expectedPath, UrlGenerator::getRelativePath($sourcePath, $targetPath));
+ }
+
+ public function provideRelativePaths()
+ {
+ return array(
+ array(
+ '/same/dir/',
+ '/same/dir/',
+ '',
+ ),
+ array(
+ '/same/file',
+ '/same/file',
+ '',
+ ),
+ array(
+ '/',
+ '/file',
+ 'file',
+ ),
+ array(
+ '/',
+ '/dir/file',
+ 'dir/file',
+ ),
+ array(
+ '/dir/file.html',
+ '/dir/different-file.html',
+ 'different-file.html',
+ ),
+ array(
+ '/same/dir/extra-file',
+ '/same/dir/',
+ './',
+ ),
+ array(
+ '/parent/dir/',
+ '/parent/',
+ '../',
+ ),
+ array(
+ '/parent/dir/extra-file',
+ '/parent/',
+ '../',
+ ),
+ array(
+ '/a/b/',
+ '/x/y/z/',
+ '../../x/y/z/',
+ ),
+ array(
+ '/a/b/c/d/e',
+ '/a/c/d',
+ '../../../c/d',
+ ),
+ array(
+ '/a/b/c//',
+ '/a/b/c/',
+ '../',
+ ),
+ array(
+ '/a/b/c/',
+ '/a/b/c//',
+ './/',
+ ),
+ array(
+ '/root/a/b/c/',
+ '/root/x/b/c/',
+ '../../../x/b/c/',
+ ),
+ array(
+ '/a/b/c/d/',
+ '/a',
+ '../../../../a',
+ ),
+ array(
+ '/special-chars/sp%20ce/1€/mäh/e=mc²',
+ '/special-chars/sp%20ce/1€/<µ>/e=mc²',
+ '../<µ>/e=mc²',
+ ),
+ array(
+ 'not-rooted',
+ 'dir/file',
+ 'dir/file',
+ ),
+ array(
+ '//dir/',
+ '',
+ '../../',
+ ),
+ array(
+ '/dir/',
+ '/dir/file:with-colon',
+ './file:with-colon',
+ ),
+ array(
+ '/dir/',
+ '/dir/subdir/file:with-colon',
+ 'subdir/file:with-colon',
+ ),
+ array(
+ '/dir/',
+ '/dir/:subdir/',
+ './:subdir/',
+ ),
+ );
+ }
+
+ public function testFragmentsCanBeAppendedToUrls()
+ {
+ $routes = $this->getRoutes('test', new Route('/testing'));
+
+ $url = $this->getGenerator($routes)->generate('test', array('_fragment' => 'frag ment'), UrlGeneratorInterface::ABSOLUTE_PATH);
+ $this->assertEquals('/app.php/testing#frag%20ment', $url);
+
+ $url = $this->getGenerator($routes)->generate('test', array('_fragment' => '0'), UrlGeneratorInterface::ABSOLUTE_PATH);
+ $this->assertEquals('/app.php/testing#0', $url);
+ }
+
+ public function testFragmentsDoNotEscapeValidCharacters()
+ {
+ $routes = $this->getRoutes('test', new Route('/testing'));
+ $url = $this->getGenerator($routes)->generate('test', array('_fragment' => '?/'), UrlGeneratorInterface::ABSOLUTE_PATH);
+
+ $this->assertEquals('/app.php/testing#?/', $url);
+ }
+
+ public function testFragmentsCanBeDefinedAsDefaults()
+ {
+ $routes = $this->getRoutes('test', new Route('/testing', array('_fragment' => 'fragment')));
+ $url = $this->getGenerator($routes)->generate('test', array(), UrlGeneratorInterface::ABSOLUTE_PATH);
+
+ $this->assertEquals('/app.php/testing#fragment', $url);
+ }
+
+ protected function getGenerator(RouteCollection $routes, array $parameters = array(), $logger = null)
+ {
+ $context = new RequestContext('/app.php');
+ foreach ($parameters as $key => $value) {
+ $method = 'set'.$key;
+ $context->$method($value);
+ }
+
+ return new UrlGenerator($routes, $context, $logger);
+ }
+
+ protected function getRoutes($name, Route $route)
+ {
+ $routes = new RouteCollection();
+ $routes->add($name, $route);
+
+ return $routes;
+ }
+}
diff --git a/assets/php/vendor/symfony/routing/Tests/Loader/AbstractAnnotationLoaderTest.php b/assets/php/vendor/symfony/routing/Tests/Loader/AbstractAnnotationLoaderTest.php
new file mode 100644
index 0000000..e8bbe8f
--- /dev/null
+++ b/assets/php/vendor/symfony/routing/Tests/Loader/AbstractAnnotationLoaderTest.php
@@ -0,0 +1,33 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Routing\Tests\Loader;
+
+use PHPUnit\Framework\TestCase;
+
+abstract class AbstractAnnotationLoaderTest extends TestCase
+{
+ public function getReader()
+ {
+ return $this->getMockBuilder('Doctrine\Common\Annotations\Reader')
+ ->disableOriginalConstructor()
+ ->getMock()
+ ;
+ }
+
+ public function getClassLoader($reader)
+ {
+ return $this->getMockBuilder('Symfony\Component\Routing\Loader\AnnotationClassLoader')
+ ->setConstructorArgs(array($reader))
+ ->getMockForAbstractClass()
+ ;
+ }
+}
diff --git a/assets/php/vendor/symfony/routing/Tests/Loader/AnnotationClassLoaderTest.php b/assets/php/vendor/symfony/routing/Tests/Loader/AnnotationClassLoaderTest.php
new file mode 100644
index 0000000..70db1cc
--- /dev/null
+++ b/assets/php/vendor/symfony/routing/Tests/Loader/AnnotationClassLoaderTest.php
@@ -0,0 +1,255 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Routing\Tests\Loader;
+
+use Symfony\Component\Routing\Annotation\Route;
+
+class AnnotationClassLoaderTest extends AbstractAnnotationLoaderTest
+{
+ protected $loader;
+ private $reader;
+
+ protected function setUp()
+ {
+ parent::setUp();
+
+ $this->reader = $this->getReader();
+ $this->loader = $this->getClassLoader($this->reader);
+ }
+
+ /**
+ * @expectedException \InvalidArgumentException
+ */
+ public function testLoadMissingClass()
+ {
+ $this->loader->load('MissingClass');
+ }
+
+ /**
+ * @expectedException \InvalidArgumentException
+ */
+ public function testLoadAbstractClass()
+ {
+ $this->loader->load('Symfony\Component\Routing\Tests\Fixtures\AnnotatedClasses\AbstractClass');
+ }
+
+ /**
+ * @dataProvider provideTestSupportsChecksResource
+ */
+ public function testSupportsChecksResource($resource, $expectedSupports)
+ {
+ $this->assertSame($expectedSupports, $this->loader->supports($resource), '->supports() returns true if the resource is loadable');
+ }
+
+ public function provideTestSupportsChecksResource()
+ {
+ return array(
+ array('class', true),
+ array('\fully\qualified\class\name', true),
+ array('namespaced\class\without\leading\slash', true),
+ array('ÿClassWithLegalSpecialCharacters', true),
+ array('5', false),
+ array('foo.foo', false),
+ array(null, false),
+ );
+ }
+
+ public function testSupportsChecksTypeIfSpecified()
+ {
+ $this->assertTrue($this->loader->supports('class', 'annotation'), '->supports() checks the resource type if specified');
+ $this->assertFalse($this->loader->supports('class', 'foo'), '->supports() checks the resource type if specified');
+ }
+
+ public function getLoadTests()
+ {
+ return array(
+ array(
+ 'Symfony\Component\Routing\Tests\Fixtures\AnnotatedClasses\BarClass',
+ array('name' => 'route1', 'path' => '/path'),
+ array('arg2' => 'defaultValue2', 'arg3' => 'defaultValue3'),
+ ),
+ array(
+ 'Symfony\Component\Routing\Tests\Fixtures\AnnotatedClasses\BarClass',
+ array('defaults' => array('arg2' => 'foo'), 'requirements' => array('arg3' => '\w+')),
+ array('arg2' => 'defaultValue2', 'arg3' => 'defaultValue3'),
+ ),
+ array(
+ 'Symfony\Component\Routing\Tests\Fixtures\AnnotatedClasses\BarClass',
+ array('options' => array('foo' => 'bar')),
+ array('arg2' => 'defaultValue2', 'arg3' => 'defaultValue3'),
+ ),
+ array(
+ 'Symfony\Component\Routing\Tests\Fixtures\AnnotatedClasses\BarClass',
+ array('schemes' => array('https'), 'methods' => array('GET')),
+ array('arg2' => 'defaultValue2', 'arg3' => 'defaultValue3'),
+ ),
+ array(
+ 'Symfony\Component\Routing\Tests\Fixtures\AnnotatedClasses\BarClass',
+ array('condition' => 'context.getMethod() == "GET"'),
+ array('arg2' => 'defaultValue2', 'arg3' => 'defaultValue3'),
+ ),
+ );
+ }
+
+ /**
+ * @dataProvider getLoadTests
+ */
+ public function testLoad($className, $routeData = array(), $methodArgs = array())
+ {
+ $routeData = array_replace(array(
+ 'name' => 'route',
+ 'path' => '/',
+ 'requirements' => array(),
+ 'options' => array(),
+ 'defaults' => array(),
+ 'schemes' => array(),
+ 'methods' => array(),
+ 'condition' => '',
+ ), $routeData);
+
+ $this->reader
+ ->expects($this->once())
+ ->method('getMethodAnnotations')
+ ->will($this->returnValue(array($this->getAnnotatedRoute($routeData))))
+ ;
+
+ $routeCollection = $this->loader->load($className);
+ $route = $routeCollection->get($routeData['name']);
+
+ $this->assertSame($routeData['path'], $route->getPath(), '->load preserves path annotation');
+ $this->assertCount(
+ count($routeData['requirements']),
+ array_intersect_assoc($routeData['requirements'], $route->getRequirements()),
+ '->load preserves requirements annotation'
+ );
+ $this->assertCount(
+ count($routeData['options']),
+ array_intersect_assoc($routeData['options'], $route->getOptions()),
+ '->load preserves options annotation'
+ );
+ $this->assertCount(
+ count($routeData['defaults']),
+ $route->getDefaults(),
+ '->load preserves defaults annotation'
+ );
+ $this->assertEquals($routeData['schemes'], $route->getSchemes(), '->load preserves schemes annotation');
+ $this->assertEquals($routeData['methods'], $route->getMethods(), '->load preserves methods annotation');
+ $this->assertSame($routeData['condition'], $route->getCondition(), '->load preserves condition annotation');
+ }
+
+ public function testClassRouteLoad()
+ {
+ $classRouteData = array(
+ 'name' => 'prefix_',
+ 'path' => '/prefix',
+ 'schemes' => array('https'),
+ 'methods' => array('GET'),
+ );
+
+ $methodRouteData = array(
+ 'name' => 'route1',
+ 'path' => '/path',
+ 'schemes' => array('http'),
+ 'methods' => array('POST', 'PUT'),
+ );
+
+ $this->reader
+ ->expects($this->once())
+ ->method('getClassAnnotation')
+ ->will($this->returnValue($this->getAnnotatedRoute($classRouteData)))
+ ;
+ $this->reader
+ ->expects($this->once())
+ ->method('getMethodAnnotations')
+ ->will($this->returnValue(array($this->getAnnotatedRoute($methodRouteData))))
+ ;
+
+ $routeCollection = $this->loader->load('Symfony\Component\Routing\Tests\Fixtures\AnnotatedClasses\BarClass');
+ $route = $routeCollection->get($classRouteData['name'].$methodRouteData['name']);
+
+ $this->assertSame($classRouteData['path'].$methodRouteData['path'], $route->getPath(), '->load concatenates class and method route path');
+ $this->assertEquals(array_merge($classRouteData['schemes'], $methodRouteData['schemes']), $route->getSchemes(), '->load merges class and method route schemes');
+ $this->assertEquals(array_merge($classRouteData['methods'], $methodRouteData['methods']), $route->getMethods(), '->load merges class and method route methods');
+ }
+
+ public function testInvokableClassRouteLoad()
+ {
+ $classRouteData = array(
+ 'name' => 'route1',
+ 'path' => '/',
+ 'schemes' => array('https'),
+ 'methods' => array('GET'),
+ );
+
+ $this->reader
+ ->expects($this->exactly(2))
+ ->method('getClassAnnotation')
+ ->will($this->returnValue($this->getAnnotatedRoute($classRouteData)))
+ ;
+ $this->reader
+ ->expects($this->once())
+ ->method('getMethodAnnotations')
+ ->will($this->returnValue(array()))
+ ;
+
+ $routeCollection = $this->loader->load('Symfony\Component\Routing\Tests\Fixtures\AnnotatedClasses\BazClass');
+ $route = $routeCollection->get($classRouteData['name']);
+
+ $this->assertSame($classRouteData['path'], $route->getPath(), '->load preserves class route path');
+ $this->assertEquals(array_merge($classRouteData['schemes'], $classRouteData['schemes']), $route->getSchemes(), '->load preserves class route schemes');
+ $this->assertEquals(array_merge($classRouteData['methods'], $classRouteData['methods']), $route->getMethods(), '->load preserves class route methods');
+ }
+
+ public function testInvokableClassWithMethodRouteLoad()
+ {
+ $classRouteData = array(
+ 'name' => 'route1',
+ 'path' => '/prefix',
+ 'schemes' => array('https'),
+ 'methods' => array('GET'),
+ );
+
+ $methodRouteData = array(
+ 'name' => 'route2',
+ 'path' => '/path',
+ 'schemes' => array('http'),
+ 'methods' => array('POST', 'PUT'),
+ );
+
+ $this->reader
+ ->expects($this->once())
+ ->method('getClassAnnotation')
+ ->will($this->returnValue($this->getAnnotatedRoute($classRouteData)))
+ ;
+ $this->reader
+ ->expects($this->once())
+ ->method('getMethodAnnotations')
+ ->will($this->returnValue(array($this->getAnnotatedRoute($methodRouteData))))
+ ;
+
+ $routeCollection = $this->loader->load('Symfony\Component\Routing\Tests\Fixtures\AnnotatedClasses\BazClass');
+ $route = $routeCollection->get($classRouteData['name']);
+
+ $this->assertNull($route, '->load ignores class route');
+
+ $route = $routeCollection->get($classRouteData['name'].$methodRouteData['name']);
+
+ $this->assertSame($classRouteData['path'].$methodRouteData['path'], $route->getPath(), '->load concatenates class and method route path');
+ $this->assertEquals(array_merge($classRouteData['schemes'], $methodRouteData['schemes']), $route->getSchemes(), '->load merges class and method route schemes');
+ $this->assertEquals(array_merge($classRouteData['methods'], $methodRouteData['methods']), $route->getMethods(), '->load merges class and method route methods');
+ }
+
+ private function getAnnotatedRoute($data)
+ {
+ return new Route($data);
+ }
+}
diff --git a/assets/php/vendor/symfony/routing/Tests/Loader/AnnotationDirectoryLoaderTest.php b/assets/php/vendor/symfony/routing/Tests/Loader/AnnotationDirectoryLoaderTest.php
new file mode 100644
index 0000000..1e8ee39
--- /dev/null
+++ b/assets/php/vendor/symfony/routing/Tests/Loader/AnnotationDirectoryLoaderTest.php
@@ -0,0 +1,98 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Routing\Tests\Loader;
+
+use Symfony\Component\Routing\Loader\AnnotationDirectoryLoader;
+use Symfony\Component\Config\FileLocator;
+
+class AnnotationDirectoryLoaderTest extends AbstractAnnotationLoaderTest
+{
+ protected $loader;
+ protected $reader;
+
+ protected function setUp()
+ {
+ parent::setUp();
+
+ $this->reader = $this->getReader();
+ $this->loader = new AnnotationDirectoryLoader(new FileLocator(), $this->getClassLoader($this->reader));
+ }
+
+ public function testLoad()
+ {
+ $this->reader->expects($this->exactly(4))->method('getClassAnnotation');
+
+ $this->reader
+ ->expects($this->any())
+ ->method('getMethodAnnotations')
+ ->will($this->returnValue(array()))
+ ;
+
+ $this->loader->load(__DIR__.'/../Fixtures/AnnotatedClasses');
+ }
+
+ public function testLoadIgnoresHiddenDirectories()
+ {
+ $this->expectAnnotationsToBeReadFrom(array(
+ 'Symfony\Component\Routing\Tests\Fixtures\AnnotatedClasses\BarClass',
+ 'Symfony\Component\Routing\Tests\Fixtures\AnnotatedClasses\BazClass',
+ 'Symfony\Component\Routing\Tests\Fixtures\AnnotatedClasses\BazClass',
+ 'Symfony\Component\Routing\Tests\Fixtures\AnnotatedClasses\FooClass',
+ ));
+
+ $this->reader
+ ->expects($this->any())
+ ->method('getMethodAnnotations')
+ ->will($this->returnValue(array()))
+ ;
+
+ $this->loader->load(__DIR__.'/../Fixtures/AnnotatedClasses');
+ }
+
+ public function testSupports()
+ {
+ $fixturesDir = __DIR__.'/../Fixtures';
+
+ $this->assertTrue($this->loader->supports($fixturesDir), '->supports() returns true if the resource is loadable');
+ $this->assertFalse($this->loader->supports('foo.foo'), '->supports() returns true if the resource is loadable');
+
+ $this->assertTrue($this->loader->supports($fixturesDir, 'annotation'), '->supports() checks the resource type if specified');
+ $this->assertFalse($this->loader->supports($fixturesDir, 'foo'), '->supports() checks the resource type if specified');
+ }
+
+ public function testItSupportsAnyAnnotation()
+ {
+ $this->assertTrue($this->loader->supports(__DIR__.'/../Fixtures/even-with-not-existing-folder', 'annotation'));
+ }
+
+ public function testLoadFileIfLocatedResourceIsFile()
+ {
+ $this->reader->expects($this->exactly(1))->method('getClassAnnotation');
+
+ $this->reader
+ ->expects($this->any())
+ ->method('getMethodAnnotations')
+ ->will($this->returnValue(array()))
+ ;
+
+ $this->loader->load(__DIR__.'/../Fixtures/AnnotatedClasses/FooClass.php');
+ }
+
+ private function expectAnnotationsToBeReadFrom(array $classes)
+ {
+ $this->reader->expects($this->exactly(count($classes)))
+ ->method('getClassAnnotation')
+ ->with($this->callback(function (\ReflectionClass $class) use ($classes) {
+ return in_array($class->getName(), $classes);
+ }));
+ }
+}
diff --git a/assets/php/vendor/symfony/routing/Tests/Loader/AnnotationFileLoaderTest.php b/assets/php/vendor/symfony/routing/Tests/Loader/AnnotationFileLoaderTest.php
new file mode 100644
index 0000000..7f1d576
--- /dev/null
+++ b/assets/php/vendor/symfony/routing/Tests/Loader/AnnotationFileLoaderTest.php
@@ -0,0 +1,91 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Routing\Tests\Loader;
+
+use Symfony\Component\Routing\Loader\AnnotationFileLoader;
+use Symfony\Component\Config\FileLocator;
+use Symfony\Component\Routing\Annotation\Route;
+
+class AnnotationFileLoaderTest extends AbstractAnnotationLoaderTest
+{
+ protected $loader;
+ protected $reader;
+
+ protected function setUp()
+ {
+ parent::setUp();
+
+ $this->reader = $this->getReader();
+ $this->loader = new AnnotationFileLoader(new FileLocator(), $this->getClassLoader($this->reader));
+ }
+
+ public function testLoad()
+ {
+ $this->reader->expects($this->once())->method('getClassAnnotation');
+
+ $this->loader->load(__DIR__.'/../Fixtures/AnnotatedClasses/FooClass.php');
+ }
+
+ /**
+ * @requires PHP 5.4
+ */
+ public function testLoadTraitWithClassConstant()
+ {
+ $this->reader->expects($this->never())->method('getClassAnnotation');
+
+ $this->loader->load(__DIR__.'/../Fixtures/AnnotatedClasses/FooTrait.php');
+ }
+
+ /**
+ * @expectedException \InvalidArgumentException
+ * @expectedExceptionMessage Did you forgot to add the "<?php" start tag at the beginning of the file?
+ */
+ public function testLoadFileWithoutStartTag()
+ {
+ $this->loader->load(__DIR__.'/../Fixtures/OtherAnnotatedClasses/NoStartTagClass.php');
+ }
+
+ /**
+ * @requires PHP 5.6
+ */
+ public function testLoadVariadic()
+ {
+ $route = new Route(array('path' => '/path/to/{id}'));
+ $this->reader->expects($this->once())->method('getClassAnnotation');
+ $this->reader->expects($this->once())->method('getMethodAnnotations')
+ ->will($this->returnValue(array($route)));
+
+ $this->loader->load(__DIR__.'/../Fixtures/OtherAnnotatedClasses/VariadicClass.php');
+ }
+
+ /**
+ * @requires PHP 7.0
+ */
+ public function testLoadAnonymousClass()
+ {
+ $this->reader->expects($this->never())->method('getClassAnnotation');
+ $this->reader->expects($this->never())->method('getMethodAnnotations');
+
+ $this->loader->load(__DIR__.'/../Fixtures/OtherAnnotatedClasses/AnonymousClassInTrait.php');
+ }
+
+ public function testSupports()
+ {
+ $fixture = __DIR__.'/../Fixtures/annotated.php';
+
+ $this->assertTrue($this->loader->supports($fixture), '->supports() returns true if the resource is loadable');
+ $this->assertFalse($this->loader->supports('foo.foo'), '->supports() returns true if the resource is loadable');
+
+ $this->assertTrue($this->loader->supports($fixture, 'annotation'), '->supports() checks the resource type if specified');
+ $this->assertFalse($this->loader->supports($fixture, 'foo'), '->supports() checks the resource type if specified');
+ }
+}
diff --git a/assets/php/vendor/symfony/routing/Tests/Loader/ClosureLoaderTest.php b/assets/php/vendor/symfony/routing/Tests/Loader/ClosureLoaderTest.php
new file mode 100644
index 0000000..5d963f8
--- /dev/null
+++ b/assets/php/vendor/symfony/routing/Tests/Loader/ClosureLoaderTest.php
@@ -0,0 +1,49 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Routing\Tests\Loader;
+
+use PHPUnit\Framework\TestCase;
+use Symfony\Component\Routing\Loader\ClosureLoader;
+use Symfony\Component\Routing\Route;
+use Symfony\Component\Routing\RouteCollection;
+
+class ClosureLoaderTest extends TestCase
+{
+ public function testSupports()
+ {
+ $loader = new ClosureLoader();
+
+ $closure = function () {};
+
+ $this->assertTrue($loader->supports($closure), '->supports() returns true if the resource is loadable');
+ $this->assertFalse($loader->supports('foo.foo'), '->supports() returns true if the resource is loadable');
+
+ $this->assertTrue($loader->supports($closure, 'closure'), '->supports() checks the resource type if specified');
+ $this->assertFalse($loader->supports($closure, 'foo'), '->supports() checks the resource type if specified');
+ }
+
+ public function testLoad()
+ {
+ $loader = new ClosureLoader();
+
+ $route = new Route('/');
+ $routes = $loader->load(function () use ($route) {
+ $routes = new RouteCollection();
+
+ $routes->add('foo', $route);
+
+ return $routes;
+ });
+
+ $this->assertEquals($route, $routes->get('foo'), '->load() loads a \Closure resource');
+ }
+}
diff --git a/assets/php/vendor/symfony/routing/Tests/Loader/DirectoryLoaderTest.php b/assets/php/vendor/symfony/routing/Tests/Loader/DirectoryLoaderTest.php
new file mode 100644
index 0000000..fc29d37
--- /dev/null
+++ b/assets/php/vendor/symfony/routing/Tests/Loader/DirectoryLoaderTest.php
@@ -0,0 +1,74 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Routing\Tests\Loader;
+
+use Symfony\Component\Routing\Loader\DirectoryLoader;
+use Symfony\Component\Routing\Loader\YamlFileLoader;
+use Symfony\Component\Routing\Loader\AnnotationFileLoader;
+use Symfony\Component\Config\Loader\LoaderResolver;
+use Symfony\Component\Config\FileLocator;
+use Symfony\Component\Routing\RouteCollection;
+
+class DirectoryLoaderTest extends AbstractAnnotationLoaderTest
+{
+ private $loader;
+ private $reader;
+
+ protected function setUp()
+ {
+ parent::setUp();
+
+ $locator = new FileLocator();
+ $this->reader = $this->getReader();
+ $this->loader = new DirectoryLoader($locator);
+ $resolver = new LoaderResolver(array(
+ new YamlFileLoader($locator),
+ new AnnotationFileLoader($locator, $this->getClassLoader($this->reader)),
+ $this->loader,
+ ));
+ $this->loader->setResolver($resolver);
+ }
+
+ public function testLoadDirectory()
+ {
+ $collection = $this->loader->load(__DIR__.'/../Fixtures/directory', 'directory');
+ $this->verifyCollection($collection);
+ }
+
+ public function testImportDirectory()
+ {
+ $collection = $this->loader->load(__DIR__.'/../Fixtures/directory_import', 'directory');
+ $this->verifyCollection($collection);
+ }
+
+ private function verifyCollection(RouteCollection $collection)
+ {
+ $routes = $collection->all();
+
+ $this->assertCount(3, $routes, 'Three routes are loaded');
+ $this->assertContainsOnly('Symfony\Component\Routing\Route', $routes);
+
+ for ($i = 1; $i <= 3; ++$i) {
+ $this->assertSame('/route/'.$i, $routes['route'.$i]->getPath());
+ }
+ }
+
+ public function testSupports()
+ {
+ $fixturesDir = __DIR__.'/../Fixtures';
+
+ $this->assertFalse($this->loader->supports($fixturesDir), '->supports(*) returns false');
+
+ $this->assertTrue($this->loader->supports($fixturesDir, 'directory'), '->supports(*, "directory") returns true');
+ $this->assertFalse($this->loader->supports($fixturesDir, 'foo'), '->supports(*, "foo") returns false');
+ }
+}
diff --git a/assets/php/vendor/symfony/routing/Tests/Loader/GlobFileLoaderTest.php b/assets/php/vendor/symfony/routing/Tests/Loader/GlobFileLoaderTest.php
new file mode 100644
index 0000000..08d806a
--- /dev/null
+++ b/assets/php/vendor/symfony/routing/Tests/Loader/GlobFileLoaderTest.php
@@ -0,0 +1,45 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Routing\Tests\Loader;
+
+use PHPUnit\Framework\TestCase;
+use Symfony\Component\Config\Resource\GlobResource;
+use Symfony\Component\Config\FileLocator;
+use Symfony\Component\Routing\Loader\GlobFileLoader;
+use Symfony\Component\Routing\RouteCollection;
+
+class GlobFileLoaderTest extends TestCase
+{
+ public function testSupports()
+ {
+ $loader = new GlobFileLoader(new FileLocator());
+
+ $this->assertTrue($loader->supports('any-path', 'glob'), '->supports() returns true if the resource has the glob type');
+ $this->assertFalse($loader->supports('any-path'), '->supports() returns false if the resource is not of glob type');
+ }
+
+ public function testLoadAddsTheGlobResourceToTheContainer()
+ {
+ $loader = new GlobFileLoaderWithoutImport(new FileLocator());
+ $collection = $loader->load(__DIR__.'/../Fixtures/directory/*.yml');
+
+ $this->assertEquals(new GlobResource(__DIR__.'/../Fixtures/directory', '/*.yml', false), $collection->getResources()[0]);
+ }
+}
+
+class GlobFileLoaderWithoutImport extends GlobFileLoader
+{
+ public function import($resource, $type = null, $ignoreErrors = false, $sourceResource = null)
+ {
+ return new RouteCollection();
+ }
+}
diff --git a/assets/php/vendor/symfony/routing/Tests/Loader/ObjectRouteLoaderTest.php b/assets/php/vendor/symfony/routing/Tests/Loader/ObjectRouteLoaderTest.php
new file mode 100644
index 0000000..408fa0b
--- /dev/null
+++ b/assets/php/vendor/symfony/routing/Tests/Loader/ObjectRouteLoaderTest.php
@@ -0,0 +1,123 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Routing\Tests\Loader;
+
+use PHPUnit\Framework\TestCase;
+use Symfony\Component\Routing\Loader\ObjectRouteLoader;
+use Symfony\Component\Routing\Route;
+use Symfony\Component\Routing\RouteCollection;
+
+class ObjectRouteLoaderTest extends TestCase
+{
+ public function testLoadCallsServiceAndReturnsCollection()
+ {
+ $loader = new ObjectRouteLoaderForTest();
+
+ // create a basic collection that will be returned
+ $collection = new RouteCollection();
+ $collection->add('foo', new Route('/foo'));
+
+ $loader->loaderMap = array(
+ 'my_route_provider_service' => new RouteService($collection),
+ );
+
+ $actualRoutes = $loader->load(
+ 'my_route_provider_service:loadRoutes',
+ 'service'
+ );
+
+ $this->assertSame($collection, $actualRoutes);
+ // the service file should be listed as a resource
+ $this->assertNotEmpty($actualRoutes->getResources());
+ }
+
+ /**
+ * @expectedException \InvalidArgumentException
+ * @dataProvider getBadResourceStrings
+ */
+ public function testExceptionWithoutSyntax($resourceString)
+ {
+ $loader = new ObjectRouteLoaderForTest();
+ $loader->load($resourceString);
+ }
+
+ public function getBadResourceStrings()
+ {
+ return array(
+ array('Foo'),
+ array('Bar::baz'),
+ array('Foo:Bar:baz'),
+ );
+ }
+
+ /**
+ * @expectedException \LogicException
+ */
+ public function testExceptionOnNoObjectReturned()
+ {
+ $loader = new ObjectRouteLoaderForTest();
+ $loader->loaderMap = array('my_service' => 'NOT_AN_OBJECT');
+ $loader->load('my_service:method');
+ }
+
+ /**
+ * @expectedException \BadMethodCallException
+ */
+ public function testExceptionOnBadMethod()
+ {
+ $loader = new ObjectRouteLoaderForTest();
+ $loader->loaderMap = array('my_service' => new \stdClass());
+ $loader->load('my_service:method');
+ }
+
+ /**
+ * @expectedException \LogicException
+ */
+ public function testExceptionOnMethodNotReturningCollection()
+ {
+ $service = $this->getMockBuilder('stdClass')
+ ->setMethods(array('loadRoutes'))
+ ->getMock();
+ $service->expects($this->once())
+ ->method('loadRoutes')
+ ->will($this->returnValue('NOT_A_COLLECTION'));
+
+ $loader = new ObjectRouteLoaderForTest();
+ $loader->loaderMap = array('my_service' => $service);
+ $loader->load('my_service:loadRoutes');
+ }
+}
+
+class ObjectRouteLoaderForTest extends ObjectRouteLoader
+{
+ public $loaderMap = array();
+
+ protected function getServiceObject($id)
+ {
+ return isset($this->loaderMap[$id]) ? $this->loaderMap[$id] : null;
+ }
+}
+
+class RouteService
+{
+ private $collection;
+
+ public function __construct($collection)
+ {
+ $this->collection = $collection;
+ }
+
+ public function loadRoutes()
+ {
+ return $this->collection;
+ }
+}
diff --git a/assets/php/vendor/symfony/routing/Tests/Loader/PhpFileLoaderTest.php b/assets/php/vendor/symfony/routing/Tests/Loader/PhpFileLoaderTest.php
new file mode 100644
index 0000000..0dcf5d4
--- /dev/null
+++ b/assets/php/vendor/symfony/routing/Tests/Loader/PhpFileLoaderTest.php
@@ -0,0 +1,133 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Routing\Tests\Loader;
+
+use PHPUnit\Framework\TestCase;
+use Symfony\Component\Config\FileLocator;
+use Symfony\Component\Config\Resource\FileResource;
+use Symfony\Component\Routing\Loader\PhpFileLoader;
+use Symfony\Component\Routing\Route;
+use Symfony\Component\Routing\RouteCollection;
+
+class PhpFileLoaderTest extends TestCase
+{
+ public function testSupports()
+ {
+ $loader = new PhpFileLoader($this->getMockBuilder('Symfony\Component\Config\FileLocator')->getMock());
+
+ $this->assertTrue($loader->supports('foo.php'), '->supports() returns true if the resource is loadable');
+ $this->assertFalse($loader->supports('foo.foo'), '->supports() returns true if the resource is loadable');
+
+ $this->assertTrue($loader->supports('foo.php', 'php'), '->supports() checks the resource type if specified');
+ $this->assertFalse($loader->supports('foo.php', 'foo'), '->supports() checks the resource type if specified');
+ }
+
+ public function testLoadWithRoute()
+ {
+ $loader = new PhpFileLoader(new FileLocator(array(__DIR__.'/../Fixtures')));
+ $routeCollection = $loader->load('validpattern.php');
+ $routes = $routeCollection->all();
+
+ $this->assertCount(1, $routes, 'One route is loaded');
+ $this->assertContainsOnly('Symfony\Component\Routing\Route', $routes);
+
+ foreach ($routes as $route) {
+ $this->assertSame('/blog/{slug}', $route->getPath());
+ $this->assertSame('MyBlogBundle:Blog:show', $route->getDefault('_controller'));
+ $this->assertSame('{locale}.example.com', $route->getHost());
+ $this->assertSame('RouteCompiler', $route->getOption('compiler_class'));
+ $this->assertEquals(array('GET', 'POST', 'PUT', 'OPTIONS'), $route->getMethods());
+ $this->assertEquals(array('https'), $route->getSchemes());
+ }
+ }
+
+ public function testLoadWithImport()
+ {
+ $loader = new PhpFileLoader(new FileLocator(array(__DIR__.'/../Fixtures')));
+ $routeCollection = $loader->load('validresource.php');
+ $routes = $routeCollection->all();
+
+ $this->assertCount(1, $routes, 'One route is loaded');
+ $this->assertContainsOnly('Symfony\Component\Routing\Route', $routes);
+
+ foreach ($routes as $route) {
+ $this->assertSame('/prefix/blog/{slug}', $route->getPath());
+ $this->assertSame('MyBlogBundle:Blog:show', $route->getDefault('_controller'));
+ $this->assertSame('{locale}.example.com', $route->getHost());
+ $this->assertSame('RouteCompiler', $route->getOption('compiler_class'));
+ $this->assertEquals(array('GET', 'POST', 'PUT', 'OPTIONS'), $route->getMethods());
+ $this->assertEquals(array('https'), $route->getSchemes());
+ }
+ }
+
+ public function testThatDefiningVariableInConfigFileHasNoSideEffects()
+ {
+ $locator = new FileLocator(array(__DIR__.'/../Fixtures'));
+ $loader = new PhpFileLoader($locator);
+ $routeCollection = $loader->load('with_define_path_variable.php');
+ $resources = $routeCollection->getResources();
+ $this->assertCount(1, $resources);
+ $this->assertContainsOnly('Symfony\Component\Config\Resource\ResourceInterface', $resources);
+ $fileResource = reset($resources);
+ $this->assertSame(
+ realpath($locator->locate('with_define_path_variable.php')),
+ (string) $fileResource
+ );
+ }
+
+ public function testRoutingConfigurator()
+ {
+ $locator = new FileLocator(array(__DIR__.'/../Fixtures'));
+ $loader = new PhpFileLoader($locator);
+ $routeCollection = $loader->load('php_dsl.php');
+
+ $expectedCollection = new RouteCollection();
+
+ $expectedCollection->add('foo', (new Route('/foo'))
+ ->setOptions(array('utf8' => true))
+ ->setCondition('abc')
+ );
+ $expectedCollection->add('buz', (new Route('/zub'))
+ ->setDefaults(array('_controller' => 'foo:act'))
+ );
+ $expectedCollection->add('c_bar', (new Route('/sub/pub/bar'))
+ ->setRequirements(array('id' => '\d+'))
+ );
+ $expectedCollection->add('c_pub_buz', (new Route('/sub/pub/buz'))
+ ->setHost('host')
+ ->setRequirements(array('id' => '\d+'))
+ );
+ $expectedCollection->add('ouf', (new Route('/ouf'))
+ ->setSchemes(array('https'))
+ ->setMethods(array('GET'))
+ ->setDefaults(array('id' => 0))
+ );
+
+ $expectedCollection->addResource(new FileResource(realpath(__DIR__.'/../Fixtures/php_dsl_sub.php')));
+ $expectedCollection->addResource(new FileResource(realpath(__DIR__.'/../Fixtures/php_dsl.php')));
+
+ $this->assertEquals($expectedCollection, $routeCollection);
+ }
+
+ public function testRoutingConfiguratorCanImportGlobPatterns()
+ {
+ $locator = new FileLocator(array(__DIR__.'/../Fixtures/glob'));
+ $loader = new PhpFileLoader($locator);
+ $routeCollection = $loader->load('php_dsl.php');
+
+ $route = $routeCollection->get('bar_route');
+ $this->assertSame('AppBundle:Bar:view', $route->getDefault('_controller'));
+
+ $route = $routeCollection->get('baz_route');
+ $this->assertSame('AppBundle:Baz:view', $route->getDefault('_controller'));
+ }
+}
diff --git a/assets/php/vendor/symfony/routing/Tests/Loader/XmlFileLoaderTest.php b/assets/php/vendor/symfony/routing/Tests/Loader/XmlFileLoaderTest.php
new file mode 100644
index 0000000..21fc340
--- /dev/null
+++ b/assets/php/vendor/symfony/routing/Tests/Loader/XmlFileLoaderTest.php
@@ -0,0 +1,385 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Routing\Tests\Loader;
+
+use PHPUnit\Framework\TestCase;
+use Symfony\Component\Config\FileLocator;
+use Symfony\Component\Routing\Loader\XmlFileLoader;
+use Symfony\Component\Routing\Tests\Fixtures\CustomXmlFileLoader;
+
+class XmlFileLoaderTest extends TestCase
+{
+ public function testSupports()
+ {
+ $loader = new XmlFileLoader($this->getMockBuilder('Symfony\Component\Config\FileLocator')->getMock());
+
+ $this->assertTrue($loader->supports('foo.xml'), '->supports() returns true if the resource is loadable');
+ $this->assertFalse($loader->supports('foo.foo'), '->supports() returns true if the resource is loadable');
+
+ $this->assertTrue($loader->supports('foo.xml', 'xml'), '->supports() checks the resource type if specified');
+ $this->assertFalse($loader->supports('foo.xml', 'foo'), '->supports() checks the resource type if specified');
+ }
+
+ public function testLoadWithRoute()
+ {
+ $loader = new XmlFileLoader(new FileLocator(array(__DIR__.'/../Fixtures')));
+ $routeCollection = $loader->load('validpattern.xml');
+ $route = $routeCollection->get('blog_show');
+
+ $this->assertInstanceOf('Symfony\Component\Routing\Route', $route);
+ $this->assertSame('/blog/{slug}', $route->getPath());
+ $this->assertSame('{locale}.example.com', $route->getHost());
+ $this->assertSame('MyBundle:Blog:show', $route->getDefault('_controller'));
+ $this->assertSame('\w+', $route->getRequirement('locale'));
+ $this->assertSame('RouteCompiler', $route->getOption('compiler_class'));
+ $this->assertEquals(array('GET', 'POST', 'PUT', 'OPTIONS'), $route->getMethods());
+ $this->assertEquals(array('https'), $route->getSchemes());
+ $this->assertEquals('context.getMethod() == "GET"', $route->getCondition());
+ }
+
+ public function testLoadWithNamespacePrefix()
+ {
+ $loader = new XmlFileLoader(new FileLocator(array(__DIR__.'/../Fixtures')));
+ $routeCollection = $loader->load('namespaceprefix.xml');
+
+ $this->assertCount(1, $routeCollection->all(), 'One route is loaded');
+
+ $route = $routeCollection->get('blog_show');
+ $this->assertSame('/blog/{slug}', $route->getPath());
+ $this->assertSame('{_locale}.example.com', $route->getHost());
+ $this->assertSame('MyBundle:Blog:show', $route->getDefault('_controller'));
+ $this->assertSame('\w+', $route->getRequirement('slug'));
+ $this->assertSame('en|fr|de', $route->getRequirement('_locale'));
+ $this->assertNull($route->getDefault('slug'));
+ $this->assertSame('RouteCompiler', $route->getOption('compiler_class'));
+ $this->assertSame(1, $route->getDefault('page'));
+ }
+
+ public function testLoadWithImport()
+ {
+ $loader = new XmlFileLoader(new FileLocator(array(__DIR__.'/../Fixtures')));
+ $routeCollection = $loader->load('validresource.xml');
+ $routes = $routeCollection->all();
+
+ $this->assertCount(2, $routes, 'Two routes are loaded');
+ $this->assertContainsOnly('Symfony\Component\Routing\Route', $routes);
+
+ foreach ($routes as $route) {
+ $this->assertSame('/{foo}/blog/{slug}', $route->getPath());
+ $this->assertSame('123', $route->getDefault('foo'));
+ $this->assertSame('\d+', $route->getRequirement('foo'));
+ $this->assertSame('bar', $route->getOption('foo'));
+ $this->assertSame('', $route->getHost());
+ $this->assertSame('context.getMethod() == "POST"', $route->getCondition());
+ }
+ }
+
+ /**
+ * @expectedException \InvalidArgumentException
+ * @dataProvider getPathsToInvalidFiles
+ */
+ public function testLoadThrowsExceptionWithInvalidFile($filePath)
+ {
+ $loader = new XmlFileLoader(new FileLocator(array(__DIR__.'/../Fixtures')));
+ $loader->load($filePath);
+ }
+
+ /**
+ * @expectedException \InvalidArgumentException
+ * @dataProvider getPathsToInvalidFiles
+ */
+ public function testLoadThrowsExceptionWithInvalidFileEvenWithoutSchemaValidation($filePath)
+ {
+ $loader = new CustomXmlFileLoader(new FileLocator(array(__DIR__.'/../Fixtures')));
+ $loader->load($filePath);
+ }
+
+ public function getPathsToInvalidFiles()
+ {
+ return array(array('nonvalidnode.xml'), array('nonvalidroute.xml'), array('nonvalid.xml'), array('missing_id.xml'), array('missing_path.xml'));
+ }
+
+ /**
+ * @expectedException \InvalidArgumentException
+ * @expectedExceptionMessage Document types are not allowed.
+ */
+ public function testDocTypeIsNotAllowed()
+ {
+ $loader = new XmlFileLoader(new FileLocator(array(__DIR__.'/../Fixtures')));
+ $loader->load('withdoctype.xml');
+ }
+
+ public function testNullValues()
+ {
+ $loader = new XmlFileLoader(new FileLocator(array(__DIR__.'/../Fixtures')));
+ $routeCollection = $loader->load('null_values.xml');
+ $route = $routeCollection->get('blog_show');
+
+ $this->assertTrue($route->hasDefault('foo'));
+ $this->assertNull($route->getDefault('foo'));
+ $this->assertTrue($route->hasDefault('bar'));
+ $this->assertNull($route->getDefault('bar'));
+ $this->assertEquals('foo', $route->getDefault('foobar'));
+ $this->assertEquals('bar', $route->getDefault('baz'));
+ }
+
+ public function testScalarDataTypeDefaults()
+ {
+ $loader = new XmlFileLoader(new FileLocator(array(__DIR__.'/../Fixtures')));
+ $routeCollection = $loader->load('scalar_defaults.xml');
+ $route = $routeCollection->get('blog');
+
+ $this->assertSame(
+ array(
+ '_controller' => 'AcmeBlogBundle:Blog:index',
+ 'slug' => null,
+ 'published' => true,
+ 'page' => 1,
+ 'price' => 3.5,
+ 'archived' => false,
+ 'free' => true,
+ 'locked' => false,
+ 'foo' => null,
+ 'bar' => null,
+ ),
+ $route->getDefaults()
+ );
+ }
+
+ public function testListDefaults()
+ {
+ $loader = new XmlFileLoader(new FileLocator(array(__DIR__.'/../Fixtures')));
+ $routeCollection = $loader->load('list_defaults.xml');
+ $route = $routeCollection->get('blog');
+
+ $this->assertSame(
+ array(
+ '_controller' => 'AcmeBlogBundle:Blog:index',
+ 'values' => array(true, 1, 3.5, 'foo'),
+ ),
+ $route->getDefaults()
+ );
+ }
+
+ public function testListInListDefaults()
+ {
+ $loader = new XmlFileLoader(new FileLocator(array(__DIR__.'/../Fixtures')));
+ $routeCollection = $loader->load('list_in_list_defaults.xml');
+ $route = $routeCollection->get('blog');
+
+ $this->assertSame(
+ array(
+ '_controller' => 'AcmeBlogBundle:Blog:index',
+ 'values' => array(array(true, 1, 3.5, 'foo')),
+ ),
+ $route->getDefaults()
+ );
+ }
+
+ public function testListInMapDefaults()
+ {
+ $loader = new XmlFileLoader(new FileLocator(array(__DIR__.'/../Fixtures')));
+ $routeCollection = $loader->load('list_in_map_defaults.xml');
+ $route = $routeCollection->get('blog');
+
+ $this->assertSame(
+ array(
+ '_controller' => 'AcmeBlogBundle:Blog:index',
+ 'values' => array('list' => array(true, 1, 3.5, 'foo')),
+ ),
+ $route->getDefaults()
+ );
+ }
+
+ public function testMapDefaults()
+ {
+ $loader = new XmlFileLoader(new FileLocator(array(__DIR__.'/../Fixtures')));
+ $routeCollection = $loader->load('map_defaults.xml');
+ $route = $routeCollection->get('blog');
+
+ $this->assertSame(
+ array(
+ '_controller' => 'AcmeBlogBundle:Blog:index',
+ 'values' => array(
+ 'public' => true,
+ 'page' => 1,
+ 'price' => 3.5,
+ 'title' => 'foo',
+ ),
+ ),
+ $route->getDefaults()
+ );
+ }
+
+ public function testMapInListDefaults()
+ {
+ $loader = new XmlFileLoader(new FileLocator(array(__DIR__.'/../Fixtures')));
+ $routeCollection = $loader->load('map_in_list_defaults.xml');
+ $route = $routeCollection->get('blog');
+
+ $this->assertSame(
+ array(
+ '_controller' => 'AcmeBlogBundle:Blog:index',
+ 'values' => array(array(
+ 'public' => true,
+ 'page' => 1,
+ 'price' => 3.5,
+ 'title' => 'foo',
+ )),
+ ),
+ $route->getDefaults()
+ );
+ }
+
+ public function testMapInMapDefaults()
+ {
+ $loader = new XmlFileLoader(new FileLocator(array(__DIR__.'/../Fixtures')));
+ $routeCollection = $loader->load('map_in_map_defaults.xml');
+ $route = $routeCollection->get('blog');
+
+ $this->assertSame(
+ array(
+ '_controller' => 'AcmeBlogBundle:Blog:index',
+ 'values' => array('map' => array(
+ 'public' => true,
+ 'page' => 1,
+ 'price' => 3.5,
+ 'title' => 'foo',
+ )),
+ ),
+ $route->getDefaults()
+ );
+ }
+
+ public function testNullValuesInList()
+ {
+ $loader = new XmlFileLoader(new FileLocator(array(__DIR__.'/../Fixtures')));
+ $routeCollection = $loader->load('list_null_values.xml');
+ $route = $routeCollection->get('blog');
+
+ $this->assertSame(array(null, null, null, null, null, null), $route->getDefault('list'));
+ }
+
+ public function testNullValuesInMap()
+ {
+ $loader = new XmlFileLoader(new FileLocator(array(__DIR__.'/../Fixtures')));
+ $routeCollection = $loader->load('map_null_values.xml');
+ $route = $routeCollection->get('blog');
+
+ $this->assertSame(
+ array(
+ 'boolean' => null,
+ 'integer' => null,
+ 'float' => null,
+ 'string' => null,
+ 'list' => null,
+ 'map' => null,
+ ),
+ $route->getDefault('map')
+ );
+ }
+
+ public function testLoadRouteWithControllerAttribute()
+ {
+ $loader = new XmlFileLoader(new FileLocator(array(__DIR__.'/../Fixtures/controller')));
+ $routeCollection = $loader->load('routing.xml');
+
+ $route = $routeCollection->get('app_homepage');
+
+ $this->assertSame('AppBundle:Homepage:show', $route->getDefault('_controller'));
+ }
+
+ public function testLoadRouteWithoutControllerAttribute()
+ {
+ $loader = new XmlFileLoader(new FileLocator(array(__DIR__.'/../Fixtures/controller')));
+ $routeCollection = $loader->load('routing.xml');
+
+ $route = $routeCollection->get('app_logout');
+
+ $this->assertNull($route->getDefault('_controller'));
+ }
+
+ public function testLoadRouteWithControllerSetInDefaults()
+ {
+ $loader = new XmlFileLoader(new FileLocator(array(__DIR__.'/../Fixtures/controller')));
+ $routeCollection = $loader->load('routing.xml');
+
+ $route = $routeCollection->get('app_blog');
+
+ $this->assertSame('AppBundle:Blog:list', $route->getDefault('_controller'));
+ }
+
+ /**
+ * @expectedException \InvalidArgumentException
+ * @expectedExceptionMessageRegExp /The routing file "[^"]*" must not specify both the "controller" attribute and the defaults key "_controller" for "app_blog"/
+ */
+ public function testOverrideControllerInDefaults()
+ {
+ $loader = new XmlFileLoader(new FileLocator(array(__DIR__.'/../Fixtures/controller')));
+ $loader->load('override_defaults.xml');
+ }
+
+ /**
+ * @dataProvider provideFilesImportingRoutesWithControllers
+ */
+ public function testImportRouteWithController($file)
+ {
+ $loader = new XmlFileLoader(new FileLocator(array(__DIR__.'/../Fixtures/controller')));
+ $routeCollection = $loader->load($file);
+
+ $route = $routeCollection->get('app_homepage');
+ $this->assertSame('FrameworkBundle:Template:template', $route->getDefault('_controller'));
+
+ $route = $routeCollection->get('app_blog');
+ $this->assertSame('FrameworkBundle:Template:template', $route->getDefault('_controller'));
+
+ $route = $routeCollection->get('app_logout');
+ $this->assertSame('FrameworkBundle:Template:template', $route->getDefault('_controller'));
+ }
+
+ public function provideFilesImportingRoutesWithControllers()
+ {
+ yield array('import_controller.xml');
+ yield array('import__controller.xml');
+ }
+
+ /**
+ * @expectedException \InvalidArgumentException
+ * @expectedExceptionMessageRegExp /The routing file "[^"]*" must not specify both the "controller" attribute and the defaults key "_controller" for the "import" tag/
+ */
+ public function testImportWithOverriddenController()
+ {
+ $loader = new XmlFileLoader(new FileLocator(array(__DIR__.'/../Fixtures/controller')));
+ $loader->load('import_override_defaults.xml');
+ }
+
+ public function testImportRouteWithGlobMatchingSingleFile()
+ {
+ $loader = new XmlFileLoader(new FileLocator(array(__DIR__.'/../Fixtures/glob')));
+ $routeCollection = $loader->load('import_single.xml');
+
+ $route = $routeCollection->get('bar_route');
+ $this->assertSame('AppBundle:Bar:view', $route->getDefault('_controller'));
+ }
+
+ public function testImportRouteWithGlobMatchingMultipleFiles()
+ {
+ $loader = new XmlFileLoader(new FileLocator(array(__DIR__.'/../Fixtures/glob')));
+ $routeCollection = $loader->load('import_multiple.xml');
+
+ $route = $routeCollection->get('bar_route');
+ $this->assertSame('AppBundle:Bar:view', $route->getDefault('_controller'));
+
+ $route = $routeCollection->get('baz_route');
+ $this->assertSame('AppBundle:Baz:view', $route->getDefault('_controller'));
+ }
+}
diff --git a/assets/php/vendor/symfony/routing/Tests/Loader/YamlFileLoaderTest.php b/assets/php/vendor/symfony/routing/Tests/Loader/YamlFileLoaderTest.php
new file mode 100644
index 0000000..822bddf
--- /dev/null
+++ b/assets/php/vendor/symfony/routing/Tests/Loader/YamlFileLoaderTest.php
@@ -0,0 +1,206 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Routing\Tests\Loader;
+
+use PHPUnit\Framework\TestCase;
+use Symfony\Component\Config\FileLocator;
+use Symfony\Component\Routing\Loader\YamlFileLoader;
+use Symfony\Component\Config\Resource\FileResource;
+
+class YamlFileLoaderTest extends TestCase
+{
+ public function testSupports()
+ {
+ $loader = new YamlFileLoader($this->getMockBuilder('Symfony\Component\Config\FileLocator')->getMock());
+
+ $this->assertTrue($loader->supports('foo.yml'), '->supports() returns true if the resource is loadable');
+ $this->assertTrue($loader->supports('foo.yaml'), '->supports() returns true if the resource is loadable');
+ $this->assertFalse($loader->supports('foo.foo'), '->supports() returns true if the resource is loadable');
+
+ $this->assertTrue($loader->supports('foo.yml', 'yaml'), '->supports() checks the resource type if specified');
+ $this->assertTrue($loader->supports('foo.yaml', 'yaml'), '->supports() checks the resource type if specified');
+ $this->assertFalse($loader->supports('foo.yml', 'foo'), '->supports() checks the resource type if specified');
+ }
+
+ public function testLoadDoesNothingIfEmpty()
+ {
+ $loader = new YamlFileLoader(new FileLocator(array(__DIR__.'/../Fixtures')));
+ $collection = $loader->load('empty.yml');
+
+ $this->assertEquals(array(), $collection->all());
+ $this->assertEquals(array(new FileResource(realpath(__DIR__.'/../Fixtures/empty.yml'))), $collection->getResources());
+ }
+
+ /**
+ * @expectedException \InvalidArgumentException
+ * @dataProvider getPathsToInvalidFiles
+ */
+ public function testLoadThrowsExceptionWithInvalidFile($filePath)
+ {
+ $loader = new YamlFileLoader(new FileLocator(array(__DIR__.'/../Fixtures')));
+ $loader->load($filePath);
+ }
+
+ public function getPathsToInvalidFiles()
+ {
+ return array(
+ array('nonvalid.yml'),
+ array('nonvalid2.yml'),
+ array('incomplete.yml'),
+ array('nonvalidkeys.yml'),
+ array('nonesense_resource_plus_path.yml'),
+ array('nonesense_type_without_resource.yml'),
+ array('bad_format.yml'),
+ );
+ }
+
+ public function testLoadSpecialRouteName()
+ {
+ $loader = new YamlFileLoader(new FileLocator(array(__DIR__.'/../Fixtures')));
+ $routeCollection = $loader->load('special_route_name.yml');
+ $route = $routeCollection->get('#$péß^a|');
+
+ $this->assertInstanceOf('Symfony\Component\Routing\Route', $route);
+ $this->assertSame('/true', $route->getPath());
+ }
+
+ public function testLoadWithRoute()
+ {
+ $loader = new YamlFileLoader(new FileLocator(array(__DIR__.'/../Fixtures')));
+ $routeCollection = $loader->load('validpattern.yml');
+ $route = $routeCollection->get('blog_show');
+
+ $this->assertInstanceOf('Symfony\Component\Routing\Route', $route);
+ $this->assertSame('/blog/{slug}', $route->getPath());
+ $this->assertSame('{locale}.example.com', $route->getHost());
+ $this->assertSame('MyBundle:Blog:show', $route->getDefault('_controller'));
+ $this->assertSame('\w+', $route->getRequirement('locale'));
+ $this->assertSame('RouteCompiler', $route->getOption('compiler_class'));
+ $this->assertEquals(array('GET', 'POST', 'PUT', 'OPTIONS'), $route->getMethods());
+ $this->assertEquals(array('https'), $route->getSchemes());
+ $this->assertEquals('context.getMethod() == "GET"', $route->getCondition());
+ }
+
+ public function testLoadWithResource()
+ {
+ $loader = new YamlFileLoader(new FileLocator(array(__DIR__.'/../Fixtures')));
+ $routeCollection = $loader->load('validresource.yml');
+ $routes = $routeCollection->all();
+
+ $this->assertCount(2, $routes, 'Two routes are loaded');
+ $this->assertContainsOnly('Symfony\Component\Routing\Route', $routes);
+
+ foreach ($routes as $route) {
+ $this->assertSame('/{foo}/blog/{slug}', $route->getPath());
+ $this->assertSame('123', $route->getDefault('foo'));
+ $this->assertSame('\d+', $route->getRequirement('foo'));
+ $this->assertSame('bar', $route->getOption('foo'));
+ $this->assertSame('', $route->getHost());
+ $this->assertSame('context.getMethod() == "POST"', $route->getCondition());
+ }
+ }
+
+ public function testLoadRouteWithControllerAttribute()
+ {
+ $loader = new YamlFileLoader(new FileLocator(array(__DIR__.'/../Fixtures/controller')));
+ $routeCollection = $loader->load('routing.yml');
+
+ $route = $routeCollection->get('app_homepage');
+
+ $this->assertSame('AppBundle:Homepage:show', $route->getDefault('_controller'));
+ }
+
+ public function testLoadRouteWithoutControllerAttribute()
+ {
+ $loader = new YamlFileLoader(new FileLocator(array(__DIR__.'/../Fixtures/controller')));
+ $routeCollection = $loader->load('routing.yml');
+
+ $route = $routeCollection->get('app_logout');
+
+ $this->assertNull($route->getDefault('_controller'));
+ }
+
+ public function testLoadRouteWithControllerSetInDefaults()
+ {
+ $loader = new YamlFileLoader(new FileLocator(array(__DIR__.'/../Fixtures/controller')));
+ $routeCollection = $loader->load('routing.yml');
+
+ $route = $routeCollection->get('app_blog');
+
+ $this->assertSame('AppBundle:Blog:list', $route->getDefault('_controller'));
+ }
+
+ /**
+ * @expectedException \InvalidArgumentException
+ * @expectedExceptionMessageRegExp /The routing file "[^"]*" must not specify both the "controller" key and the defaults key "_controller" for "app_blog"/
+ */
+ public function testOverrideControllerInDefaults()
+ {
+ $loader = new YamlFileLoader(new FileLocator(array(__DIR__.'/../Fixtures/controller')));
+ $loader->load('override_defaults.yml');
+ }
+
+ /**
+ * @dataProvider provideFilesImportingRoutesWithControllers
+ */
+ public function testImportRouteWithController($file)
+ {
+ $loader = new YamlFileLoader(new FileLocator(array(__DIR__.'/../Fixtures/controller')));
+ $routeCollection = $loader->load($file);
+
+ $route = $routeCollection->get('app_homepage');
+ $this->assertSame('FrameworkBundle:Template:template', $route->getDefault('_controller'));
+
+ $route = $routeCollection->get('app_blog');
+ $this->assertSame('FrameworkBundle:Template:template', $route->getDefault('_controller'));
+
+ $route = $routeCollection->get('app_logout');
+ $this->assertSame('FrameworkBundle:Template:template', $route->getDefault('_controller'));
+ }
+
+ public function provideFilesImportingRoutesWithControllers()
+ {
+ yield array('import_controller.yml');
+ yield array('import__controller.yml');
+ }
+
+ /**
+ * @expectedException \InvalidArgumentException
+ * @expectedExceptionMessageRegExp /The routing file "[^"]*" must not specify both the "controller" key and the defaults key "_controller" for "_static"/
+ */
+ public function testImportWithOverriddenController()
+ {
+ $loader = new YamlFileLoader(new FileLocator(array(__DIR__.'/../Fixtures/controller')));
+ $loader->load('import_override_defaults.yml');
+ }
+
+ public function testImportRouteWithGlobMatchingSingleFile()
+ {
+ $loader = new YamlFileLoader(new FileLocator(array(__DIR__.'/../Fixtures/glob')));
+ $routeCollection = $loader->load('import_single.yml');
+
+ $route = $routeCollection->get('bar_route');
+ $this->assertSame('AppBundle:Bar:view', $route->getDefault('_controller'));
+ }
+
+ public function testImportRouteWithGlobMatchingMultipleFiles()
+ {
+ $loader = new YamlFileLoader(new FileLocator(array(__DIR__.'/../Fixtures/glob')));
+ $routeCollection = $loader->load('import_multiple.yml');
+
+ $route = $routeCollection->get('bar_route');
+ $this->assertSame('AppBundle:Bar:view', $route->getDefault('_controller'));
+
+ $route = $routeCollection->get('baz_route');
+ $this->assertSame('AppBundle:Baz:view', $route->getDefault('_controller'));
+ }
+}
diff --git a/assets/php/vendor/symfony/routing/Tests/Matcher/DumpedRedirectableUrlMatcherTest.php b/assets/php/vendor/symfony/routing/Tests/Matcher/DumpedRedirectableUrlMatcherTest.php
new file mode 100644
index 0000000..cfbb524
--- /dev/null
+++ b/assets/php/vendor/symfony/routing/Tests/Matcher/DumpedRedirectableUrlMatcherTest.php
@@ -0,0 +1,43 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Routing\Tests\Matcher;
+
+use Symfony\Component\Routing\Matcher\Dumper\PhpMatcherDumper;
+use Symfony\Component\Routing\Matcher\RedirectableUrlMatcherInterface;
+use Symfony\Component\Routing\Matcher\UrlMatcher;
+use Symfony\Component\Routing\RouteCollection;
+use Symfony\Component\Routing\RequestContext;
+
+class DumpedRedirectableUrlMatcherTest extends RedirectableUrlMatcherTest
+{
+ protected function getUrlMatcher(RouteCollection $routes, RequestContext $context = null)
+ {
+ static $i = 0;
+
+ $class = 'DumpedRedirectableUrlMatcher'.++$i;
+ $dumper = new PhpMatcherDumper($routes);
+ eval('?>'.$dumper->dump(array('class' => $class, 'base_class' => 'Symfony\Component\Routing\Tests\Matcher\TestDumpedRedirectableUrlMatcher')));
+
+ return $this->getMockBuilder($class)
+ ->setConstructorArgs(array($context ?: new RequestContext()))
+ ->setMethods(array('redirect'))
+ ->getMock();
+ }
+}
+
+class TestDumpedRedirectableUrlMatcher extends UrlMatcher implements RedirectableUrlMatcherInterface
+{
+ public function redirect($path, $route, $scheme = null)
+ {
+ return array();
+ }
+}
diff --git a/assets/php/vendor/symfony/routing/Tests/Matcher/DumpedUrlMatcherTest.php b/assets/php/vendor/symfony/routing/Tests/Matcher/DumpedUrlMatcherTest.php
new file mode 100644
index 0000000..880b2b1
--- /dev/null
+++ b/assets/php/vendor/symfony/routing/Tests/Matcher/DumpedUrlMatcherTest.php
@@ -0,0 +1,48 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Routing\Tests\Matcher;
+
+use Symfony\Component\Routing\Matcher\Dumper\PhpMatcherDumper;
+use Symfony\Component\Routing\RouteCollection;
+use Symfony\Component\Routing\RequestContext;
+
+class DumpedUrlMatcherTest extends UrlMatcherTest
+{
+ /**
+ * @expectedException \LogicException
+ * @expectedExceptionMessage The "schemes" requirement is only supported for URL matchers that implement RedirectableUrlMatcherInterface.
+ */
+ public function testSchemeRequirement()
+ {
+ parent::testSchemeRequirement();
+ }
+
+ /**
+ * @expectedException \LogicException
+ * @expectedExceptionMessage The "schemes" requirement is only supported for URL matchers that implement RedirectableUrlMatcherInterface.
+ */
+ public function testSchemeAndMethodMismatch()
+ {
+ parent::testSchemeRequirement();
+ }
+
+ protected function getUrlMatcher(RouteCollection $routes, RequestContext $context = null)
+ {
+ static $i = 0;
+
+ $class = 'DumpedUrlMatcher'.++$i;
+ $dumper = new PhpMatcherDumper($routes);
+ eval('?>'.$dumper->dump(array('class' => $class)));
+
+ return new $class($context ?: new RequestContext());
+ }
+}
diff --git a/assets/php/vendor/symfony/routing/Tests/Matcher/Dumper/DumperCollectionTest.php b/assets/php/vendor/symfony/routing/Tests/Matcher/Dumper/DumperCollectionTest.php
new file mode 100644
index 0000000..823efdb
--- /dev/null
+++ b/assets/php/vendor/symfony/routing/Tests/Matcher/Dumper/DumperCollectionTest.php
@@ -0,0 +1,34 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Routing\Tests\Matcher\Dumper;
+
+use PHPUnit\Framework\TestCase;
+use Symfony\Component\Routing\Matcher\Dumper\DumperCollection;
+
+class DumperCollectionTest extends TestCase
+{
+ public function testGetRoot()
+ {
+ $a = new DumperCollection();
+
+ $b = new DumperCollection();
+ $a->add($b);
+
+ $c = new DumperCollection();
+ $b->add($c);
+
+ $d = new DumperCollection();
+ $c->add($d);
+
+ $this->assertSame($a, $c->getRoot());
+ }
+}
diff --git a/assets/php/vendor/symfony/routing/Tests/Matcher/Dumper/PhpMatcherDumperTest.php b/assets/php/vendor/symfony/routing/Tests/Matcher/Dumper/PhpMatcherDumperTest.php
new file mode 100644
index 0000000..f29a6d6
--- /dev/null
+++ b/assets/php/vendor/symfony/routing/Tests/Matcher/Dumper/PhpMatcherDumperTest.php
@@ -0,0 +1,459 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Routing\Tests\Matcher\Dumper;
+
+use PHPUnit\Framework\TestCase;
+use Symfony\Component\Routing\Matcher\Dumper\PhpMatcherDumper;
+use Symfony\Component\Routing\Matcher\RedirectableUrlMatcherInterface;
+use Symfony\Component\Routing\Matcher\UrlMatcher;
+use Symfony\Component\Routing\RequestContext;
+use Symfony\Component\Routing\Route;
+use Symfony\Component\Routing\RouteCollection;
+
+class PhpMatcherDumperTest extends TestCase
+{
+ /**
+ * @var string
+ */
+ private $matcherClass;
+
+ /**
+ * @var string
+ */
+ private $dumpPath;
+
+ protected function setUp()
+ {
+ parent::setUp();
+
+ $this->matcherClass = uniqid('ProjectUrlMatcher');
+ $this->dumpPath = sys_get_temp_dir().DIRECTORY_SEPARATOR.'php_matcher.'.$this->matcherClass.'.php';
+ }
+
+ protected function tearDown()
+ {
+ parent::tearDown();
+
+ @unlink($this->dumpPath);
+ }
+
+ /**
+ * @expectedException \LogicException
+ */
+ public function testDumpWhenSchemeIsUsedWithoutAProperDumper()
+ {
+ $collection = new RouteCollection();
+ $collection->add('secure', new Route(
+ '/secure',
+ array(),
+ array(),
+ array(),
+ '',
+ array('https')
+ ));
+ $dumper = new PhpMatcherDumper($collection);
+ $dumper->dump();
+ }
+
+ public function testRedirectPreservesUrlEncoding()
+ {
+ $collection = new RouteCollection();
+ $collection->add('foo', new Route('/foo:bar/'));
+
+ $class = $this->generateDumpedMatcher($collection, true);
+
+ $matcher = $this->getMockBuilder($class)
+ ->setMethods(array('redirect'))
+ ->setConstructorArgs(array(new RequestContext()))
+ ->getMock();
+
+ $matcher->expects($this->once())->method('redirect')->with('/foo%3Abar/', 'foo')->willReturn(array());
+
+ $matcher->match('/foo%3Abar');
+ }
+
+ /**
+ * @dataProvider getRouteCollections
+ */
+ public function testDump(RouteCollection $collection, $fixture, $options = array())
+ {
+ $basePath = __DIR__.'/../../Fixtures/dumper/';
+
+ $dumper = new PhpMatcherDumper($collection);
+ $this->assertStringEqualsFile($basePath.$fixture, $dumper->dump($options), '->dump() correctly dumps routes as optimized PHP code.');
+ }
+
+ public function getRouteCollections()
+ {
+ /* test case 1 */
+
+ $collection = new RouteCollection();
+
+ $collection->add('overridden', new Route('/overridden'));
+
+ // defaults and requirements
+ $collection->add('foo', new Route(
+ '/foo/{bar}',
+ array('def' => 'test'),
+ array('bar' => 'baz|symfony')
+ ));
+ // method requirement
+ $collection->add('bar', new Route(
+ '/bar/{foo}',
+ array(),
+ array(),
+ array(),
+ '',
+ array(),
+ array('GET', 'head')
+ ));
+ // GET method requirement automatically adds HEAD as valid
+ $collection->add('barhead', new Route(
+ '/barhead/{foo}',
+ array(),
+ array(),
+ array(),
+ '',
+ array(),
+ array('GET')
+ ));
+ // simple
+ $collection->add('baz', new Route(
+ '/test/baz'
+ ));
+ // simple with extension
+ $collection->add('baz2', new Route(
+ '/test/baz.html'
+ ));
+ // trailing slash
+ $collection->add('baz3', new Route(
+ '/test/baz3/'
+ ));
+ // trailing slash with variable
+ $collection->add('baz4', new Route(
+ '/test/{foo}/'
+ ));
+ // trailing slash and method
+ $collection->add('baz5', new Route(
+ '/test/{foo}/',
+ array(),
+ array(),
+ array(),
+ '',
+ array(),
+ array('post')
+ ));
+ // complex name
+ $collection->add('baz.baz6', new Route(
+ '/test/{foo}/',
+ array(),
+ array(),
+ array(),
+ '',
+ array(),
+ array('put')
+ ));
+ // defaults without variable
+ $collection->add('foofoo', new Route(
+ '/foofoo',
+ array('def' => 'test')
+ ));
+ // pattern with quotes
+ $collection->add('quoter', new Route(
+ '/{quoter}',
+ array(),
+ array('quoter' => '[\']+')
+ ));
+ // space in pattern
+ $collection->add('space', new Route(
+ '/spa ce'
+ ));
+
+ // prefixes
+ $collection1 = new RouteCollection();
+ $collection1->add('overridden', new Route('/overridden1'));
+ $collection1->add('foo1', new Route('/{foo}'));
+ $collection1->add('bar1', new Route('/{bar}'));
+ $collection1->addPrefix('/b\'b');
+ $collection2 = new RouteCollection();
+ $collection2->addCollection($collection1);
+ $collection2->add('overridden', new Route('/{var}', array(), array('var' => '.*')));
+ $collection1 = new RouteCollection();
+ $collection1->add('foo2', new Route('/{foo1}'));
+ $collection1->add('bar2', new Route('/{bar1}'));
+ $collection1->addPrefix('/b\'b');
+ $collection2->addCollection($collection1);
+ $collection2->addPrefix('/a');
+ $collection->addCollection($collection2);
+
+ // overridden through addCollection() and multiple sub-collections with no own prefix
+ $collection1 = new RouteCollection();
+ $collection1->add('overridden2', new Route('/old'));
+ $collection1->add('helloWorld', new Route('/hello/{who}', array('who' => 'World!')));
+ $collection2 = new RouteCollection();
+ $collection3 = new RouteCollection();
+ $collection3->add('overridden2', new Route('/new'));
+ $collection3->add('hey', new Route('/hey/'));
+ $collection2->addCollection($collection3);
+ $collection1->addCollection($collection2);
+ $collection1->addPrefix('/multi');
+ $collection->addCollection($collection1);
+
+ // "dynamic" prefix
+ $collection1 = new RouteCollection();
+ $collection1->add('foo3', new Route('/{foo}'));
+ $collection1->add('bar3', new Route('/{bar}'));
+ $collection1->addPrefix('/b');
+ $collection1->addPrefix('{_locale}');
+ $collection->addCollection($collection1);
+
+ // route between collections
+ $collection->add('ababa', new Route('/ababa'));
+
+ // collection with static prefix but only one route
+ $collection1 = new RouteCollection();
+ $collection1->add('foo4', new Route('/{foo}'));
+ $collection1->addPrefix('/aba');
+ $collection->addCollection($collection1);
+
+ // prefix and host
+
+ $collection1 = new RouteCollection();
+
+ $route1 = new Route('/route1', array(), array(), array(), 'a.example.com');
+ $collection1->add('route1', $route1);
+
+ $route2 = new Route('/c2/route2', array(), array(), array(), 'a.example.com');
+ $collection1->add('route2', $route2);
+
+ $route3 = new Route('/c2/route3', array(), array(), array(), 'b.example.com');
+ $collection1->add('route3', $route3);
+
+ $route4 = new Route('/route4', array(), array(), array(), 'a.example.com');
+ $collection1->add('route4', $route4);
+
+ $route5 = new Route('/route5', array(), array(), array(), 'c.example.com');
+ $collection1->add('route5', $route5);
+
+ $route6 = new Route('/route6', array(), array(), array(), null);
+ $collection1->add('route6', $route6);
+
+ $collection->addCollection($collection1);
+
+ // host and variables
+
+ $collection1 = new RouteCollection();
+
+ $route11 = new Route('/route11', array(), array(), array(), '{var1}.example.com');
+ $collection1->add('route11', $route11);
+
+ $route12 = new Route('/route12', array('var1' => 'val'), array(), array(), '{var1}.example.com');
+ $collection1->add('route12', $route12);
+
+ $route13 = new Route('/route13/{name}', array(), array(), array(), '{var1}.example.com');
+ $collection1->add('route13', $route13);
+
+ $route14 = new Route('/route14/{name}', array('var1' => 'val'), array(), array(), '{var1}.example.com');
+ $collection1->add('route14', $route14);
+
+ $route15 = new Route('/route15/{name}', array(), array(), array(), 'c.example.com');
+ $collection1->add('route15', $route15);
+
+ $route16 = new Route('/route16/{name}', array('var1' => 'val'), array(), array(), null);
+ $collection1->add('route16', $route16);
+
+ $route17 = new Route('/route17', array(), array(), array(), null);
+ $collection1->add('route17', $route17);
+
+ $collection->addCollection($collection1);
+
+ // multiple sub-collections with a single route and a prefix each
+ $collection1 = new RouteCollection();
+ $collection1->add('a', new Route('/a...'));
+ $collection2 = new RouteCollection();
+ $collection2->add('b', new Route('/{var}'));
+ $collection3 = new RouteCollection();
+ $collection3->add('c', new Route('/{var}'));
+ $collection3->addPrefix('/c');
+ $collection2->addCollection($collection3);
+ $collection2->addPrefix('/b');
+ $collection1->addCollection($collection2);
+ $collection1->addPrefix('/a');
+ $collection->addCollection($collection1);
+
+ /* test case 2 */
+
+ $redirectCollection = clone $collection;
+
+ // force HTTPS redirection
+ $redirectCollection->add('secure', new Route(
+ '/secure',
+ array(),
+ array(),
+ array(),
+ '',
+ array('https')
+ ));
+
+ // force HTTP redirection
+ $redirectCollection->add('nonsecure', new Route(
+ '/nonsecure',
+ array(),
+ array(),
+ array(),
+ '',
+ array('http')
+ ));
+
+ /* test case 3 */
+
+ $rootprefixCollection = new RouteCollection();
+ $rootprefixCollection->add('static', new Route('/test'));
+ $rootprefixCollection->add('dynamic', new Route('/{var}'));
+ $rootprefixCollection->addPrefix('rootprefix');
+ $route = new Route('/with-condition');
+ $route->setCondition('context.getMethod() == "GET"');
+ $rootprefixCollection->add('with-condition', $route);
+
+ /* test case 4 */
+ $headMatchCasesCollection = new RouteCollection();
+ $headMatchCasesCollection->add('just_head', new Route(
+ '/just_head',
+ array(),
+ array(),
+ array(),
+ '',
+ array(),
+ array('HEAD')
+ ));
+ $headMatchCasesCollection->add('head_and_get', new Route(
+ '/head_and_get',
+ array(),
+ array(),
+ array(),
+ '',
+ array(),
+ array('HEAD', 'GET')
+ ));
+ $headMatchCasesCollection->add('get_and_head', new Route(
+ '/get_and_head',
+ array(),
+ array(),
+ array(),
+ '',
+ array(),
+ array('GET', 'HEAD')
+ ));
+ $headMatchCasesCollection->add('post_and_head', new Route(
+ '/post_and_head',
+ array(),
+ array(),
+ array(),
+ '',
+ array(),
+ array('POST', 'HEAD')
+ ));
+ $headMatchCasesCollection->add('put_and_post', new Route(
+ '/put_and_post',
+ array(),
+ array(),
+ array(),
+ '',
+ array(),
+ array('PUT', 'POST')
+ ));
+ $headMatchCasesCollection->add('put_and_get_and_head', new Route(
+ '/put_and_post',
+ array(),
+ array(),
+ array(),
+ '',
+ array(),
+ array('PUT', 'GET', 'HEAD')
+ ));
+
+ /* test case 5 */
+ $groupOptimisedCollection = new RouteCollection();
+ $groupOptimisedCollection->add('a_first', new Route('/a/11'));
+ $groupOptimisedCollection->add('a_second', new Route('/a/22'));
+ $groupOptimisedCollection->add('a_third', new Route('/a/333'));
+ $groupOptimisedCollection->add('a_wildcard', new Route('/{param}'));
+ $groupOptimisedCollection->add('a_fourth', new Route('/a/44/'));
+ $groupOptimisedCollection->add('a_fifth', new Route('/a/55/'));
+ $groupOptimisedCollection->add('a_sixth', new Route('/a/66/'));
+ $groupOptimisedCollection->add('nested_wildcard', new Route('/nested/{param}'));
+ $groupOptimisedCollection->add('nested_a', new Route('/nested/group/a/'));
+ $groupOptimisedCollection->add('nested_b', new Route('/nested/group/b/'));
+ $groupOptimisedCollection->add('nested_c', new Route('/nested/group/c/'));
+
+ $groupOptimisedCollection->add('slashed_a', new Route('/slashed/group/'));
+ $groupOptimisedCollection->add('slashed_b', new Route('/slashed/group/b/'));
+ $groupOptimisedCollection->add('slashed_c', new Route('/slashed/group/c/'));
+
+ $trailingSlashCollection = new RouteCollection();
+ $trailingSlashCollection->add('simple_trailing_slash_no_methods', new Route('/trailing/simple/no-methods/', array(), array(), array(), '', array(), array()));
+ $trailingSlashCollection->add('simple_trailing_slash_GET_method', new Route('/trailing/simple/get-method/', array(), array(), array(), '', array(), array('GET')));
+ $trailingSlashCollection->add('simple_trailing_slash_HEAD_method', new Route('/trailing/simple/head-method/', array(), array(), array(), '', array(), array('HEAD')));
+ $trailingSlashCollection->add('simple_trailing_slash_POST_method', new Route('/trailing/simple/post-method/', array(), array(), array(), '', array(), array('POST')));
+ $trailingSlashCollection->add('regex_trailing_slash_no_methods', new Route('/trailing/regex/no-methods/{param}/', array(), array(), array(), '', array(), array()));
+ $trailingSlashCollection->add('regex_trailing_slash_GET_method', new Route('/trailing/regex/get-method/{param}/', array(), array(), array(), '', array(), array('GET')));
+ $trailingSlashCollection->add('regex_trailing_slash_HEAD_method', new Route('/trailing/regex/head-method/{param}/', array(), array(), array(), '', array(), array('HEAD')));
+ $trailingSlashCollection->add('regex_trailing_slash_POST_method', new Route('/trailing/regex/post-method/{param}/', array(), array(), array(), '', array(), array('POST')));
+
+ $trailingSlashCollection->add('simple_not_trailing_slash_no_methods', new Route('/not-trailing/simple/no-methods', array(), array(), array(), '', array(), array()));
+ $trailingSlashCollection->add('simple_not_trailing_slash_GET_method', new Route('/not-trailing/simple/get-method', array(), array(), array(), '', array(), array('GET')));
+ $trailingSlashCollection->add('simple_not_trailing_slash_HEAD_method', new Route('/not-trailing/simple/head-method', array(), array(), array(), '', array(), array('HEAD')));
+ $trailingSlashCollection->add('simple_not_trailing_slash_POST_method', new Route('/not-trailing/simple/post-method', array(), array(), array(), '', array(), array('POST')));
+ $trailingSlashCollection->add('regex_not_trailing_slash_no_methods', new Route('/not-trailing/regex/no-methods/{param}', array(), array(), array(), '', array(), array()));
+ $trailingSlashCollection->add('regex_not_trailing_slash_GET_method', new Route('/not-trailing/regex/get-method/{param}', array(), array(), array(), '', array(), array('GET')));
+ $trailingSlashCollection->add('regex_not_trailing_slash_HEAD_method', new Route('/not-trailing/regex/head-method/{param}', array(), array(), array(), '', array(), array('HEAD')));
+ $trailingSlashCollection->add('regex_not_trailing_slash_POST_method', new Route('/not-trailing/regex/post-method/{param}', array(), array(), array(), '', array(), array('POST')));
+
+ return array(
+ array(new RouteCollection(), 'url_matcher0.php', array()),
+ array($collection, 'url_matcher1.php', array()),
+ array($redirectCollection, 'url_matcher2.php', array('base_class' => 'Symfony\Component\Routing\Tests\Fixtures\RedirectableUrlMatcher')),
+ array($rootprefixCollection, 'url_matcher3.php', array()),
+ array($headMatchCasesCollection, 'url_matcher4.php', array()),
+ array($groupOptimisedCollection, 'url_matcher5.php', array('base_class' => 'Symfony\Component\Routing\Tests\Fixtures\RedirectableUrlMatcher')),
+ array($trailingSlashCollection, 'url_matcher6.php', array()),
+ array($trailingSlashCollection, 'url_matcher7.php', array('base_class' => 'Symfony\Component\Routing\Tests\Fixtures\RedirectableUrlMatcher')),
+ );
+ }
+
+ /**
+ * @param $dumper
+ */
+ private function generateDumpedMatcher(RouteCollection $collection, $redirectableStub = false)
+ {
+ $options = array('class' => $this->matcherClass);
+
+ if ($redirectableStub) {
+ $options['base_class'] = '\Symfony\Component\Routing\Tests\Matcher\Dumper\RedirectableUrlMatcherStub';
+ }
+
+ $dumper = new PhpMatcherDumper($collection);
+ $code = $dumper->dump($options);
+
+ file_put_contents($this->dumpPath, $code);
+ include $this->dumpPath;
+
+ return $this->matcherClass;
+ }
+}
+
+abstract class RedirectableUrlMatcherStub extends UrlMatcher implements RedirectableUrlMatcherInterface
+{
+ public function redirect($path, $route, $scheme = null)
+ {
+ }
+}
diff --git a/assets/php/vendor/symfony/routing/Tests/Matcher/Dumper/StaticPrefixCollectionTest.php b/assets/php/vendor/symfony/routing/Tests/Matcher/Dumper/StaticPrefixCollectionTest.php
new file mode 100644
index 0000000..37419e7
--- /dev/null
+++ b/assets/php/vendor/symfony/routing/Tests/Matcher/Dumper/StaticPrefixCollectionTest.php
@@ -0,0 +1,175 @@
+<?php
+
+namespace Symfony\Component\Routing\Tests\Matcher\Dumper;
+
+use PHPUnit\Framework\TestCase;
+use Symfony\Component\Routing\Matcher\Dumper\StaticPrefixCollection;
+use Symfony\Component\Routing\Route;
+
+class StaticPrefixCollectionTest extends TestCase
+{
+ /**
+ * @dataProvider routeProvider
+ */
+ public function testGrouping(array $routes, $expected)
+ {
+ $collection = new StaticPrefixCollection('/');
+
+ foreach ($routes as $route) {
+ list($path, $name) = $route;
+ $staticPrefix = (new Route($path))->compile()->getStaticPrefix();
+ $collection->addRoute($staticPrefix, $name);
+ }
+
+ $collection->optimizeGroups();
+ $dumped = $this->dumpCollection($collection);
+ $this->assertEquals($expected, $dumped);
+ }
+
+ public function routeProvider()
+ {
+ return array(
+ 'Simple - not nested' => array(
+ array(
+ array('/', 'root'),
+ array('/prefix/segment/', 'prefix_segment'),
+ array('/leading/segment/', 'leading_segment'),
+ ),
+ <<<EOF
+/ root
+/prefix/segment prefix_segment
+/leading/segment leading_segment
+EOF
+ ),
+ 'Not nested - group too small' => array(
+ array(
+ array('/', 'root'),
+ array('/prefix/segment/aa', 'prefix_segment'),
+ array('/prefix/segment/bb', 'leading_segment'),
+ ),
+ <<<EOF
+/ root
+/prefix/segment/aa prefix_segment
+/prefix/segment/bb leading_segment
+EOF
+ ),
+ 'Nested - contains item at intersection' => array(
+ array(
+ array('/', 'root'),
+ array('/prefix/segment/', 'prefix_segment'),
+ array('/prefix/segment/bb', 'leading_segment'),
+ ),
+ <<<EOF
+/ root
+/prefix/segment
+-> /prefix/segment prefix_segment
+-> /prefix/segment/bb leading_segment
+EOF
+ ),
+ 'Simple one level nesting' => array(
+ array(
+ array('/', 'root'),
+ array('/group/segment/', 'nested_segment'),
+ array('/group/thing/', 'some_segment'),
+ array('/group/other/', 'other_segment'),
+ ),
+ <<<EOF
+/ root
+/group
+-> /group/segment nested_segment
+-> /group/thing some_segment
+-> /group/other other_segment
+EOF
+ ),
+ 'Retain matching order with groups' => array(
+ array(
+ array('/group/aa/', 'aa'),
+ array('/group/bb/', 'bb'),
+ array('/group/cc/', 'cc'),
+ array('/', 'root'),
+ array('/group/dd/', 'dd'),
+ array('/group/ee/', 'ee'),
+ array('/group/ff/', 'ff'),
+ ),
+ <<<EOF
+/group
+-> /group/aa aa
+-> /group/bb bb
+-> /group/cc cc
+/ root
+/group
+-> /group/dd dd
+-> /group/ee ee
+-> /group/ff ff
+EOF
+ ),
+ 'Retain complex matching order with groups at base' => array(
+ array(
+ array('/aaa/111/', 'first_aaa'),
+ array('/prefixed/group/aa/', 'aa'),
+ array('/prefixed/group/bb/', 'bb'),
+ array('/prefixed/group/cc/', 'cc'),
+ array('/prefixed/', 'root'),
+ array('/prefixed/group/dd/', 'dd'),
+ array('/prefixed/group/ee/', 'ee'),
+ array('/prefixed/group/ff/', 'ff'),
+ array('/aaa/222/', 'second_aaa'),
+ array('/aaa/333/', 'third_aaa'),
+ ),
+ <<<EOF
+/aaa
+-> /aaa/111 first_aaa
+-> /aaa/222 second_aaa
+-> /aaa/333 third_aaa
+/prefixed
+-> /prefixed/group
+-> -> /prefixed/group/aa aa
+-> -> /prefixed/group/bb bb
+-> -> /prefixed/group/cc cc
+-> /prefixed root
+-> /prefixed/group
+-> -> /prefixed/group/dd dd
+-> -> /prefixed/group/ee ee
+-> -> /prefixed/group/ff ff
+EOF
+ ),
+
+ 'Group regardless of segments' => array(
+ array(
+ array('/aaa-111/', 'a1'),
+ array('/aaa-222/', 'a2'),
+ array('/aaa-333/', 'a3'),
+ array('/group-aa/', 'g1'),
+ array('/group-bb/', 'g2'),
+ array('/group-cc/', 'g3'),
+ ),
+ <<<EOF
+/aaa-
+-> /aaa-111 a1
+-> /aaa-222 a2
+-> /aaa-333 a3
+/group-
+-> /group-aa g1
+-> /group-bb g2
+-> /group-cc g3
+EOF
+ ),
+ );
+ }
+
+ private function dumpCollection(StaticPrefixCollection $collection, $prefix = '')
+ {
+ $lines = array();
+
+ foreach ($collection->getItems() as $item) {
+ if ($item instanceof StaticPrefixCollection) {
+ $lines[] = $prefix.$item->getPrefix();
+ $lines[] = $this->dumpCollection($item, $prefix.'-> ');
+ } else {
+ $lines[] = $prefix.implode(' ', $item);
+ }
+ }
+
+ return implode("\n", $lines);
+ }
+}
diff --git a/assets/php/vendor/symfony/routing/Tests/Matcher/RedirectableUrlMatcherTest.php b/assets/php/vendor/symfony/routing/Tests/Matcher/RedirectableUrlMatcherTest.php
new file mode 100644
index 0000000..7984391
--- /dev/null
+++ b/assets/php/vendor/symfony/routing/Tests/Matcher/RedirectableUrlMatcherTest.php
@@ -0,0 +1,124 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Routing\Tests\Matcher;
+
+use Symfony\Component\Routing\Route;
+use Symfony\Component\Routing\RouteCollection;
+use Symfony\Component\Routing\RequestContext;
+
+class RedirectableUrlMatcherTest extends UrlMatcherTest
+{
+ public function testMissingTrailingSlash()
+ {
+ $coll = new RouteCollection();
+ $coll->add('foo', new Route('/foo/'));
+
+ $matcher = $this->getUrlMatcher($coll);
+ $matcher->expects($this->once())->method('redirect')->will($this->returnValue(array()));
+ $matcher->match('/foo');
+ }
+
+ /**
+ * @expectedException \Symfony\Component\Routing\Exception\ResourceNotFoundException
+ */
+ public function testRedirectWhenNoSlashForNonSafeMethod()
+ {
+ $coll = new RouteCollection();
+ $coll->add('foo', new Route('/foo/'));
+
+ $context = new RequestContext();
+ $context->setMethod('POST');
+ $matcher = $this->getUrlMatcher($coll, $context);
+ $matcher->match('/foo');
+ }
+
+ public function testSchemeRedirectRedirectsToFirstScheme()
+ {
+ $coll = new RouteCollection();
+ $coll->add('foo', new Route('/foo', array(), array(), array(), '', array('FTP', 'HTTPS')));
+
+ $matcher = $this->getUrlMatcher($coll);
+ $matcher
+ ->expects($this->once())
+ ->method('redirect')
+ ->with('/foo', 'foo', 'ftp')
+ ->will($this->returnValue(array('_route' => 'foo')))
+ ;
+ $matcher->match('/foo');
+ }
+
+ public function testNoSchemaRedirectIfOneOfMultipleSchemesMatches()
+ {
+ $coll = new RouteCollection();
+ $coll->add('foo', new Route('/foo', array(), array(), array(), '', array('https', 'http')));
+
+ $matcher = $this->getUrlMatcher($coll);
+ $matcher
+ ->expects($this->never())
+ ->method('redirect');
+ $matcher->match('/foo');
+ }
+
+ public function testSchemeRedirectWithParams()
+ {
+ $coll = new RouteCollection();
+ $coll->add('foo', new Route('/foo/{bar}', array(), array(), array(), '', array('https')));
+
+ $matcher = $this->getUrlMatcher($coll);
+ $matcher
+ ->expects($this->once())
+ ->method('redirect')
+ ->with('/foo/baz', 'foo', 'https')
+ ->will($this->returnValue(array('redirect' => 'value')))
+ ;
+ $this->assertEquals(array('_route' => 'foo', 'bar' => 'baz', 'redirect' => 'value'), $matcher->match('/foo/baz'));
+ }
+
+ public function testSlashRedirectWithParams()
+ {
+ $coll = new RouteCollection();
+ $coll->add('foo', new Route('/foo/{bar}/'));
+
+ $matcher = $this->getUrlMatcher($coll);
+ $matcher
+ ->expects($this->once())
+ ->method('redirect')
+ ->with('/foo/baz/', 'foo', null)
+ ->will($this->returnValue(array('redirect' => 'value')))
+ ;
+ $this->assertEquals(array('_route' => 'foo', 'bar' => 'baz', 'redirect' => 'value'), $matcher->match('/foo/baz'));
+ }
+
+ public function testRedirectPreservesUrlEncoding()
+ {
+ $coll = new RouteCollection();
+ $coll->add('foo', new Route('/foo:bar/'));
+
+ $matcher = $this->getUrlMatcher($coll);
+ $matcher->expects($this->once())->method('redirect')->with('/foo%3Abar/')->willReturn(array());
+ $matcher->match('/foo%3Abar');
+ }
+
+ public function testSchemeRequirement()
+ {
+ $coll = new RouteCollection();
+ $coll->add('foo', new Route('/foo', array(), array(), array(), '', array('https')));
+ $matcher = $this->getUrlMatcher($coll, new RequestContext());
+ $matcher->expects($this->once())->method('redirect')->with('/foo', 'foo', 'https')->willReturn(array());
+ $this->assertSame(array('_route' => 'foo'), $matcher->match('/foo'));
+ }
+
+ protected function getUrlMatcher(RouteCollection $routes, RequestContext $context = null)
+ {
+ return $this->getMockForAbstractClass('Symfony\Component\Routing\Matcher\RedirectableUrlMatcher', array($routes, $context ?: new RequestContext()));
+ }
+}
diff --git a/assets/php/vendor/symfony/routing/Tests/Matcher/TraceableUrlMatcherTest.php b/assets/php/vendor/symfony/routing/Tests/Matcher/TraceableUrlMatcherTest.php
new file mode 100644
index 0000000..9f0529e
--- /dev/null
+++ b/assets/php/vendor/symfony/routing/Tests/Matcher/TraceableUrlMatcherTest.php
@@ -0,0 +1,122 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Routing\Tests\Matcher;
+
+use PHPUnit\Framework\TestCase;
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\Routing\Route;
+use Symfony\Component\Routing\RouteCollection;
+use Symfony\Component\Routing\RequestContext;
+use Symfony\Component\Routing\Matcher\TraceableUrlMatcher;
+
+class TraceableUrlMatcherTest extends TestCase
+{
+ public function test()
+ {
+ $coll = new RouteCollection();
+ $coll->add('foo', new Route('/foo', array(), array(), array(), '', array(), array('POST')));
+ $coll->add('bar', new Route('/bar/{id}', array(), array('id' => '\d+')));
+ $coll->add('bar1', new Route('/bar/{name}', array(), array('id' => '\w+'), array(), '', array(), array('POST')));
+ $coll->add('bar2', new Route('/foo', array(), array(), array(), 'baz'));
+ $coll->add('bar3', new Route('/foo1', array(), array(), array(), 'baz'));
+ $coll->add('bar4', new Route('/foo2', array(), array(), array(), 'baz', array(), array(), 'context.getMethod() == "GET"'));
+
+ $context = new RequestContext();
+ $context->setHost('baz');
+
+ $matcher = new TraceableUrlMatcher($coll, $context);
+ $traces = $matcher->getTraces('/babar');
+ $this->assertSame(array(0, 0, 0, 0, 0, 0), $this->getLevels($traces));
+
+ $traces = $matcher->getTraces('/foo');
+ $this->assertSame(array(1, 0, 0, 2), $this->getLevels($traces));
+
+ $traces = $matcher->getTraces('/bar/12');
+ $this->assertSame(array(0, 2), $this->getLevels($traces));
+
+ $traces = $matcher->getTraces('/bar/dd');
+ $this->assertSame(array(0, 1, 1, 0, 0, 0), $this->getLevels($traces));
+
+ $traces = $matcher->getTraces('/foo1');
+ $this->assertSame(array(0, 0, 0, 0, 2), $this->getLevels($traces));
+
+ $context->setMethod('POST');
+ $traces = $matcher->getTraces('/foo');
+ $this->assertSame(array(2), $this->getLevels($traces));
+
+ $traces = $matcher->getTraces('/bar/dd');
+ $this->assertSame(array(0, 1, 2), $this->getLevels($traces));
+
+ $traces = $matcher->getTraces('/foo2');
+ $this->assertSame(array(0, 0, 0, 0, 0, 1), $this->getLevels($traces));
+ }
+
+ public function testMatchRouteOnMultipleHosts()
+ {
+ $routes = new RouteCollection();
+ $routes->add('first', new Route(
+ '/mypath/',
+ array('_controller' => 'MainBundle:Info:first'),
+ array(),
+ array(),
+ 'some.example.com'
+ ));
+
+ $routes->add('second', new Route(
+ '/mypath/',
+ array('_controller' => 'MainBundle:Info:second'),
+ array(),
+ array(),
+ 'another.example.com'
+ ));
+
+ $context = new RequestContext();
+ $context->setHost('baz');
+
+ $matcher = new TraceableUrlMatcher($routes, $context);
+
+ $traces = $matcher->getTraces('/mypath/');
+ $this->assertSame(
+ array(TraceableUrlMatcher::ROUTE_ALMOST_MATCHES, TraceableUrlMatcher::ROUTE_ALMOST_MATCHES),
+ $this->getLevels($traces)
+ );
+ }
+
+ public function getLevels($traces)
+ {
+ $levels = array();
+ foreach ($traces as $trace) {
+ $levels[] = $trace['level'];
+ }
+
+ return $levels;
+ }
+
+ public function testRoutesWithConditions()
+ {
+ $routes = new RouteCollection();
+ $routes->add('foo', new Route('/foo', array(), array(), array(), 'baz', array(), array(), "request.headers.get('User-Agent') matches '/firefox/i'"));
+
+ $context = new RequestContext();
+ $context->setHost('baz');
+
+ $matcher = new TraceableUrlMatcher($routes, $context);
+
+ $notMatchingRequest = Request::create('/foo', 'GET');
+ $traces = $matcher->getTracesForRequest($notMatchingRequest);
+ $this->assertEquals("Condition \"request.headers.get('User-Agent') matches '/firefox/i'\" does not evaluate to \"true\"", $traces[0]['log']);
+
+ $matchingRequest = Request::create('/foo', 'GET', array(), array(), array(), array('HTTP_USER_AGENT' => 'Firefox'));
+ $traces = $matcher->getTracesForRequest($matchingRequest);
+ $this->assertEquals('Route matches!', $traces[0]['log']);
+ }
+}
diff --git a/assets/php/vendor/symfony/routing/Tests/Matcher/UrlMatcherTest.php b/assets/php/vendor/symfony/routing/Tests/Matcher/UrlMatcherTest.php
new file mode 100644
index 0000000..e8d31e2
--- /dev/null
+++ b/assets/php/vendor/symfony/routing/Tests/Matcher/UrlMatcherTest.php
@@ -0,0 +1,509 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Routing\Tests\Matcher;
+
+use PHPUnit\Framework\TestCase;
+use Symfony\Component\Routing\Exception\MethodNotAllowedException;
+use Symfony\Component\Routing\Exception\ResourceNotFoundException;
+use Symfony\Component\Routing\Matcher\UrlMatcher;
+use Symfony\Component\Routing\Route;
+use Symfony\Component\Routing\RouteCollection;
+use Symfony\Component\Routing\RequestContext;
+
+class UrlMatcherTest extends TestCase
+{
+ public function testNoMethodSoAllowed()
+ {
+ $coll = new RouteCollection();
+ $coll->add('foo', new Route('/foo'));
+
+ $matcher = $this->getUrlMatcher($coll);
+ $this->assertInternalType('array', $matcher->match('/foo'));
+ }
+
+ public function testMethodNotAllowed()
+ {
+ $coll = new RouteCollection();
+ $coll->add('foo', new Route('/foo', array(), array(), array(), '', array(), array('post')));
+
+ $matcher = $this->getUrlMatcher($coll);
+
+ try {
+ $matcher->match('/foo');
+ $this->fail();
+ } catch (MethodNotAllowedException $e) {
+ $this->assertEquals(array('POST'), $e->getAllowedMethods());
+ }
+ }
+
+ public function testMethodNotAllowedOnRoot()
+ {
+ $coll = new RouteCollection();
+ $coll->add('foo', new Route('/', array(), array(), array(), '', array(), array('GET')));
+
+ $matcher = $this->getUrlMatcher($coll, new RequestContext('', 'POST'));
+
+ try {
+ $matcher->match('/');
+ $this->fail();
+ } catch (MethodNotAllowedException $e) {
+ $this->assertEquals(array('GET'), $e->getAllowedMethods());
+ }
+ }
+
+ public function testHeadAllowedWhenRequirementContainsGet()
+ {
+ $coll = new RouteCollection();
+ $coll->add('foo', new Route('/foo', array(), array(), array(), '', array(), array('get')));
+
+ $matcher = $this->getUrlMatcher($coll, new RequestContext('', 'head'));
+ $this->assertInternalType('array', $matcher->match('/foo'));
+ }
+
+ public function testMethodNotAllowedAggregatesAllowedMethods()
+ {
+ $coll = new RouteCollection();
+ $coll->add('foo1', new Route('/foo', array(), array(), array(), '', array(), array('post')));
+ $coll->add('foo2', new Route('/foo', array(), array(), array(), '', array(), array('put', 'delete')));
+
+ $matcher = $this->getUrlMatcher($coll);
+
+ try {
+ $matcher->match('/foo');
+ $this->fail();
+ } catch (MethodNotAllowedException $e) {
+ $this->assertEquals(array('POST', 'PUT', 'DELETE'), $e->getAllowedMethods());
+ }
+ }
+
+ public function testMatch()
+ {
+ // test the patterns are matched and parameters are returned
+ $collection = new RouteCollection();
+ $collection->add('foo', new Route('/foo/{bar}'));
+ $matcher = $this->getUrlMatcher($collection);
+ try {
+ $matcher->match('/no-match');
+ $this->fail();
+ } catch (ResourceNotFoundException $e) {
+ }
+ $this->assertEquals(array('_route' => 'foo', 'bar' => 'baz'), $matcher->match('/foo/baz'));
+
+ // test that defaults are merged
+ $collection = new RouteCollection();
+ $collection->add('foo', new Route('/foo/{bar}', array('def' => 'test')));
+ $matcher = $this->getUrlMatcher($collection);
+ $this->assertEquals(array('_route' => 'foo', 'bar' => 'baz', 'def' => 'test'), $matcher->match('/foo/baz'));
+
+ // test that route "method" is ignored if no method is given in the context
+ $collection = new RouteCollection();
+ $collection->add('foo', new Route('/foo', array(), array(), array(), '', array(), array('get', 'head')));
+ $matcher = $this->getUrlMatcher($collection);
+ $this->assertInternalType('array', $matcher->match('/foo'));
+
+ // route does not match with POST method context
+ $matcher = $this->getUrlMatcher($collection, new RequestContext('', 'post'));
+ try {
+ $matcher->match('/foo');
+ $this->fail();
+ } catch (MethodNotAllowedException $e) {
+ }
+
+ // route does match with GET or HEAD method context
+ $matcher = $this->getUrlMatcher($collection);
+ $this->assertInternalType('array', $matcher->match('/foo'));
+ $matcher = $this->getUrlMatcher($collection, new RequestContext('', 'head'));
+ $this->assertInternalType('array', $matcher->match('/foo'));
+
+ // route with an optional variable as the first segment
+ $collection = new RouteCollection();
+ $collection->add('bar', new Route('/{bar}/foo', array('bar' => 'bar'), array('bar' => 'foo|bar')));
+ $matcher = $this->getUrlMatcher($collection);
+ $this->assertEquals(array('_route' => 'bar', 'bar' => 'bar'), $matcher->match('/bar/foo'));
+ $this->assertEquals(array('_route' => 'bar', 'bar' => 'foo'), $matcher->match('/foo/foo'));
+
+ $collection = new RouteCollection();
+ $collection->add('bar', new Route('/{bar}', array('bar' => 'bar'), array('bar' => 'foo|bar')));
+ $matcher = $this->getUrlMatcher($collection);
+ $this->assertEquals(array('_route' => 'bar', 'bar' => 'foo'), $matcher->match('/foo'));
+ $this->assertEquals(array('_route' => 'bar', 'bar' => 'bar'), $matcher->match('/'));
+
+ // route with only optional variables
+ $collection = new RouteCollection();
+ $collection->add('bar', new Route('/{foo}/{bar}', array('foo' => 'foo', 'bar' => 'bar'), array()));
+ $matcher = $this->getUrlMatcher($collection);
+ $this->assertEquals(array('_route' => 'bar', 'foo' => 'foo', 'bar' => 'bar'), $matcher->match('/'));
+ $this->assertEquals(array('_route' => 'bar', 'foo' => 'a', 'bar' => 'bar'), $matcher->match('/a'));
+ $this->assertEquals(array('_route' => 'bar', 'foo' => 'a', 'bar' => 'b'), $matcher->match('/a/b'));
+ }
+
+ public function testMatchWithPrefixes()
+ {
+ $collection = new RouteCollection();
+ $collection->add('foo', new Route('/{foo}'));
+ $collection->addPrefix('/b');
+ $collection->addPrefix('/a');
+
+ $matcher = $this->getUrlMatcher($collection);
+ $this->assertEquals(array('_route' => 'foo', 'foo' => 'foo'), $matcher->match('/a/b/foo'));
+ }
+
+ public function testMatchWithDynamicPrefix()
+ {
+ $collection = new RouteCollection();
+ $collection->add('foo', new Route('/{foo}'));
+ $collection->addPrefix('/b');
+ $collection->addPrefix('/{_locale}');
+
+ $matcher = $this->getUrlMatcher($collection);
+ $this->assertEquals(array('_locale' => 'fr', '_route' => 'foo', 'foo' => 'foo'), $matcher->match('/fr/b/foo'));
+ }
+
+ public function testMatchSpecialRouteName()
+ {
+ $collection = new RouteCollection();
+ $collection->add('$péß^a|', new Route('/bar'));
+
+ $matcher = $this->getUrlMatcher($collection);
+ $this->assertEquals(array('_route' => '$péß^a|'), $matcher->match('/bar'));
+ }
+
+ /**
+ * @expectedException \Symfony\Component\Routing\Exception\ResourceNotFoundException
+ */
+ public function testTrailingEncodedNewlineIsNotOverlooked()
+ {
+ $collection = new RouteCollection();
+ $collection->add('foo', new Route('/foo'));
+
+ $matcher = $this->getUrlMatcher($collection);
+ $matcher->match('/foo%0a');
+ }
+
+ public function testMatchNonAlpha()
+ {
+ $collection = new RouteCollection();
+ $chars = '!"$%éà &\'()*+,./:;<=>@ABCDEFGHIJKLMNOPQRSTUVWXYZ\\[]^_`abcdefghijklmnopqrstuvwxyz{|}~-';
+ $collection->add('foo', new Route('/{foo}/bar', array(), array('foo' => '['.preg_quote($chars).']+'), array('utf8' => true)));
+
+ $matcher = $this->getUrlMatcher($collection);
+ $this->assertEquals(array('_route' => 'foo', 'foo' => $chars), $matcher->match('/'.rawurlencode($chars).'/bar'));
+ $this->assertEquals(array('_route' => 'foo', 'foo' => $chars), $matcher->match('/'.strtr($chars, array('%' => '%25')).'/bar'));
+ }
+
+ public function testMatchWithDotMetacharacterInRequirements()
+ {
+ $collection = new RouteCollection();
+ $collection->add('foo', new Route('/{foo}/bar', array(), array('foo' => '.+')));
+
+ $matcher = $this->getUrlMatcher($collection);
+ $this->assertEquals(array('_route' => 'foo', 'foo' => "\n"), $matcher->match('/'.urlencode("\n").'/bar'), 'linefeed character is matched');
+ }
+
+ public function testMatchOverriddenRoute()
+ {
+ $collection = new RouteCollection();
+ $collection->add('foo', new Route('/foo'));
+
+ $collection1 = new RouteCollection();
+ $collection1->add('foo', new Route('/foo1'));
+
+ $collection->addCollection($collection1);
+
+ $matcher = $this->getUrlMatcher($collection);
+
+ $this->assertEquals(array('_route' => 'foo'), $matcher->match('/foo1'));
+ $this->{method_exists($this, $_ = 'expectException') ? $_ : 'setExpectedException'}('Symfony\Component\Routing\Exception\ResourceNotFoundException');
+ $this->assertEquals(array(), $matcher->match('/foo'));
+ }
+
+ public function testMatchRegression()
+ {
+ $coll = new RouteCollection();
+ $coll->add('foo', new Route('/foo/{foo}'));
+ $coll->add('bar', new Route('/foo/bar/{foo}'));
+
+ $matcher = $this->getUrlMatcher($coll);
+ $this->assertEquals(array('foo' => 'bar', '_route' => 'bar'), $matcher->match('/foo/bar/bar'));
+
+ $collection = new RouteCollection();
+ $collection->add('foo', new Route('/{bar}'));
+ $matcher = $this->getUrlMatcher($collection);
+ try {
+ $matcher->match('/');
+ $this->fail();
+ } catch (ResourceNotFoundException $e) {
+ }
+ }
+
+ public function testDefaultRequirementForOptionalVariables()
+ {
+ $coll = new RouteCollection();
+ $coll->add('test', new Route('/{page}.{_format}', array('page' => 'index', '_format' => 'html')));
+
+ $matcher = $this->getUrlMatcher($coll);
+ $this->assertEquals(array('page' => 'my-page', '_format' => 'xml', '_route' => 'test'), $matcher->match('/my-page.xml'));
+ }
+
+ public function testMatchingIsEager()
+ {
+ $coll = new RouteCollection();
+ $coll->add('test', new Route('/{foo}-{bar}-', array(), array('foo' => '.+', 'bar' => '.+')));
+
+ $matcher = $this->getUrlMatcher($coll);
+ $this->assertEquals(array('foo' => 'text1-text2-text3', 'bar' => 'text4', '_route' => 'test'), $matcher->match('/text1-text2-text3-text4-'));
+ }
+
+ public function testAdjacentVariables()
+ {
+ $coll = new RouteCollection();
+ $coll->add('test', new Route('/{w}{x}{y}{z}.{_format}', array('z' => 'default-z', '_format' => 'html'), array('y' => 'y|Y')));
+
+ $matcher = $this->getUrlMatcher($coll);
+ // 'w' eagerly matches as much as possible and the other variables match the remaining chars.
+ // This also shows that the variables w-z must all exclude the separating char (the dot '.' in this case) by default requirement.
+ // Otherwise they would also consume '.xml' and _format would never match as it's an optional variable.
+ $this->assertEquals(array('w' => 'wwwww', 'x' => 'x', 'y' => 'Y', 'z' => 'Z', '_format' => 'xml', '_route' => 'test'), $matcher->match('/wwwwwxYZ.xml'));
+ // As 'y' has custom requirement and can only be of value 'y|Y', it will leave 'ZZZ' to variable z.
+ // So with carefully chosen requirements adjacent variables, can be useful.
+ $this->assertEquals(array('w' => 'wwwww', 'x' => 'x', 'y' => 'y', 'z' => 'ZZZ', '_format' => 'html', '_route' => 'test'), $matcher->match('/wwwwwxyZZZ'));
+ // z and _format are optional.
+ $this->assertEquals(array('w' => 'wwwww', 'x' => 'x', 'y' => 'y', 'z' => 'default-z', '_format' => 'html', '_route' => 'test'), $matcher->match('/wwwwwxy'));
+
+ $this->{method_exists($this, $_ = 'expectException') ? $_ : 'setExpectedException'}('Symfony\Component\Routing\Exception\ResourceNotFoundException');
+ $matcher->match('/wxy.html');
+ }
+
+ public function testOptionalVariableWithNoRealSeparator()
+ {
+ $coll = new RouteCollection();
+ $coll->add('test', new Route('/get{what}', array('what' => 'All')));
+ $matcher = $this->getUrlMatcher($coll);
+
+ $this->assertEquals(array('what' => 'All', '_route' => 'test'), $matcher->match('/get'));
+ $this->assertEquals(array('what' => 'Sites', '_route' => 'test'), $matcher->match('/getSites'));
+
+ // Usually the character in front of an optional parameter can be left out, e.g. with pattern '/get/{what}' just '/get' would match.
+ // But here the 't' in 'get' is not a separating character, so it makes no sense to match without it.
+ $this->{method_exists($this, $_ = 'expectException') ? $_ : 'setExpectedException'}('Symfony\Component\Routing\Exception\ResourceNotFoundException');
+ $matcher->match('/ge');
+ }
+
+ public function testRequiredVariableWithNoRealSeparator()
+ {
+ $coll = new RouteCollection();
+ $coll->add('test', new Route('/get{what}Suffix'));
+ $matcher = $this->getUrlMatcher($coll);
+
+ $this->assertEquals(array('what' => 'Sites', '_route' => 'test'), $matcher->match('/getSitesSuffix'));
+ }
+
+ public function testDefaultRequirementOfVariable()
+ {
+ $coll = new RouteCollection();
+ $coll->add('test', new Route('/{page}.{_format}'));
+ $matcher = $this->getUrlMatcher($coll);
+
+ $this->assertEquals(array('page' => 'index', '_format' => 'mobile.html', '_route' => 'test'), $matcher->match('/index.mobile.html'));
+ }
+
+ /**
+ * @expectedException \Symfony\Component\Routing\Exception\ResourceNotFoundException
+ */
+ public function testDefaultRequirementOfVariableDisallowsSlash()
+ {
+ $coll = new RouteCollection();
+ $coll->add('test', new Route('/{page}.{_format}'));
+ $matcher = $this->getUrlMatcher($coll);
+
+ $matcher->match('/index.sl/ash');
+ }
+
+ /**
+ * @expectedException \Symfony\Component\Routing\Exception\ResourceNotFoundException
+ */
+ public function testDefaultRequirementOfVariableDisallowsNextSeparator()
+ {
+ $coll = new RouteCollection();
+ $coll->add('test', new Route('/{page}.{_format}', array(), array('_format' => 'html|xml')));
+ $matcher = $this->getUrlMatcher($coll);
+
+ $matcher->match('/do.t.html');
+ }
+
+ /**
+ * @expectedException \Symfony\Component\Routing\Exception\ResourceNotFoundException
+ */
+ public function testSchemeRequirement()
+ {
+ $coll = new RouteCollection();
+ $coll->add('foo', new Route('/foo', array(), array(), array(), '', array('https')));
+ $matcher = $this->getUrlMatcher($coll);
+ $matcher->match('/foo');
+ }
+
+ /**
+ * @expectedException \Symfony\Component\Routing\Exception\ResourceNotFoundException
+ */
+ public function testCondition()
+ {
+ $coll = new RouteCollection();
+ $route = new Route('/foo');
+ $route->setCondition('context.getMethod() == "POST"');
+ $coll->add('foo', $route);
+ $matcher = $this->getUrlMatcher($coll);
+ $matcher->match('/foo');
+ }
+
+ public function testRequestCondition()
+ {
+ $coll = new RouteCollection();
+ $route = new Route('/foo/{bar}');
+ $route->setCondition('request.getBaseUrl() == "/sub/front.php" and request.getPathInfo() == "/foo/bar"');
+ $coll->add('foo', $route);
+ $matcher = $this->getUrlMatcher($coll, new RequestContext('/sub/front.php'));
+ $this->assertEquals(array('bar' => 'bar', '_route' => 'foo'), $matcher->match('/foo/bar'));
+ }
+
+ public function testDecodeOnce()
+ {
+ $coll = new RouteCollection();
+ $coll->add('foo', new Route('/foo/{foo}'));
+
+ $matcher = $this->getUrlMatcher($coll);
+ $this->assertEquals(array('foo' => 'bar%23', '_route' => 'foo'), $matcher->match('/foo/bar%2523'));
+ }
+
+ public function testCannotRelyOnPrefix()
+ {
+ $coll = new RouteCollection();
+
+ $subColl = new RouteCollection();
+ $subColl->add('bar', new Route('/bar'));
+ $subColl->addPrefix('/prefix');
+ // overwrite the pattern, so the prefix is not valid anymore for this route in the collection
+ $subColl->get('bar')->setPath('/new');
+
+ $coll->addCollection($subColl);
+
+ $matcher = $this->getUrlMatcher($coll);
+ $this->assertEquals(array('_route' => 'bar'), $matcher->match('/new'));
+ }
+
+ public function testWithHost()
+ {
+ $coll = new RouteCollection();
+ $coll->add('foo', new Route('/foo/{foo}', array(), array(), array(), '{locale}.example.com'));
+
+ $matcher = $this->getUrlMatcher($coll, new RequestContext('', 'GET', 'en.example.com'));
+ $this->assertEquals(array('foo' => 'bar', '_route' => 'foo', 'locale' => 'en'), $matcher->match('/foo/bar'));
+ }
+
+ public function testWithHostOnRouteCollection()
+ {
+ $coll = new RouteCollection();
+ $coll->add('foo', new Route('/foo/{foo}'));
+ $coll->add('bar', new Route('/bar/{foo}', array(), array(), array(), '{locale}.example.net'));
+ $coll->setHost('{locale}.example.com');
+
+ $matcher = $this->getUrlMatcher($coll, new RequestContext('', 'GET', 'en.example.com'));
+ $this->assertEquals(array('foo' => 'bar', '_route' => 'foo', 'locale' => 'en'), $matcher->match('/foo/bar'));
+
+ $matcher = $this->getUrlMatcher($coll, new RequestContext('', 'GET', 'en.example.com'));
+ $this->assertEquals(array('foo' => 'bar', '_route' => 'bar', 'locale' => 'en'), $matcher->match('/bar/bar'));
+ }
+
+ /**
+ * @expectedException \Symfony\Component\Routing\Exception\ResourceNotFoundException
+ */
+ public function testWithOutHostHostDoesNotMatch()
+ {
+ $coll = new RouteCollection();
+ $coll->add('foo', new Route('/foo/{foo}', array(), array(), array(), '{locale}.example.com'));
+
+ $matcher = $this->getUrlMatcher($coll, new RequestContext('', 'GET', 'example.com'));
+ $matcher->match('/foo/bar');
+ }
+
+ /**
+ * @expectedException \Symfony\Component\Routing\Exception\ResourceNotFoundException
+ */
+ public function testPathIsCaseSensitive()
+ {
+ $coll = new RouteCollection();
+ $coll->add('foo', new Route('/locale', array(), array('locale' => 'EN|FR|DE')));
+
+ $matcher = $this->getUrlMatcher($coll);
+ $matcher->match('/en');
+ }
+
+ public function testHostIsCaseInsensitive()
+ {
+ $coll = new RouteCollection();
+ $coll->add('foo', new Route('/', array(), array('locale' => 'EN|FR|DE'), array(), '{locale}.example.com'));
+
+ $matcher = $this->getUrlMatcher($coll, new RequestContext('', 'GET', 'en.example.com'));
+ $this->assertEquals(array('_route' => 'foo', 'locale' => 'en'), $matcher->match('/'));
+ }
+
+ /**
+ * @expectedException \Symfony\Component\Routing\Exception\NoConfigurationException
+ */
+ public function testNoConfiguration()
+ {
+ $coll = new RouteCollection();
+
+ $matcher = $this->getUrlMatcher($coll);
+ $matcher->match('/');
+ }
+
+ public function testNestedCollections()
+ {
+ $coll = new RouteCollection();
+
+ $subColl = new RouteCollection();
+ $subColl->add('a', new Route('/a'));
+ $subColl->add('b', new Route('/b'));
+ $subColl->add('c', new Route('/c'));
+ $subColl->addPrefix('/p');
+ $coll->addCollection($subColl);
+
+ $coll->add('baz', new Route('/{baz}'));
+
+ $subColl = new RouteCollection();
+ $subColl->add('buz', new Route('/buz'));
+ $subColl->addPrefix('/prefix');
+ $coll->addCollection($subColl);
+
+ $matcher = $this->getUrlMatcher($coll);
+ $this->assertEquals(array('_route' => 'a'), $matcher->match('/p/a'));
+ $this->assertEquals(array('_route' => 'baz', 'baz' => 'p'), $matcher->match('/p'));
+ $this->assertEquals(array('_route' => 'buz'), $matcher->match('/prefix/buz'));
+ }
+
+ /**
+ * @expectedException \Symfony\Component\Routing\Exception\ResourceNotFoundException
+ */
+ public function testSchemeAndMethodMismatch()
+ {
+ $coll = new RouteCollection();
+ $coll->add('foo', new Route('/', array(), array(), array(), null, array('https'), array('POST')));
+
+ $matcher = $this->getUrlMatcher($coll);
+ $matcher->match('/');
+ }
+
+ protected function getUrlMatcher(RouteCollection $routes, RequestContext $context = null)
+ {
+ return new UrlMatcher($routes, $context ?: new RequestContext());
+ }
+}
diff --git a/assets/php/vendor/symfony/routing/Tests/RequestContextTest.php b/assets/php/vendor/symfony/routing/Tests/RequestContextTest.php
new file mode 100644
index 0000000..ffe29d1
--- /dev/null
+++ b/assets/php/vendor/symfony/routing/Tests/RequestContextTest.php
@@ -0,0 +1,160 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Routing\Tests;
+
+use PHPUnit\Framework\TestCase;
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\Routing\RequestContext;
+
+class RequestContextTest extends TestCase
+{
+ public function testConstruct()
+ {
+ $requestContext = new RequestContext(
+ 'foo',
+ 'post',
+ 'foo.bar',
+ 'HTTPS',
+ 8080,
+ 444,
+ '/baz',
+ 'bar=foobar'
+ );
+
+ $this->assertEquals('foo', $requestContext->getBaseUrl());
+ $this->assertEquals('POST', $requestContext->getMethod());
+ $this->assertEquals('foo.bar', $requestContext->getHost());
+ $this->assertEquals('https', $requestContext->getScheme());
+ $this->assertSame(8080, $requestContext->getHttpPort());
+ $this->assertSame(444, $requestContext->getHttpsPort());
+ $this->assertEquals('/baz', $requestContext->getPathInfo());
+ $this->assertEquals('bar=foobar', $requestContext->getQueryString());
+ }
+
+ public function testFromRequest()
+ {
+ $request = Request::create('https://test.com:444/foo?bar=baz');
+ $requestContext = new RequestContext();
+ $requestContext->setHttpPort(123);
+ $requestContext->fromRequest($request);
+
+ $this->assertEquals('', $requestContext->getBaseUrl());
+ $this->assertEquals('GET', $requestContext->getMethod());
+ $this->assertEquals('test.com', $requestContext->getHost());
+ $this->assertEquals('https', $requestContext->getScheme());
+ $this->assertEquals('/foo', $requestContext->getPathInfo());
+ $this->assertEquals('bar=baz', $requestContext->getQueryString());
+ $this->assertSame(123, $requestContext->getHttpPort());
+ $this->assertSame(444, $requestContext->getHttpsPort());
+
+ $request = Request::create('http://test.com:8080/foo?bar=baz');
+ $requestContext = new RequestContext();
+ $requestContext->setHttpsPort(567);
+ $requestContext->fromRequest($request);
+
+ $this->assertSame(8080, $requestContext->getHttpPort());
+ $this->assertSame(567, $requestContext->getHttpsPort());
+ }
+
+ public function testGetParameters()
+ {
+ $requestContext = new RequestContext();
+ $this->assertEquals(array(), $requestContext->getParameters());
+
+ $requestContext->setParameters(array('foo' => 'bar'));
+ $this->assertEquals(array('foo' => 'bar'), $requestContext->getParameters());
+ }
+
+ public function testHasParameter()
+ {
+ $requestContext = new RequestContext();
+ $requestContext->setParameters(array('foo' => 'bar'));
+
+ $this->assertTrue($requestContext->hasParameter('foo'));
+ $this->assertFalse($requestContext->hasParameter('baz'));
+ }
+
+ public function testGetParameter()
+ {
+ $requestContext = new RequestContext();
+ $requestContext->setParameters(array('foo' => 'bar'));
+
+ $this->assertEquals('bar', $requestContext->getParameter('foo'));
+ $this->assertNull($requestContext->getParameter('baz'));
+ }
+
+ public function testSetParameter()
+ {
+ $requestContext = new RequestContext();
+ $requestContext->setParameter('foo', 'bar');
+
+ $this->assertEquals('bar', $requestContext->getParameter('foo'));
+ }
+
+ public function testMethod()
+ {
+ $requestContext = new RequestContext();
+ $requestContext->setMethod('post');
+
+ $this->assertSame('POST', $requestContext->getMethod());
+ }
+
+ public function testScheme()
+ {
+ $requestContext = new RequestContext();
+ $requestContext->setScheme('HTTPS');
+
+ $this->assertSame('https', $requestContext->getScheme());
+ }
+
+ public function testHost()
+ {
+ $requestContext = new RequestContext();
+ $requestContext->setHost('eXampLe.com');
+
+ $this->assertSame('example.com', $requestContext->getHost());
+ }
+
+ public function testQueryString()
+ {
+ $requestContext = new RequestContext();
+ $requestContext->setQueryString(null);
+
+ $this->assertSame('', $requestContext->getQueryString());
+ }
+
+ public function testPort()
+ {
+ $requestContext = new RequestContext();
+ $requestContext->setHttpPort('123');
+ $requestContext->setHttpsPort('456');
+
+ $this->assertSame(123, $requestContext->getHttpPort());
+ $this->assertSame(456, $requestContext->getHttpsPort());
+ }
+
+ public function testFluentInterface()
+ {
+ $requestContext = new RequestContext();
+
+ $this->assertSame($requestContext, $requestContext->setBaseUrl('/app.php'));
+ $this->assertSame($requestContext, $requestContext->setPathInfo('/index'));
+ $this->assertSame($requestContext, $requestContext->setMethod('POST'));
+ $this->assertSame($requestContext, $requestContext->setScheme('https'));
+ $this->assertSame($requestContext, $requestContext->setHost('example.com'));
+ $this->assertSame($requestContext, $requestContext->setQueryString('foo=bar'));
+ $this->assertSame($requestContext, $requestContext->setHttpPort(80));
+ $this->assertSame($requestContext, $requestContext->setHttpsPort(443));
+ $this->assertSame($requestContext, $requestContext->setParameters(array()));
+ $this->assertSame($requestContext, $requestContext->setParameter('foo', 'bar'));
+ }
+}
diff --git a/assets/php/vendor/symfony/routing/Tests/RouteCollectionBuilderTest.php b/assets/php/vendor/symfony/routing/Tests/RouteCollectionBuilderTest.php
new file mode 100644
index 0000000..76a042d
--- /dev/null
+++ b/assets/php/vendor/symfony/routing/Tests/RouteCollectionBuilderTest.php
@@ -0,0 +1,364 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Routing\Tests;
+
+use PHPUnit\Framework\TestCase;
+use Symfony\Component\Config\FileLocator;
+use Symfony\Component\Config\Resource\FileResource;
+use Symfony\Component\Routing\Loader\YamlFileLoader;
+use Symfony\Component\Routing\Route;
+use Symfony\Component\Routing\RouteCollection;
+use Symfony\Component\Routing\RouteCollectionBuilder;
+
+class RouteCollectionBuilderTest extends TestCase
+{
+ public function testImport()
+ {
+ $resolvedLoader = $this->getMockBuilder('Symfony\Component\Config\Loader\LoaderInterface')->getMock();
+ $resolver = $this->getMockBuilder('Symfony\Component\Config\Loader\LoaderResolverInterface')->getMock();
+ $resolver->expects($this->once())
+ ->method('resolve')
+ ->with('admin_routing.yml', 'yaml')
+ ->will($this->returnValue($resolvedLoader));
+
+ $originalRoute = new Route('/foo/path');
+ $expectedCollection = new RouteCollection();
+ $expectedCollection->add('one_test_route', $originalRoute);
+ $expectedCollection->addResource(new FileResource(__DIR__.'/Fixtures/file_resource.yml'));
+
+ $resolvedLoader
+ ->expects($this->once())
+ ->method('load')
+ ->with('admin_routing.yml', 'yaml')
+ ->will($this->returnValue($expectedCollection));
+
+ $loader = $this->getMockBuilder('Symfony\Component\Config\Loader\LoaderInterface')->getMock();
+ $loader->expects($this->any())
+ ->method('getResolver')
+ ->will($this->returnValue($resolver));
+
+ // import the file!
+ $routes = new RouteCollectionBuilder($loader);
+ $importedRoutes = $routes->import('admin_routing.yml', '/', 'yaml');
+
+ // we should get back a RouteCollectionBuilder
+ $this->assertInstanceOf('Symfony\Component\Routing\RouteCollectionBuilder', $importedRoutes);
+
+ // get the collection back so we can look at it
+ $addedCollection = $importedRoutes->build();
+ $route = $addedCollection->get('one_test_route');
+ $this->assertSame($originalRoute, $route);
+ // should return file_resource.yml, which is in the original collection
+ $this->assertCount(1, $addedCollection->getResources());
+
+ // make sure the routes were imported into the top-level builder
+ $routeCollection = $routes->build();
+ $this->assertCount(1, $routes->build());
+ $this->assertCount(1, $routeCollection->getResources());
+ }
+
+ public function testImportAddResources()
+ {
+ $routeCollectionBuilder = new RouteCollectionBuilder(new YamlFileLoader(new FileLocator(array(__DIR__.'/Fixtures/'))));
+ $routeCollectionBuilder->import('file_resource.yml');
+ $routeCollection = $routeCollectionBuilder->build();
+
+ $this->assertCount(1, $routeCollection->getResources());
+ }
+
+ /**
+ * @expectedException \BadMethodCallException
+ */
+ public function testImportWithoutLoaderThrowsException()
+ {
+ $collectionBuilder = new RouteCollectionBuilder();
+ $collectionBuilder->import('routing.yml');
+ }
+
+ public function testAdd()
+ {
+ $collectionBuilder = new RouteCollectionBuilder();
+
+ $addedRoute = $collectionBuilder->add('/checkout', 'AppBundle:Order:checkout');
+ $addedRoute2 = $collectionBuilder->add('/blogs', 'AppBundle:Blog:list', 'blog_list');
+ $this->assertInstanceOf('Symfony\Component\Routing\Route', $addedRoute);
+ $this->assertEquals('AppBundle:Order:checkout', $addedRoute->getDefault('_controller'));
+
+ $finalCollection = $collectionBuilder->build();
+ $this->assertSame($addedRoute2, $finalCollection->get('blog_list'));
+ }
+
+ public function testFlushOrdering()
+ {
+ $importedCollection = new RouteCollection();
+ $importedCollection->add('imported_route1', new Route('/imported/foo1'));
+ $importedCollection->add('imported_route2', new Route('/imported/foo2'));
+
+ $loader = $this->getMockBuilder('Symfony\Component\Config\Loader\LoaderInterface')->getMock();
+ // make this loader able to do the import - keeps mocking simple
+ $loader->expects($this->any())
+ ->method('supports')
+ ->will($this->returnValue(true));
+ $loader
+ ->expects($this->once())
+ ->method('load')
+ ->will($this->returnValue($importedCollection));
+
+ $routes = new RouteCollectionBuilder($loader);
+
+ // 1) Add a route
+ $routes->add('/checkout', 'AppBundle:Order:checkout', 'checkout_route');
+ // 2) Import from a file
+ $routes->mount('/', $routes->import('admin_routing.yml'));
+ // 3) Add another route
+ $routes->add('/', 'AppBundle:Default:homepage', 'homepage');
+ // 4) Add another route
+ $routes->add('/admin', 'AppBundle:Admin:dashboard', 'admin_dashboard');
+
+ // set a default value
+ $routes->setDefault('_locale', 'fr');
+
+ $actualCollection = $routes->build();
+
+ $this->assertCount(5, $actualCollection);
+ $actualRouteNames = array_keys($actualCollection->all());
+ $this->assertEquals(array(
+ 'checkout_route',
+ 'imported_route1',
+ 'imported_route2',
+ 'homepage',
+ 'admin_dashboard',
+ ), $actualRouteNames);
+
+ // make sure the defaults were set
+ $checkoutRoute = $actualCollection->get('checkout_route');
+ $defaults = $checkoutRoute->getDefaults();
+ $this->assertArrayHasKey('_locale', $defaults);
+ $this->assertEquals('fr', $defaults['_locale']);
+ }
+
+ public function testFlushSetsRouteNames()
+ {
+ $collectionBuilder = new RouteCollectionBuilder();
+
+ // add a "named" route
+ $collectionBuilder->add('/admin', 'AppBundle:Admin:dashboard', 'admin_dashboard');
+ // add an unnamed route
+ $collectionBuilder->add('/blogs', 'AppBundle:Blog:list')
+ ->setMethods(array('GET'));
+
+ // integer route names are allowed - they don't confuse things
+ $collectionBuilder->add('/products', 'AppBundle:Product:list', 100);
+
+ $actualCollection = $collectionBuilder->build();
+ $actualRouteNames = array_keys($actualCollection->all());
+ $this->assertEquals(array(
+ 'admin_dashboard',
+ 'GET_blogs',
+ '100',
+ ), $actualRouteNames);
+ }
+
+ public function testFlushSetsDetailsOnChildrenRoutes()
+ {
+ $routes = new RouteCollectionBuilder();
+
+ $routes->add('/blogs/{page}', 'listAction', 'blog_list')
+ // unique things for the route
+ ->setDefault('page', 1)
+ ->setRequirement('id', '\d+')
+ ->setOption('expose', true)
+ // things that the collection will try to override (but won't)
+ ->setDefault('_format', 'html')
+ ->setRequirement('_format', 'json|xml')
+ ->setOption('fooBar', true)
+ ->setHost('example.com')
+ ->setCondition('request.isSecure()')
+ ->setSchemes(array('https'))
+ ->setMethods(array('POST'));
+
+ // a simple route, nothing added to it
+ $routes->add('/blogs/{id}', 'editAction', 'blog_edit');
+
+ // configure the collection itself
+ $routes
+ // things that will not override the child route
+ ->setDefault('_format', 'json')
+ ->setRequirement('_format', 'xml')
+ ->setOption('fooBar', false)
+ ->setHost('symfony.com')
+ ->setCondition('request.query.get("page")==1')
+ // some unique things that should be set on the child
+ ->setDefault('_locale', 'fr')
+ ->setRequirement('_locale', 'fr|en')
+ ->setOption('niceRoute', true)
+ ->setSchemes(array('http'))
+ ->setMethods(array('GET', 'POST'));
+
+ $collection = $routes->build();
+ $actualListRoute = $collection->get('blog_list');
+
+ $this->assertEquals(1, $actualListRoute->getDefault('page'));
+ $this->assertEquals('\d+', $actualListRoute->getRequirement('id'));
+ $this->assertTrue($actualListRoute->getOption('expose'));
+ // none of these should be overridden
+ $this->assertEquals('html', $actualListRoute->getDefault('_format'));
+ $this->assertEquals('json|xml', $actualListRoute->getRequirement('_format'));
+ $this->assertTrue($actualListRoute->getOption('fooBar'));
+ $this->assertEquals('example.com', $actualListRoute->getHost());
+ $this->assertEquals('request.isSecure()', $actualListRoute->getCondition());
+ $this->assertEquals(array('https'), $actualListRoute->getSchemes());
+ $this->assertEquals(array('POST'), $actualListRoute->getMethods());
+ // inherited from the main collection
+ $this->assertEquals('fr', $actualListRoute->getDefault('_locale'));
+ $this->assertEquals('fr|en', $actualListRoute->getRequirement('_locale'));
+ $this->assertTrue($actualListRoute->getOption('niceRoute'));
+
+ $actualEditRoute = $collection->get('blog_edit');
+ // inherited from the collection
+ $this->assertEquals('symfony.com', $actualEditRoute->getHost());
+ $this->assertEquals('request.query.get("page")==1', $actualEditRoute->getCondition());
+ $this->assertEquals(array('http'), $actualEditRoute->getSchemes());
+ $this->assertEquals(array('GET', 'POST'), $actualEditRoute->getMethods());
+ }
+
+ /**
+ * @dataProvider providePrefixTests
+ */
+ public function testFlushPrefixesPaths($collectionPrefix, $routePath, $expectedPath)
+ {
+ $routes = new RouteCollectionBuilder();
+
+ $routes->add($routePath, 'someController', 'test_route');
+
+ $outerRoutes = new RouteCollectionBuilder();
+ $outerRoutes->mount($collectionPrefix, $routes);
+
+ $collection = $outerRoutes->build();
+
+ $this->assertEquals($expectedPath, $collection->get('test_route')->getPath());
+ }
+
+ public function providePrefixTests()
+ {
+ $tests = array();
+ // empty prefix is of course ok
+ $tests[] = array('', '/foo', '/foo');
+ // normal prefix - does not matter if it's a wildcard
+ $tests[] = array('/{admin}', '/foo', '/{admin}/foo');
+ // shows that a prefix will always be given the starting slash
+ $tests[] = array('0', '/foo', '/0/foo');
+
+ // spaces are ok, and double slahses at the end are cleaned
+ $tests[] = array('/ /', '/foo', '/ /foo');
+
+ return $tests;
+ }
+
+ public function testFlushSetsPrefixedWithMultipleLevels()
+ {
+ $loader = $this->getMockBuilder('Symfony\Component\Config\Loader\LoaderInterface')->getMock();
+ $routes = new RouteCollectionBuilder($loader);
+
+ $routes->add('homepage', 'MainController::homepageAction', 'homepage');
+
+ $adminRoutes = $routes->createBuilder();
+ $adminRoutes->add('/dashboard', 'AdminController::dashboardAction', 'admin_dashboard');
+
+ // embedded collection under /admin
+ $adminBlogRoutes = $routes->createBuilder();
+ $adminBlogRoutes->add('/new', 'BlogController::newAction', 'admin_blog_new');
+ // mount into admin, but before the parent collection has been mounted
+ $adminRoutes->mount('/blog', $adminBlogRoutes);
+
+ // now mount the /admin routes, above should all still be /blog/admin
+ $routes->mount('/admin', $adminRoutes);
+ // add a route after mounting
+ $adminRoutes->add('/users', 'AdminController::userAction', 'admin_users');
+
+ // add another sub-collection after the mount
+ $otherAdminRoutes = $routes->createBuilder();
+ $otherAdminRoutes->add('/sales', 'StatsController::indexAction', 'admin_stats_sales');
+ $adminRoutes->mount('/stats', $otherAdminRoutes);
+
+ // add a normal collection and see that it is also prefixed
+ $importedCollection = new RouteCollection();
+ $importedCollection->add('imported_route', new Route('/foo'));
+ // make this loader able to do the import - keeps mocking simple
+ $loader->expects($this->any())
+ ->method('supports')
+ ->will($this->returnValue(true));
+ $loader
+ ->expects($this->any())
+ ->method('load')
+ ->will($this->returnValue($importedCollection));
+ // import this from the /admin route builder
+ $adminRoutes->import('admin.yml', '/imported');
+
+ $collection = $routes->build();
+ $this->assertEquals('/admin/dashboard', $collection->get('admin_dashboard')->getPath(), 'Routes before mounting have the prefix');
+ $this->assertEquals('/admin/users', $collection->get('admin_users')->getPath(), 'Routes after mounting have the prefix');
+ $this->assertEquals('/admin/blog/new', $collection->get('admin_blog_new')->getPath(), 'Sub-collections receive prefix even if mounted before parent prefix');
+ $this->assertEquals('/admin/stats/sales', $collection->get('admin_stats_sales')->getPath(), 'Sub-collections receive prefix if mounted after parent prefix');
+ $this->assertEquals('/admin/imported/foo', $collection->get('imported_route')->getPath(), 'Normal RouteCollections are also prefixed properly');
+ }
+
+ public function testAutomaticRouteNamesDoNotConflict()
+ {
+ $routes = new RouteCollectionBuilder();
+
+ $adminRoutes = $routes->createBuilder();
+ // route 1
+ $adminRoutes->add('/dashboard', '');
+
+ $accountRoutes = $routes->createBuilder();
+ // route 2
+ $accountRoutes->add('/dashboard', '')
+ ->setMethods(array('GET'));
+ // route 3
+ $accountRoutes->add('/dashboard', '')
+ ->setMethods(array('POST'));
+
+ $routes->mount('/admin', $adminRoutes);
+ $routes->mount('/account', $accountRoutes);
+
+ $collection = $routes->build();
+ // there are 2 routes (i.e. with non-conflicting names)
+ $this->assertCount(3, $collection->all());
+ }
+
+ public function testAddsThePrefixOnlyOnceWhenLoadingMultipleCollections()
+ {
+ $firstCollection = new RouteCollection();
+ $firstCollection->add('a', new Route('/a'));
+
+ $secondCollection = new RouteCollection();
+ $secondCollection->add('b', new Route('/b'));
+
+ $loader = $this->getMockBuilder('Symfony\Component\Config\Loader\LoaderInterface')->getMock();
+ $loader->expects($this->any())
+ ->method('supports')
+ ->will($this->returnValue(true));
+ $loader
+ ->expects($this->any())
+ ->method('load')
+ ->will($this->returnValue(array($firstCollection, $secondCollection)));
+
+ $routeCollectionBuilder = new RouteCollectionBuilder($loader);
+ $routeCollectionBuilder->import('/directory/recurse/*', '/other/', 'glob');
+ $routes = $routeCollectionBuilder->build()->all();
+
+ $this->assertCount(2, $routes);
+ $this->assertEquals('/other/a', $routes['a']->getPath());
+ $this->assertEquals('/other/b', $routes['b']->getPath());
+ }
+}
diff --git a/assets/php/vendor/symfony/routing/Tests/RouteCollectionTest.php b/assets/php/vendor/symfony/routing/Tests/RouteCollectionTest.php
new file mode 100644
index 0000000..83457ff
--- /dev/null
+++ b/assets/php/vendor/symfony/routing/Tests/RouteCollectionTest.php
@@ -0,0 +1,305 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Routing\Tests;
+
+use PHPUnit\Framework\TestCase;
+use Symfony\Component\Routing\RouteCollection;
+use Symfony\Component\Routing\Route;
+use Symfony\Component\Config\Resource\FileResource;
+
+class RouteCollectionTest extends TestCase
+{
+ public function testRoute()
+ {
+ $collection = new RouteCollection();
+ $route = new Route('/foo');
+ $collection->add('foo', $route);
+ $this->assertEquals(array('foo' => $route), $collection->all(), '->add() adds a route');
+ $this->assertEquals($route, $collection->get('foo'), '->get() returns a route by name');
+ $this->assertNull($collection->get('bar'), '->get() returns null if a route does not exist');
+ }
+
+ public function testOverriddenRoute()
+ {
+ $collection = new RouteCollection();
+ $collection->add('foo', new Route('/foo'));
+ $collection->add('foo', new Route('/foo1'));
+
+ $this->assertEquals('/foo1', $collection->get('foo')->getPath());
+ }
+
+ public function testDeepOverriddenRoute()
+ {
+ $collection = new RouteCollection();
+ $collection->add('foo', new Route('/foo'));
+
+ $collection1 = new RouteCollection();
+ $collection1->add('foo', new Route('/foo1'));
+
+ $collection2 = new RouteCollection();
+ $collection2->add('foo', new Route('/foo2'));
+
+ $collection1->addCollection($collection2);
+ $collection->addCollection($collection1);
+
+ $this->assertEquals('/foo2', $collection1->get('foo')->getPath());
+ $this->assertEquals('/foo2', $collection->get('foo')->getPath());
+ }
+
+ public function testIterator()
+ {
+ $collection = new RouteCollection();
+ $collection->add('foo', new Route('/foo'));
+
+ $collection1 = new RouteCollection();
+ $collection1->add('bar', $bar = new Route('/bar'));
+ $collection1->add('foo', $foo = new Route('/foo-new'));
+ $collection->addCollection($collection1);
+ $collection->add('last', $last = new Route('/last'));
+
+ $this->assertInstanceOf('\ArrayIterator', $collection->getIterator());
+ $this->assertSame(array('bar' => $bar, 'foo' => $foo, 'last' => $last), $collection->getIterator()->getArrayCopy());
+ }
+
+ public function testCount()
+ {
+ $collection = new RouteCollection();
+ $collection->add('foo', new Route('/foo'));
+
+ $collection1 = new RouteCollection();
+ $collection1->add('bar', new Route('/bar'));
+ $collection->addCollection($collection1);
+
+ $this->assertCount(2, $collection);
+ }
+
+ public function testAddCollection()
+ {
+ $collection = new RouteCollection();
+ $collection->add('foo', new Route('/foo'));
+
+ $collection1 = new RouteCollection();
+ $collection1->add('bar', $bar = new Route('/bar'));
+ $collection1->add('foo', $foo = new Route('/foo-new'));
+
+ $collection2 = new RouteCollection();
+ $collection2->add('grandchild', $grandchild = new Route('/grandchild'));
+
+ $collection1->addCollection($collection2);
+ $collection->addCollection($collection1);
+ $collection->add('last', $last = new Route('/last'));
+
+ $this->assertSame(array('bar' => $bar, 'foo' => $foo, 'grandchild' => $grandchild, 'last' => $last), $collection->all(),
+ '->addCollection() imports routes of another collection, overrides if necessary and adds them at the end');
+ }
+
+ public function testAddCollectionWithResources()
+ {
+ $collection = new RouteCollection();
+ $collection->addResource($foo = new FileResource(__DIR__.'/Fixtures/foo.xml'));
+ $collection1 = new RouteCollection();
+ $collection1->addResource($foo1 = new FileResource(__DIR__.'/Fixtures/foo1.xml'));
+ $collection->addCollection($collection1);
+ $this->assertEquals(array($foo, $foo1), $collection->getResources(), '->addCollection() merges resources');
+ }
+
+ public function testAddDefaultsAndRequirementsAndOptions()
+ {
+ $collection = new RouteCollection();
+ $collection->add('foo', new Route('/{placeholder}'));
+ $collection1 = new RouteCollection();
+ $collection1->add('bar', new Route('/{placeholder}',
+ array('_controller' => 'fixed', 'placeholder' => 'default'), array('placeholder' => '.+'), array('option' => 'value'))
+ );
+ $collection->addCollection($collection1);
+
+ $collection->addDefaults(array('placeholder' => 'new-default'));
+ $this->assertEquals(array('placeholder' => 'new-default'), $collection->get('foo')->getDefaults(), '->addDefaults() adds defaults to all routes');
+ $this->assertEquals(array('_controller' => 'fixed', 'placeholder' => 'new-default'), $collection->get('bar')->getDefaults(),
+ '->addDefaults() adds defaults to all routes and overwrites existing ones');
+
+ $collection->addRequirements(array('placeholder' => '\d+'));
+ $this->assertEquals(array('placeholder' => '\d+'), $collection->get('foo')->getRequirements(), '->addRequirements() adds requirements to all routes');
+ $this->assertEquals(array('placeholder' => '\d+'), $collection->get('bar')->getRequirements(),
+ '->addRequirements() adds requirements to all routes and overwrites existing ones');
+
+ $collection->addOptions(array('option' => 'new-value'));
+ $this->assertEquals(
+ array('option' => 'new-value', 'compiler_class' => 'Symfony\\Component\\Routing\\RouteCompiler'),
+ $collection->get('bar')->getOptions(), '->addOptions() adds options to all routes and overwrites existing ones'
+ );
+ }
+
+ public function testAddPrefix()
+ {
+ $collection = new RouteCollection();
+ $collection->add('foo', $foo = new Route('/foo'));
+ $collection2 = new RouteCollection();
+ $collection2->add('bar', $bar = new Route('/bar'));
+ $collection->addCollection($collection2);
+ $collection->addPrefix(' / ');
+ $this->assertSame('/foo', $collection->get('foo')->getPath(), '->addPrefix() trims the prefix and a single slash has no effect');
+ $collection->addPrefix('/{admin}', array('admin' => 'admin'), array('admin' => '\d+'));
+ $this->assertEquals('/{admin}/foo', $collection->get('foo')->getPath(), '->addPrefix() adds a prefix to all routes');
+ $this->assertEquals('/{admin}/bar', $collection->get('bar')->getPath(), '->addPrefix() adds a prefix to all routes');
+ $this->assertEquals(array('admin' => 'admin'), $collection->get('foo')->getDefaults(), '->addPrefix() adds defaults to all routes');
+ $this->assertEquals(array('admin' => 'admin'), $collection->get('bar')->getDefaults(), '->addPrefix() adds defaults to all routes');
+ $this->assertEquals(array('admin' => '\d+'), $collection->get('foo')->getRequirements(), '->addPrefix() adds requirements to all routes');
+ $this->assertEquals(array('admin' => '\d+'), $collection->get('bar')->getRequirements(), '->addPrefix() adds requirements to all routes');
+ $collection->addPrefix('0');
+ $this->assertEquals('/0/{admin}/foo', $collection->get('foo')->getPath(), '->addPrefix() ensures a prefix must start with a slash and must not end with a slash');
+ $collection->addPrefix('/ /');
+ $this->assertSame('/ /0/{admin}/foo', $collection->get('foo')->getPath(), '->addPrefix() can handle spaces if desired');
+ $this->assertSame('/ /0/{admin}/bar', $collection->get('bar')->getPath(), 'the route pattern of an added collection is in synch with the added prefix');
+ }
+
+ public function testAddPrefixOverridesDefaultsAndRequirements()
+ {
+ $collection = new RouteCollection();
+ $collection->add('foo', $foo = new Route('/foo.{_format}'));
+ $collection->add('bar', $bar = new Route('/bar.{_format}', array(), array('_format' => 'json')));
+ $collection->addPrefix('/admin', array(), array('_format' => 'html'));
+
+ $this->assertEquals('html', $collection->get('foo')->getRequirement('_format'), '->addPrefix() overrides existing requirements');
+ $this->assertEquals('html', $collection->get('bar')->getRequirement('_format'), '->addPrefix() overrides existing requirements');
+ }
+
+ public function testResource()
+ {
+ $collection = new RouteCollection();
+ $collection->addResource($foo = new FileResource(__DIR__.'/Fixtures/foo.xml'));
+ $collection->addResource($bar = new FileResource(__DIR__.'/Fixtures/bar.xml'));
+ $collection->addResource(new FileResource(__DIR__.'/Fixtures/foo.xml'));
+
+ $this->assertEquals(array($foo, $bar), $collection->getResources(),
+ '->addResource() adds a resource and getResources() only returns unique ones by comparing the string representation');
+ }
+
+ public function testUniqueRouteWithGivenName()
+ {
+ $collection1 = new RouteCollection();
+ $collection1->add('foo', new Route('/old'));
+ $collection2 = new RouteCollection();
+ $collection3 = new RouteCollection();
+ $collection3->add('foo', $new = new Route('/new'));
+
+ $collection2->addCollection($collection3);
+ $collection1->addCollection($collection2);
+
+ $this->assertSame($new, $collection1->get('foo'), '->get() returns new route that overrode previous one');
+ // size of 1 because collection1 contains /new but not /old anymore
+ $this->assertCount(1, $collection1->getIterator(), '->addCollection() removes previous routes when adding new routes with the same name');
+ }
+
+ public function testGet()
+ {
+ $collection1 = new RouteCollection();
+ $collection1->add('a', $a = new Route('/a'));
+ $collection2 = new RouteCollection();
+ $collection2->add('b', $b = new Route('/b'));
+ $collection1->addCollection($collection2);
+ $collection1->add('$péß^a|', $c = new Route('/special'));
+
+ $this->assertSame($b, $collection1->get('b'), '->get() returns correct route in child collection');
+ $this->assertSame($c, $collection1->get('$péß^a|'), '->get() can handle special characters');
+ $this->assertNull($collection2->get('a'), '->get() does not return the route defined in parent collection');
+ $this->assertNull($collection1->get('non-existent'), '->get() returns null when route does not exist');
+ $this->assertNull($collection1->get(0), '->get() does not disclose internal child RouteCollection');
+ }
+
+ public function testRemove()
+ {
+ $collection = new RouteCollection();
+ $collection->add('foo', $foo = new Route('/foo'));
+
+ $collection1 = new RouteCollection();
+ $collection1->add('bar', $bar = new Route('/bar'));
+ $collection->addCollection($collection1);
+ $collection->add('last', $last = new Route('/last'));
+
+ $collection->remove('foo');
+ $this->assertSame(array('bar' => $bar, 'last' => $last), $collection->all(), '->remove() can remove a single route');
+ $collection->remove(array('bar', 'last'));
+ $this->assertSame(array(), $collection->all(), '->remove() accepts an array and can remove multiple routes at once');
+ }
+
+ public function testSetHost()
+ {
+ $collection = new RouteCollection();
+ $routea = new Route('/a');
+ $routeb = new Route('/b', array(), array(), array(), '{locale}.example.net');
+ $collection->add('a', $routea);
+ $collection->add('b', $routeb);
+
+ $collection->setHost('{locale}.example.com');
+
+ $this->assertEquals('{locale}.example.com', $routea->getHost());
+ $this->assertEquals('{locale}.example.com', $routeb->getHost());
+ }
+
+ public function testSetCondition()
+ {
+ $collection = new RouteCollection();
+ $routea = new Route('/a');
+ $routeb = new Route('/b', array(), array(), array(), '{locale}.example.net', array(), array(), 'context.getMethod() == "GET"');
+ $collection->add('a', $routea);
+ $collection->add('b', $routeb);
+
+ $collection->setCondition('context.getMethod() == "POST"');
+
+ $this->assertEquals('context.getMethod() == "POST"', $routea->getCondition());
+ $this->assertEquals('context.getMethod() == "POST"', $routeb->getCondition());
+ }
+
+ public function testClone()
+ {
+ $collection = new RouteCollection();
+ $collection->add('a', new Route('/a'));
+ $collection->add('b', new Route('/b', array('placeholder' => 'default'), array('placeholder' => '.+')));
+
+ $clonedCollection = clone $collection;
+
+ $this->assertCount(2, $clonedCollection);
+ $this->assertEquals($collection->get('a'), $clonedCollection->get('a'));
+ $this->assertNotSame($collection->get('a'), $clonedCollection->get('a'));
+ $this->assertEquals($collection->get('b'), $clonedCollection->get('b'));
+ $this->assertNotSame($collection->get('b'), $clonedCollection->get('b'));
+ }
+
+ public function testSetSchemes()
+ {
+ $collection = new RouteCollection();
+ $routea = new Route('/a', array(), array(), array(), '', 'http');
+ $routeb = new Route('/b');
+ $collection->add('a', $routea);
+ $collection->add('b', $routeb);
+
+ $collection->setSchemes(array('http', 'https'));
+
+ $this->assertEquals(array('http', 'https'), $routea->getSchemes());
+ $this->assertEquals(array('http', 'https'), $routeb->getSchemes());
+ }
+
+ public function testSetMethods()
+ {
+ $collection = new RouteCollection();
+ $routea = new Route('/a', array(), array(), array(), '', array(), array('GET', 'POST'));
+ $routeb = new Route('/b');
+ $collection->add('a', $routea);
+ $collection->add('b', $routeb);
+
+ $collection->setMethods('PUT');
+
+ $this->assertEquals(array('PUT'), $routea->getMethods());
+ $this->assertEquals(array('PUT'), $routeb->getMethods());
+ }
+}
diff --git a/assets/php/vendor/symfony/routing/Tests/RouteCompilerTest.php b/assets/php/vendor/symfony/routing/Tests/RouteCompilerTest.php
new file mode 100644
index 0000000..dc304e3
--- /dev/null
+++ b/assets/php/vendor/symfony/routing/Tests/RouteCompilerTest.php
@@ -0,0 +1,389 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Routing\Tests;
+
+use PHPUnit\Framework\TestCase;
+use Symfony\Component\Routing\Route;
+use Symfony\Component\Routing\RouteCompiler;
+
+class RouteCompilerTest extends TestCase
+{
+ /**
+ * @dataProvider provideCompileData
+ */
+ public function testCompile($name, $arguments, $prefix, $regex, $variables, $tokens)
+ {
+ $r = new \ReflectionClass('Symfony\\Component\\Routing\\Route');
+ $route = $r->newInstanceArgs($arguments);
+
+ $compiled = $route->compile();
+ $this->assertEquals($prefix, $compiled->getStaticPrefix(), $name.' (static prefix)');
+ $this->assertEquals($regex, $compiled->getRegex(), $name.' (regex)');
+ $this->assertEquals($variables, $compiled->getVariables(), $name.' (variables)');
+ $this->assertEquals($tokens, $compiled->getTokens(), $name.' (tokens)');
+ }
+
+ public function provideCompileData()
+ {
+ return array(
+ array(
+ 'Static route',
+ array('/foo'),
+ '/foo', '#^/foo$#sD', array(), array(
+ array('text', '/foo'),
+ ),
+ ),
+
+ array(
+ 'Route with a variable',
+ array('/foo/{bar}'),
+ '/foo', '#^/foo/(?P<bar>[^/]++)$#sD', array('bar'), array(
+ array('variable', '/', '[^/]++', 'bar'),
+ array('text', '/foo'),
+ ),
+ ),
+
+ array(
+ 'Route with a variable that has a default value',
+ array('/foo/{bar}', array('bar' => 'bar')),
+ '/foo', '#^/foo(?:/(?P<bar>[^/]++))?$#sD', array('bar'), array(
+ array('variable', '/', '[^/]++', 'bar'),
+ array('text', '/foo'),
+ ),
+ ),
+
+ array(
+ 'Route with several variables',
+ array('/foo/{bar}/{foobar}'),
+ '/foo', '#^/foo/(?P<bar>[^/]++)/(?P<foobar>[^/]++)$#sD', array('bar', 'foobar'), array(
+ array('variable', '/', '[^/]++', 'foobar'),
+ array('variable', '/', '[^/]++', 'bar'),
+ array('text', '/foo'),
+ ),
+ ),
+
+ array(
+ 'Route with several variables that have default values',
+ array('/foo/{bar}/{foobar}', array('bar' => 'bar', 'foobar' => '')),
+ '/foo', '#^/foo(?:/(?P<bar>[^/]++)(?:/(?P<foobar>[^/]++))?)?$#sD', array('bar', 'foobar'), array(
+ array('variable', '/', '[^/]++', 'foobar'),
+ array('variable', '/', '[^/]++', 'bar'),
+ array('text', '/foo'),
+ ),
+ ),
+
+ array(
+ 'Route with several variables but some of them have no default values',
+ array('/foo/{bar}/{foobar}', array('bar' => 'bar')),
+ '/foo', '#^/foo/(?P<bar>[^/]++)/(?P<foobar>[^/]++)$#sD', array('bar', 'foobar'), array(
+ array('variable', '/', '[^/]++', 'foobar'),
+ array('variable', '/', '[^/]++', 'bar'),
+ array('text', '/foo'),
+ ),
+ ),
+
+ array(
+ 'Route with an optional variable as the first segment',
+ array('/{bar}', array('bar' => 'bar')),
+ '', '#^/(?P<bar>[^/]++)?$#sD', array('bar'), array(
+ array('variable', '/', '[^/]++', 'bar'),
+ ),
+ ),
+
+ array(
+ 'Route with a requirement of 0',
+ array('/{bar}', array('bar' => null), array('bar' => '0')),
+ '', '#^/(?P<bar>0)?$#sD', array('bar'), array(
+ array('variable', '/', '0', 'bar'),
+ ),
+ ),
+
+ array(
+ 'Route with an optional variable as the first segment with requirements',
+ array('/{bar}', array('bar' => 'bar'), array('bar' => '(foo|bar)')),
+ '', '#^/(?P<bar>(foo|bar))?$#sD', array('bar'), array(
+ array('variable', '/', '(foo|bar)', 'bar'),
+ ),
+ ),
+
+ array(
+ 'Route with only optional variables',
+ array('/{foo}/{bar}', array('foo' => 'foo', 'bar' => 'bar')),
+ '', '#^/(?P<foo>[^/]++)?(?:/(?P<bar>[^/]++))?$#sD', array('foo', 'bar'), array(
+ array('variable', '/', '[^/]++', 'bar'),
+ array('variable', '/', '[^/]++', 'foo'),
+ ),
+ ),
+
+ array(
+ 'Route with a variable in last position',
+ array('/foo-{bar}'),
+ '/foo-', '#^/foo\-(?P<bar>[^/]++)$#sD', array('bar'), array(
+ array('variable', '-', '[^/]++', 'bar'),
+ array('text', '/foo'),
+ ),
+ ),
+
+ array(
+ 'Route with nested placeholders',
+ array('/{static{var}static}'),
+ '/{static', '#^/\{static(?P<var>[^/]+)static\}$#sD', array('var'), array(
+ array('text', 'static}'),
+ array('variable', '', '[^/]+', 'var'),
+ array('text', '/{static'),
+ ),
+ ),
+
+ array(
+ 'Route without separator between variables',
+ array('/{w}{x}{y}{z}.{_format}', array('z' => 'default-z', '_format' => 'html'), array('y' => '(y|Y)')),
+ '', '#^/(?P<w>[^/\.]+)(?P<x>[^/\.]+)(?P<y>(y|Y))(?:(?P<z>[^/\.]++)(?:\.(?P<_format>[^/]++))?)?$#sD', array('w', 'x', 'y', 'z', '_format'), array(
+ array('variable', '.', '[^/]++', '_format'),
+ array('variable', '', '[^/\.]++', 'z'),
+ array('variable', '', '(y|Y)', 'y'),
+ array('variable', '', '[^/\.]+', 'x'),
+ array('variable', '/', '[^/\.]+', 'w'),
+ ),
+ ),
+
+ array(
+ 'Route with a format',
+ array('/foo/{bar}.{_format}'),
+ '/foo', '#^/foo/(?P<bar>[^/\.]++)\.(?P<_format>[^/]++)$#sD', array('bar', '_format'), array(
+ array('variable', '.', '[^/]++', '_format'),
+ array('variable', '/', '[^/\.]++', 'bar'),
+ array('text', '/foo'),
+ ),
+ ),
+
+ array(
+ 'Static non UTF-8 route',
+ array("/fo\xE9"),
+ "/fo\xE9", "#^/fo\xE9$#sD", array(), array(
+ array('text', "/fo\xE9"),
+ ),
+ ),
+
+ array(
+ 'Route with an explicit UTF-8 requirement',
+ array('/{bar}', array('bar' => null), array('bar' => '.'), array('utf8' => true)),
+ '', '#^/(?P<bar>.)?$#sDu', array('bar'), array(
+ array('variable', '/', '.', 'bar', true),
+ ),
+ ),
+ );
+ }
+
+ /**
+ * @group legacy
+ * @dataProvider provideCompileImplicitUtf8Data
+ * @expectedDeprecation Using UTF-8 route %s without setting the "utf8" option is deprecated %s.
+ */
+ public function testCompileImplicitUtf8Data($name, $arguments, $prefix, $regex, $variables, $tokens, $deprecationType)
+ {
+ $r = new \ReflectionClass('Symfony\\Component\\Routing\\Route');
+ $route = $r->newInstanceArgs($arguments);
+
+ $compiled = $route->compile();
+ $this->assertEquals($prefix, $compiled->getStaticPrefix(), $name.' (static prefix)');
+ $this->assertEquals($regex, $compiled->getRegex(), $name.' (regex)');
+ $this->assertEquals($variables, $compiled->getVariables(), $name.' (variables)');
+ $this->assertEquals($tokens, $compiled->getTokens(), $name.' (tokens)');
+ }
+
+ public function provideCompileImplicitUtf8Data()
+ {
+ return array(
+ array(
+ 'Static UTF-8 route',
+ array('/foé'),
+ '/foé', '#^/foé$#sDu', array(), array(
+ array('text', '/foé'),
+ ),
+ 'patterns',
+ ),
+
+ array(
+ 'Route with an implicit UTF-8 requirement',
+ array('/{bar}', array('bar' => null), array('bar' => 'é')),
+ '', '#^/(?P<bar>é)?$#sDu', array('bar'), array(
+ array('variable', '/', 'é', 'bar', true),
+ ),
+ 'requirements',
+ ),
+
+ array(
+ 'Route with a UTF-8 class requirement',
+ array('/{bar}', array('bar' => null), array('bar' => '\pM')),
+ '', '#^/(?P<bar>\pM)?$#sDu', array('bar'), array(
+ array('variable', '/', '\pM', 'bar', true),
+ ),
+ 'requirements',
+ ),
+
+ array(
+ 'Route with a UTF-8 separator',
+ array('/foo/{bar}§{_format}', array(), array(), array('compiler_class' => Utf8RouteCompiler::class)),
+ '/foo', '#^/foo/(?P<bar>[^/§]++)§(?P<_format>[^/]++)$#sDu', array('bar', '_format'), array(
+ array('variable', '§', '[^/]++', '_format', true),
+ array('variable', '/', '[^/§]++', 'bar', true),
+ array('text', '/foo'),
+ ),
+ 'patterns',
+ ),
+ );
+ }
+
+ /**
+ * @expectedException \LogicException
+ */
+ public function testRouteWithSameVariableTwice()
+ {
+ $route = new Route('/{name}/{name}');
+
+ $compiled = $route->compile();
+ }
+
+ /**
+ * @expectedException \LogicException
+ */
+ public function testRouteCharsetMismatch()
+ {
+ $route = new Route("/\xE9/{bar}", array(), array('bar' => '.'), array('utf8' => true));
+
+ $compiled = $route->compile();
+ }
+
+ /**
+ * @expectedException \LogicException
+ */
+ public function testRequirementCharsetMismatch()
+ {
+ $route = new Route('/foo/{bar}', array(), array('bar' => "\xE9"), array('utf8' => true));
+
+ $compiled = $route->compile();
+ }
+
+ /**
+ * @expectedException \InvalidArgumentException
+ */
+ public function testRouteWithFragmentAsPathParameter()
+ {
+ $route = new Route('/{_fragment}');
+
+ $compiled = $route->compile();
+ }
+
+ /**
+ * @dataProvider getVariableNamesStartingWithADigit
+ * @expectedException \DomainException
+ */
+ public function testRouteWithVariableNameStartingWithADigit($name)
+ {
+ $route = new Route('/{'.$name.'}');
+ $route->compile();
+ }
+
+ public function getVariableNamesStartingWithADigit()
+ {
+ return array(
+ array('09'),
+ array('123'),
+ array('1e2'),
+ );
+ }
+
+ /**
+ * @dataProvider provideCompileWithHostData
+ */
+ public function testCompileWithHost($name, $arguments, $prefix, $regex, $variables, $pathVariables, $tokens, $hostRegex, $hostVariables, $hostTokens)
+ {
+ $r = new \ReflectionClass('Symfony\\Component\\Routing\\Route');
+ $route = $r->newInstanceArgs($arguments);
+
+ $compiled = $route->compile();
+ $this->assertEquals($prefix, $compiled->getStaticPrefix(), $name.' (static prefix)');
+ $this->assertEquals($regex, str_replace(array("\n", ' '), '', $compiled->getRegex()), $name.' (regex)');
+ $this->assertEquals($variables, $compiled->getVariables(), $name.' (variables)');
+ $this->assertEquals($pathVariables, $compiled->getPathVariables(), $name.' (path variables)');
+ $this->assertEquals($tokens, $compiled->getTokens(), $name.' (tokens)');
+ $this->assertEquals($hostRegex, str_replace(array("\n", ' '), '', $compiled->getHostRegex()), $name.' (host regex)');
+ $this->assertEquals($hostVariables, $compiled->getHostVariables(), $name.' (host variables)');
+ $this->assertEquals($hostTokens, $compiled->getHostTokens(), $name.' (host tokens)');
+ }
+
+ public function provideCompileWithHostData()
+ {
+ return array(
+ array(
+ 'Route with host pattern',
+ array('/hello', array(), array(), array(), 'www.example.com'),
+ '/hello', '#^/hello$#sD', array(), array(), array(
+ array('text', '/hello'),
+ ),
+ '#^www\.example\.com$#sDi', array(), array(
+ array('text', 'www.example.com'),
+ ),
+ ),
+ array(
+ 'Route with host pattern and some variables',
+ array('/hello/{name}', array(), array(), array(), 'www.example.{tld}'),
+ '/hello', '#^/hello/(?P<name>[^/]++)$#sD', array('tld', 'name'), array('name'), array(
+ array('variable', '/', '[^/]++', 'name'),
+ array('text', '/hello'),
+ ),
+ '#^www\.example\.(?P<tld>[^\.]++)$#sDi', array('tld'), array(
+ array('variable', '.', '[^\.]++', 'tld'),
+ array('text', 'www.example'),
+ ),
+ ),
+ array(
+ 'Route with variable at beginning of host',
+ array('/hello', array(), array(), array(), '{locale}.example.{tld}'),
+ '/hello', '#^/hello$#sD', array('locale', 'tld'), array(), array(
+ array('text', '/hello'),
+ ),
+ '#^(?P<locale>[^\.]++)\.example\.(?P<tld>[^\.]++)$#sDi', array('locale', 'tld'), array(
+ array('variable', '.', '[^\.]++', 'tld'),
+ array('text', '.example'),
+ array('variable', '', '[^\.]++', 'locale'),
+ ),
+ ),
+ array(
+ 'Route with host variables that has a default value',
+ array('/hello', array('locale' => 'a', 'tld' => 'b'), array(), array(), '{locale}.example.{tld}'),
+ '/hello', '#^/hello$#sD', array('locale', 'tld'), array(), array(
+ array('text', '/hello'),
+ ),
+ '#^(?P<locale>[^\.]++)\.example\.(?P<tld>[^\.]++)$#sDi', array('locale', 'tld'), array(
+ array('variable', '.', '[^\.]++', 'tld'),
+ array('text', '.example'),
+ array('variable', '', '[^\.]++', 'locale'),
+ ),
+ ),
+ );
+ }
+
+ /**
+ * @expectedException \DomainException
+ */
+ public function testRouteWithTooLongVariableName()
+ {
+ $route = new Route(sprintf('/{%s}', str_repeat('a', RouteCompiler::VARIABLE_MAXIMUM_LENGTH + 1)));
+ $route->compile();
+ }
+}
+
+class Utf8RouteCompiler extends RouteCompiler
+{
+ const SEPARATORS = '/§';
+}
diff --git a/assets/php/vendor/symfony/routing/Tests/RouteTest.php b/assets/php/vendor/symfony/routing/Tests/RouteTest.php
new file mode 100644
index 0000000..c7af058
--- /dev/null
+++ b/assets/php/vendor/symfony/routing/Tests/RouteTest.php
@@ -0,0 +1,258 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Routing\Tests;
+
+use PHPUnit\Framework\TestCase;
+use Symfony\Component\Routing\Route;
+
+class RouteTest extends TestCase
+{
+ public function testConstructor()
+ {
+ $route = new Route('/{foo}', array('foo' => 'bar'), array('foo' => '\d+'), array('foo' => 'bar'), '{locale}.example.com');
+ $this->assertEquals('/{foo}', $route->getPath(), '__construct() takes a path as its first argument');
+ $this->assertEquals(array('foo' => 'bar'), $route->getDefaults(), '__construct() takes defaults as its second argument');
+ $this->assertEquals(array('foo' => '\d+'), $route->getRequirements(), '__construct() takes requirements as its third argument');
+ $this->assertEquals('bar', $route->getOption('foo'), '__construct() takes options as its fourth argument');
+ $this->assertEquals('{locale}.example.com', $route->getHost(), '__construct() takes a host pattern as its fifth argument');
+
+ $route = new Route('/', array(), array(), array(), '', array('Https'), array('POST', 'put'), 'context.getMethod() == "GET"');
+ $this->assertEquals(array('https'), $route->getSchemes(), '__construct() takes schemes as its sixth argument and lowercases it');
+ $this->assertEquals(array('POST', 'PUT'), $route->getMethods(), '__construct() takes methods as its seventh argument and uppercases it');
+ $this->assertEquals('context.getMethod() == "GET"', $route->getCondition(), '__construct() takes a condition as its eight argument');
+
+ $route = new Route('/', array(), array(), array(), '', 'Https', 'Post');
+ $this->assertEquals(array('https'), $route->getSchemes(), '__construct() takes a single scheme as its sixth argument');
+ $this->assertEquals(array('POST'), $route->getMethods(), '__construct() takes a single method as its seventh argument');
+ }
+
+ public function testPath()
+ {
+ $route = new Route('/{foo}');
+ $route->setPath('/{bar}');
+ $this->assertEquals('/{bar}', $route->getPath(), '->setPath() sets the path');
+ $route->setPath('');
+ $this->assertEquals('/', $route->getPath(), '->setPath() adds a / at the beginning of the path if needed');
+ $route->setPath('bar');
+ $this->assertEquals('/bar', $route->getPath(), '->setPath() adds a / at the beginning of the path if needed');
+ $this->assertEquals($route, $route->setPath(''), '->setPath() implements a fluent interface');
+ $route->setPath('//path');
+ $this->assertEquals('/path', $route->getPath(), '->setPath() does not allow two slashes "//" at the beginning of the path as it would be confused with a network path when generating the path from the route');
+ }
+
+ public function testOptions()
+ {
+ $route = new Route('/{foo}');
+ $route->setOptions(array('foo' => 'bar'));
+ $this->assertEquals(array_merge(array(
+ 'compiler_class' => 'Symfony\\Component\\Routing\\RouteCompiler',
+ ), array('foo' => 'bar')), $route->getOptions(), '->setOptions() sets the options');
+ $this->assertEquals($route, $route->setOptions(array()), '->setOptions() implements a fluent interface');
+
+ $route->setOptions(array('foo' => 'foo'));
+ $route->addOptions(array('bar' => 'bar'));
+ $this->assertEquals($route, $route->addOptions(array()), '->addOptions() implements a fluent interface');
+ $this->assertEquals(array('foo' => 'foo', 'bar' => 'bar', 'compiler_class' => 'Symfony\\Component\\Routing\\RouteCompiler'), $route->getOptions(), '->addDefaults() keep previous defaults');
+ }
+
+ public function testOption()
+ {
+ $route = new Route('/{foo}');
+ $this->assertFalse($route->hasOption('foo'), '->hasOption() return false if option is not set');
+ $this->assertEquals($route, $route->setOption('foo', 'bar'), '->setOption() implements a fluent interface');
+ $this->assertEquals('bar', $route->getOption('foo'), '->setOption() sets the option');
+ $this->assertTrue($route->hasOption('foo'), '->hasOption() return true if option is set');
+ }
+
+ public function testDefaults()
+ {
+ $route = new Route('/{foo}');
+ $route->setDefaults(array('foo' => 'bar'));
+ $this->assertEquals(array('foo' => 'bar'), $route->getDefaults(), '->setDefaults() sets the defaults');
+ $this->assertEquals($route, $route->setDefaults(array()), '->setDefaults() implements a fluent interface');
+
+ $route->setDefault('foo', 'bar');
+ $this->assertEquals('bar', $route->getDefault('foo'), '->setDefault() sets a default value');
+
+ $route->setDefault('foo2', 'bar2');
+ $this->assertEquals('bar2', $route->getDefault('foo2'), '->getDefault() return the default value');
+ $this->assertNull($route->getDefault('not_defined'), '->getDefault() return null if default value is not set');
+
+ $route->setDefault('_controller', $closure = function () { return 'Hello'; });
+ $this->assertEquals($closure, $route->getDefault('_controller'), '->setDefault() sets a default value');
+
+ $route->setDefaults(array('foo' => 'foo'));
+ $route->addDefaults(array('bar' => 'bar'));
+ $this->assertEquals($route, $route->addDefaults(array()), '->addDefaults() implements a fluent interface');
+ $this->assertEquals(array('foo' => 'foo', 'bar' => 'bar'), $route->getDefaults(), '->addDefaults() keep previous defaults');
+ }
+
+ public function testRequirements()
+ {
+ $route = new Route('/{foo}');
+ $route->setRequirements(array('foo' => '\d+'));
+ $this->assertEquals(array('foo' => '\d+'), $route->getRequirements(), '->setRequirements() sets the requirements');
+ $this->assertEquals('\d+', $route->getRequirement('foo'), '->getRequirement() returns a requirement');
+ $this->assertNull($route->getRequirement('bar'), '->getRequirement() returns null if a requirement is not defined');
+ $route->setRequirements(array('foo' => '^\d+$'));
+ $this->assertEquals('\d+', $route->getRequirement('foo'), '->getRequirement() removes ^ and $ from the path');
+ $this->assertEquals($route, $route->setRequirements(array()), '->setRequirements() implements a fluent interface');
+
+ $route->setRequirements(array('foo' => '\d+'));
+ $route->addRequirements(array('bar' => '\d+'));
+ $this->assertEquals($route, $route->addRequirements(array()), '->addRequirements() implements a fluent interface');
+ $this->assertEquals(array('foo' => '\d+', 'bar' => '\d+'), $route->getRequirements(), '->addRequirement() keep previous requirements');
+ }
+
+ public function testRequirement()
+ {
+ $route = new Route('/{foo}');
+ $this->assertFalse($route->hasRequirement('foo'), '->hasRequirement() return false if requirement is not set');
+ $route->setRequirement('foo', '^\d+$');
+ $this->assertEquals('\d+', $route->getRequirement('foo'), '->setRequirement() removes ^ and $ from the path');
+ $this->assertTrue($route->hasRequirement('foo'), '->hasRequirement() return true if requirement is set');
+ }
+
+ /**
+ * @dataProvider getInvalidRequirements
+ * @expectedException \InvalidArgumentException
+ */
+ public function testSetInvalidRequirement($req)
+ {
+ $route = new Route('/{foo}');
+ $route->setRequirement('foo', $req);
+ }
+
+ public function getInvalidRequirements()
+ {
+ return array(
+ array(''),
+ array(array()),
+ array('^$'),
+ array('^'),
+ array('$'),
+ );
+ }
+
+ public function testHost()
+ {
+ $route = new Route('/');
+ $route->setHost('{locale}.example.net');
+ $this->assertEquals('{locale}.example.net', $route->getHost(), '->setHost() sets the host pattern');
+ }
+
+ public function testScheme()
+ {
+ $route = new Route('/');
+ $this->assertEquals(array(), $route->getSchemes(), 'schemes is initialized with array()');
+ $this->assertFalse($route->hasScheme('http'));
+ $route->setSchemes('hTTp');
+ $this->assertEquals(array('http'), $route->getSchemes(), '->setSchemes() accepts a single scheme string and lowercases it');
+ $this->assertTrue($route->hasScheme('htTp'));
+ $this->assertFalse($route->hasScheme('httpS'));
+ $route->setSchemes(array('HttpS', 'hTTp'));
+ $this->assertEquals(array('https', 'http'), $route->getSchemes(), '->setSchemes() accepts an array of schemes and lowercases them');
+ $this->assertTrue($route->hasScheme('htTp'));
+ $this->assertTrue($route->hasScheme('httpS'));
+ }
+
+ public function testMethod()
+ {
+ $route = new Route('/');
+ $this->assertEquals(array(), $route->getMethods(), 'methods is initialized with array()');
+ $route->setMethods('gEt');
+ $this->assertEquals(array('GET'), $route->getMethods(), '->setMethods() accepts a single method string and uppercases it');
+ $route->setMethods(array('gEt', 'PosT'));
+ $this->assertEquals(array('GET', 'POST'), $route->getMethods(), '->setMethods() accepts an array of methods and uppercases them');
+ }
+
+ public function testCondition()
+ {
+ $route = new Route('/');
+ $this->assertSame('', $route->getCondition());
+ $route->setCondition('context.getMethod() == "GET"');
+ $this->assertSame('context.getMethod() == "GET"', $route->getCondition());
+ }
+
+ public function testCompile()
+ {
+ $route = new Route('/{foo}');
+ $this->assertInstanceOf('Symfony\Component\Routing\CompiledRoute', $compiled = $route->compile(), '->compile() returns a compiled route');
+ $this->assertSame($compiled, $route->compile(), '->compile() only compiled the route once if unchanged');
+ $route->setRequirement('foo', '.*');
+ $this->assertNotSame($compiled, $route->compile(), '->compile() recompiles if the route was modified');
+ }
+
+ public function testSerialize()
+ {
+ $route = new Route('/prefix/{foo}', array('foo' => 'default'), array('foo' => '\d+'));
+
+ $serialized = serialize($route);
+ $unserialized = unserialize($serialized);
+
+ $this->assertEquals($route, $unserialized);
+ $this->assertNotSame($route, $unserialized);
+ }
+
+ /**
+ * Tests that the compiled version is also serialized to prevent the overhead
+ * of compiling it again after unserialize.
+ */
+ public function testSerializeWhenCompiled()
+ {
+ $route = new Route('/prefix/{foo}', array('foo' => 'default'), array('foo' => '\d+'));
+ $route->setHost('{locale}.example.net');
+ $route->compile();
+
+ $serialized = serialize($route);
+ $unserialized = unserialize($serialized);
+
+ $this->assertEquals($route, $unserialized);
+ $this->assertNotSame($route, $unserialized);
+ }
+
+ /**
+ * Tests that unserialization does not fail when the compiled Route is of a
+ * class other than CompiledRoute, such as a subclass of it.
+ */
+ public function testSerializeWhenCompiledWithClass()
+ {
+ $route = new Route('/', array(), array(), array('compiler_class' => '\Symfony\Component\Routing\Tests\Fixtures\CustomRouteCompiler'));
+ $this->assertInstanceOf('\Symfony\Component\Routing\Tests\Fixtures\CustomCompiledRoute', $route->compile(), '->compile() returned a proper route');
+
+ $serialized = serialize($route);
+ try {
+ $unserialized = unserialize($serialized);
+ $this->assertInstanceOf('\Symfony\Component\Routing\Tests\Fixtures\CustomCompiledRoute', $unserialized->compile(), 'the unserialized route compiled successfully');
+ } catch (\Exception $e) {
+ $this->fail('unserializing a route which uses a custom compiled route class');
+ }
+ }
+
+ /**
+ * Tests that the serialized representation of a route in one symfony version
+ * also works in later symfony versions, i.e. the unserialized route is in the
+ * same state as another, semantically equivalent, route.
+ */
+ public function testSerializedRepresentationKeepsWorking()
+ {
+ $serialized = 'C:31:"Symfony\Component\Routing\Route":936:{a:8:{s:4:"path";s:13:"/prefix/{foo}";s:4:"host";s:20:"{locale}.example.net";s:8:"defaults";a:1:{s:3:"foo";s:7:"default";}s:12:"requirements";a:1:{s:3:"foo";s:3:"\d+";}s:7:"options";a:1:{s:14:"compiler_class";s:39:"Symfony\Component\Routing\RouteCompiler";}s:7:"schemes";a:0:{}s:7:"methods";a:0:{}s:8:"compiled";C:39:"Symfony\Component\Routing\CompiledRoute":571:{a:8:{s:4:"vars";a:2:{i:0;s:6:"locale";i:1;s:3:"foo";}s:11:"path_prefix";s:7:"/prefix";s:10:"path_regex";s:31:"#^/prefix(?:/(?P<foo>\d+))?$#sD";s:11:"path_tokens";a:2:{i:0;a:4:{i:0;s:8:"variable";i:1;s:1:"/";i:2;s:3:"\d+";i:3;s:3:"foo";}i:1;a:2:{i:0;s:4:"text";i:1;s:7:"/prefix";}}s:9:"path_vars";a:1:{i:0;s:3:"foo";}s:10:"host_regex";s:40:"#^(?P<locale>[^\.]++)\.example\.net$#sDi";s:11:"host_tokens";a:2:{i:0;a:2:{i:0;s:4:"text";i:1;s:12:".example.net";}i:1;a:4:{i:0;s:8:"variable";i:1;s:0:"";i:2;s:7:"[^\.]++";i:3;s:6:"locale";}}s:9:"host_vars";a:1:{i:0;s:6:"locale";}}}}}';
+ $unserialized = unserialize($serialized);
+
+ $route = new Route('/prefix/{foo}', array('foo' => 'default'), array('foo' => '\d+'));
+ $route->setHost('{locale}.example.net');
+ $route->compile();
+
+ $this->assertEquals($route, $unserialized);
+ $this->assertNotSame($route, $unserialized);
+ }
+}
diff --git a/assets/php/vendor/symfony/routing/Tests/RouterTest.php b/assets/php/vendor/symfony/routing/Tests/RouterTest.php
new file mode 100644
index 0000000..3e3d43f
--- /dev/null
+++ b/assets/php/vendor/symfony/routing/Tests/RouterTest.php
@@ -0,0 +1,163 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Routing\Tests;
+
+use PHPUnit\Framework\TestCase;
+use Symfony\Component\Routing\RouteCollection;
+use Symfony\Component\Routing\Router;
+use Symfony\Component\HttpFoundation\Request;
+
+class RouterTest extends TestCase
+{
+ private $router = null;
+
+ private $loader = null;
+
+ protected function setUp()
+ {
+ $this->loader = $this->getMockBuilder('Symfony\Component\Config\Loader\LoaderInterface')->getMock();
+ $this->router = new Router($this->loader, 'routing.yml');
+ }
+
+ public function testSetOptionsWithSupportedOptions()
+ {
+ $this->router->setOptions(array(
+ 'cache_dir' => './cache',
+ 'debug' => true,
+ 'resource_type' => 'ResourceType',
+ ));
+
+ $this->assertSame('./cache', $this->router->getOption('cache_dir'));
+ $this->assertTrue($this->router->getOption('debug'));
+ $this->assertSame('ResourceType', $this->router->getOption('resource_type'));
+ }
+
+ /**
+ * @expectedException \InvalidArgumentException
+ * @expectedExceptionMessage The Router does not support the following options: "option_foo", "option_bar"
+ */
+ public function testSetOptionsWithUnsupportedOptions()
+ {
+ $this->router->setOptions(array(
+ 'cache_dir' => './cache',
+ 'option_foo' => true,
+ 'option_bar' => 'baz',
+ 'resource_type' => 'ResourceType',
+ ));
+ }
+
+ public function testSetOptionWithSupportedOption()
+ {
+ $this->router->setOption('cache_dir', './cache');
+
+ $this->assertSame('./cache', $this->router->getOption('cache_dir'));
+ }
+
+ /**
+ * @expectedException \InvalidArgumentException
+ * @expectedExceptionMessage The Router does not support the "option_foo" option
+ */
+ public function testSetOptionWithUnsupportedOption()
+ {
+ $this->router->setOption('option_foo', true);
+ }
+
+ /**
+ * @expectedException \InvalidArgumentException
+ * @expectedExceptionMessage The Router does not support the "option_foo" option
+ */
+ public function testGetOptionWithUnsupportedOption()
+ {
+ $this->router->getOption('option_foo', true);
+ }
+
+ public function testThatRouteCollectionIsLoaded()
+ {
+ $this->router->setOption('resource_type', 'ResourceType');
+
+ $routeCollection = new RouteCollection();
+
+ $this->loader->expects($this->once())
+ ->method('load')->with('routing.yml', 'ResourceType')
+ ->will($this->returnValue($routeCollection));
+
+ $this->assertSame($routeCollection, $this->router->getRouteCollection());
+ }
+
+ /**
+ * @dataProvider provideMatcherOptionsPreventingCaching
+ */
+ public function testMatcherIsCreatedIfCacheIsNotConfigured($option)
+ {
+ $this->router->setOption($option, null);
+
+ $this->loader->expects($this->once())
+ ->method('load')->with('routing.yml', null)
+ ->will($this->returnValue(new RouteCollection()));
+
+ $this->assertInstanceOf('Symfony\\Component\\Routing\\Matcher\\UrlMatcher', $this->router->getMatcher());
+ }
+
+ public function provideMatcherOptionsPreventingCaching()
+ {
+ return array(
+ array('cache_dir'),
+ array('matcher_cache_class'),
+ );
+ }
+
+ /**
+ * @dataProvider provideGeneratorOptionsPreventingCaching
+ */
+ public function testGeneratorIsCreatedIfCacheIsNotConfigured($option)
+ {
+ $this->router->setOption($option, null);
+
+ $this->loader->expects($this->once())
+ ->method('load')->with('routing.yml', null)
+ ->will($this->returnValue(new RouteCollection()));
+
+ $this->assertInstanceOf('Symfony\\Component\\Routing\\Generator\\UrlGenerator', $this->router->getGenerator());
+ }
+
+ public function provideGeneratorOptionsPreventingCaching()
+ {
+ return array(
+ array('cache_dir'),
+ array('generator_cache_class'),
+ );
+ }
+
+ public function testMatchRequestWithUrlMatcherInterface()
+ {
+ $matcher = $this->getMockBuilder('Symfony\Component\Routing\Matcher\UrlMatcherInterface')->getMock();
+ $matcher->expects($this->once())->method('match');
+
+ $p = new \ReflectionProperty($this->router, 'matcher');
+ $p->setAccessible(true);
+ $p->setValue($this->router, $matcher);
+
+ $this->router->matchRequest(Request::create('/'));
+ }
+
+ public function testMatchRequestWithRequestMatcherInterface()
+ {
+ $matcher = $this->getMockBuilder('Symfony\Component\Routing\Matcher\RequestMatcherInterface')->getMock();
+ $matcher->expects($this->once())->method('matchRequest');
+
+ $p = new \ReflectionProperty($this->router, 'matcher');
+ $p->setAccessible(true);
+ $p->setValue($this->router, $matcher);
+
+ $this->router->matchRequest(Request::create('/'));
+ }
+}