is(Season::Summer)); } public function testIsReturnsFalseForNull(): void { self::assertFalse(Season::Summer->is(null)); } public function testIsReturnsFalseForDifferentCase(): void { self::assertFalse(Season::Summer->is(Season::Winter)); } public function testIsReturnsTrueForMatchingStringName(): void { self::assertTrue(Season::Autumn->is('Autumn')); } public function testIsReturnsFalseForNonMatchingStringName(): void { self::assertFalse(Season::Autumn->is('Spring')); } public function testIsReturnsTrueForBackedEnumByValue(): void { self::assertTrue(Direction::North->is('north')); } public function testIsReturnsFalseForBackedEnumWithWrongValue(): void { self::assertFalse(Direction::North->is('south')); } // ------------------------------------------------------------------------- // isOneOf() / isNoneOf() // ------------------------------------------------------------------------- public function testIsOneOfReturnsTrueWhenMatchFound(): void { self::assertTrue(Season::Winter->isOneOf([Season::Autumn, Season::Winter])); } public function testIsOneOfReturnsFalseWhenNoMatch(): void { self::assertFalse(Season::Spring->isOneOf([Season::Autumn, Season::Winter])); } public function testIsOneOfReturnsFalseForNull(): void { self::assertFalse(Season::Spring->isOneOf(null)); } public function testIsNoneOfIsInverseOfIsOneOf(): void { self::assertTrue(Season::Spring->isNoneOf([Season::Autumn, Season::Winter])); self::assertFalse(Season::Winter->isNoneOf([Season::Autumn, Season::Winter])); } // ------------------------------------------------------------------------- // toArray() // ------------------------------------------------------------------------- public function testToArrayForPureEnumReturnsNameToNameMapping(): void { $expected = [ 'Spring' => 'Spring', 'Summer' => 'Summer', 'Autumn' => 'Autumn', 'Winter' => 'Winter', ]; self::assertSame($expected, Season::toArray()); } public function testToArrayForBackedEnumReturnsValueToNameMapping(): void { $expected = [ 'north' => 'North', 'south' => 'South', 'east' => 'East', 'west' => 'West', ]; self::assertSame($expected, Direction::toArray()); } // ------------------------------------------------------------------------- // find() // ------------------------------------------------------------------------- public function testFindReturnsNullForNull(): void { self::assertNull(Season::find(null)); } public function testFindReturnsEnumInstanceWhenPassedItself(): void { self::assertSame(Season::Spring, Season::find(Season::Spring)); } public function testFindByNameForPureEnum(): void { self::assertSame(Season::Summer, Season::find('Summer')); } public function testFindReturnsNullForUnknownName(): void { self::assertNull(Season::find('Unknown')); } public function testFindIgnoreCasePureEnum(): void { self::assertSame(Season::Winter, Season::find('winter', ignoreCase: true)); } public function testFindByValueForBackedEnum(): void { self::assertSame(Direction::East, Direction::find('east')); } public function testFindIgnoreCaseBackedEnum(): void { self::assertSame(Direction::West, Direction::find('WEST', ignoreCase: true)); } // ------------------------------------------------------------------------- // filter() // ------------------------------------------------------------------------- public function testFilterReturnsCasesMatchingCallback(): void { $result = Season::filter(fn(Season $c) => in_array($c, [Season::Spring, Season::Summer], true)); self::assertCount(2, $result); self::assertContains(Season::Spring, $result); self::assertContains(Season::Summer, $result); } public function testFilterReturnsEmptyArrayWhenNothingMatches(): void { $result = Season::filter(fn() => false); self::assertSame([], $result); } // ------------------------------------------------------------------------- // ordinal() // ------------------------------------------------------------------------- public function testOrdinalReturnsZeroBasedPosition(): void { self::assertSame(0, Season::Spring->ordinal()); self::assertSame(1, Season::Summer->ordinal()); self::assertSame(2, Season::Autumn->ordinal()); self::assertSame(3, Season::Winter->ordinal()); } // ------------------------------------------------------------------------- // first() / last() // ------------------------------------------------------------------------- public function testFirstReturnsFirstCase(): void { self::assertSame(Season::Spring, Season::first()); } public function testLastReturnsLastCase(): void { self::assertSame(Season::Winter, Season::last()); } }