diff --git a/src/PhpValueObject/Person/Female.php b/src/PhpValueObject/Person/Female.php new file mode 100644 index 0000000..fd06521 --- /dev/null +++ b/src/PhpValueObject/Person/Female.php @@ -0,0 +1,23 @@ + + * GitHub: danitome24 + */ + +namespace PhpValueObject\Person; + +final class Female extends Gender +{ + private const NAME = 'Female'; + + /** + * Build Female instance + * + * @return static + */ + public static function fromFemale() + { + return new static(self::NAME); + } +} diff --git a/src/PhpValueObject/Person/Gender.php b/src/PhpValueObject/Person/Gender.php new file mode 100644 index 0000000..e7f4e38 --- /dev/null +++ b/src/PhpValueObject/Person/Gender.php @@ -0,0 +1,46 @@ + + * GitHub: danitome24 + */ + +namespace PhpValueObject\Person; + +use PhpValueObject\ValueObject; + +abstract class Gender implements ValueObject +{ + /** + * @var string + */ + private $gender; + + /** + * Gender constructor. + * @param string $gender + */ + protected function __construct(string $gender) + { + $this->gender = $gender; + } + + /** + * @return string + */ + public function gender(): string + { + return $this->gender; + } + + /** + * Compare a value object with another one. + * + * @param static|ValueObject $valueObjectToCompare + * @return bool + */ + public function equals(ValueObject $valueObjectToCompare): bool + { + return ($this->gender() === $valueObjectToCompare->gender()); + } +} diff --git a/src/PhpValueObject/Person/Male.php b/src/PhpValueObject/Person/Male.php new file mode 100644 index 0000000..9a0b5e6 --- /dev/null +++ b/src/PhpValueObject/Person/Male.php @@ -0,0 +1,23 @@ + + * GitHub: danitome24 + */ + +namespace PhpValueObject\Person; + +final class Male extends Gender +{ + private const NAME = 'Male'; + + /** + * Build Male instance + * + * @return static + */ + public static function fromMale() + { + return new static(self::NAME); + } +} diff --git a/src/PhpValueObject/Person/Neutral.php b/src/PhpValueObject/Person/Neutral.php new file mode 100644 index 0000000..9141a3c --- /dev/null +++ b/src/PhpValueObject/Person/Neutral.php @@ -0,0 +1,23 @@ + + * GitHub: danitome24 + */ + +namespace PhpValueObject\Person; + +final class Neutral extends Gender +{ + private const NAME = 'Neutral'; + + /** + * Build Neutral instance + * + * @return static + */ + public static function fromNeutral() + { + return new static(self::NAME); + } +} diff --git a/tests/Person/GenderTest.php b/tests/Person/GenderTest.php new file mode 100644 index 0000000..6cea3a2 --- /dev/null +++ b/tests/Person/GenderTest.php @@ -0,0 +1,47 @@ + + * GitHub: danitome24 + */ + +namespace Person; + +use PHPUnit\Framework\TestCase; +use PhpValueObject\Person\Female; +use PhpValueObject\Person\Gender; +use PhpValueObject\Person\Male; +use PhpValueObject\Person\Neutral; + +class GenderTest extends TestCase +{ + + public function testGenderInheritanceInstance() + { + $this->assertEquals('Male', Male::fromMale()->gender()); + $this->assertEquals('Female', Female::fromFemale()->gender()); + $this->assertEquals('Neutral', Neutral::fromNeutral()->gender()); + } + + /** + * @dataProvider genders + * @param Gender $gender + * @param Gender $genderToCompare + * @param bool $isEquals + */ + public function testEqualsMethod(Gender $gender, Gender $genderToCompare, bool $isEquals) + { + $this->assertEquals($isEquals, $gender->equals($genderToCompare)); + } + + /** + * @return array + */ + public function genders(): array + { + return [ + [Male::fromMale(), Male::fromMale(), true], + [Male::fromMale(), Female::fromFemale(), false] + ]; + } +}