Skip to content

Repository files navigation

PHP Forge

Support


PHPUnitMutation TestingPHPStan

Support utilities for PHPUnit-focused development
Reflection helpers, line ending normalization, and filesystem cleanup for deterministic tests.

Features

Feature Overview

Installation

composer require php-forge/support:^0.2 --dev

Quick start

This package provides helper classes for PHPUnit tests.

It supports reflection-based access to non-public members, deterministic string comparisons across platforms, and filesystem cleanup for isolated test environments.

Accessing private properties

<?phpdeclare(strict_types=1);
usePHPForge\Support\ReflectionHelper;
usePHPUnit\Framework\TestCase;
finalclass AccessPrivatePropertyTest extends TestCase
{
publicfunctiontestInaccessibleProperty(): void
{
$object = newclass () {
privatestring$secretValue = 'hidden';
};
$value = ReflectionHelper::inaccessibleProperty($object, 'secretValue');
self::assertSame('hidden', $value);
}
}

Invoking protected methods

<?phpdeclare(strict_types=1);
usePHPForge\Support\ReflectionHelper;
usePHPUnit\Framework\TestCase;
finalclass InvokeProtectedMethodTest extends TestCase
{
publicfunctiontestInvokeMethod(): void
{
$object = newclass () {
protectedfunctioncalculate(int$a, int$b): int
{
return$a + $b;
}
};
$result = ReflectionHelper::invokeMethod($object, 'calculate', [5, 3]);
self::assertSame(8, $result);
}
}

Normalize line endings

<?phpdeclare(strict_types=1);
usePHPForge\Support\LineEndingNormalizer;
usePHPUnit\Framework\TestCase;
finalclass NormalizeLineEndingsTest extends TestCase
{
publicfunctiontestNormalizedComparison(): void
{
self::assertSame(
LineEndingNormalizer::normalize("Foo\r\nBar"),
LineEndingNormalizer::normalize("Foo\nBar"),
);
}
}

Remove files from directory

<?phpdeclare(strict_types=1);
usePHPForge\Support\DirectoryCleaner;
usePHPUnit\Framework\TestCase;
finalclass RemoveFilesFromDirectoryTest extends TestCase
{
publicfunctiontestCleanup(): void
{
$testDir = sys_get_temp_dir() . '/php-forge-support-' . bin2hex(random_bytes(8));
mkdir($testDir);
try {
file_put_contents($testDir . '/artifact.txt', 'test');
file_put_contents($testDir . '/.gitignore', "*\n");
DirectoryCleaner::clean($testDir);
self::assertFileDoesNotExist($testDir . '/artifact.txt');
self::assertFileExists($testDir . '/.gitignore');
} finally {
@unlink($testDir . '/.gitignore');
@rmdir($testDir);
}
}
}

Set inaccessible property

<?phpdeclare(strict_types=1);
usePHPForge\Support\ReflectionHelper;
usePHPUnit\Framework\TestCase;
finalclass SetInaccessiblePropertyTest extends TestCase
{
publicfunctiontestSetProperty(): void
{
$object = newclass () {
privatestring$config = 'default';
};
ReflectionHelper::setInaccessibleProperty($object, 'config', 'test-mode');
$newValue = ReflectionHelper::inaccessibleProperty($object, 'config');
self::assertSame('test-mode', $newValue);
}
}

Enum data provider

Use PHPForge\Support\EnumDataProvider to build deterministic datasets from UnitEnum::cases() and normalized enum values.

Attribute fragment output (HTML)
<?phpdeclare(strict_types=1);
namespaceApp\Tests;
usePHPForge\Support\EnumDataProvider;
usePHPUnit\Framework\Attributes\DataProvider;
usePHPUnit\Framework\TestCase;
useUnitEnum;
enum Size
{
case Small;
case Large;
}
finalclass EnumDataProviderHtmlTest extends TestCase
{
publicstaticfunctionprovideEnumAttributes(): array
{
return EnumDataProvider::attributeCases(Size::class, 'data-size', true);
}
#[DataProvider('provideEnumAttributes')]
publicfunctiontestBuildsAttributeFragment(UnitEnum$case, array$args, string$expected, string$message): void
{
$normalized = $case->name;
$attributeFragment = " data-size=\"{$normalized}\"";
self::assertSame($expected, $attributeFragment, $message);
}
}
Enum instance output (non-HTML)
<?phpdeclare(strict_types=1);
namespaceApp\Tests;
usePHPForge\Support\EnumDataProvider;
usePHPUnit\Framework\Attributes\DataProvider;
usePHPUnit\Framework\TestCase;
useUnitEnum;
enum State
{
case Active;
case Disabled;
}
finalclass EnumDataProviderEnumTest extends TestCase
{
publicstaticfunctionprovideEnumInstances(): array
{
return EnumDataProvider::attributeCases(State::class, 'state', false);
}
#[DataProvider('provideEnumInstances')]
publicfunctiontestReturnsEnumInstance(UnitEnum$case, array$args, UnitEnum$expected, string$message): void
{
self::assertSame($case, $expected, $message);
}
}
Tag cases
<?phpdeclare(strict_types=1);
namespaceApp\Tests;
usePHPForge\Support\EnumDataProvider;
usePHPUnit\Framework\Attributes\DataProvider;
usePHPUnit\Framework\TestCase;
enum Heading
{
caseH1;
caseH2;
}
finalclass EnumDataProviderTagCasesTest extends TestCase
{
publicstaticfunctionprovideTags(): array
{
return EnumDataProvider::tagCases(Heading::class, 'heading');
}
#[DataProvider('provideTags')]
publicfunctiontestProvidesNormalizedTag(Heading$case, string$normalized): void
{
self::assertSame($case->name, $normalized);
}
}

Documentation

For detailed configuration options and advanced usage.

Package information

PHPLatest Stable VersionTotal Downloads

Quality code

CodecovPHPStan Level MaxSuper-LinterStyleCI

Our social networks

Follow on X

License

License

About

Support utilities for enhanced testing capabilities.

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

1 star

Watchers

2 watching

Forks

Releases

Sponsor this project

Packages

Used by

Contributors

Languages

Generated from yii-tools/template