diff --git a/phpstan.neon b/phpstan.neon index 0ba884ff..79dc6a96 100644 --- a/phpstan.neon +++ b/phpstan.neon @@ -3,5 +3,6 @@ parameters: treatPhpDocTypesAsCertain: false paths: - src + - tests includes: - phpstan-baseline.neon diff --git a/src/Knp/Menu/Util/MenuManipulator.php b/src/Knp/Menu/Util/MenuManipulator.php index 34d6099c..fe650110 100644 --- a/src/Knp/Menu/Util/MenuManipulator.php +++ b/src/Knp/Menu/Util/MenuManipulator.php @@ -208,7 +208,7 @@ public function toArray(ItemInterface $item, ?int $depth = null): array * * @param string|ItemInterface|array|\Traversable|null $subItem A string or array to append onto the end of the array * - * @phpstan-param string|ItemInterface|array|\Traversable|null $subItem + * @phpstan-param string|ItemInterface|array|\Traversable|null $subItem * * @return array> * @phpstan-return list diff --git a/tests/Knp/Menu/Tests/Iterator/CurrentItemFilterIteratorTest.php b/tests/Knp/Menu/Tests/Iterator/CurrentItemFilterIteratorTest.php index a3636ffe..788a6334 100644 --- a/tests/Knp/Menu/Tests/Iterator/CurrentItemFilterIteratorTest.php +++ b/tests/Knp/Menu/Tests/Iterator/CurrentItemFilterIteratorTest.php @@ -11,13 +11,17 @@ final class CurrentItemFilterIteratorTest extends MenuTestCase { public function testSimpleFiltering(): void { - $this->pt1->setCurrent(true); - $this->ch2->setCurrent(true); - $this->gc1->setCurrent(true); + $pt1 = $this->pt1; + $ch2 = $this->ch2; + $gc1 = $this->gc1; + $menu = $this->menu; + $pt1->setCurrent(true); + $ch2->setCurrent(true); + $gc1->setCurrent(true); $names = []; // FilterIterator expects an Iterator implementation explicitly, not an IteratorAggregate. - $iterator = new CurrentItemFilterIterator($this->menu->getIterator(), new Matcher()); + $iterator = new CurrentItemFilterIterator(new \IteratorIterator($this->menu), new Matcher()); foreach ($iterator as $value) { $names[] = $value->getName(); @@ -28,13 +32,17 @@ public function testSimpleFiltering(): void public function testFiltering(): void { - $this->pt1->setCurrent(true); - $this->ch2->setCurrent(true); - $this->gc1->setCurrent(true); + $pt1 = $this->pt1; + $ch2 = $this->ch2; + $gc1 = $this->gc1; + $menu = $this->menu; + $pt1->setCurrent(true); + $ch2->setCurrent(true); + $gc1->setCurrent(true); $names = []; $iterator = new CurrentItemFilterIterator( - new \RecursiveIteratorIterator(new RecursiveItemIterator($this->menu), \RecursiveIteratorIterator::SELF_FIRST), + new \RecursiveIteratorIterator(new RecursiveItemIterator($menu), \RecursiveIteratorIterator::SELF_FIRST), new Matcher() ); diff --git a/tests/Knp/Menu/Tests/Iterator/DisplayedItemFilterIteratorTest.php b/tests/Knp/Menu/Tests/Iterator/DisplayedItemFilterIteratorTest.php index cdfd1f80..a1074094 100644 --- a/tests/Knp/Menu/Tests/Iterator/DisplayedItemFilterIteratorTest.php +++ b/tests/Knp/Menu/Tests/Iterator/DisplayedItemFilterIteratorTest.php @@ -10,13 +10,17 @@ final class DisplayedItemFilterIteratorTest extends MenuTestCase { public function testFiltering(): void { - $this->ch1->setDisplay(false); - $this->ch2->setDisplay(false); - $this->ch4->setDisplayChildren(false); + $ch1 = $this->ch1; + $ch2 = $this->ch2; + $ch4 = $this->ch4; + $menu = $this->menu; + $ch1->setDisplay(false); + $ch2->setDisplay(false); + $ch4->setDisplayChildren(false); $names = []; $iterator = new \RecursiveIteratorIterator( - new DisplayedItemFilterIterator(new RecursiveItemIterator($this->menu)), + new DisplayedItemFilterIterator(new RecursiveItemIterator(new \ArrayIterator($menu->getChildren()))), \RecursiveIteratorIterator::SELF_FIRST ); foreach ($iterator as $value) { diff --git a/tests/Knp/Menu/Tests/Iterator/IteratorTest.php b/tests/Knp/Menu/Tests/Iterator/IteratorTest.php index d96674bb..375ee921 100644 --- a/tests/Knp/Menu/Tests/Iterator/IteratorTest.php +++ b/tests/Knp/Menu/Tests/Iterator/IteratorTest.php @@ -28,10 +28,11 @@ public function testRecursiveIterator(): void $child->expects($this->any()) ->method('getIterator') ->willReturn(new \EmptyIterator()); - $this->menu->addChild($child); + $menu = $this->menu; + $menu->addChild($child); $names = []; - foreach (new \RecursiveIteratorIterator(new RecursiveItemIterator($this->menu), \RecursiveIteratorIterator::SELF_FIRST) as $value) { + foreach (new \RecursiveIteratorIterator(new RecursiveItemIterator($menu), \RecursiveIteratorIterator::SELF_FIRST) as $value) { $names[] = $value->getName(); } @@ -50,8 +51,9 @@ public function testRecursiveIteratorLeavesOnly(): void public function testFullTreeIterator(): void { + $menu = $this->menu; $fullTreeIterator = new \RecursiveIteratorIterator( - new RecursiveItemIterator(new \ArrayIterator([$this->menu])), // recursive iterator containing the root item + new RecursiveItemIterator(new \ArrayIterator([$menu])), // recursive iterator containing the root item \RecursiveIteratorIterator::SELF_FIRST ); diff --git a/tests/Knp/Menu/Tests/Matcher/Voter/CallbackVoterTest.php b/tests/Knp/Menu/Tests/Matcher/Voter/CallbackVoterTest.php index 8efd4324..2a2d6a2b 100644 --- a/tests/Knp/Menu/Tests/Matcher/Voter/CallbackVoterTest.php +++ b/tests/Knp/Menu/Tests/Matcher/Voter/CallbackVoterTest.php @@ -53,12 +53,12 @@ public function testMatching(callable $callback, ?bool $expected): void } /** - * @return iterable + * @return iterable */ public static function provideData(): iterable { - yield 'matching' => [fn (): ?bool => true, true]; - yield 'not matching' => [fn (): ?bool => false, false]; - yield 'skipping' => [fn (): ?bool => null, null]; + yield 'matching' => [static fn (): bool => true, true]; + yield 'not matching' => [static fn (): bool => false, false]; + yield 'skipping' => [static fn (): ?bool => null, null]; } } diff --git a/tests/Knp/Menu/Tests/MenuFactoryTest.php b/tests/Knp/Menu/Tests/MenuFactoryTest.php index 884cc329..bb4b2a62 100644 --- a/tests/Knp/Menu/Tests/MenuFactoryTest.php +++ b/tests/Knp/Menu/Tests/MenuFactoryTest.php @@ -16,11 +16,11 @@ public function testExtensions(): void $extension1 = $this->getMockBuilder(ExtensionInterface::class)->getMock(); $extension1->expects($this->once()) ->method('buildOptions') - ->with(['foo' => 'bar']) - ->willReturn(['uri' => 'foobar']); + ->with(['uri' => 'foobar']) + ->willReturnArgument(0); $extension1->expects($this->once()) ->method('buildItem') - ->with($this->isInstanceOf(ItemInterface::class), $this->containsCustom('foobar')); + ->with($this->isInstanceOf(ItemInterface::class), $this->containsEqual('foobar')); $factory->addExtension($extension1); @@ -28,10 +28,10 @@ public function testExtensions(): void $extension2->expects($this->once()) ->method('buildOptions') ->with(['foo' => 'baz']) - ->willReturn(['foo' => 'bar']); - $extension1->expects($this->once()) + ->willReturn(['uri' => 'foobar']); + $extension2->expects($this->once()) ->method('buildItem') - ->with($this->isInstanceOf(ItemInterface::class), $this->containsCustom('foobar')); + ->with($this->isInstanceOf(ItemInterface::class), $this->containsEqual('foobar')); $factory->addExtension($extension2, 10); @@ -57,16 +57,5 @@ public function testCreateItem(): void $this->assertEquals('foo', $item->getLinkAttribute('class')); } - private function containsCustom(string $value): ?object - { - if (\method_exists($this, 'contains')) { - return $this->contains($value); - } - - if (\method_exists($this, 'containsEqual')) { - return $this->containsEqual($value); - } - return null; - } } diff --git a/tests/Knp/Menu/Tests/MenuItemGetterSetterTest.php b/tests/Knp/Menu/Tests/MenuItemGetterSetterTest.php index c59c9845..930cbe77 100644 --- a/tests/Knp/Menu/Tests/MenuItemGetterSetterTest.php +++ b/tests/Knp/Menu/Tests/MenuItemGetterSetterTest.php @@ -171,8 +171,8 @@ public function testChildren(): void { $menu = $this->createMenu(); $child = $this->createMenu('child_menu'); - $menu->setChildren([$child]); - $this->assertEquals([$child], $menu->getChildren()); + $menu->setChildren(['child' => $child]); + $this->assertEquals(['child' => $child], $menu->getChildren()); } public function testSetExistingNameThrowsAnException(): void @@ -182,7 +182,7 @@ public function testSetExistingNameThrowsAnException(): void $menu = $this->createMenu(); $menu->addChild('jack'); $menu->addChild('joe'); - $menu->getChild('joe')->setName('jack'); + $menu->getChildren()['joe']->setName('jack'); } public function testSetSameName(): void diff --git a/tests/Knp/Menu/Tests/MenuItemTreeTest.php b/tests/Knp/Menu/Tests/MenuItemTreeTest.php index dcdf37bf..d011e3e5 100644 --- a/tests/Knp/Menu/Tests/MenuItemTreeTest.php +++ b/tests/Knp/Menu/Tests/MenuItemTreeTest.php @@ -3,6 +3,7 @@ namespace Knp\Menu\Tests; use Knp\Menu\FactoryInterface; +use Knp\Menu\ItemInterface; use Knp\Menu\MenuItem; final class TestMenuItem extends MenuItem @@ -13,64 +14,90 @@ final class MenuItemTreeTest extends MenuTestCase { public function testSampleTreeIntegrity(): void { - $this->assertCount(2, $this->menu); - $this->assertCount(3, $this->menu['Parent 1']); - $this->assertCount(1, $this->menu['Parent 2']); - $this->assertCount(1, $this->menu['Parent 2']['Child 4']); - $this->assertEquals('Grandchild 1', $this->menu['Parent 2']['Child 4']['Grandchild 1']->getName()); + $menu = $this->menu; + $pt1 = $this->pt1; + $pt2 = $this->pt2; + $ch4 = $this->ch4; + $gc1 = $this->gc1; + $this->assertCount(2, $menu->getChildren()); + $this->assertCount(3, $pt1->getChildren()); + $this->assertCount(1, $pt2->getChildren()); + $this->assertCount(1, $ch4->getChildren()); + $this->assertEquals('Grandchild 1', $gc1->getName()); } public function testGetLevel(): void { - $this->assertEquals(0, $this->menu->getLevel()); - $this->assertEquals(1, $this->pt1->getLevel()); - $this->assertEquals(1, $this->pt2->getLevel()); - $this->assertEquals(2, $this->ch4->getLevel()); - $this->assertEquals(3, $this->gc1->getLevel()); + $menu = $this->menu; + $pt1 = $this->pt1; + $pt2 = $this->pt2; + $ch4 = $this->ch4; + $gc1 = $this->gc1; + $this->assertEquals(0, $menu->getLevel()); + $this->assertEquals(1, $pt1->getLevel()); + $this->assertEquals(1, $pt2->getLevel()); + $this->assertEquals(2, $ch4->getLevel()); + $this->assertEquals(3, $gc1->getLevel()); } public function testGetRoot(): void { - $this->assertSame($this->menu, $this->menu->getRoot()); - $this->assertSame($this->menu, $this->pt1->getRoot()); - $this->assertSame($this->menu, $this->gc1->getRoot()); + $menu = $this->menu; + $pt1 = $this->pt1; + $gc1 = $this->gc1; + $this->assertSame($menu, $menu->getRoot()); + $this->assertSame($menu, $pt1->getRoot()); + $this->assertSame($menu, $gc1->getRoot()); } public function testIsRoot(): void { - $this->assertTrue($this->menu->isRoot()); - $this->assertFalse($this->pt1->isRoot()); - $this->assertFalse($this->ch3->isRoot()); + $menu = $this->menu; + $pt1 = $this->pt1; + $ch3 = $this->ch3; + $this->assertTrue($menu->isRoot()); + $this->assertFalse($pt1->isRoot()); + $this->assertFalse($ch3->isRoot()); } public function testGetParent(): void { - $this->assertNull($this->menu->getParent()); - $this->assertSame($this->menu, $this->pt1->getParent()); - $this->assertSame($this->ch4, $this->gc1->getParent()); + $menu = $this->menu; + $pt1 = $this->pt1; + $ch4 = $this->ch4; + $gc1 = $this->gc1; + $this->assertNull($menu->getParent()); + $this->assertSame($menu, $pt1->getParent()); + $this->assertSame($ch4, $gc1->getParent()); } public function testMoveSampleMenuToNewRoot(): void { $newRoot = new TestMenuItem('newRoot', $this->getMockBuilder(FactoryInterface::class)->getMock()); - $newRoot->addChild($this->menu); + $menu = $this->menu; + $pt1 = $this->pt1; + $newRoot->addChild($menu); - $this->assertEquals(1, $this->menu->getLevel()); - $this->assertEquals(2, $this->pt1->getLevel()); + $this->assertEquals(1, $menu->getLevel()); + $this->assertEquals(2, $pt1->getLevel()); - $this->assertSame($newRoot, $this->menu->getRoot()); - $this->assertSame($newRoot, $this->pt1->getRoot()); - $this->assertFalse($this->menu->isRoot()); + $this->assertSame($newRoot, $menu->getRoot()); + $this->assertSame($newRoot, $pt1->getRoot()); + $this->assertFalse($menu->isRoot()); $this->assertTrue($newRoot->isRoot()); - $this->assertSame($newRoot, $this->menu->getParent()); + $this->assertSame($newRoot, $menu->getParent()); } public function testIsFirst(): void { - $this->assertFalse($this->menu->isFirst(), 'The root item is not considered as first'); - $this->assertTrue($this->pt1->isFirst()); - $this->assertFalse($this->pt2->isFirst()); - $this->assertTrue($this->ch4->isFirst()); + $menu = $this->menu; + $pt1 = $this->pt1; + $pt2 = $this->pt2; + $ch4 = $this->ch4; + $this->assertFalse($menu->isFirst(), 'The root item is not considered as first'); + $this->assertTrue($pt1->isFirst()); + $this->assertFalse($pt2->isFirst()); + $this->assertTrue($ch4->isFirst()); } public function testActsLikeFirst(): void @@ -93,10 +120,14 @@ public function testActsLikeFirstWithNoDisplayedItem(): void public function testIsLast(): void { - $this->assertFalse($this->menu->isLast(), 'The root item is not considered as last'); - $this->assertFalse($this->pt1->isLast()); - $this->assertTrue($this->pt2->isLast()); - $this->assertTrue($this->ch4->isLast()); + $menu = $this->menu; + $pt1 = $this->pt1; + $pt2 = $this->pt2; + $ch4 = $this->ch4; + $this->assertFalse($menu->isLast(), 'The root item is not considered as last'); + $this->assertFalse($pt1->isLast()); + $this->assertTrue($pt2->isLast()); + $this->assertTrue($ch4->isLast()); } public function testActsLikeLast(): void @@ -119,53 +150,62 @@ public function testActsLikeLastWithNoDisplayedItem(): void public function testArrayAccess(): void { - $this->menu->addChild('Child Menu'); - $this->assertEquals('Child Menu', $this->menu['Child Menu']->getName()); - $this->assertNull($this->menu['Fake']); - - $this->menu['New Child'] = 'New Label'; - $this->assertEquals(MenuItem::class, \get_class($this->menu['New Child'])); - $this->assertEquals('New Child', $this->menu['New Child']->getName()); - $this->assertEquals('New Label', $this->menu['New Child']->getLabel()); - - unset($this->menu['New Child']); - $this->assertNull($this->menu['New Child']); + $menu = $this->menu; + $menu->addChild('Child Menu'); + $childMenu = $menu['Child Menu']; + /** @var ItemInterface $childMenu */ + $this->assertEquals('Child Menu', $childMenu->getName()); + $this->assertNull($menu->getChild('Fake')); + + $menu->addChild('New Child', ['label' => 'New Label']); + $newChild = $menu['New Child']; + /** @var ItemInterface $newChild */ + $this->assertEquals(MenuItem::class, \get_class($newChild)); + $this->assertEquals('New Child', $newChild->getName()); + $this->assertEquals('New Label', $newChild->getLabel()); + + unset($menu['New Child']); + $this->assertNull($menu['New Child']); } public function testCountable(): void { - $this->assertCount(2, $this->menu); + $menu = $this->menu; + $this->assertCount(2, $menu); - $this->menu->addChild('New Child'); - $this->assertCount(3, $this->menu); + $menu->addChild('New Child'); + $this->assertCount(3, $menu); - unset($this->menu['New Child']); - $this->assertCount(2, $this->menu); + unset($menu['New Child']); + $this->assertCount(2, $menu); } public function testGetChildren(): void { - $children = $this->ch4->getChildren(); - $this->assertCount(1, $children); - $this->assertEquals($this->gc1->getName(), $children['Grandchild 1']->getName()); + $this->assertCount(1, $this->ch4->getChildren()); + $this->assertSame($this->gc1, $this->ch4['Grandchild 1']); } public function testGetFirstChild(): void { - $this->assertSame($this->pt1, $this->menu->getFirstChild()); + $menu = $this->menu; + $pt1 = $this->pt1; + $this->assertSame($pt1, $menu->getFirstChild()); // test for bug in getFirstChild implementation (when internal array pointer is changed getFirstChild returns wrong child) - foreach ($this->menu->getChildren() as $c) { + foreach ($menu->getChildren() as $c) { } - $this->assertSame($this->pt1, $this->menu->getFirstChild()); + $this->assertSame($pt1, $menu->getFirstChild()); } public function testGetLastChild(): void { - $this->assertSame($this->pt2, $this->menu->getLastChild()); + $menu = $this->menu; + $pt2 = $this->pt2; + $this->assertSame($pt2, $menu->getLastChild()); // test for bug in getFirstChild implementation (when internal array pointer is changed getLastChild returns wrong child) - foreach ($this->menu->getChildren() as $c) { + foreach ($menu->getChildren() as $c) { } - $this->assertSame($this->pt2, $this->menu->getLastChild()); + $this->assertSame($pt2, $menu->getLastChild()); } public function testAddChildDoesNotUSeTheFactoryIfItem(): void @@ -192,44 +232,50 @@ public function testAddChildFailsIfInAnotherMenu(): void public function testGetChild(): void { - $this->assertSame($this->gc1, $this->ch4->getChild('Grandchild 1')); - $this->assertNull($this->ch4->getChild('nonexistentchild')); + $this->assertSame($this->gc1, $this->ch4['Grandchild 1']); + $this->assertNull($this->ch4['nonexistentchild']); } public function testRemoveChild(): void { - $gc2 = $this->ch4->addChild('gc2'); - $gc3 = $this->ch4->addChild('gc3'); - $gc4 = $this->ch4->addChild('gc4'); - $this->assertCount(4, $this->ch4); - $this->ch4->removeChild('gc4'); - $this->assertCount(3, $this->ch4); - $this->assertTrue($this->ch4->getChild('Grandchild 1')->isFirst()); - $this->assertTrue($this->ch4->getChild('gc3')->isLast()); + $ch4 = $this->ch4; + $ch4->addChild('gc2'); + $gc3 = $ch4->addChild('gc3'); + $ch4->addChild('gc4'); + $this->assertCount(4, $ch4); + $ch4->removeChild('gc4'); + $this->assertCount(3, $ch4); + $this->assertTrue($this->gc1->isFirst()); + $this->assertTrue($gc3->isLast()); } public function testRemoveFakeChild(): void { - $this->menu->removeChild('fake'); - $this->assertCount(2, $this->menu); + $menu = $this->menu; + $menu->removeChild('fake'); + $this->assertCount(2, $menu->getChildren()); } public function testReAddRemovedChild(): void { - $gc2 = $this->ch4->addChild('gc2'); - $this->ch4->removeChild('gc2'); - $this->menu->addChild($gc2); - $this->assertCount(3, $this->menu); + $ch4 = $this->ch4; + $menu = $this->menu; + $gc2 = $ch4->addChild('gc2'); + $ch4->removeChild('gc2'); + $menu->addChild($gc2); + $this->assertCount(3, $menu); $this->assertTrue($gc2->isLast()); $this->assertFalse($this->pt2->isLast()); } public function testUpdateChildAfterRename(): void { - $this->pt1->setName('Temp name'); - $this->assertSame($this->pt1, $this->menu->getChild('Temp name')); - $this->assertEquals(['Temp name', 'Parent 2'], \array_keys($this->menu->getChildren())); - $this->assertNull($this->menu->getChild('Parent 1')); + $pt1 = $this->pt1; + $menu = $this->menu; + $pt1->setName('Temp name'); + $this->assertSame($pt1, $menu['Temp name']); + $this->assertEquals(['Temp name', 'Parent 2'], \array_keys($menu->getChildren())); + $this->assertNull($menu['Parent 1']); } public function testRenameToExistingSiblingNameThrowAnException(): void @@ -243,7 +289,9 @@ public function testGetUri(): void { $this->addChildWithExternalUrl(); $this->assertNull($this->pt1->getUri()); - $this->assertEquals('http://www.symfony-reloaded.org', $this->menu['child']->getUri()); + $child = $this->menu['child']; + /** @var ItemInterface $child */ + $this->assertEquals('http://www.symfony-reloaded.org', $child->getUri()); } protected function addChildWithExternalUrl(): void diff --git a/tests/Knp/Menu/Tests/MenuTestCase.php b/tests/Knp/Menu/Tests/MenuTestCase.php index 50b0af59..151c8776 100644 --- a/tests/Knp/Menu/Tests/MenuTestCase.php +++ b/tests/Knp/Menu/Tests/MenuTestCase.php @@ -9,21 +9,21 @@ abstract class MenuTestCase extends TestCase { - protected ItemInterface|null $menu; + protected ItemInterface $menu; - protected ItemInterface|null $pt1; + protected ItemInterface $pt1; - protected ItemInterface|null $ch1; + protected ItemInterface $ch1; - protected ItemInterface|null $ch2; + protected ItemInterface $ch2; - protected ItemInterface|null $ch3; + protected ItemInterface $ch3; - protected ItemInterface|null $pt2; + protected ItemInterface $pt2; - protected ItemInterface|null $ch4; + protected ItemInterface $ch4; - protected ItemInterface|null $gc1; + protected ItemInterface $gc1; protected function setUp(): void { @@ -44,14 +44,6 @@ protected function setUp(): void protected function tearDown(): void { - $this->menu = null; - $this->pt1 = null; - $this->ch1 = null; - $this->ch2 = null; - $this->ch3 = null; - $this->pt2 = null; - $this->ch4 = null; - $this->gc1 = null; } // prints a visual representation of our basic testing tree diff --git a/tests/Knp/Menu/Tests/Provider/ArrayAccessProviderTest.php b/tests/Knp/Menu/Tests/Provider/ArrayAccessProviderTest.php index b4830941..694c0345 100644 --- a/tests/Knp/Menu/Tests/Provider/ArrayAccessProviderTest.php +++ b/tests/Knp/Menu/Tests/Provider/ArrayAccessProviderTest.php @@ -18,6 +18,7 @@ public function testHas(): void public function testGetExistentMenu(): void { + /** @var \ArrayObject $registry */ $registry = new \ArrayObject(); $menu = $this->getMockBuilder(ItemInterface::class)->getMock(); $registry['menu'] = $menu; @@ -27,9 +28,10 @@ public function testGetExistentMenu(): void public function testGetMenuAsClosure(): void { + /** @var \ArrayObject $registry */ $registry = new \ArrayObject(); $menu = $this->getMockBuilder(ItemInterface::class)->getMock(); - $registry['menu'] = static function (array $options, object $c) use ($menu) { + $registry['menu'] = static function (array $options, \ArrayObject $c) use ($menu) { $c['options'] = $options; return $menu; diff --git a/tests/Knp/Menu/Tests/Provider/LazyProviderTest.php b/tests/Knp/Menu/Tests/Provider/LazyProviderTest.php index c679e796..96beb558 100644 --- a/tests/Knp/Menu/Tests/Provider/LazyProviderTest.php +++ b/tests/Knp/Menu/Tests/Provider/LazyProviderTest.php @@ -10,7 +10,9 @@ final class LazyProviderTest extends TestCase { public function testHas(): void { - $provider = new LazyProvider(['first' => static function (): void {}, 'second' => static function (): void {}]); + /** @var array $builders */ + $builders = ['first' => static function (): void {}, 'second' => static function (): void {}]; + $provider = new LazyProvider($builders); $this->assertTrue($provider->has('first')); $this->assertTrue($provider->has('second')); $this->assertFalse($provider->has('third')); @@ -43,7 +45,9 @@ public function testGetWithBrokenBuilder(): void { $this->expectException(\LogicException::class); - $provider = new LazyProvider(['broken' => new \stdClass()]); + /** @var array $builders */ + $builders = ['broken' => new \stdClass()]; + $provider = new LazyProvider($builders); $provider->get('broken'); } diff --git a/tests/Knp/Menu/Tests/Renderer/AbstractRendererTest.php b/tests/Knp/Menu/Tests/Renderer/AbstractRendererTest.php index e568c2be..320f429d 100644 --- a/tests/Knp/Menu/Tests/Renderer/AbstractRendererTest.php +++ b/tests/Knp/Menu/Tests/Renderer/AbstractRendererTest.php @@ -28,11 +28,24 @@ protected function tearDown(): void $this->renderer = null; } + protected function getRenderer(): RendererInterface + { + if ($this->renderer === null) { + throw new \LogicException('Renderer not initialized'); + } + return $this->renderer; + } + + protected function getMenu(): \Knp\Menu\ItemInterface + { + return $this->menu; + } + public function testRenderEmptyRoot(): void { $menu = new MenuItem('test', new MenuFactory()); $rendered = ''; - $this->assertEquals($rendered, $this->renderer->render($menu)); + $this->assertEquals($rendered, $this->getRenderer()->render($menu)); } public function testRenderRootWithAttributes(): void @@ -41,7 +54,7 @@ public function testRenderRootWithAttributes(): void $menu->setChildrenAttributes(['class' => 'test_class']); $menu->addChild('c1'); $rendered = '
  • c1
'; - $this->assertEquals($rendered, $this->renderer->render($menu)); + $this->assertEquals($rendered, $this->getRenderer()->render($menu)); } public function testRenderEncodedAttributes(): void @@ -50,7 +63,7 @@ public function testRenderEncodedAttributes(): void $menu->setChildrenAttributes(['title' => 'encode " me >']); $menu->addChild('c1'); $rendered = '
  • c1
'; - $this->assertEquals($rendered, $this->renderer->render($menu)); + $this->assertEquals($rendered, $this->getRenderer()->render($menu)); } public function testRenderLink(): void @@ -59,7 +72,7 @@ public function testRenderLink(): void $menu->addChild('About', ['uri' => '/about']); $rendered = ''; - $this->assertEquals($rendered, $this->renderer->render($menu)); + $this->assertEquals($rendered, $this->getRenderer()->render($menu)); } public function testRenderLinkWithAttributes(): void @@ -68,7 +81,7 @@ public function testRenderLinkWithAttributes(): void $menu->addChild('About', ['uri' => '/about', 'linkAttributes' => ['title' => 'About page']]); $rendered = ''; - $this->assertEquals($rendered, $this->renderer->render($menu)); + $this->assertEquals($rendered, $this->getRenderer()->render($menu)); } public function testRenderLinkWithEmptyAttributes(): void @@ -80,7 +93,7 @@ public function testRenderLinkWithEmptyAttributes(): void ]); $rendered = ''; - $this->assertEquals($rendered, $this->renderer->render($menu)); + $this->assertEquals($rendered, $this->getRenderer()->render($menu)); } public function testRenderLinkWithSpecialAttributes(): void @@ -89,7 +102,7 @@ public function testRenderLinkWithSpecialAttributes(): void $menu->addChild('About', ['uri' => '/about', 'linkAttributes' => ['title' => true]]); $rendered = ''; - $this->assertEquals($rendered, $this->renderer->render($menu)); + $this->assertEquals($rendered, $this->getRenderer()->render($menu)); } public function testRenderChildrenWithAttributes(): void @@ -100,7 +113,7 @@ public function testRenderChildrenWithAttributes(): void $about->setChildrenAttribute('title', 'About page'); $rendered = '
  • About
'; - $this->assertEquals($rendered, $this->renderer->render($menu)); + $this->assertEquals($rendered, $this->getRenderer()->render($menu)); } public function testRenderChildrenWithEmptyAttributes(): void @@ -113,7 +126,7 @@ public function testRenderChildrenWithEmptyAttributes(): void $about->setChildrenAttribute('target', false); $rendered = '
  • About
'; - $this->assertEquals($rendered, $this->renderer->render($menu)); + $this->assertEquals($rendered, $this->getRenderer()->render($menu)); } public function testRenderChildrenWithSpecialAttributes(): void @@ -124,7 +137,7 @@ public function testRenderChildrenWithSpecialAttributes(): void $about->setChildrenAttribute('title', true); $rendered = '
  • About
'; - $this->assertEquals($rendered, $this->renderer->render($menu)); + $this->assertEquals($rendered, $this->getRenderer()->render($menu)); } public function testRenderLabelWithAttributes(): void @@ -133,7 +146,7 @@ public function testRenderLabelWithAttributes(): void $menu->addChild('About', ['labelAttributes' => ['title' => 'About page']]); $rendered = '
  • About
'; - $this->assertEquals($rendered, $this->renderer->render($menu)); + $this->assertEquals($rendered, $this->getRenderer()->render($menu)); } public function testRenderLabelWithEmptyAttributes(): void @@ -142,7 +155,7 @@ public function testRenderLabelWithEmptyAttributes(): void $menu->addChild('About', ['labelAttributes' => ['title' => '', 'rel' => null, 'target' => false]]); $rendered = '
  • About
'; - $this->assertEquals($rendered, $this->renderer->render($menu)); + $this->assertEquals($rendered, $this->getRenderer()->render($menu)); } public function testRenderLabelWithSpecialAttributes(): void @@ -151,7 +164,7 @@ public function testRenderLabelWithSpecialAttributes(): void $menu->addChild('About', ['labelAttributes' => ['title' => true]]); $rendered = '
  • About
'; - $this->assertEquals($rendered, $this->renderer->render($menu)); + $this->assertEquals($rendered, $this->getRenderer()->render($menu)); } public function testRenderWeirdLink(): void @@ -160,7 +173,7 @@ public function testRenderWeirdLink(): void $menu->addChild('About', ['uri' => 'http://en.wikipedia.org/wiki/%22Weird_Al%22_Yankovic?v1=1&v2=2']); $rendered = ''; - $this->assertEquals($rendered, $this->renderer->render($menu)); + $this->assertEquals($rendered, $this->getRenderer()->render($menu)); } public function testRenderEscapedLabel(): void @@ -171,7 +184,7 @@ public function testRenderEscapedLabel(): void $menu->addChild('Escaped', ['label' => 'Encode " me too', 'extras' => ['safe_label' => false]]); $rendered = '
  • Encode " me
  • Encode " me again
  • Encode " me too
'; - $this->assertEquals($rendered, $this->renderer->render($menu)); + $this->assertEquals($rendered, $this->getRenderer()->render($menu)); } public function testRenderSafeLabel(): void @@ -182,28 +195,30 @@ public function testRenderSafeLabel(): void $menu->addChild('Escaped', ['label' => 'Encode " me too', 'extras' => ['safe_label' => false]]); $rendered = '
  • Encode " me
  • Encode " me again
  • Encode " me too
'; - $this->assertEquals($rendered, $this->renderer->render($menu, ['allow_safe_labels' => true])); + $this->assertEquals($rendered, $this->getRenderer()->render($menu, ['allow_safe_labels' => true])); } public function testRenderWholeMenu(): void { $rendered = '
  • Parent 1
  • Parent 2
'; - $this->assertEquals($rendered, $this->renderer->render($this->menu)); + $this->assertEquals($rendered, $this->getRenderer()->render($this->getMenu())); } public function testRenderWithClassAndTitle(): void { - $this->pt2->setAttribute('class', 'parent2_class'); - $this->pt2->setAttribute('title', 'parent2 title'); + $pt2 = $this->pt2; + $pt2->setAttribute('class', 'parent2_class'); + $pt2->setAttribute('title', 'parent2 title'); $rendered = '
  • Parent 1
  • Parent 2
'; - $this->assertEquals($rendered, $this->renderer->render($this->menu)); + $this->assertEquals($rendered, $this->getRenderer()->render($this->getMenu())); } public function testRenderWithCurrentItem(): void { - $this->ch2->setCurrent(true); + $ch2 = $this->ch2; + $ch2->setCurrent(true); $rendered = '
  • Parent 1
  • Parent 2
'; - $this->assertEquals($rendered, $this->renderer->render($this->menu)); + $this->assertEquals($rendered, $this->getRenderer()->render($this->getMenu())); } public function testRenderWithCurrentItemAsLink(): void @@ -213,7 +228,7 @@ public function testRenderWithCurrentItemAsLink(): void $about->setCurrent(true); $rendered = ''; - $this->assertEquals($rendered, $this->renderer->render($menu)); + $this->assertEquals($rendered, $this->getRenderer()->render($menu)); } public function testRenderWithCurrentItemAsLinkUsingMatcherWithVoters(): void @@ -225,7 +240,7 @@ public function testRenderWithCurrentItemAsLinkUsingMatcherWithVoters(): void $menu->addChild('About', ['uri' => '/about']); $rendered = ''; - $this->assertEquals($rendered, $this->renderer->render($menu)); + $this->assertEquals($rendered, $this->getRenderer()->render($menu)); } public function testRenderWithCurrentItemNotAsLink(): void @@ -235,7 +250,7 @@ public function testRenderWithCurrentItemNotAsLink(): void $about->setCurrent(true); $rendered = '
  • About
'; - $this->assertEquals($rendered, $this->renderer->render($menu, ['currentAsLink' => false])); + $this->assertEquals($rendered, $this->getRenderer()->render($menu, ['currentAsLink' => false])); } public function testRenderWithCurrentItemNotAsLinkUsingMatcherWithVoters(): void @@ -247,93 +262,100 @@ public function testRenderWithCurrentItemNotAsLinkUsingMatcherWithVoters(): void $menu->addChild('About', ['uri' => '/about']); $rendered = '
  • About
'; - $this->assertEquals($rendered, $this->renderer->render($menu, ['currentAsLink' => false])); + $this->assertEquals($rendered, $this->getRenderer()->render($menu, ['currentAsLink' => false])); } public function testRenderSubMenuPortionWithClassAndTitle(): void { - $this->pt2->setChildrenAttribute('class', 'parent2_class')->setChildrenAttribute('title', 'parent2 title'); + $pt2 = $this->pt2; + $pt2->setChildrenAttribute('class', 'parent2_class')->setChildrenAttribute('title', 'parent2 title'); $rendered = '
  • Child 4
'; - $this->assertEquals($rendered, $this->renderer->render($this->menu['Parent 2'])); + $this->assertEquals($rendered, $this->getRenderer()->render($pt2)); } public function testDoNotShowChildrenRendersNothing(): void { - $this->menu->setDisplayChildren(false); + $this->getMenu()->setDisplayChildren(false); $rendered = ''; - $this->assertEquals($rendered, $this->renderer->render($this->menu)); + $this->assertEquals($rendered, $this->getRenderer()->render($this->getMenu())); } public function testDoNotShowChildChildrenRendersPartialMenu(): void { - $this->menu['Parent 1']->setDisplayChildren(false); + $pt1 = $this->pt1; + $pt1->setDisplayChildren(false); $rendered = '
  • Parent 1
  • Parent 2
'; - $this->assertEquals($rendered, $this->renderer->render($this->menu)); + $this->assertEquals($rendered, $this->getRenderer()->render($this->getMenu())); } public function testDoNotShowChildRendersPartialMenu(): void { - $this->menu['Parent 1']->setDisplay(false); + $pt1 = $this->pt1; + $pt1->setDisplay(false); $rendered = '
  • Parent 2
'; - $this->assertEquals($rendered, $this->renderer->render($this->menu)); + $this->assertEquals($rendered, $this->getRenderer()->render($this->getMenu())); } public function testDepth0(): void { $rendered = ''; - $this->assertEquals($rendered, $this->renderer->render($this->menu, ['depth' => 0])); + $this->assertEquals($rendered, $this->getRenderer()->render($this->getMenu(), ['depth' => 0])); } public function testDepth1(): void { $rendered = '
  • Parent 1
  • Parent 2
'; - $this->assertEquals($rendered, $this->renderer->render($this->menu, ['depth' => 1])); + $this->assertEquals($rendered, $this->getRenderer()->render($this->getMenu(), ['depth' => 1])); } public function testDepth2(): void { $rendered = '
  • Parent 1
  • Parent 2
'; - $this->assertEquals($rendered, $this->renderer->render($this->menu, ['depth' => 2])); + $this->assertEquals($rendered, $this->getRenderer()->render($this->getMenu(), ['depth' => 2])); } public function testDepth2WithNotShowChildChildren(): void { - $this->menu['Parent 1']->setDisplayChildren(false); + $pt1 = $this->pt1; + $pt1->setDisplayChildren(false); $rendered = '
  • Parent 1
  • Parent 2
'; - $this->assertEquals($rendered, $this->renderer->render($this->menu, ['depth' => 2])); + $this->assertEquals($rendered, $this->getRenderer()->render($this->getMenu(), ['depth' => 2])); } public function testEmptyUncompressed(): void { $rendered = ''; - $this->assertEquals($rendered, $this->renderer->render($this->menu, ['depth' => 0, 'compressed' => false])); + $this->assertEquals($rendered, $this->getRenderer()->render($this->getMenu(), ['depth' => 0, 'compressed' => false])); } public function testMatchingDepth0(): void { - $this->menu['Parent 1']['Child 1']->setCurrent(true); + $ch1 = $this->ch1; + $ch1->setCurrent(true); $rendered = '
  • Parent 1
  • Parent 2
'; - $this->assertEquals($rendered, $this->renderer->render($this->menu, ['depth' => 1, 'matchingDepth' => 1])); + $this->assertEquals($rendered, $this->getRenderer()->render($this->getMenu(), ['depth' => 1, 'matchingDepth' => 1])); } public function testMatchingDepth1(): void { - $this->menu['Parent 1']['Child 1']->setCurrent(true); + $ch1 = $this->ch1; + $ch1->setCurrent(true); $rendered = '
  • Parent 1
  • Parent 2
'; - $this->assertEquals($rendered, $this->renderer->render($this->menu, ['depth' => 1, 'matchingDepth' => 2])); + $this->assertEquals($rendered, $this->getRenderer()->render($this->getMenu(), ['depth' => 1, 'matchingDepth' => 2])); } public function testMatchingDepth2(): void { - $this->menu['Parent 1']['Child 1']->setCurrent(true); + $ch1 = $this->ch1; + $ch1->setCurrent(true); $rendered = '
  • Parent 1
  • Parent 2
'; - $this->assertEquals($rendered, $this->renderer->render($this->menu, ['depth' => 1, 'matchingDepth' => 0])); + $this->assertEquals($rendered, $this->getRenderer()->render($this->getMenu(), ['depth' => 1, 'matchingDepth' => 0])); } public function testLeafAndBranchRendering(): void { $rendered = '
  • Parent 1
  • Parent 2
'; - $this->assertEquals($rendered, $this->renderer->render($this->menu, ['depth' => 2, 'leaf_class' => 'leaf', 'branch_class' => 'branch'])); + $this->assertEquals($rendered, $this->getRenderer()->render($this->getMenu(), ['depth' => 2, 'leaf_class' => 'leaf', 'branch_class' => 'branch'])); } } diff --git a/tests/Knp/Menu/Tests/Renderer/ArrayAccessProviderTest.php b/tests/Knp/Menu/Tests/Renderer/ArrayAccessProviderTest.php index 6da01822..a0215672 100644 --- a/tests/Knp/Menu/Tests/Renderer/ArrayAccessProviderTest.php +++ b/tests/Knp/Menu/Tests/Renderer/ArrayAccessProviderTest.php @@ -18,6 +18,7 @@ public function testHas(): void public function testGetExistentRenderer(): void { + /** @var \ArrayObject $registry */ $registry = new \ArrayObject(); $renderer = $this->getMockBuilder(RendererInterface::class)->getMock(); $registry['renderer'] = $renderer; @@ -27,6 +28,7 @@ public function testGetExistentRenderer(): void public function testGetDefaultRenderer(): void { + /** @var \ArrayObject $registry */ $registry = new \ArrayObject(); $renderer = $this->getMockBuilder(RendererInterface::class)->getMock(); $registry['renderer'] = $renderer; diff --git a/tests/Knp/Menu/Tests/Renderer/ListRendererTest.php b/tests/Knp/Menu/Tests/Renderer/ListRendererTest.php index 647f2489..d3182a8e 100644 --- a/tests/Knp/Menu/Tests/Renderer/ListRendererTest.php +++ b/tests/Knp/Menu/Tests/Renderer/ListRendererTest.php @@ -26,7 +26,6 @@ public function testPrettyRendering(): void HTML; - - $this->assertEquals($rendered, $this->renderer->render($this->menu, ['compressed' => false, 'depth' => 1])); + $this->assertEquals($rendered, $this->getRenderer()->render($this->getMenu(), ['compressed' => false, 'depth' => 1])); } } diff --git a/tests/Knp/Menu/Tests/Renderer/TwigRendererTest.php b/tests/Knp/Menu/Tests/Renderer/TwigRendererTest.php index 0545c44e..ba105eee 100644 --- a/tests/Knp/Menu/Tests/Renderer/TwigRendererTest.php +++ b/tests/Knp/Menu/Tests/Renderer/TwigRendererTest.php @@ -28,6 +28,6 @@ public function testRenderOrderedList(): void $menu->addChild('About')->addChild('foobar'); $rendered = '
  1. About
'; - $this->assertEquals($rendered, $this->renderer->render($menu, ['template' => 'knp_menu_ordered.html.twig'])); + $this->assertEquals($rendered, $this->getRenderer()->render($menu, ['template' => 'knp_menu_ordered.html.twig'])); } } diff --git a/tests/Knp/Menu/Tests/Twig/HelperTest.php b/tests/Knp/Menu/Tests/Twig/HelperTest.php index e5ab5b43..7a7e1659 100644 --- a/tests/Knp/Menu/Tests/Twig/HelperTest.php +++ b/tests/Knp/Menu/Tests/Twig/HelperTest.php @@ -267,17 +267,19 @@ public function testCurrentItem(): void $matcher = new Matcher(); $menu = new MenuItem('root', new MenuFactory()); - $menu->addChild('c1'); - $menu['c1']->addChild('c1_1'); - $menu->addChild('c2'); - $menu['c2']->addChild('c2_1'); - $menu['c2']->addChild('c2_2'); - $menu['c2']['c2_2']->addChild('c2_2_1'); - $menu['c2']['c2_2']->addChild('c2_2_2')->setCurrent(true); - $menu['c2']['c2_2']->addChild('c2_2_3'); + $c1 = $menu->addChild('c1'); + $c1->addChild('c1_1'); + $c2 = $menu->addChild('c2'); + $c2->addChild('c2_1'); + $c2_2 = $c2->addChild('c2_2'); + $c2_2->addChild('c2_2_1'); + $c2_2->addChild('c2_2_2')->setCurrent(true); + $c2_2->addChild('c2_2_3'); $helper = new Helper($this->getMockBuilder(RendererProviderInterface::class)->getMock(), null, null, $matcher); - $this->assertSame('c2_2_2', $helper->getCurrentItem($menu)->getName()); + $currentItem = $helper->getCurrentItem($menu); + /** @var ItemInterface $currentItem */ + $this->assertSame('c2_2_2', $currentItem->getName()); } } diff --git a/tests/Knp/Menu/Tests/Twig/MenuExtensionTest.php b/tests/Knp/Menu/Tests/Twig/MenuExtensionTest.php index 18c2ae5c..57c51856 100644 --- a/tests/Knp/Menu/Tests/Twig/MenuExtensionTest.php +++ b/tests/Knp/Menu/Tests/Twig/MenuExtensionTest.php @@ -20,173 +20,201 @@ final class MenuExtensionTest extends TestCase public function testRenderMenu(): void { $menu = $this->getMockBuilder(ItemInterface::class)->getMock(); - $helper = $this->getHelperMock(['render']); - $helper->expects($this->once()) + $helperMock = $this->getHelperMock(['render']); + $helperMock->expects($this->once()) ->method('render') ->with($menu, [], null) ->willReturn('

foobar

') ; + /** @var Helper&MockObject $helper */ + $helper = $helperMock; + $matcher = null; + $manipulator = null; - $this->assertEquals('

foobar

', $this->getTemplate('{{ knp_menu_render(menu) }}', $helper)->render(['menu' => $menu])); + $this->assertEquals('

foobar

', $this->getTemplate('{{ knp_menu_render(menu) }}', $helper, $matcher, $manipulator)->render(['menu' => $menu])); } public function testRenderMenuWithOptions(): void { $menu = $this->getMockBuilder(ItemInterface::class)->getMock(); - $helper = $this->getHelperMock(['render']); - $helper->expects($this->once()) + $helperMock = $this->getHelperMock(['render']); + $helperMock->expects($this->once()) ->method('render') ->with($menu, ['firstClass' => 'test'], null) ->willReturn('

foobar

') ; + /** @var Helper&MockObject $helper */ + $helper = $helperMock; + $matcher = null; + $manipulator = null; - $this->assertEquals('

foobar

', $this->getTemplate('{{ knp_menu_render(menu, {"firstClass": "test"}) }}', $helper)->render(['menu' => $menu])); + $this->assertEquals('

foobar

', $this->getTemplate('{{ knp_menu_render(menu, {"firstClass": "test"}) }}', $helper, $matcher, $manipulator)->render(['menu' => $menu])); } - public function testRenderMenuWithRenderer(): void - { - $menu = $this->getMockBuilder(ItemInterface::class)->getMock(); - $helper = $this->getHelperMock(['render']); - $helper->expects($this->once()) - ->method('render') - ->with($menu, [], 'custom') - ->willReturn('

foobar

') - ; - $this->assertEquals('

foobar

', $this->getTemplate('{{ knp_menu_render(menu, {}, "custom") }}', $helper)->render(['menu' => $menu])); - } public function testRenderMenuByName(): void { - $helper = $this->getHelperMock(['render']); - $helper->expects($this->once()) + $helperMock = $this->getHelperMock(['render']); + $helperMock->expects($this->once()) ->method('render') ->with('default', [], null) ->willReturn('

foobar

') ; + /** @var Helper&MockObject $helper */ + $helper = $helperMock; + $matcher = null; + $manipulator = null; - $this->assertEquals('

foobar

', $this->getTemplate('{{ knp_menu_render(menu) }}', $helper)->render(['menu' => 'default'])); + $this->assertEquals('

foobar

', $this->getTemplate('{{ knp_menu_render(menu) }}', $helper, $matcher, $manipulator)->render(['menu' => 'default'])); } public function testRetrieveMenuByName(): void { $menu = $this->getMockBuilder(ItemInterface::class)->getMock(); - $helper = $this->getHelperMock(['get', 'render']); - $helper->expects($this->once()) + $helperMock = $this->getHelperMock(['get', 'render']); + $helperMock->expects($this->once()) ->method('render') ->with($menu, [], null) ->willReturn('

foobar

') ; - $helper->expects($this->once()) + $helperMock->expects($this->once()) ->method('get') ->with('default') ->willReturn($menu) ; + /** @var Helper&MockObject $helper */ + $helper = $helperMock; + $matcher = null; + $manipulator = null; - $this->assertEquals('

foobar

', $this->getTemplate('{{ knp_menu_render(knp_menu_get("default")) }}', $helper)->render([])); + $this->assertEquals('

foobar

', $this->getTemplate('{{ knp_menu_render(knp_menu_get("default")) }}', $helper, $matcher, $manipulator)->render([])); } public function testGetBreadcrumbsArray(): void { - $helper = $this->getHelperMock(['getBreadcrumbsArray']); - $helper->expects($this->any()) + $helperMock = $this->getHelperMock(['getBreadcrumbsArray']); + $helperMock->expects($this->any()) ->method('getBreadcrumbsArray') ->with('default') ->willReturn(['A', 'B']) ; + /** @var Helper&MockObject $helper */ + $helper = $helperMock; + $matcher = null; + $manipulator = null; - $this->assertEquals('A, B', $this->getTemplate('{{ knp_menu_get_breadcrumbs_array("default")|join(", ") }}', $helper)->render([])); + $this->assertEquals('A, B', $this->getTemplate('{{ knp_menu_get_breadcrumbs_array("default")|join(", ") }}', $helper, $matcher, $manipulator)->render([])); } public function testPathAsString(): void { $menu = $this->getMockBuilder(ItemInterface::class)->getMock(); - $helper = $this->getHelperMock(['get']); - $manipulator = $this->getManipulatorMock(['getPathAsString']); - $helper->expects($this->any()) + $helperMock = $this->getHelperMock(['get']); + $manipulatorMock = $this->getManipulatorMock(['getPathAsString']); + $helperMock->expects($this->any()) ->method('get') ->with('default') ->willReturn($menu); - $manipulator->expects($this->any()) + $manipulatorMock->expects($this->any()) ->method('getPathAsString') ->with($menu) ->willReturn('A > B') ; + /** @var Helper&MockObject $helper */ + $helper = $helperMock; + /** @var MenuManipulator&MockObject $manipulator */ + $manipulator = $manipulatorMock; + $matcher = null; - $this->assertEquals('A > B', $this->getTemplate('{{ knp_menu_get("default")|knp_menu_as_string }}', $helper, null, $manipulator)->render([])); + $this->assertEquals('A > B', $this->getTemplate('{{ knp_menu_get("default")|knp_menu_as_string }}', $helper, $matcher, $manipulator)->render([])); } public function testIsCurrent(): void { $menu = $this->getMockBuilder(ItemInterface::class)->getMock(); - $helper = $this->getHelperMock([]); - $matcher = $this->getMatcherMock(); - $matcher->expects($this->any()) + $helperMock = $this->getHelperMock([]); + $matcherMock = $this->getMatcherMock(); + $matcherMock->expects($this->any()) ->method('isCurrent') ->with($menu) ->willReturn(true) ; + /** @var Helper&MockObject $helper */ + $helper = $helperMock; + /** @var MatcherInterface&MockObject $matcher */ + $matcher = $matcherMock; + $manipulator = null; - $this->assertEquals('current', $this->getTemplate('{{ menu is knp_menu_current ? "current" : "not current" }}', $helper, $matcher)->render(['menu' => $menu])); + $this->assertEquals('current', $this->getTemplate('{{ menu is knp_menu_current ? "current" : "not current" }}', $helper, $matcher, $manipulator)->render(['menu' => $menu])); } public function testIsAncestor(): void { $menu = $this->getMockBuilder(ItemInterface::class)->getMock(); - $helper = $this->getHelperMock([]); - $matcher = $this->getMatcherMock(); - $matcher->expects($this->any()) + $helperMock = $this->getHelperMock([]); + $matcherMock = $this->getMatcherMock(); + $matcherMock->expects($this->any()) ->method('isAncestor') ->with($menu) ->willReturn(false) ; + /** @var Helper&MockObject $helper */ + $helper = $helperMock; + /** @var MatcherInterface&MockObject $matcher */ + $matcher = $matcherMock; + $manipulator = null; - $this->assertEquals('not ancestor', $this->getTemplate('{{ menu is knp_menu_ancestor ? "ancestor" : "not ancestor" }}', $helper, $matcher)->render(['menu' => $menu])); + $this->assertEquals('not ancestor', $this->getTemplate('{{ menu is knp_menu_ancestor ? "ancestor" : "not ancestor" }}', $helper, $matcher, $manipulator)->render(['menu' => $menu])); } public function testGetCurrentItem(): void { $menu = $this->getMockBuilder(ItemInterface::class)->getMock(); - $helper = $this->getHelperMock(['get', 'getCurrentItem']); - $helper->expects($this->once()) + $helperMock = $this->getHelperMock(['get', 'getCurrentItem']); + $helperMock->expects($this->once()) ->method('get') ->with('default') ->willReturn($menu) ; - $matcher = $this->getMatcherMock(); - $matcher->expects($this->any()) + $matcherMock = $this->getMatcherMock(); + $matcherMock->expects($this->any()) ->method('isCurrent') ->with($menu) ->willReturn(true) ; + /** @var Helper&MockObject $helper */ + $helper = $helperMock; + /** @var MatcherInterface&MockObject $matcher */ + $matcher = $matcherMock; + $manipulator = null; - $this->assertEquals('current', $this->getTemplate('{{ knp_menu_get_current_item("default") is knp_menu_current ? "current" : "not current" }}', $helper, $matcher)->render([])); + $this->assertEquals('current', $this->getTemplate('{{ knp_menu_get_current_item("default") is knp_menu_current ? "current" : "not current" }}', $helper, $matcher, $manipulator)->render([])); } public function testLastModified(): void { $this->assertSame(max( - filemtime((new \ReflectionClass(MenuExtension::class))->getFileName()), - filemtime((new \ReflectionClass(MenuRuntimeExtension::class))->getFileName()), + filemtime((string) (new \ReflectionClass(MenuExtension::class))->getFileName()), + filemtime((string) (new \ReflectionClass(MenuRuntimeExtension::class))->getFileName()), ), (new MenuExtension())->getLastModified()); } /** * @param array $methods */ - private function getHelperMock(array $methods): MockObject|Helper + private function getHelperMock(array $methods): MockObject { return $this->getMockBuilder(Helper::class) ->disableOriginalConstructor() - ->setMethods($methods) - ->getMock() - ; + ->onlyMethods($methods) + ->getMock(); } /** * @param array $methods */ - private function getManipulatorMock(array $methods): MenuManipulator|MockObject + private function getManipulatorMock(array $methods): MockObject { return $this->getMockBuilder(MenuManipulator::class) ->disableOriginalConstructor() @@ -195,7 +223,7 @@ private function getManipulatorMock(array $methods): MenuManipulator|MockObject ; } - private function getMatcherMock(): MockObject|MatcherInterface + private function getMatcherMock(): MockObject { return $this->getMockBuilder(MatcherInterface::class)->getMock(); } diff --git a/tests/Knp/Menu/Tests/Util/MenuManipulatorTest.php b/tests/Knp/Menu/Tests/Util/MenuManipulatorTest.php index 6081cfd6..f77e3579 100644 --- a/tests/Knp/Menu/Tests/Util/MenuManipulatorTest.php +++ b/tests/Knp/Menu/Tests/Util/MenuManipulatorTest.php @@ -19,7 +19,7 @@ public function testMoveToFirstPosition(): void $menu->addChild('c4'); $manipulator = new MenuManipulator(); - $manipulator->moveToFirstPosition($menu['c3']); + $manipulator->moveToFirstPosition($menu->getChildren()['c3']); $this->assertEquals(['c3', 'c1', 'c2', 'c4'], \array_keys($menu->getChildren())); } @@ -32,7 +32,7 @@ public function testMoveToLastPosition(): void $menu->addChild('c4'); $manipulator = new MenuManipulator(); - $manipulator->moveToLastPosition($menu['c2']); + $manipulator->moveToLastPosition($menu->getChildren()['c2']); $this->assertEquals(['c1', 'c3', 'c4', 'c2'], \array_keys($menu->getChildren())); } @@ -45,7 +45,9 @@ public function testMoveToPosition(): void $menu->addChild('c4'); $manipulator = new MenuManipulator(); - $manipulator->moveToPosition($menu['c1'], 2); + $c1 = $menu['c1']; + /** @var ItemInterface $c1 */ + $manipulator->moveToPosition($c1, 2); $this->assertEquals(['c2', 'c3', 'c1', 'c4'], \array_keys($menu->getChildren())); } @@ -59,7 +61,8 @@ public function testMoveToPosition(): void public function testSlice($offset, $length, int $count, array $keys): void { $manipulator = new MenuManipulator(); - $sliced = $manipulator->slice($this->pt1, $offset, $length); + $pt1 = $this->pt1; + $sliced = $manipulator->slice($pt1, $offset, $length); $this->assertCount($count, $sliced); $this->assertEquals($keys, \array_keys($sliced->getChildren())); } @@ -71,13 +74,17 @@ public function getSliceData(): array { $this->setUp(); + $ch1 = $this->ch1; + $ch2 = $this->ch2; + $ch3 = $this->ch3; + return [ - 'numeric offset and numeric length' => [0, 2, 2, [$this->ch1->getName(), $this->ch2->getName()]], - 'numeric offset and no length' => [0, null, 3, [$this->ch1->getName(), $this->ch2->getName(), $this->ch3->getName()]], - 'named offset and no length' => ['Child 2', null, 2, [$this->ch2->getName(), $this->ch3->getName()]], - 'child offset and no length' => [$this->ch3, null, 1, [$this->ch3->getName()]], - 'numeric offset and named length' => [0, 'Child 3', 2, [$this->ch1->getName(), $this->ch2->getName()]], - 'numeric offset and child length' => [0, $this->ch3, 2, [$this->ch1->getName(), $this->ch2->getName()]], + 'numeric offset and numeric length' => [0, 2, 2, [$ch1->getName(), $ch2->getName()]], + 'numeric offset and no length' => [0, null, 3, [$ch1->getName(), $ch2->getName(), $ch3->getName()]], + 'named offset and no length' => ['Child 2', null, 2, [$ch2->getName(), $ch3->getName()]], + 'child offset and no length' => [$ch3, null, 1, [$ch3->getName()]], + 'numeric offset and named length' => [0, 'Child 3', 2, [$ch1->getName(), $ch2->getName()]], + 'numeric offset and child length' => [0, $ch3, 2, [$ch1->getName(), $ch2->getName()]], ]; } @@ -90,7 +97,8 @@ public function getSliceData(): array public function testSplit($length, int $count, array $keys): void { $manipulator = new MenuManipulator(); - $split = $manipulator->split($this->pt1, $length); + $pt1 = $this->pt1; + $split = $manipulator->split($pt1, $length); $this->assertArrayHasKey('primary', $split); $this->assertArrayHasKey('secondary', $split); $this->assertCount($count, $split['primary']); @@ -105,41 +113,51 @@ public function getSplitData(): array { $this->setUp(); + $ch1 = $this->ch1; + $ch2 = $this->ch2; + $ch3 = $this->ch3; + return [ - 'numeric length' => [1, 1, [$this->ch1->getName()]], - 'named length' => ['Child 3', 2, [$this->ch1->getName(), $this->ch2->getName()]], - 'child length' => [$this->ch3, 2, [$this->ch1->getName(), $this->ch2->getName()]], + 'numeric length' => [1, 1, [$ch1->getName()]], + 'named length' => ['Child 3', 2, [$ch1->getName(), $ch2->getName()]], + 'child length' => [$ch3, 2, [$ch1->getName(), $ch2->getName()]], ]; } public function testPathAsString(): void { $manipulator = new MenuManipulator(); - $this->assertEquals('Root li > Parent 2 > Child 4', $manipulator->getPathAsString($this->ch4), 'Path with default separator'); - $this->assertEquals('Root li / Parent 1 / Child 2', $manipulator->getPathAsString($this->ch2, ' / '), 'Path with custom separator'); + $ch4 = $this->ch4; + $ch2 = $this->ch2; + $this->assertEquals('Root li > Parent 2 > Child 4', $manipulator->getPathAsString($ch4), 'Path with default separator'); + $this->assertEquals('Root li / Parent 1 / Child 2', $manipulator->getPathAsString($ch2, ' / '), 'Path with custom separator'); } public function testBreadcrumbsArray(): void { $manipulator = new MenuManipulator(); - $this->menu->addChild('child', ['uri' => 'http://www.symfony-reloaded.org']); - $this->menu->addChild('123', ['uri' => 'http://www.symfony-reloaded.org']); + $menu = $this->menu; + $menu->addChild('child', ['uri' => 'http://www.symfony-reloaded.org']); + + $pt1 = $this->pt1; + $child = $menu['child']; + /** @var ItemInterface $child */ $this->assertEquals( - [['label' => 'Root li', 'uri' => null, 'item' => $this->menu], ['label' => 'Parent 1', 'uri' => null, 'item' => $this->pt1]], - $manipulator->getBreadcrumbsArray($this->pt1) + [['label' => 'Root li', 'uri' => null, 'item' => $menu], ['label' => 'Parent 1', 'uri' => null, 'item' => $pt1]], + $manipulator->getBreadcrumbsArray($pt1) ); $this->assertEquals( - [['label' => 'Root li', 'uri' => null, 'item' => $this->menu], ['label' => 'child', 'uri' => 'http://www.symfony-reloaded.org', 'item' => $this->menu['child']]], - $manipulator->getBreadcrumbsArray($this->menu['child']) + [['label' => 'Root li', 'uri' => null, 'item' => $menu], ['label' => 'child', 'uri' => 'http://www.symfony-reloaded.org', 'item' => $child]], + $manipulator->getBreadcrumbsArray($child) ); $this->assertEquals( [ - ['label' => 'Root li', 'uri' => null, 'item' => $this->menu], - ['label' => 'child', 'uri' => 'http://www.symfony-reloaded.org', 'item' => $this->menu['child']], + ['label' => 'Root li', 'uri' => null, 'item' => $menu], + ['label' => 'child', 'uri' => 'http://www.symfony-reloaded.org', 'item' => $child], ['label' => 'subitem1', 'uri' => null, 'item' => null], ], - $manipulator->getBreadcrumbsArray($this->menu['child'], 'subitem1') + $manipulator->getBreadcrumbsArray($child, 'subitem1') ); $item = $this->getMockBuilder(ItemInterface::class)->getMock(); @@ -148,15 +166,15 @@ public function testBreadcrumbsArray(): void $this->assertEquals( [ - ['label' => 'Root li', 'uri' => null, 'item' => $this->menu], - ['label' => 'child', 'uri' => 'http://www.symfony-reloaded.org', 'item' => $this->menu['child']], + ['label' => 'Root li', 'uri' => null, 'item' => $menu], + ['label' => 'child', 'uri' => 'http://www.symfony-reloaded.org', 'item' => $child], ['label' => 'subitem1', 'uri' => null, 'item' => null], ['label' => 'subitem2', 'uri' => null, 'item' => null], ['label' => 'subitem3', 'uri' => 'http://php.net', 'item' => null], ['label' => 'subitem4', 'uri' => null, 'item' => null], ['label' => 'mock', 'uri' => 'foo', 'item' => $item], ], - $manipulator->getBreadcrumbsArray($this->menu['child'], [ + $manipulator->getBreadcrumbsArray($child, [ 'subitem1', 'subitem2' => null, 'subitem3' => 'http://php.net', @@ -164,20 +182,6 @@ public function testBreadcrumbsArray(): void $item, ]) ); - - $this->assertEquals( - [['label' => 'Root li', 'uri' => null, 'item' => $this->menu], ['label' => '123', 'uri' => 'http://www.symfony-reloaded.org', 'item' => $this->menu['123']]], - $manipulator->getBreadcrumbsArray($this->menu['123']) - ); - - $this->assertEquals( - [ - ['label' => 'Root li', 'uri' => null, 'item' => $this->menu], - ['label' => 'child', 'uri' => 'http://www.symfony-reloaded.org', 'item' => $this->menu['child']], - ['label' => 'mock', 'uri' => 'foo', 'item' => $item], - ], - $manipulator->getBreadcrumbsArray($this->menu['child'], $item) - ); } public function testBreadcrumbsArrayInvalidData(): void @@ -185,7 +189,8 @@ public function testBreadcrumbsArrayInvalidData(): void $this->expectException(\InvalidArgumentException::class); $manipulator = new MenuManipulator(); - $manipulator->getBreadcrumbsArray($this->pt1, [new \stdClass()]); + $pt1 = $this->pt1; + $manipulator->getBreadcrumbsArray($pt1, [new \stdClass()]); } public function testCallRecursively(): void