schemator-php

Форк
0
/
SetPropertyValueTest.php 
111 строк · 3.4 Кб
1
<?php
2

3
declare(strict_types=1);
4

5
namespace Smoren\Schemator\Tests\Unit\ObjectAccessHelper;
6

7
use Codeception\Test\Unit;
8
use Smoren\Schemator\Helpers\ObjectAccessHelper;
9
use Smoren\Schemator\Tests\Unit\Fixtures\ClassWithAccessibleProperties;
10
use stdClass;
11

12
class SetPropertyValueTest extends Unit
13
{
14
    /**
15
     * @param stdClass $input
16
     * @param string $key
17
     * @param mixed $value
18
     * @return void
19
     * @dataProvider toStdClassDataProvider
20
     */
21
    public function testToStdClass(stdClass $input, string $key, $value): void
22
    {
23
        // When
24
        ObjectAccessHelper::setPropertyValue($input, $key, $value);
25

26
        // Then
27
        $result = ObjectAccessHelper::getPropertyValue($input, $key);
28
        $this->assertSame($value, $result);
29
    }
30

31
    public function toStdClassDataProvider(): array
32
    {
33
        $wrap = static function(array $input): object {
34
            return (object)$input;
35
        };
36

37
        return [
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
     */
64
    public function testToObjectSuccess(object $input, string $key, $value): void
65
    {
66
        // When
67
        ObjectAccessHelper::setPropertyValue($input, $key, $value);
68

69
        // Then
70
        $result = ObjectAccessHelper::getPropertyValue($input, $key);
71
        $this->assertSame($value, $result);
72
    }
73

74
    public function toObjectSuccessDataProvider(): array
75
    {
76
        return [
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
     */
91
    public function testToObjectFail(object $input, string $key, $value): void
92
    {
93
        try {
94
            // When
95
            ObjectAccessHelper::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

103
    public function toObjectFailDataProvider(): array
104
    {
105
        return [
106
            [new ClassWithAccessibleProperties(), 'unknownProperty', 42],
107
            [new ClassWithAccessibleProperties(), 'protectedProperty', 42],
108
            [new ClassWithAccessibleProperties(), 'privateProperty', 42],
109
        ];
110
    }
111
}
112

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.