File: EnumSerializableTraitTest.php

package info (click to toggle)
php-enum 4.7.1-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, trixie
  • size: 556 kB
  • sloc: php: 3,481; xml: 15; makefile: 8
file content (115 lines) | stat: -rw-r--r-- 3,964 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
<?php

namespace MabeEnumTest;

use LogicException;
use MabeEnum\Enum;
use MabeEnumTest\TestAsset\ExtendedSerializableEnum;
use MabeEnumTest\TestAsset\SerializableEnum;
use PHPUnit\Framework\TestCase;
use ReflectionClass;
use ReflectionProperty;
use RuntimeException;

/**
 * Unit tests for the trait MabeEnum\EnumSerializableTrait
 *
 * @copyright 2020, Marc Bennewitz
 * @license http://github.com/marc-mabe/php-enum/blob/master/LICENSE.txt New BSD License
 * @link http://github.com/marc-mabe/php-enum for the canonical source repository
 */
class EnumSerializableTraitTest extends TestCase
{
    public function testSerializeSerializableEnum(): void
    {
        $serialized = serialize(SerializableEnum::get(SerializableEnum::NIL));
        $this->assertIsString($serialized);

        $unserialized = unserialize($serialized);
        $this->assertInstanceOf(SerializableEnum::class, $unserialized);
    }

    public function testUnserializeFirstWillHoldTheSameInstance(): void
    {
        $serialized = serialize(SerializableEnum::get(SerializableEnum::STR));
        $this->assertIsString($serialized);

        // clear all instantiated instances so we can virtual test unserializing first
        $this->clearEnumeration(SerializableEnum::class);

        // First unserialize
        /** @var Enum $unserialized */
        $unserialized = unserialize($serialized);
        $this->assertInstanceOf(SerializableEnum::class, $unserialized);

        // second instantiate
        $enum = SerializableEnum::get($unserialized->getValue());

        // check if it's the same instance
        $this->assertSame($enum, $unserialized);
    }

    public function testUnserializeThrowsRuntimeExceptionOnUnknownValue(): void
    {
        $this->expectException(RuntimeException::class);
        unserialize('C:' . strlen(SerializableEnum::class) . ':"' . SerializableEnum::class . '":11:{s:4:"test";}');
    }

    public function testUnserializeThrowsRuntimeExceptionOnInvalidValue(): void
    {
        $this->expectException(RuntimeException::class);
        unserialize('C:' . strlen(SerializableEnum::class) . ':"' . SerializableEnum::class . '":19:{O:8:"stdClass":0:{}}');
    }

    public function testUnserializeThrowsLogicExceptionOnChangingValue(): void
    {
        $enumInt = SerializableEnum::get(SerializableEnum::INT);
        $enumStrSer = SerializableEnum::STR()->__serialize();

        $this->expectException(LogicException::class);
        $enumInt->__unserialize($enumStrSer);
    }

    public function testInheritence(): void
    {
        $enum = ExtendedSerializableEnum::EXTENDED();

        $serialized = serialize($enum);
        $this->assertIsString($serialized);

        /** @var Enum $unserialized */
        $unserialized = unserialize($serialized);

        $this->assertInstanceOf(ExtendedSerializableEnum::class, $unserialized);
        $this->assertSame($enum->getValue(), $unserialized->getValue());
    }

    public function testUnserializeFromPhp73(): void
    {
        $serialized = 'C:39:"MabeEnumTest\TestAsset\SerializableEnum":2:{N;}';

        /** @var Enum $unserialized */
        $unserialized = unserialize($serialized);

        $this->assertInstanceOf(SerializableEnum::class, $unserialized);
        $this->assertNull($unserialized->getValue());
    }

    /**
     * Clears all instantiated enumerations and detected constants of the given enumerator
     * @param class-string<Enum> $enumeration
     */
    private function clearEnumeration($enumeration): void
    {
        $reflClass = new ReflectionClass($enumeration);
        while ($reflClass->getName() !== Enum::class) {
            /** @var ReflectionClass<Enum> $reflClass */
            $reflClass = $reflClass->getParentClass();
        }

        foreach ($reflClass->getProperties(ReflectionProperty::IS_STATIC) as $reflProp) {
            $reflProp->setAccessible(true);
            $reflProp->setValue(null, []);
        }
    }
}