File: EnumSetIteratorTest.php

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

namespace MabeEnumTest;

use InvalidArgumentException;
use MabeEnum\Enum;
use MabeEnum\EnumSet;
use MabeEnumTest\TestAsset\EmptyEnum;
use MabeEnumTest\TestAsset\Enum31;
use MabeEnumTest\TestAsset\EnumBasic;
use MabeEnumTest\TestAsset\EnumInheritance;
use MabeEnumTest\TestAsset\Enum32;
use MabeEnumTest\TestAsset\Enum64;
use MabeEnumTest\TestAsset\Enum65;
use MabeEnumTest\TestAsset\Enum66;
use OutOfBoundsException;
use PHPUnit\Framework\Attributes\DataProvider;
use PHPUnit\Framework\TestCase;

/**
 * Unit tests for the class MabeEnum\EnumSet
 *
 * @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 EnumSetIteratorTest extends TestCase
{
    public function testIterateEmpty(): void
    {
        $set = new EnumSet(EnumBasic::class);

        $this->assertSame([], iterator_to_array($set->getIterator()));
    }

    public function testIterateOrdered(): void
    {
        $set = new EnumSet(EnumBasic::class);
        $set->add(EnumBasic::FOUR);
        $set->add(EnumBasic::TWO);
        $set->add(EnumBasic::SEVEN);

        $this->assertSame([
            1 => EnumBasic::TWO(),
            3 => EnumBasic::FOUR(),
            6 => EnumBasic::SEVEN(),
        ], iterator_to_array($set));
    }

    public function testMultipleIterators(): void
    {
        $set = new EnumSet(EnumBasic::class);
        $set->add(EnumBasic::ONE);
        $set->add(EnumBasic::TWO);

        $it1 = $set->getIterator();
        $it2 = $set->getIterator();
        $it2->next();

        $this->assertSame(0, $it1->key());
        $this->assertSame(1, $it2->key());
    }

    public function testStartAtFirstValidPosition(): void
    {
        $set = new EnumSet(EnumBasic::class);
        $set->add(EnumBasic::SEVEN);

        $it = $set->getIterator();
        $this->assertSame(EnumBasic::SEVEN(), $it->current());
        $this->assertSame(EnumBasic::SEVEN()->getOrdinal(), $it->key());
    }

    public function testCurrentOnEmpty(): void
    {
        $set = new EnumSet(EnumBasic::class);

        $it = $set->getIterator();
        $this->assertFalse($it->valid());
        $this->assertNull($it->key());
        $this->assertNull($it->current());
    }

    /**
     * @param class-string<Enum> $enumeration
     */
    #[DataProvider('getIntegerEnumerations')]
    public function testNextCurrentOutOfRange(string $enumeration): void
    {
        $set   = new EnumSet($enumeration);
        $count = count($enumeration::getConstants());
        $last  = $enumeration::byOrdinal($count - 1);
        $set->add($last);

        $it = $set->getIterator();
        $this->assertTrue($it->valid());
        $this->assertSame($last, $it->current());
        $this->assertSame($last->getOrdinal(), $it->key());

        // go to the first out-of-range position
        $it->next();
        $this->assertFalse($it->valid());
        $this->assertNull($it->key());
        $this->assertNull($it->current());
    }

    /**
     * Data provider for all available integer enumerators
     * @return array<int, array<int, class-string<Enum>>>
     */
    public static function getIntegerEnumerations(): array
    {
        return [
            [Enum31::class],
            [Enum32::class],
            [Enum64::class],
            [Enum65::class],
            [Enum66::class]
        ];
    }
}