diff --git a/More/EAV/Attribute.php b/More/EAV/Attribute.php index f7af581..7103af9 100644 --- a/More/EAV/Attribute.php +++ b/More/EAV/Attribute.php @@ -43,8 +43,10 @@ class Attribute implements ValueAccessInterface */ public function removeValue(ValueInterface $value) { - if ($key = array_search($value, $this->values, true)) { - unset($this->values[$key]); + $index = array_search($value, $this->values, true); + + if (false !== $index) { + unset($this->values[$index]); } return $this; diff --git a/More/EAV/Entity.php b/More/EAV/Entity.php index 4da304a..5dd7ed1 100644 --- a/More/EAV/Entity.php +++ b/More/EAV/Entity.php @@ -43,8 +43,10 @@ class Entity implements ValueAccessInterface */ public function removeValue(ValueInterface $value) { - if ($key = array_search($value, $this->values, true)) { - unset($this->values[$key]); + $index = array_search($value, $this->values, true); + + if (false !== $index) { + unset($this->values[$index]); } return $this; diff --git a/More/EAV/README.rst b/More/EAV/README.rst index 8aab2f1..0a03ad7 100644 --- a/More/EAV/README.rst +++ b/More/EAV/README.rst @@ -9,7 +9,74 @@ Purpose Examples -------- -... +``` +use DesignPatterns\More\EAV\Entity; +use DesignPatterns\More\EAV\Attribute; +use DesignPatterns\More\EAV\Value; + +// color attribute +$color = (new Attribute())->setName('Color'); +// color values +$colorSilver = (new Value($color))->setName('Silver'); +$colorGold = (new Value($color))->setName('Gold'); +$colorSpaceGrey = (new Value($color))->setName('Space Grey'); + +// memory attribute +$memory = (new Attribute())->setName('Memory'); +// memory values +$memory4Gb = (new Value($memory))->setName('4GB'); +$memory8Gb = (new Value($memory))->setName('8GB'); +$memory16Gb = (new Value($memory))->setName('16GB'); + +// storage attribute +$storage = (new Attribute())->setName('Storage'); +// storage values +$storage128Gb = (new Value($storage))->setName('128GB'); +$storage256Gb = (new Value($storage))->setName('256GB'); +$storage512Gb = (new Value($storage))->setName('512GB'); +$storage1Tb = (new Value($storage))->setName('1TB'); + +// entities +$mac = (new Entity()) + ->setName('MacBook') + // colors + ->addValue($colorSilver) + ->addValue($colorGold) + ->addValue($colorSpaceGrey) + // memories + ->addValue($memory8Gb) + // storages + ->addValue($storage256Gb) + ->addValue($storage512Gb) +; + +$macAir = (new Entity()) + ->setName('MacBook Air') + // colors + ->addValue($colorSilver) + // memories + ->addValue($memory4Gb) + ->addValue($memory8Gb) + // storages + ->addValue($storage128Gb) + ->addValue($storage256Gb) + ->addValue($storage512Gb) +; + +$macPro = (new Entity()) + ->setName('MacBook Pro') + // colors + ->addValue($colorSilver) + // memories + ->addValue($memory8Gb) + ->addValue($memory16Gb) + // storages + ->addValue($storage128Gb) + ->addValue($storage256Gb) + ->addValue($storage512Gb) + ->addValue($storage1Tb) +; +``` UML Diagram ----------- @@ -24,7 +91,23 @@ You can also find these code on `GitHub`_ Test ---- -... +Tests/EntityTest.php + +.. literalinclude:: Tests/EntityTest.php + :language: php + :linenos: + +Tests/AttributeTest.php + +.. literalinclude:: Tests/AttributeTest.php + :language: php + :linenos: + +Tests/ValueTest.php + +.. literalinclude:: Tests/ValueTest.php + :language: php + :linenos: .. _`GitHub`: https://github.com/domnikl/DesignPatternsPHP/tree/master/More/EAV diff --git a/More/EAV/Tests/AttributeTest.php b/More/EAV/Tests/AttributeTest.php new file mode 100644 index 0000000..7a086d3 --- /dev/null +++ b/More/EAV/Tests/AttributeTest.php @@ -0,0 +1,66 @@ +assertInstanceOf('\DesignPatterns\More\EAV\Attribute', $attribute); + } + + /** + * @depends testCreationSuccess + */ + public function testSetGetName() + { + $attribute = new Attribute(); + $attribute->setName('Color'); + + $this->assertEquals('Color', $attribute->getName()); + } + + /** + * @depends testCreationSuccess + */ + public function testAddValue() + { + $attribute = new Attribute(); + $attribute->setName('Color'); + + $values[] = (new Value($attribute))->setName('Silver'); + $values[] = (new Value($attribute))->setName('Gold'); + $values[] = (new Value($attribute))->setName('Space Grey'); + + $this->assertEquals($values, $attribute->getValues()); + } + + /** + * @depends testAddValue + */ + public function testRemoveValue() + { + $values = []; + + $attribute = new Attribute(); + $attribute->setName('Color'); + + $values[] = (new Value($attribute))->setName('Silver'); + $values[] = (new Value($attribute))->setName('Gold'); + $values[] = (new Value($attribute))->setName('Space Grey'); + + $randomIndex = array_rand($values); + $attribute->removeValue($values[$randomIndex]); + unset($values[$randomIndex]); + + $this->assertEquals($values, $attribute->getValues()); + } +} diff --git a/More/EAV/Tests/EntityTest.php b/More/EAV/Tests/EntityTest.php new file mode 100644 index 0000000..5fa47cc --- /dev/null +++ b/More/EAV/Tests/EntityTest.php @@ -0,0 +1,132 @@ +setName($name); + + $this->assertEquals($name, $macBook->getName()); + } + + /** + * @dataProvider valueProvider + * + * @var string $name + * @var array|Value[] $values + */ + public function testAddValue($name, array $values) + { + $macBook = new Entity(); + $macBook->setName($name); + + foreach ($values as $value) { + $macBook->addValue($value); + } + + $this->assertEquals($values, $macBook->getValues()); + } + + /** + * @depends testAddValue + * @dataProvider valueProvider + * + * @var string $name + * @var array|Value[] $values + */ + public function testRemoveValue($name, array $values) + { + $macBook = new Entity(); + $macBook->setName($name); + + foreach ($values as $value) { + $macBook->addValue($value); + } + + $randomIndex = array_rand($values); + $macBook->removeValue($values[$randomIndex]); + unset($values[$randomIndex]); + + $this->assertEquals($values, $macBook->getValues()); + } + + /** + * @return array + */ + public function valueProvider() + { + // color attribute + $color = (new Attribute())->setName('Color'); + // color values + $colorSilver = (new Value($color))->setName('Silver'); + $colorGold = (new Value($color))->setName('Gold'); + $colorSpaceGrey = (new Value($color))->setName('Space Grey'); + + // memory attribute + $memory = (new Attribute())->setName('Memory'); + // memory values + $memory4Gb = (new Value($memory))->setName('4GB'); + $memory8Gb = (new Value($memory))->setName('8GB'); + $memory16Gb = (new Value($memory))->setName('16GB'); + + // storage attribute + $storage = (new Attribute())->setName('Storage'); + // storage values + $storage128Gb = (new Value($storage))->setName('128GB'); + $storage256Gb = (new Value($storage))->setName('256GB'); + $storage512Gb = (new Value($storage))->setName('512GB'); + $storage1Tb = (new Value($storage))->setName('1TB'); + + return [ + [ + 'MacBook', + [ + $colorSilver, + $colorGold, + $colorSpaceGrey, + $memory8Gb, + $storage256Gb, + $storage512Gb, + ], + ], + [ + 'MacBook Air', + [ + $colorSilver, + $memory4Gb, + $memory8Gb, + $storage128Gb, + $storage256Gb, + $storage512Gb, + ], + ], + [ + 'MacBook Pro', + [ + $colorSilver, + $memory8Gb, + $memory16Gb, + $storage128Gb, + $storage256Gb, + $storage512Gb, + $storage1Tb, + ], + ], + ]; + } +} diff --git a/More/EAV/Tests/ValueTest.php b/More/EAV/Tests/ValueTest.php new file mode 100644 index 0000000..0d817ce --- /dev/null +++ b/More/EAV/Tests/ValueTest.php @@ -0,0 +1,59 @@ +assertTrue($isFailure); + } + + public function testCreationSuccessWithAttribute() + { + $attribute = new Attribute(); + $attribute->setName('Color'); + + $value = new Value($attribute); + + $this->assertInstanceOf('\DesignPatterns\More\EAV\Value', $value); + } + + public function testSetGetName() + { + $attribute = new Attribute(); + $attribute->setName('Color'); + + $value = new Value($attribute); + $value->setName('Silver'); + + $this->assertEquals('Silver', $value->getName()); + } + + public function testSetGetAttribute() + { + $attribute = new Attribute(); + $attribute->setName('Color'); + + $value = new Value($attribute); + $value->setName('Silver'); + $this->assertSame($attribute, $value->getAttribute()); + + $value->setAttribute($attribute); + $this->assertSame($attribute, $value->getAttribute()); + } +} diff --git a/More/EAV/Value.php b/More/EAV/Value.php index 9f1d3ae..617afdc 100644 --- a/More/EAV/Value.php +++ b/More/EAV/Value.php @@ -26,6 +26,16 @@ class Value implements ValueInterface $this->attribute = $attribute; } + /** + * @param Attribute $attribute + */ + public function setAttribute(Attribute $attribute) + { + $this->attribute->removeValue($this); // Remove value from current attribute + $attribute->addValue($this); // Add value to new attribute + $this->attribute = $attribute; + } + /** * @return Attribute */ diff --git a/More/EAV/ValueInterface.php b/More/EAV/ValueInterface.php index fee9865..c041835 100644 --- a/More/EAV/ValueInterface.php +++ b/More/EAV/ValueInterface.php @@ -12,6 +12,11 @@ interface ValueInterface */ public function __construct(Attribute $attribute); + /** + * @param Attribute $attribute + */ + public function setAttribute(Attribute $attribute); + /** * @return Attribute */