diff --git a/.gitignore b/.gitignore index 8969645b..4a3db6b2 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ vendor/ .idea /composer.lock +/.phpunit.result.cache diff --git a/.travis.yml b/.travis.yml index da8df6f4..85850ddc 100644 --- a/.travis.yml +++ b/.travis.yml @@ -5,9 +5,9 @@ cache: - $HOME/.composer/cache/files php: - - 7.1 - 7.2 - 7.3 + - 7.4 install: - composer self-update diff --git a/composer.json b/composer.json index 3cddb176..b07d3a74 100644 --- a/composer.json +++ b/composer.json @@ -14,7 +14,7 @@ } ], "require-dev": { - "phpunit/phpunit": "^7.1", + "phpunit/phpunit": "^8.0", "squizlabs/php_codesniffer": "^3.2", "phpstan/phpstan": "^0.11" }, diff --git a/src/CliMenu.php b/src/CliMenu.php index 668e6702..3399a878 100644 --- a/src/CliMenu.php +++ b/src/CliMenu.php @@ -132,6 +132,11 @@ public function setTitle(string $title) : void $this->title = $title; } + public function getTitle() : ?string + { + return $this->title; + } + public function setParent(CliMenu $parent) : void { $this->parent = $parent; @@ -228,6 +233,11 @@ public function addCustomControlMapping(string $input, callable $callable) : voi $this->customControlMappings[$input] = $callable; } + public function getCustomControlMappings() : array + { + return $this->customControlMappings; + } + /** * Shorthand function to add multiple custom control mapping at once */ diff --git a/src/MenuItem/AsciiArtItem.php b/src/MenuItem/AsciiArtItem.php index b0ae715c..7fa1b3b3 100644 --- a/src/MenuItem/AsciiArtItem.php +++ b/src/MenuItem/AsciiArtItem.php @@ -128,6 +128,16 @@ public function getArtLength() : int return $this->artLength; } + public function getPosition() : string + { + return $this->position; + } + + public function getAlternateText() : string + { + return $this->alternateText; + } + /** * Whether or not the menu item is showing the menustyle extra value */ diff --git a/src/MenuItem/LineBreakItem.php b/src/MenuItem/LineBreakItem.php index dc581965..0b22a52c 100644 --- a/src/MenuItem/LineBreakItem.php +++ b/src/MenuItem/LineBreakItem.php @@ -80,6 +80,11 @@ public function showsItemExtra() : bool return false; } + public function getLines() : int + { + return $this->lines; + } + /** * Enable showing item extra */ diff --git a/src/MenuItem/SplitItem.php b/src/MenuItem/SplitItem.php index aa094ded..bc5d27fe 100644 --- a/src/MenuItem/SplitItem.php +++ b/src/MenuItem/SplitItem.php @@ -52,6 +52,11 @@ public function setGutter(int $gutter) : void $this->gutter = $gutter; } + public function getGutter() : int + { + return $this->gutter; + } + public function addItem(MenuItemInterface $item) : self { foreach (self::$blacklistedItems as $bl) { diff --git a/test/Builder/CliMenuBuilderTest.php b/test/Builder/CliMenuBuilderTest.php index daf42680..a57bfae2 100644 --- a/test/Builder/CliMenuBuilderTest.php +++ b/test/Builder/CliMenuBuilderTest.php @@ -11,7 +11,6 @@ use PhpSchool\CliMenu\MenuItem\StaticItem; use PhpSchool\Terminal\Terminal; use PHPUnit\Framework\TestCase; -use RuntimeException; /** * @author Aydin Hassan @@ -69,17 +68,18 @@ public function testModifyStyles() : void $builder->setTitleSeparator('-'); $menu = $builder->build(); + $style = $menu->getStyle(); - $this->checkStyleVariable($menu, 'bg', 'red'); - $this->checkStyleVariable($menu, 'fg', 'red'); - $this->checkStyleVariable($menu, 'width', 40); - $this->checkStyleVariable($menu, 'paddingTopBottom', 4); - $this->checkStyleVariable($menu, 'paddingLeftRight', 1); - $this->checkStyleVariable($menu, 'margin', 4); - $this->checkStyleVariable($menu, 'unselectedMarker', '>'); - $this->checkStyleVariable($menu, 'selectedMarker', 'x'); - $this->checkStyleVariable($menu, 'itemExtra', '*'); - $this->checkStyleVariable($menu, 'titleSeparator', '-'); + self::assertEquals('red', $style->getBg()); + self::assertEquals('red', $style->getFg()); + self::assertEquals(40, $style->getWidth()); + self::assertEquals(4, $style->getPaddingTopBottom()); + self::assertEquals(1, $style->getPaddingLeftRight()); + self::assertEquals(4, $style->getMargin()); + self::assertEquals('>', $style->getUnselectedMarker()); + self::assertEquals('x', $style->getSelectedMarker()); + self::assertEquals('*', $style->getItemExtra()); + self::assertEquals('-', $style->getTitleSeparator()); } public function testSetBorderShorthandFunction() : void @@ -90,85 +90,93 @@ public function testSetBorderShorthandFunction() : void ->method('getWidth') ->will($this->returnValue(200)); - $menu = (new CliMenuBuilder($terminal)) + $style = (new CliMenuBuilder($terminal)) ->setBorder(2) - ->build(); - - $this->checkStyleVariable($menu, 'borderTopWidth', 2); - $this->checkStyleVariable($menu, 'borderRightWidth', 2); - $this->checkStyleVariable($menu, 'borderBottomWidth', 2); - $this->checkStyleVariable($menu, 'borderLeftWidth', 2); - $this->checkStyleVariable($menu, 'borderColour', 'white'); + ->build() + ->getStyle(); - $menu = (new CliMenuBuilder($terminal)) + self::assertEquals(2, $style->getBorderTopWidth()); + self::assertEquals(2, $style->getBorderRightWidth()); + self::assertEquals(2, $style->getBorderBottomWidth()); + self::assertEquals(2, $style->getBorderLeftWidth()); + self::assertEquals('white', $style->getBorderColour()); + + $style = (new CliMenuBuilder($terminal)) ->setBorder(2, 4) - ->build(); - - $this->checkStyleVariable($menu, 'borderTopWidth', 2); - $this->checkStyleVariable($menu, 'borderRightWidth', 4); - $this->checkStyleVariable($menu, 'borderBottomWidth', 2); - $this->checkStyleVariable($menu, 'borderLeftWidth', 4); - $this->checkStyleVariable($menu, 'borderColour', 'white'); + ->build() + ->getStyle(); - $menu = (new CliMenuBuilder($terminal)) + self::assertEquals(2, $style->getBorderTopWidth()); + self::assertEquals(4, $style->getBorderRightWidth()); + self::assertEquals(2, $style->getBorderBottomWidth()); + self::assertEquals(4, $style->getBorderLeftWidth()); + self::assertEquals('white', $style->getBorderColour()); + + $style = (new CliMenuBuilder($terminal)) ->setBorder(2, 4, 6) - ->build(); - - $this->checkStyleVariable($menu, 'borderTopWidth', 2); - $this->checkStyleVariable($menu, 'borderRightWidth', 4); - $this->checkStyleVariable($menu, 'borderBottomWidth', 6); - $this->checkStyleVariable($menu, 'borderLeftWidth', 4); - $this->checkStyleVariable($menu, 'borderColour', 'white'); + ->build() + ->getStyle(); - $menu = (new CliMenuBuilder($terminal)) + self::assertEquals(2, $style->getBorderTopWidth()); + self::assertEquals(4, $style->getBorderRightWidth()); + self::assertEquals(6, $style->getBorderBottomWidth()); + self::assertEquals(4, $style->getBorderLeftWidth()); + self::assertEquals('white', $style->getBorderColour()); + + $style = (new CliMenuBuilder($terminal)) ->setBorder(2, 4, 6, 8) - ->build(); - - $this->checkStyleVariable($menu, 'borderTopWidth', 2); - $this->checkStyleVariable($menu, 'borderRightWidth', 4); - $this->checkStyleVariable($menu, 'borderBottomWidth', 6); - $this->checkStyleVariable($menu, 'borderLeftWidth', 8); - $this->checkStyleVariable($menu, 'borderColour', 'white'); + ->build() + ->getStyle(); - $menu = (new CliMenuBuilder($terminal)) + self::assertEquals(2, $style->getBorderTopWidth()); + self::assertEquals(4, $style->getBorderRightWidth()); + self::assertEquals(6, $style->getBorderBottomWidth()); + self::assertEquals(8, $style->getBorderLeftWidth()); + self::assertEquals('white', $style->getBorderColour()); + + $style = (new CliMenuBuilder($terminal)) ->setBorder(2, 4, 6, 8, 'green') - ->build(); - - $this->checkStyleVariable($menu, 'borderTopWidth', 2); - $this->checkStyleVariable($menu, 'borderRightWidth', 4); - $this->checkStyleVariable($menu, 'borderBottomWidth', 6); - $this->checkStyleVariable($menu, 'borderLeftWidth', 8); - $this->checkStyleVariable($menu, 'borderColour', 'green'); + ->build() + ->getStyle(); - $menu = (new CliMenuBuilder($terminal)) + self::assertEquals(2, $style->getBorderTopWidth()); + self::assertEquals(4, $style->getBorderRightWidth()); + self::assertEquals(6, $style->getBorderBottomWidth()); + self::assertEquals(8, $style->getBorderLeftWidth()); + self::assertEquals('green', $style->getBorderColour()); + + $style = (new CliMenuBuilder($terminal)) ->setBorder(2, 4, 6, 'green') - ->build(); - - $this->checkStyleVariable($menu, 'borderTopWidth', 2); - $this->checkStyleVariable($menu, 'borderRightWidth', 4); - $this->checkStyleVariable($menu, 'borderBottomWidth', 6); - $this->checkStyleVariable($menu, 'borderLeftWidth', 4); - $this->checkStyleVariable($menu, 'borderColour', 'green'); + ->build() + ->getStyle(); - $menu = (new CliMenuBuilder($terminal)) + self::assertEquals(2, $style->getBorderTopWidth()); + self::assertEquals(4, $style->getBorderRightWidth()); + self::assertEquals(6, $style->getBorderBottomWidth()); + self::assertEquals(4, $style->getBorderLeftWidth()); + self::assertEquals('green', $style->getBorderColour()); + + $style = (new CliMenuBuilder($terminal)) ->setBorder(2, 4, 'green') - ->build(); - - $this->checkStyleVariable($menu, 'borderTopWidth', 2); - $this->checkStyleVariable($menu, 'borderRightWidth', 4); - $this->checkStyleVariable($menu, 'borderBottomWidth', 2); - $this->checkStyleVariable($menu, 'borderLeftWidth', 4); - $this->checkStyleVariable($menu, 'borderColour', 'green'); + ->build() + ->getStyle(); - $menu = (new CliMenuBuilder($terminal)) + self::assertEquals(2, $style->getBorderTopWidth()); + self::assertEquals(4, $style->getBorderRightWidth()); + self::assertEquals(2, $style->getBorderBottomWidth()); + self::assertEquals(4, $style->getBorderLeftWidth()); + self::assertEquals('green', $style->getBorderColour()); + + $style = (new CliMenuBuilder($terminal)) ->setBorder(2, 'green') - ->build(); - - $this->checkStyleVariable($menu, 'borderTopWidth', 2); - $this->checkStyleVariable($menu, 'borderRightWidth', 2); - $this->checkStyleVariable($menu, 'borderBottomWidth', 2); - $this->checkStyleVariable($menu, 'borderLeftWidth', 2); - $this->checkStyleVariable($menu, 'borderColour', 'green'); + ->build() + ->getStyle(); + + self::assertEquals(2, $style->getBorderTopWidth()); + self::assertEquals(2, $style->getBorderRightWidth()); + self::assertEquals(2, $style->getBorderBottomWidth()); + self::assertEquals(2, $style->getBorderLeftWidth()); + self::assertEquals('green', $style->getBorderColour()); } public function testSetBorderTopWidth() : void @@ -232,10 +240,11 @@ public function test256ColoursCodes() : void $builder = new CliMenuBuilder($terminal); $builder->setBackgroundColour(16, 'white'); $builder->setForegroundColour(206, 'red'); - $menu = $builder->build(); + $style = $builder->build() + ->getStyle(); - $this->checkStyleVariable($menu, 'bg', 16); - $this->checkStyleVariable($menu, 'fg', 206); + self::assertEquals(16, $style->getBg()); + self::assertEquals(206, $style->getFg()); $terminal = static::createMock(Terminal::class); $terminal @@ -246,10 +255,11 @@ public function test256ColoursCodes() : void $builder = new CliMenuBuilder($terminal); $builder->setBackgroundColour(16, 'white'); $builder->setForegroundColour(206, 'red'); - $menu = $builder->build(); + $style = $builder->build() + ->getStyle(); - $this->checkStyleVariable($menu, 'bg', 'white'); - $this->checkStyleVariable($menu, 'fg', 'red'); + self::assertEquals('white', $style->getBg()); + self::assertEquals('red', $style->getFg()); } public function testSetFgThrowsExceptionWhenColourCodeIsNotInRange() : void @@ -288,8 +298,8 @@ public function testDisableDefaultItems() : void $builder->disableDefaultItems(); $menu = $builder->build(); - - $this->checkVariable($menu, 'items', []); + + self::assertEquals([], $menu->getItems()); } public function testSetTitle() : void @@ -299,7 +309,7 @@ public function testSetTitle() : void $menu = $builder->build(); - $this->checkVariable($menu, 'title', 'title'); + self::assertEquals('title', $menu->getTitle()); } public function testAddItem() : void @@ -782,11 +792,15 @@ public function testAddSplitItemWithClosureBinding() : void private function checkMenuItems(CliMenu $menu, array $expected) : void { - $this->checkItems($this->readAttribute($menu, 'items'), $expected); + $this->checkItems($menu->getItems(), $expected); } private function checkItems(array $actualItems, array $expected) : void { + $propMap = [ + 'breakChar' => 'getText', + ]; + self::assertCount(count($expected), $actualItems); foreach ($expected as $expectedItem) { @@ -796,21 +810,14 @@ private function checkItems(array $actualItems, array $expected) : void unset($expectedItem['class']); foreach ($expectedItem as $property => $value) { - self::assertEquals($this->readAttribute($actualItem, $property), $value); + if (isset($propMap[$property])) { + $getter = $propMap[$property]; + } else { + $getter = 'get'. ucfirst($property); + } + + self::assertEquals($actualItem->{$getter}(), $value); } } } - - - private function checkVariable(CliMenu $menu, string $property, $expected) : void - { - $actual = $this->readAttribute($menu, $property); - self::assertEquals($expected, $actual); - } - - private function checkStyleVariable(CliMenu $menu, string $property, $expected) : void - { - $style = $this->readAttribute($menu, 'style'); - self::assertEquals($this->readAttribute($style, $property), $expected); - } } diff --git a/test/Builder/SplitItemBuilderTest.php b/test/Builder/SplitItemBuilderTest.php index 12e60d59..6d2d10fe 100644 --- a/test/Builder/SplitItemBuilderTest.php +++ b/test/Builder/SplitItemBuilderTest.php @@ -90,7 +90,7 @@ public function testSetGutter() : void $builder->setGutter(4); $item = $builder->build(); - self::assertEquals(4, self::readAttribute($item, 'gutter')); + self::assertEquals(4, $item->getGutter()); } public function testAddSubMenuWithClosureBinding() : void @@ -134,7 +134,7 @@ private function checkItems(array $actualItems, array $expected) : void unset($expectedItem['class']); foreach ($expectedItem as $property => $value) { - self::assertEquals($this->readAttribute($actualItem, $property), $value); + self::assertEquals($actualItem->{'get'. ucfirst($property)}(), $value); } } } diff --git a/test/CliMenuTest.php b/test/CliMenuTest.php index 0436adfd..ffb03790 100644 --- a/test/CliMenuTest.php +++ b/test/CliMenuTest.php @@ -29,7 +29,7 @@ class CliMenuTest extends TestCase */ private $output; - public function setUp() + public function setUp() : void { $this->output = new BufferedOutput; $this->terminal = $this->createMock(Terminal::class); @@ -671,10 +671,10 @@ public function testRemoveCustomControlMapping() : void $menu = new CliMenu('PHP School FTW', [], $this->terminal); $menu->addCustomControlMapping('c', $action); - self::assertSame(['c' => $action], $this->readAttribute($menu, 'customControlMappings')); + self::assertSame(['c' => $action], $menu->getCustomControlMappings()); $menu->removeCustomControlMapping('c'); - self::assertSame([], $this->readAttribute($menu, 'customControlMappings')); + self::assertSame([], $menu->getCustomControlMappings()); } public function testSplitItemWithNoSelectableItemsScrollingVertically() : void @@ -847,7 +847,11 @@ public function testAddItemSelectsFirstSelectableItemWhenItemsExistButNoneAreSel $menu = new CliMenu('PHP School FTW', [], $this->terminal); $menu->addItem(new StaticItem('No Selectable')); - self::assertNull(self::readAttribute($menu, 'selectedItem')); + try { + $menu->getSelectedItem(); + $this->fail('Exception not thrown'); + } catch (\RuntimeException $e) { + } $menu->addItem($item = new SelectableItem('Selectable', function () { })); @@ -860,7 +864,11 @@ public function testAddItemsSelectsFirstSelectableItemWhenItemsExistButNoneAreSe $menu = new CliMenu('PHP School FTW', [], $this->terminal); $menu->addItem(new StaticItem('No Selectable')); - self::assertNull(self::readAttribute($menu, 'selectedItem')); + try { + $menu->getSelectedItem(); + $this->fail('Exception not thrown'); + } catch (\RuntimeException $e) { + } $menu->addItems([$item = new SelectableItem('Selectable', function () { })]); @@ -894,7 +902,11 @@ public function testRemoveItemReSelectsFirstSelectableItemIfSelectedItemRemoved( $menu->removeItem($item); - self::assertNull(self::readAttribute($menu, 'selectedItem')); + try { + $menu->getSelectedItem(); + $this->fail('Exception not thrown'); + } catch (\RuntimeException $e) { + } $menu = new CliMenu('PHP School FTW', [], $this->terminal); $menu->addItem(new StaticItem('No Selectable')); diff --git a/test/Dialogue/ConfirmTest.php b/test/Dialogue/ConfirmTest.php index c98168d9..8a0e6c54 100644 --- a/test/Dialogue/ConfirmTest.php +++ b/test/Dialogue/ConfirmTest.php @@ -24,7 +24,7 @@ class ConfirmTest extends TestCase */ private $output; - public function setUp() + public function setUp() : void { $this->output = new BufferedOutput; $this->terminal = $this->createMock(Terminal::class); diff --git a/test/Dialogue/FlashTest.php b/test/Dialogue/FlashTest.php index 58ec514b..8d61e12d 100644 --- a/test/Dialogue/FlashTest.php +++ b/test/Dialogue/FlashTest.php @@ -24,7 +24,7 @@ class FlashTest extends TestCase */ private $output; - public function setUp() + public function setUp() : void { $this->output = new BufferedOutput; $this->terminal = $this->createMock(Terminal::class); diff --git a/test/Input/InputIOTest.php b/test/Input/InputIOTest.php index 58403e8a..022c0b16 100644 --- a/test/Input/InputIOTest.php +++ b/test/Input/InputIOTest.php @@ -41,7 +41,7 @@ class InputIOTest extends TestCase */ private $inputIO; - public function setUp() + public function setUp() : void { $this->terminal = $this->createMock(Terminal::class); $this->output = new BufferedOutput; diff --git a/test/Input/NumberTest.php b/test/Input/NumberTest.php index 6fa2f94a..6e131aad 100644 --- a/test/Input/NumberTest.php +++ b/test/Input/NumberTest.php @@ -29,7 +29,7 @@ class NumberTest extends TestCase */ private $input; - public function setUp() + public function setUp() : void { $this->terminal = $this->createMock(Terminal::class); $menu = $this->createMock(CliMenu::class); diff --git a/test/Input/PasswordTest.php b/test/Input/PasswordTest.php index c38b8401..08a13c80 100644 --- a/test/Input/PasswordTest.php +++ b/test/Input/PasswordTest.php @@ -29,7 +29,7 @@ class PasswordTest extends TestCase */ private $input; - public function setUp() + public function setUp() : void { $this->terminal = $this->createMock(Terminal::class); $menu = $this->createMock(CliMenu::class); diff --git a/test/Input/TextTest.php b/test/Input/TextTest.php index 2b3e6125..b9864e2c 100644 --- a/test/Input/TextTest.php +++ b/test/Input/TextTest.php @@ -29,7 +29,7 @@ class TextTest extends TestCase */ private $input; - public function setUp() + public function setUp() : void { $this->terminal = $this->createMock(Terminal::class); $menu = $this->createMock(CliMenu::class); diff --git a/test/MenuItem/MenuMenuItemTest.php b/test/MenuItem/MenuMenuItemTest.php index 3b4ec3a3..16c03bd8 100644 --- a/test/MenuItem/MenuMenuItemTest.php +++ b/test/MenuItem/MenuMenuItemTest.php @@ -28,7 +28,7 @@ public function testGetSelectAction() : void $item = new MenuMenuItem('Item', $subMenu); $action = $item->getSelectAction(); - $this->assertInternalType('callable', $action); + $this->assertIsCallable($action); } public function testShowsItemExtra() : void