File tree Expand file tree Collapse file tree 3 files changed +134
-0
lines changed
src/PhpValueObject/Person Expand file tree Collapse file tree 3 files changed +134
-0
lines changed Original file line number Diff line number Diff line change 1+ <?php
2+ /**
3+ * This software was built by:
4+ * Daniel Tomé Fernández <danieltomefer@gmail.com>
5+ * GitHub: danitome24
6+ */
7+
8+ namespace PhpValueObject \Person ;
9+
10+ use PhpValueObject \Person \Exception \InvalidAgeException ;
11+ use PhpValueObject \ValueObject ;
12+
13+ final class Age implements ValueObject
14+ {
15+ private const MIN_AGE = 0 ;
16+ private const MAX_AGE = 150 ;
17+
18+ /**
19+ * @var int
20+ */
21+ private $ age ;
22+
23+ /**
24+ * Age constructor.
25+ * @param int $age
26+ */
27+ private function __construct (int $ age )
28+ {
29+ $ this ->checkIsValidAge ($ age );
30+ $ this ->age = $ age ;
31+ }
32+
33+ /**
34+ * @param int $age
35+ * @return static
36+ */
37+ public static function from (int $ age )
38+ {
39+ return new static ($ age );
40+ }
41+
42+ /**
43+ * @return int
44+ */
45+ public function age (): int
46+ {
47+ return $ this ->age ;
48+ }
49+
50+ /**
51+ * @param int $age
52+ * @throws \PhpValueObject\Person\Exception\InvalidAgeException
53+ */
54+ private function checkIsValidAge (int $ age )
55+ {
56+ if ($ age < self ::MIN_AGE || $ age > self ::MAX_AGE ) {
57+ throw new InvalidAgeException ('Age ' . $ age . ' is invalid ' );
58+ }
59+ }
60+
61+ /**
62+ * Compare a value object with another one.
63+ *
64+ * @param static|ValueObject $valueObjectToCompare
65+ * @return bool
66+ */
67+ public function equals (ValueObject $ valueObjectToCompare ): bool
68+ {
69+ return ($ this ->age () === $ valueObjectToCompare ->age ());
70+ }
71+ }
Original file line number Diff line number Diff line change 1+ <?php
2+ /**
3+ * This software was built by:
4+ * Daniel Tomé Fernández <danieltomefer@gmail.com>
5+ * GitHub: danitome24
6+ */
7+
8+ namespace PhpValueObject \Person \Exception ;
9+
10+ use Throwable ;
11+
12+ class InvalidAgeException extends \Exception
13+ {
14+ public function __construct ($ message = "" , $ code = 0 , Throwable $ previous = null )
15+ {
16+ parent ::__construct ($ message , $ code , $ previous );
17+ }
18+ }
Original file line number Diff line number Diff line change 1+ <?php
2+ /**
3+ * This software was built by:
4+ * Daniel Tomé Fernández <danieltomefer@gmail.com>
5+ * GitHub: danitome24
6+ */
7+
8+ namespace Person ;
9+
10+ use PhpValueObject \Person \Age ;
11+ use PHPUnit \Framework \TestCase ;
12+ use PhpValueObject \Person \Exception \InvalidAgeException ;
13+
14+ class AgeTest extends TestCase
15+ {
16+ public function testAgeIsValid ()
17+ {
18+ $ this ->assertEquals (5 , Age::from (5 )->age ());
19+ }
20+
21+ public function testInvalidAgeExceptionIsThrown ()
22+ {
23+ $ this ->expectException (InvalidAgeException::class);
24+ Age::from (-5 );
25+ }
26+
27+ /**
28+ * @dataProvider ages
29+ * @param Age $age
30+ * @param Age $ageToCompare
31+ * @param bool $isEquals
32+ */
33+ public function testEqualsMethod (Age $ age , Age $ ageToCompare , bool $ isEquals )
34+ {
35+ $ this ->assertEquals ($ isEquals , $ age ->equals ($ ageToCompare ));
36+ }
37+
38+ public function ages ()
39+ {
40+ return [
41+ [Age::from (14 ), Age::from (14 ), true ],
42+ [Age::from (12 ), Age::from (11 ), false ]
43+ ];
44+ }
45+ }
You can’t perform that action at this time.
0 commit comments