1+ <?php
2+
3+ namespace TheCodingMachine \GraphQLite \Utils ;
4+
5+ use Exception ;
6+ use PHPUnit \Framework \TestCase ;
7+ use TheCodingMachine \GraphQLite \Fixtures \Integration \Models \Contact ;
8+ use TheCodingMachine \GraphQLite \Fixtures \Integration \Models \Post ;
9+ use TheCodingMachine \GraphQLite \Fixtures \Integration \Models \Preferences ;
10+ use TheCodingMachine \GraphQLite \Fixtures \Integration \Models \Product ;
11+ use TheCodingMachine \GraphQLite \Fixtures \Integration \Models \TrickyProduct ;
12+ use TheCodingMachine \GraphQLite \Fixtures \Types \GetterSetterType ;
13+ use TheCodingMachine \GraphQLite \Fixtures \Types \MagicGetterSetterType ;
14+
15+ class PropertyAccessorTest extends TestCase
16+ {
17+ /**
18+ * @dataProvider findGetterProvider
19+ */
20+ public function testFindGetter (mixed $ expected , string $ class , string $ propertyName ): void
21+ {
22+ self ::assertSame ($ expected , PropertyAccessor::findGetter ($ class , $ propertyName ));
23+ }
24+
25+ public static function findGetterProvider (): iterable
26+ {
27+ yield 'regular property ' => [null , MagicGetterSetterType::class, 'one ' ];
28+ yield 'getter ' => ['getTwo ' , MagicGetterSetterType::class, 'two ' ];
29+ yield 'isser ' => ['isThree ' , MagicGetterSetterType::class, 'three ' ];
30+ yield 'private getter ' => [null , MagicGetterSetterType::class, 'four ' ];
31+ yield 'undefined property ' => [null , MagicGetterSetterType::class, 'twenty ' ];
32+ }
33+
34+ /**
35+ * @dataProvider findSetterProvider
36+ */
37+ public function testFindSetter (mixed $ expected , string $ class , string $ propertyName ): void
38+ {
39+ self ::assertSame ($ expected , PropertyAccessor::findSetter ($ class , $ propertyName ));
40+ }
41+
42+ public static function findSetterProvider (): iterable
43+ {
44+ yield 'regular property ' => [null , MagicGetterSetterType::class, 'one ' ];
45+ yield 'setter ' => ['setTwo ' , MagicGetterSetterType::class, 'two ' ];
46+ yield 'private setter ' => [null , MagicGetterSetterType::class, 'four ' ];
47+ yield 'undefined property ' => [null , MagicGetterSetterType::class, 'twenty ' ];
48+ }
49+
50+ /**
51+ * @dataProvider getValueProvider
52+ */
53+ public function testGetValue (mixed $ expected , object $ object , string $ propertyName , array $ args = []): void
54+ {
55+ if ($ expected instanceof Exception) {
56+ $ this ->expectExceptionObject ($ expected );
57+ }
58+
59+ self ::assertSame ($ expected , PropertyAccessor::getValue ($ object , $ propertyName , ...$ args ));
60+ }
61+
62+ public static function getValueProvider (): iterable
63+ {
64+ yield 'regular property ' => ['result ' , new MagicGetterSetterType (one: 'result ' ), 'one ' ];
65+ yield 'getter ' => ['result ' , new MagicGetterSetterType (), 'two ' , ['result ' ]];
66+ yield 'isser #1 ' => [true , new MagicGetterSetterType (), 'three ' , ['foo ' ]];
67+ yield 'isser #2 ' => [false , new MagicGetterSetterType (), 'three ' , ['bar ' ]];
68+ yield 'private getter ' => ['result ' , new MagicGetterSetterType (four: 'result ' ), 'four ' ];
69+ yield 'magic getter ' => ['magic ' , new MagicGetterSetterType (), 'twenty ' ];
70+ yield 'undefined property ' => [AccessPropertyException::createForUnreadableProperty (GetterSetterType::class, 'twenty ' ), new GetterSetterType (), 'twenty ' ];
71+ }
72+
73+ /**
74+ * @dataProvider setValueProvider
75+ */
76+ public function testSetValue (mixed $ expected , object $ object , string $ propertyName , mixed $ value ): void
77+ {
78+ if ($ expected instanceof Exception) {
79+ $ this ->expectExceptionObject ($ expected );
80+ }
81+
82+ PropertyAccessor::setValue ($ object , $ propertyName , $ value );
83+
84+ self ::assertSame ($ expected , $ object ->{$ propertyName });
85+ }
86+
87+ public static function setValueProvider (): iterable
88+ {
89+ yield 'regular property ' => ['result ' , new MagicGetterSetterType (one: 'result ' ), 'one ' , 'result ' ];
90+ yield 'setter ' => ['result set ' , new MagicGetterSetterType (), 'two ' , 'result ' ];
91+ yield 'private setter ' => ['result ' , new MagicGetterSetterType (four: 'result ' ), 'four ' , 'result ' ];
92+ yield 'magic setter ' => ['magic ' , new MagicGetterSetterType (), 'twenty ' , 'result ' ];
93+ yield 'undefined property ' => [AccessPropertyException::createForUnwritableProperty (GetterSetterType::class, 'twenty ' ), new GetterSetterType (), 'twenty ' , 'result ' ];
94+ }
95+ }
0 commit comments