schemator-php
111 строк · 3.4 Кб
1<?php
2
3declare(strict_types=1);
4
5namespace Smoren\Schemator\Tests\Unit\ObjectAccessHelper;
6
7use Codeception\Test\Unit;
8use Smoren\Schemator\Helpers\ObjectAccessHelper;
9use Smoren\Schemator\Tests\Unit\Fixtures\ClassWithAccessibleProperties;
10use stdClass;
11
12class SetPropertyValueTest extends Unit
13{
14/**
15* @param stdClass $input
16* @param string $key
17* @param mixed $value
18* @return void
19* @dataProvider toStdClassDataProvider
20*/
21public function testToStdClass(stdClass $input, string $key, $value): void
22{
23// When
24ObjectAccessHelper::setPropertyValue($input, $key, $value);
25
26// Then
27$result = ObjectAccessHelper::getPropertyValue($input, $key);
28$this->assertSame($value, $result);
29}
30
31public function toStdClassDataProvider(): array
32{
33$wrap = static function(array $input): object {
34return (object)$input;
35};
36
37return [
38[$wrap([]), '', null],
39[$wrap([]), '', 42],
40[$wrap([]), '0', null],
41[$wrap([]), '0', 42],
42[$wrap([]), 'a', null],
43[$wrap([]), 'b', 42],
44[$wrap(['a' => 1, 'b' => 2]), '', null],
45[$wrap(['a' => 1, 'b' => 2]), '', 42],
46[$wrap(['a' => 1, 'b' => 2]), '0', null],
47[$wrap(['a' => 1, 'b' => 2]), '0', 42],
48[$wrap(['a' => 1, 'b' => 2]), '1', null],
49[$wrap(['a' => 1, 'b' => 2]), '1', 42],
50[$wrap(['a' => 1, 'b' => 2]), '2', null],
51[$wrap(['a' => 1, 'b' => 2]), '2', 42],
52[$wrap(['a' => 1, 'b' => 2]), 'a', 42],
53[$wrap(['a' => 1, 'b' => 2]), 'b', 42],
54];
55}
56
57/**
58* @param object $input
59* @param string $key
60* @param mixed $value
61* @return void
62* @dataProvider toObjectSuccessDataProvider
63*/
64public function testToObjectSuccess(object $input, string $key, $value): void
65{
66// When
67ObjectAccessHelper::setPropertyValue($input, $key, $value);
68
69// Then
70$result = ObjectAccessHelper::getPropertyValue($input, $key);
71$this->assertSame($value, $result);
72}
73
74public function toObjectSuccessDataProvider(): array
75{
76return [
77[new ClassWithAccessibleProperties(), 'publicProperty', 42],
78[new ClassWithAccessibleProperties(), 'publicPropertyWithMethodsAccess', 42],
79[new ClassWithAccessibleProperties(), 'protectedPropertyWithMethodsAccess', 42],
80[new ClassWithAccessibleProperties(), 'privatePropertyWithMethodsAccess', 42],
81];
82}
83
84/**
85* @param object $input
86* @param string $key
87* @param mixed $value
88* @return void
89* @dataProvider toObjectFailDataProvider
90*/
91public function testToObjectFail(object $input, string $key, $value): void
92{
93try {
94// When
95ObjectAccessHelper::setPropertyValue($input, $key, $value);
96$this->fail();
97} catch(\InvalidArgumentException $e) {
98// Then
99$this->assertSame("Property '".get_class($input)."::{$key}' is not writable", $e->getMessage());
100}
101}
102
103public function toObjectFailDataProvider(): array
104{
105return [
106[new ClassWithAccessibleProperties(), 'unknownProperty', 42],
107[new ClassWithAccessibleProperties(), 'protectedProperty', 42],
108[new ClassWithAccessibleProperties(), 'privateProperty', 42],
109];
110}
111}
112