Implemented tests for DimensionHelper

This commit is contained in:
Kevin Frantz 2018-11-01 22:34:26 +01:00
parent 0cd09258e7
commit fdeaa390d3
19 changed files with 187 additions and 104 deletions

View File

@ -3,8 +3,7 @@
namespace App\Entity\Attribut; namespace App\Entity\Attribut;
use Doctrine\Common\Collections\Collection; use Doctrine\Common\Collections\Collection;
use Doctrine\Common\Collections\ArrayCollection; use App\Helper\DimensionHelper;
use App\Helper\Dimension;
/** /**
* @author kevinfrantz * @author kevinfrantz
@ -34,8 +33,9 @@ trait MembersAttribut
*/ */
public function getMembersIncludingChildren(?int $dimension = null, Collection $members = null): Collection public function getMembersIncludingChildren(?int $dimension = null, Collection $members = null): Collection
{ {
$dimensionHelper = new Dimension(__FUNCTION__, MembersAttributInterface::class, $this, 'members'); $dimensionHelper = new DimensionHelper(__FUNCTION__, MembersAttributInterface::class, $this, 'members');
return $dimensionHelper->getDimensions($dimension,$members);
return $dimensionHelper->getDimensions($dimension, $members);
} }
private function continueIncludeMembersLoop(?int $dimension): bool private function continueIncludeMembersLoop(?int $dimension): bool

View File

@ -3,7 +3,6 @@
namespace App\Entity\Attribut; namespace App\Entity\Attribut;
use Doctrine\Common\Collections\Collection; use Doctrine\Common\Collections\Collection;
use App\Entity\Source\GroupSourceInterface;
use App\Entity\Source\Collection\MemberCollectionSourceInterface; use App\Entity\Source\Collection\MemberCollectionSourceInterface;
/** /**

View File

@ -1,4 +1,5 @@
<?php <?php
namespace App\Entity\Attribut; namespace App\Entity\Attribut;
use Doctrine\Common\Collections\Collection; use Doctrine\Common\Collections\Collection;
@ -9,15 +10,14 @@ trait SourceCollectionAttribut
/** /**
* @param Collection|SourceInterface[] $collection * @param Collection|SourceInterface[] $collection
*/ */
public function setCollection(Collection $collection):void{ public function setCollection(Collection $collection): void
{
} }
/** /**
* @return Collection|SourceInterface[] * @return Collection|SourceInterface[]
*/ */
public function getCollection():Collection{ public function getCollection(): Collection
{
} }
} }

View File

@ -1,4 +1,5 @@
<?php <?php
namespace App\Entity\Attribut; namespace App\Entity\Attribut;
use Doctrine\Common\Collections\Collection; use Doctrine\Common\Collections\Collection;
@ -9,10 +10,10 @@ interface SourceCollectionAttributInterface
/** /**
* @param Collection|SourceInterface[] $collection * @param Collection|SourceInterface[] $collection
*/ */
public function setCollection(Collection $collection):void; public function setCollection(Collection $collection): void;
/** /**
* @return Collection|SourceInterface[] * @return Collection|SourceInterface[]
*/ */
public function getCollection():Collection; public function getCollection(): Collection;
} }

View File

@ -6,7 +6,6 @@ use Doctrine\ORM\Mapping as ORM;
use JMS\Serializer\Annotation\Exclude; use JMS\Serializer\Annotation\Exclude;
use App\Entity\AbstractEntity; use App\Entity\AbstractEntity;
use Doctrine\Common\Collections\Collection; use Doctrine\Common\Collections\Collection;
use App\Entity\Attribut\GroupSourcesAttribut;
use App\Entity\Meta\RelationInterface; use App\Entity\Meta\RelationInterface;
use App\Entity\Attribut\RelationAttribut; use App\Entity\Attribut\RelationAttribut;
use App\Entity\Meta\Relation; use App\Entity\Meta\Relation;

View File

@ -1,9 +1,14 @@
<?php <?php
namespace App\Entity\Source\Collection; namespace App\Entity\Source\Collection;
use App\Entity\Source\AbstractSource; use App\Entity\Source\AbstractSource;
/**
* @todo Implement inhiering classes!
* @author kevinfrantz
*
*/
class AbstractCollectionSource extends AbstractSource implements CollectionSourceInterface class AbstractCollectionSource extends AbstractSource implements CollectionSourceInterface
{ {
} }

View File

@ -1,8 +1,9 @@
<?php <?php
namespace App\Entity\Source\Collection; namespace App\Entity\Source\Collection;
use App\Entity\Source\SourceInterface; use App\Entity\Source\SourceInterface;
interface CollectionSourceInterface extends SourceInterface interface CollectionSourceInterface extends SourceInterface
{} {
}

View File

@ -6,6 +6,7 @@ use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\Collection; use Doctrine\Common\Collections\Collection;
use App\Entity\Attribut\MembersAttribut; use App\Entity\Attribut\MembersAttribut;
use Doctrine\Common\Collections\ArrayCollection; use Doctrine\Common\Collections\ArrayCollection;
/** /**
* @author kevinfrantz * @author kevinfrantz
* @ORM\Table(name="source_group") * @ORM\Table(name="source_group")

View File

@ -7,6 +7,6 @@ use App\Entity\Attribut\MembersAttributInterface;
/** /**
* @author kevinfrantz * @author kevinfrantz
*/ */
interface MemberCollectionSourceInterface extends MembersAttributInterface,CollectionSourceInterface interface MemberCollectionSourceInterface extends MembersAttributInterface, CollectionSourceInterface
{ {
} }

View File

@ -1,4 +1,5 @@
<?php <?php
namespace App\Entity\Source\Collection\Queue; namespace App\Entity\Source\Collection\Queue;
use App\Entity\Attribut\MembersAttributInterface; use App\Entity\Attribut\MembersAttributInterface;
@ -7,11 +8,12 @@ use App\Entity\Source\SourceInterface;
/** /**
* @todo Implement integration test for two user accessing queue! Check if log works! * @todo Implement integration test for two user accessing queue! Check if log works!
*
* @author kevinfrantz * @author kevinfrantz
*/ */
interface QueueSourceInterface extends CollectionSourceInterface, MembersAttributInterface interface QueueSourceInterface extends CollectionSourceInterface, MembersAttributInterface
{ {
public function getPointerPosition():int; public function getPointerPosition(): int;
public function getNextElement():SourceInterface; public function getNextElement(): SourceInterface;
} }

View File

@ -1,60 +1,61 @@
<?php <?php
namespace App\Helper; namespace App\Helper;
use Doctrine\Common\Collections\ArrayCollection; use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection; use Doctrine\Common\Collections\Collection;
/** /**
* Helps to get all Elements till a special dimension * Helps to get all Elements till a special dimension.
*
* @author kevinfrantz * @author kevinfrantz
* *
* @todo Implement tests for all functions
*/ */
final class Dimension implements DimensionInterface final class DimensionHelper implements DimensionHelperInterface
{ {
/** /**
*
* @var string * @var string
*/ */
private $attribut; private $attribut;
/** /**
* @var string * @var string
*/ */
private $method; private $method;
/** /**
*
* @var string * @var string
*/ */
private $interface; private $interface;
/** /**
*
* @var object * @var object
*/ */
private $object; private $object;
/** /**
* @var int|null the actual dimension to which the class points * @var int|null the actual dimension to which the class points
*/ */
private $dimension = null; private $dimension = null;
/** /**
* @param string $method which uses the dimension helper * @param string $method which uses the dimension helper
* @param string $interface which is implemented in all classes which have dimensions * @param string $interface which is implemented in all classes which have dimensions
* @param object $object which calls the dimension helper * @param object $object which calls the dimension helper
* @param string $attribut which represents dimensions * @param string $attribut which represents dimensions
*/ */
public function __construct(string $method,string $interface, object $object,string $attribut) { public function __construct(string $method, string $interface, object $object, string $attribut)
$this->method = $method; {
$this->interface = $interface; $this->method = $method;
$this->object = $object; $this->interface = $interface;
$this->attribut = $attribut; $this->object = $object;
$this->attribut = $attribut;
} }
/** /**
* @param int $dimension The dimensions start with 1 for the elements of the actuall dimension and NULL for all elements * @param int $dimension The dimensions start with 1 for the elements of the actuall dimension and NULL for all elements
* @param Collection $elements A elements collection, to which new elements should be add * @param Collection $elements A elements collection, to which new elements should be add
* *
* @return Collection Returns all elements till the defined dimension * @return Collection Returns all elements till the defined dimension
*/ */
@ -62,7 +63,7 @@ final class Dimension implements DimensionInterface
{ {
$this->setDimension($dimension); $this->setDimension($dimension);
$elements = $elements ?? new ArrayCollection(); $elements = $elements ?? new ArrayCollection();
foreach ($this->object->{$this->attributGetterName()}()->toArray() as $element) { foreach ($this->object->{$this->attributGetterName()}()->toArray() as $element) {
if (!$elements->contains($element)) { if (!$elements->contains($element)) {
$elements->add($element); $elements->add($element);
if ($this->continueLoop() && $element instanceof $this->interface) { if ($this->continueLoop() && $element instanceof $this->interface) {
@ -70,28 +71,32 @@ final class Dimension implements DimensionInterface
} }
} }
} }
return $elements; return $elements;
} }
private function setDimension(?int $dimension):void{ private function setDimension(?int $dimension): void
{
$this->dimension = is_int($dimension) ? $dimension - 1 : null; $this->dimension = is_int($dimension) ? $dimension - 1 : null;
} }
private function attributGetterName():string{ private function attributGetterName(): string
{
return 'get'.ucfirst($this->attribut); return 'get'.ucfirst($this->attribut);
} }
private function includeInfiniteDimensions():bool{ private function includeInfiniteDimensions(): bool
{
return is_null($this->dimension); return is_null($this->dimension);
} }
private function isNotLastDimension():bool{ private function isNotLastDimension(): bool
{
return $this->dimension > 0; return $this->dimension > 0;
} }
private function continueLoop(): bool private function continueLoop(): bool
{ {
return $this->includeInfiniteDimensions() || $this->isNotLastDimension(); return $this->includeInfiniteDimensions() || $this->isNotLastDimension();
} }
} }

View File

@ -1,10 +1,10 @@
<?php <?php
namespace App\Helper; namespace App\Helper;
use Doctrine\Common\Collections\Collection; use Doctrine\Common\Collections\Collection;
interface DimensionInterface interface DimensionHelperInterface
{ {
public function getDimensions(?int $dimension = null, Collection $elements = null): Collection; public function getDimensions(?int $dimension = null, Collection $elements = null): Collection;
} }

View File

@ -17,12 +17,30 @@ abstract class AbstractTestCase extends TestCase
* *
* @return mixed method return * @return mixed method return
*/ */
public function invokeMethod(&$object, $methodName, array $parameters = []) public function invokeMethod(object &$object, string $methodName, array $parameters = [])
{ {
$reflection = new \ReflectionClass(get_class($object)); $reflection = $this->getReflectionClassByObject($object);
$method = $reflection->getMethod($methodName); $method = $reflection->getMethod($methodName);
$method->setAccessible(true); $method->setAccessible(true);
return $method->invokeArgs($object, $parameters); return $method->invokeArgs($object, $parameters);
} }
/**
* @param object $object
* @param string $property
* @param mixed $value
*/
public function setProperty(object &$object, string $property, $value): void
{
$reflectionClass = $this->getReflectionClassByObject($object);
$reflectionProperty = $reflectionClass->getProperty($property);
$reflectionProperty->setAccessible(true);
$reflectionProperty->setValue($object, $value);
}
private function getReflectionClassByObject(object &$object): \ReflectionClass
{
return new \ReflectionClass(get_class($object));
}
} }

View File

@ -1,4 +1,5 @@
<?php <?php
namespace Tests\Unit\Entity\Attribut; namespace Tests\Unit\Entity\Attribut;
use PHPUnit\Framework\TestCase; use PHPUnit\Framework\TestCase;
@ -8,27 +9,27 @@ use App\Entity\Attribut\IdAttributInterface;
class IdAttributTest extends TestCase class IdAttributTest extends TestCase
{ {
/** /**
*
* @var IdAttributInterface * @var IdAttributInterface
*/ */
protected $id; protected $id;
public function setUp():void{ public function setUp(): void
$this->id = new class implements IdAttributInterface{ {
$this->id = new class() implements IdAttributInterface {
use IdAttribut; use IdAttribut;
}; };
} }
public function testConstruct():void{ public function testConstruct(): void
{
$this->expectException(\TypeError::class); $this->expectException(\TypeError::class);
$this->id->getId(); $this->id->getId();
} }
public function testAccessors():void{ public function testAccessors(): void
{
$id = 1234; $id = 1234;
$this->assertNull($this->id->setId($id)); $this->assertNull($this->id->setId($id));
$this->assertEquals($id, $this->id->getId()); $this->assertEquals($id, $this->id->getId());
} }
} }

View File

@ -5,7 +5,6 @@ namespace App\Tests\Unit\Entity\Attribut;
use App\Entity\Attribut\MembersAttribut; use App\Entity\Attribut\MembersAttribut;
use App\Entity\Attribut\MembersAttributInterface; use App\Entity\Attribut\MembersAttributInterface;
use Doctrine\Common\Collections\ArrayCollection; use Doctrine\Common\Collections\ArrayCollection;
use App\Entity\Source\AbstractSource;
use App\Tests\AbstractTestCase; use App\Tests\AbstractTestCase;
use App\Entity\Source\SourceInterface; use App\Entity\Source\SourceInterface;
@ -20,9 +19,10 @@ class MembersAttributTest extends AbstractTestCase
{ {
$this->membersAttribut = $this->getMembersAttributClassMock(); $this->membersAttribut = $this->getMembersAttributClassMock();
} }
private function getMembersAttributClassMock():MembersAttributInterface{ private function getMembersAttributClassMock(): MembersAttributInterface
return new class implements MembersAttributInterface{ {
return new class() implements MembersAttributInterface {
use MembersAttribut; use MembersAttribut;
}; };
} }
@ -34,20 +34,6 @@ class MembersAttributTest extends AbstractTestCase
$this->membersAttribut->getMembersIncludingChildren(); $this->membersAttribut->getMembersIncludingChildren();
} }
private function getContinueIncludeMemberLoopResult($dimension): bool
{
return $this->invokeMethod($this->membersAttribut, 'continueIncludeMembersLoop', [$dimension]);
}
public function testContinueIncludeMemberLoop()
{
$this->assertTrue($this->getContinueIncludeMemberLoopResult(null));
$this->assertTrue($this->getContinueIncludeMemberLoopResult(2));
$this->assertTrue($this->getContinueIncludeMemberLoopResult(1));
$this->assertFalse($this->getContinueIncludeMemberLoopResult(0));
$this->assertFalse($this->getContinueIncludeMemberLoopResult(-1));
}
public function testMembersAccessors() public function testMembersAccessors()
{ {
$source1 = $this->createMock(SourceInterface::class); $source1 = $this->createMock(SourceInterface::class);

View File

@ -1,4 +1,5 @@
<?php <?php
namespace Tests\Unit\Entity\Attribut; namespace Tests\Unit\Entity\Attribut;
use PHPUnit\Framework\TestCase; use PHPUnit\Framework\TestCase;
@ -10,26 +11,27 @@ use Doctrine\Common\Collections\ArrayCollection;
class MembershipsAttributTest extends TestCase class MembershipsAttributTest extends TestCase
{ {
/** /**
*
* @var MembershipsAttributInterface * @var MembershipsAttributInterface
*/ */
protected $memberships; protected $memberships;
public function setUp():void{ public function setUp(): void
$this->memberships = new class implements MembershipsAttributInterface{ {
$this->memberships = new class() implements MembershipsAttributInterface {
use MembershipsAttribut; use MembershipsAttribut;
}; };
} }
public function testConstructor():void { public function testConstructor(): void
{
$this->expectException(\TypeError::class); $this->expectException(\TypeError::class);
$this->memberships->getMemberships(); $this->memberships->getMemberships();
} }
public function testAccessors():void { public function testAccessors(): void
{
$membership = $this->createMock(MemberCollectionSourceInterface::class); $membership = $this->createMock(MemberCollectionSourceInterface::class);
$this->assertNull($this->memberships->setMemberships(new ArrayCollection([$membership]))); $this->assertNull($this->memberships->setMemberships(new ArrayCollection([$membership])));
$this->assertEquals($this->memberships->getMemberships()->get(0), $membership); $this->assertEquals($this->memberships->getMemberships()->get(0), $membership);
} }
} }

View File

@ -33,4 +33,4 @@ class AbstractSourceTest extends TestCase
$this->assertInstanceOf(Collection::class, $this->source->getMemberships()); $this->assertInstanceOf(Collection::class, $this->source->getMemberships());
$this->assertInstanceOf(LawInterface::class, $this->source->getLaw()); $this->assertInstanceOf(LawInterface::class, $this->source->getLaw());
} }
} }

View File

@ -1,4 +1,5 @@
<?php <?php
namespace Tests\Unit\Entity\Source\Collection; namespace Tests\Unit\Entity\Source\Collection;
use PHPUnit\Framework\TestCase; use PHPUnit\Framework\TestCase;
@ -9,14 +10,11 @@ use App\Entity\Source\Collection\MemberCollectionSourceInterface;
use App\Entity\Source\Collection\MemberCollectionSource; use App\Entity\Source\Collection\MemberCollectionSource;
/** /**
*
* @author kevinfrantz * @author kevinfrantz
*/ */
class MemberCollectionSourceTest extends TestCase class MemberCollectionSourceTest extends TestCase
{ {
/** /**
*
* @var MemberCollectionSourceInterface * @var MemberCollectionSourceInterface
*/ */
protected $groupSource; protected $groupSource;
@ -33,9 +31,10 @@ class MemberCollectionSourceTest extends TestCase
public function testMembers() public function testMembers()
{ {
$member = new class() extends AbstractSource {}; $member = new class() extends AbstractSource {
};
$this->groupSource->setMembers(new ArrayCollection([ $this->groupSource->setMembers(new ArrayCollection([
$member $member,
])); ]));
$this->assertEquals($member, $this->groupSource->getMembers() $this->assertEquals($member, $this->groupSource->getMembers()
->get(0)); ->get(0));

View File

@ -0,0 +1,64 @@
<?php
namespace App\Tests\Unit\Helper;
use App\Tests\AbstractTestCase;
use App\Helper\DimensionHelper;
use App\Helper\DimensionHelperInterface;
use Doctrine\Common\Collections\Collection;
use Doctrine\Common\Collections\ArrayCollection;
class HelperTest extends AbstractTestCase
{
/**
* @var DimensionHelperInterface
*/
protected $dimensionMock;
public function setUp(): void
{
$this->dimensionMock = new class() implements DimensionHelperInterface {
/**
* @var ArrayCollection
*/
public $dimensionElements;
/**
* @var DimensionHelper
*/
public $dimensionHelper;
public function __construct()
{
$this->dimensionElements = new ArrayCollection();
$this->dimensionHelper = new DimensionHelper('getDimensions', DimensionHelperInterface::class, $this, 'dimensionElements');
}
public function getDimensionElements(): Collection
{
return $this->dimensionElements;
}
public function getDimensions(?int $dimension = null, Collection $elements = null): Collection
{
return $this->dimensionHelper->getDimensions($dimension, $elements);
}
};
}
private function getContinueLoopResult($dimension): bool
{
$this->setProperty($this->dimensionMock->dimensionHelper, 'dimension', $dimension);
return $this->invokeMethod($this->dimensionMock->dimensionHelper, 'continueLoop');
}
public function testContinueLoop(): void
{
$this->assertTrue($this->getContinueLoopResult(null));
$this->assertTrue($this->getContinueLoopResult(2));
$this->assertTrue($this->getContinueLoopResult(1));
$this->assertFalse($this->getContinueLoopResult(0));
$this->assertFalse($this->getContinueLoopResult(-1));
}
}