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