File: DeprecatedAssertions.php

package info (click to toggle)
php-zend-eventmanager 3.14.0-6
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 904 kB
  • sloc: php: 3,542; xml: 696; makefile: 17
file content (137 lines) | stat: -rw-r--r-- 3,881 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
<?php

declare(strict_types=1);

namespace LaminasTest\EventManager;

use PHPUnit\Framework\Assert;
use ReflectionClass;
use stdClass;

use function property_exists;
use function sprintf;

// phpcs:ignore WebimpressCodingStandard.NamingConventions.Trait.Suffix
trait DeprecatedAssertions
{
    /**
     * @param non-empty-string $attributeName
     */
    public static function assertAttributeEmpty(
        string $attributeName,
        object $instance,
        string $message = ''
    ): void {
        if (! self::propertyExists($instance, $attributeName)) {
            Assert::fail(sprintf(
                'Failed to assert attribute %s is empty; attribute does not exist in instance of %s',
                $attributeName,
                $instance::class
            ));
        }

        Assert::assertEmpty(self::getPropertyValue($instance, $attributeName), $message);
    }

    /**
     * @param mixed $value
     * @param non-empty-string $attributeName
     */
    public static function assertAttributeEquals(
        $value,
        string $attributeName,
        object $instance,
        string $message = ''
    ): void {
        if (! self::propertyExists($instance, $attributeName)) {
            Assert::fail(sprintf(
                'Failed to assert equality against attribute %s; attribute does not exist in instance of %s',
                $attributeName,
                $instance::class
            ));
        }

        Assert::assertEquals($value, self::getPropertyValue($instance, $attributeName), $message);
    }

    /**
     * @param non-empty-string $attributeName
     */
    public static function assertAttributeInstanceOf(
        string $type,
        string $attributeName,
        object $instance,
        string $message = ''
    ): void {
        if (! self::propertyExists($instance, $attributeName)) {
            Assert::fail(sprintf(
                'Failed to assert type of attribute %s; attribute does not exist in instance of %s',
                $attributeName,
                $instance::class
            ));
        }

        Assert::assertInstanceOf($type, self::getPropertyValue($instance, $attributeName), $message);
    }

    /**
     * @param mixed $value
     * @param non-empty-string $attributeName
     */
    public static function assertAttributeSame(
        $value,
        string $attributeName,
        object $instance,
        string $message = ''
    ): void {
        if (! self::propertyExists($instance, $attributeName)) {
            Assert::fail(sprintf(
                'Failed to assert equality against attribute %s; attribute does not exist in instance of %s',
                $attributeName,
                $instance::class
            ));
        }

        Assert::assertSame($value, self::getPropertyValue($instance, $attributeName), $message);
    }

    /**
     * @param non-empty-string $property
     * @return mixed
     */
    private static function getPropertyValue(object $instance, string $property)
    {
        if ($instance instanceof stdClass) {
            return $instance->$property;
        }

        $r = new ReflectionClass($instance);

        do {
            if ($r->hasProperty($property)) {
                $propertyReflection = $r->getProperty($property);
                return $propertyReflection->getValue($instance);
            }
        } while ($r = $r->getParentClass());

        return null;
    }

    /** @param non-empty-string $property */
    private static function propertyExists(object $instance, string $property): bool
    {
        if (property_exists($instance, $property)) {
            return true;
        }

        $r = new ReflectionClass($instance);

        while ($r = $r->getParentClass()) {
            if ($r->hasProperty($property)) {
                return true;
            }
        }

        return false;
    }
}