Modules

abstract Kohana_Unittest_TestSuite
extends PHPUnit\Framework\TestSuite

Implements: Countable | PHPUnit\Framework\Test | PHPUnit\Framework\SelfDescribing | Traversable | IteratorAggregate

This class is a transparent base class for Unittest_TestSuite and should not be accessed directly.

A version of the stock PHPUnit testsuite that supports whitelisting and blacklisting for code coverage filter

Class declared in MODPATH/unittest/classes/Kohana/Unittest/TestSuite.php on line 9.

Properties

protected array $_filter_calls

Holds the details of files that should be white and blacklisted for code coverage

Default value:
array(3) (
    "addFileToBlacklist" => array(0) 
    "addDirectoryToBlacklist" => array(0) 
    "addFileToWhitelist" => array(0) 
)

protected bool $backupGlobals

Enable or disable the backup and restoration of the $GLOBALS array.

Default value:
NULL

protected bool $backupStaticAttributes

Enable or disable the backup and restoration of static attributes.

Default value:
NULL

protected array $foundClasses

Default value:
array(0) 

protected array $groups

The test groups of the test suite.

Default value:
array(0) 

protected string $name

The name of the test suite.

Default value:
string(0) ""

protected int $numTests

The number of tests in the test suite.

Default value:
integer -1

protected bool $runTestInSeparateProcess

Default value:
bool FALSE

protected bool $testCase

Default value:
bool FALSE

protected Test[] $tests

The tests in the test suite.

Default value:
array(0) 

Methods

public addDirectoryToBlacklist( string $dir ) (defined in Kohana_Unittest_TestSuite)

Queues a directory to be added to the code coverage blacklist when the suite runs

Parameters

  • string $dir required - $dir

Source Code

public function addDirectoryToBlacklist(string $dir)
{
    $this->_filter_calls['addDirectoryToBlacklist'][] = $dir;
}

public addFileToBlacklist( string $file ) (defined in Kohana_Unittest_TestSuite)

Queues a file to be added to the code coverage blacklist when the suite runs

Parameters

  • string $file required - $file

Source Code

public function addFileToBlacklist(string $file)
{
    $this->_filter_calls['addFileToBlacklist'][] = $file;
}

public addFileToWhitelist( string $file ) (defined in Kohana_Unittest_TestSuite)

Queues a file to be added to the code coverage whitelist when the suite runs

Parameters

  • string $file required - $file

Source Code

public function addFileToWhitelist(string $file)
{
    $this->_filter_calls['addFileToWhitelist'][] = $file;
}

public run( [ TestResult|null $result = NULL ] ) (defined in Kohana_Unittest_TestSuite)

Runs the tests and collects their result in a TestResult.

Parameters

  • TestResult|null $result = NULL - $result

Return Values

  • TestResult

Source Code

public function run(TestResult $result = null): TestResult
{
    // Get the code coverage filter from the suite's result object
    $coverage = $result->getCodeCoverage();

    if ($coverage) {
        $coverage_filter = $coverage->filter();

        // Apply the white and blacklisting
        foreach ($this->_filter_calls as $method => $args) {
            foreach ($args as $arg) {
                $coverage_filter->$method($arg);
            }
        }
    }

    return parent::run($result);
}

public __construct( [ string $theClass = string(0) "" , $name = string(0) "" ] ) (defined in PHPUnit\Framework\TestSuite)

Constructs a new TestSuite:

  • PHPUnit\Framework\TestSuite() constructs an empty TestSuite.

  • PHPUnit\Framework\TestSuite(ReflectionClass) constructs a TestSuite from the given class.

  • PHPUnit\Framework\TestSuite(ReflectionClass, String) constructs a TestSuite from the given class with the given name.

  • PHPUnit\Framework\TestSuite(String) either constructs a TestSuite from the given class (if the passed string is the name of an existing class) or constructs an empty TestSuite with the given name.

Parameters

  • string $theClass = string(0) "" - $name
  • unknown $name = string(0) ""

Tags

Source Code

public function __construct($theClass = '', $name = '')
{
    $this->declaredClasses = \get_declared_classes();

    $argumentsValid = false;

    if (\is_object($theClass) &&
        $theClass instanceof ReflectionClass) {
        $argumentsValid = true;
    } elseif (\is_string($theClass) &&
        $theClass !== '' &&
        \class_exists($theClass, true)) {
        $argumentsValid = true;

        if ($name == '') {
            $name = $theClass;
        }

        $theClass = new ReflectionClass($theClass);
    } elseif (\is_string($theClass)) {
        $this->setName($theClass);

        return;
    }

    if (!$argumentsValid) {
        throw new Exception;
    }

    if (!$theClass->isSubclassOf(TestCase::class)) {
        $this->setName($theClass);

        return;
    }

    if ($name != '') {
        $this->setName($name);
    } else {
        $this->setName($theClass->getName());
    }

    $constructor = $theClass->getConstructor();

    if ($constructor !== null &&
        !$constructor->isPublic()) {
        $this->addTest(
            self::warning(
                \sprintf(
                    'Class "%s" has no public constructor.',
                    $theClass->getName()
                )
            )
        );

        return;
    }

    foreach ($theClass->getMethods() as $method) {
        if ($method->getDeclaringClass()->getName() === Assert::class) {
            continue;
        }

        if ($method->getDeclaringClass()->getName() === TestCase::class) {
            continue;
        }

        $this->addTestMethod($theClass, $method);
    }

    if (empty($this->tests)) {
        $this->addTest(
            self::warning(
                \sprintf(
                    'No tests found in class "%s".',
                    $theClass->getName()
                )
            )
        );
    }

    $this->testCase = true;
}

public addTest( array $test [, $groups = array(0) ] ) (defined in PHPUnit\Framework\TestSuite)

Adds a test to the suite.

Parameters

  • array $test required - $groups
  • unknown $groups = array(0)

Source Code

public function addTest(Test $test, $groups = []): void
{
    $class = new ReflectionClass($test);

    if (!$class->isAbstract()) {
        $this->tests[]  = $test;
        $this->numTests = -1;

        if ($test instanceof self && empty($groups)) {
            $groups = $test->getGroups();
        }

        if (empty($groups)) {
            $groups = ['default'];
        }

        foreach ($groups as $group) {
            if (!isset($this->groups[$group])) {
                $this->groups[$group] = [$test];
            } else {
                $this->groups[$group][] = $test;
            }
        }

        if ($test instanceof TestCase) {
            $test->setGroups($groups);
        }
    }
}

public addTestFile( ) (defined in PHPUnit\Framework\TestSuite)

Wraps both addTest() and addTestSuite as well as the separate import statements for the user's convenience.

If the named file cannot be read or there are no new tests that can be added, a PHPUnit\Framework\WarningTestCase will be created instead, leaving the current test run untouched.

Tags

Source Code

public function addTestFile(string $filename): void
{
    if (\file_exists($filename) && \substr($filename, -5) == '.phpt') {
        $this->addTest(
            new PhptTestCase($filename)
        );

        return;
    }

    // The given file may contain further stub classes in addition to the
    // test class itself. Figure out the actual test class.
    $filename   = FileLoader::checkAndLoad($filename);
    $newClasses = \array_diff(\get_declared_classes(), $this->declaredClasses);

    // The diff is empty in case a parent class (with test methods) is added
    // AFTER a child class that inherited from it. To account for that case,
    // accumulate all discovered classes, so the parent class may be found in
    // a later invocation.
    if (!empty($newClasses)) {
        // On the assumption that test classes are defined first in files,
        // process discovered classes in approximate LIFO order, so as to
        // avoid unnecessary reflection.
        $this->foundClasses    = \array_merge($newClasses, $this->foundClasses);
        $this->declaredClasses = \get_declared_classes();
    }

    // The test class's name must match the filename, either in full, or as
    // a PEAR/PSR-0 prefixed short name ('NameSpace_ShortName'), or as a
    // PSR-1 local short name ('NameSpace\ShortName'). The comparison must be
    // anchored to prevent false-positive matches (e.g., 'OtherShortName').
    $shortName      = \basename($filename, '.php');
    $shortNameRegEx = '/(?:^|_|\\\\)' . \preg_quote($shortName, '/') . '$/';

    foreach ($this->foundClasses as $i => $className) {
        if (\preg_match($shortNameRegEx, $className)) {
            $class = new ReflectionClass($className);

            if ($class->getFileName() == $filename) {
                $newClasses = [$className];
                unset($this->foundClasses[$i]);

                break;
            }
        }
    }

    foreach ($newClasses as $className) {
        $class = new ReflectionClass($className);

        if (\dirname($class->getFileName()) === __DIR__) {
            continue;
        }

        if (!$class->isAbstract()) {
            if ($class->hasMethod(BaseTestRunner::SUITE_METHODNAME)) {
                $method = $class->getMethod(
                    BaseTestRunner::SUITE_METHODNAME
                );

                if ($method->isStatic()) {
                    $this->addTest($method->invoke(null, $className));
                }
            } elseif ($class->implementsInterface(Test::class)) {
                $this->addTestSuite($class);
            }
        }
    }

    $this->numTests = -1;
}

public addTestFiles( array|Iterator $fileNames ) (defined in PHPUnit\Framework\TestSuite)

Wrapper for addTestFile() that adds multiple test files.

Parameters

  • array|Iterator $fileNames required -

Tags

Source Code

public function addTestFiles($fileNames): void
{
    if (!(\is_array($fileNames) ||
        (\is_object($fileNames) && $fileNames instanceof Iterator))) {
        throw InvalidArgumentHelper::factory(
            1,
            'array or iterator'
        );
    }

    foreach ($fileNames as $filename) {
        $this->addTestFile((string) $filename);
    }
}

public addTestSuite( ) (defined in PHPUnit\Framework\TestSuite)

Adds the tests from the given class to the suite.

Tags

Source Code

public function addTestSuite($testClass): void
{
    if (\is_string($testClass) && \class_exists($testClass)) {
        $testClass = new ReflectionClass($testClass);
    }

    if (!\is_object($testClass)) {
        throw InvalidArgumentHelper::factory(
            1,
            'class name or object'
        );
    }

    if ($testClass instanceof self) {
        $this->addTest($testClass);
    } elseif ($testClass instanceof ReflectionClass) {
        $suiteMethod = false;

        if (!$testClass->isAbstract() && $testClass->hasMethod(BaseTestRunner::SUITE_METHODNAME)) {
            $method = $testClass->getMethod(
                BaseTestRunner::SUITE_METHODNAME
            );

            if ($method->isStatic()) {
                $this->addTest(
                    $method->invoke(null, $testClass->getName())
                );

                $suiteMethod = true;
            }
        }

        if (!$suiteMethod && !$testClass->isAbstract() && $testClass->isSubclassOf(TestCase::class)) {
            $this->addTest(new self($testClass));
        }
    } else {
        throw new Exception;
    }
}

public count( [ bool $preferCache = bool FALSE ] ) (defined in PHPUnit\Framework\TestSuite)

Counts the number of test cases that will be run by this test.

Parameters

  • bool $preferCache = bool FALSE - Indicates if cache is preferred

Source Code

public function count($preferCache = false): int
{
    if ($preferCache && $this->cachedNumTests !== null) {
        return $this->cachedNumTests;
    }

    $numTests = 0;

    foreach ($this as $test) {
        $numTests += \count($test);
    }

    $this->cachedNumTests = $numTests;

    return $numTests;
}

public static createTest( string $theClass , $name ) (defined in PHPUnit\Framework\TestSuite)

Parameters

  • string $theClass required - $name
  • unknown $name required

Tags

Source Code

public static function createTest(ReflectionClass $theClass, $name): Test
{
    $className = $theClass->getName();

    if (!$theClass->isInstantiable()) {
        return self::warning(
            \sprintf('Cannot instantiate class "%s".', $className)
        );
    }

    $backupSettings = \PHPUnit\Util\Test::getBackupSettings(
        $className,
        $name
    );

    $preserveGlobalState = \PHPUnit\Util\Test::getPreserveGlobalStateSettings(
        $className,
        $name
    );

    $runTestInSeparateProcess = \PHPUnit\Util\Test::getProcessIsolationSettings(
        $className,
        $name
    );

    $runClassInSeparateProcess = \PHPUnit\Util\Test::getClassProcessIsolationSettings(
        $className,
        $name
    );

    $constructor = $theClass->getConstructor();

    if ($constructor === null) {
        throw new Exception('No valid test provided.');
    }
    $parameters = $constructor->getParameters();

    // TestCase() or TestCase($name)
    if (\count($parameters) < 2) {
        $test = new $className;
    } // TestCase($name, $data)
    else {
        try {
            $data = \PHPUnit\Util\Test::getProvidedData(
                $className,
                $name
            );
        } catch (IncompleteTestError $e) {
            $message = \sprintf(
                'Test for %s::%s marked incomplete by data provider',
                $className,
                $name
            );

            $_message = $e->getMessage();

            if (!empty($_message)) {
                $message .= "\n" . $_message;
            }

            $data = self::incompleteTest($className, $name, $message);
        } catch (SkippedTestError $e) {
            $message = \sprintf(
                'Test for %s::%s skipped by data provider',
                $className,
                $name
            );

            $_message = $e->getMessage();

            if (!empty($_message)) {
                $message .= "\n" . $_message;
            }

            $data = self::skipTest($className, $name, $message);
        } catch (Throwable $t) {
            $message = \sprintf(
                'The data provider specified for %s::%s is invalid.',
                $className,
                $name
            );

            $_message = $t->getMessage();

            if (!empty($_message)) {
                $message .= "\n" . $_message;
            }

            $data = self::warning($message);
        }

        // Test method with @dataProvider.
        if (isset($data)) {
            $test = new DataProviderTestSuite(
                $className . '::' . $name
            );

            if (empty($data)) {
                $data = self::warning(
                    \sprintf(
                        'No tests found in suite "%s".',
                        $test->getName()
                    )
                );
            }

            $groups = \PHPUnit\Util\Test::getGroups($className, $name);

            if ($data instanceof WarningTestCase ||
                $data instanceof SkippedTestCase ||
                $data instanceof IncompleteTestCase) {
                $test->addTest($data, $groups);
            } else {
                foreach ($data as $_dataName => $_data) {
                    $_test = new $className($name, $_data, $_dataName);

                    /* @var TestCase $_test */

                    if ($runTestInSeparateProcess) {
                        $_test->setRunTestInSeparateProcess(true);

                        if ($preserveGlobalState !== null) {
                            $_test->setPreserveGlobalState($preserveGlobalState);
                        }
                    }

                    if ($runClassInSeparateProcess) {
                        $_test->setRunClassInSeparateProcess(true);

                        if ($preserveGlobalState !== null) {
                            $_test->setPreserveGlobalState($preserveGlobalState);
                        }
                    }

                    if ($backupSettings['backupGlobals'] !== null) {
                        $_test->setBackupGlobals(
                            $backupSettings['backupGlobals']
                        );
                    }

                    if ($backupSettings['backupStaticAttributes'] !== null) {
                        $_test->setBackupStaticAttributes(
                            $backupSettings['backupStaticAttributes']
                        );
                    }

                    $test->addTest($_test, $groups);
                }
            }
        } else {
            $test = new $className;
        }
    }

    if ($test instanceof TestCase) {
        $test->setName($name);

        if ($runTestInSeparateProcess) {
            $test->setRunTestInSeparateProcess(true);

            if ($preserveGlobalState !== null) {
                $test->setPreserveGlobalState($preserveGlobalState);
            }
        }

        if ($runClassInSeparateProcess) {
            $test->setRunClassInSeparateProcess(true);

            if ($preserveGlobalState !== null) {
                $test->setPreserveGlobalState($preserveGlobalState);
            }
        }

        if ($backupSettings['backupGlobals'] !== null) {
            $test->setBackupGlobals($backupSettings['backupGlobals']);
        }

        if ($backupSettings['backupStaticAttributes'] !== null) {
            $test->setBackupStaticAttributes(
                $backupSettings['backupStaticAttributes']
            );
        }
    }

    return $test;
}

public getGroupDetails( ) (defined in PHPUnit\Framework\TestSuite)

Source Code

public function getGroupDetails()
{
    return $this->groups;
}

public getGroups( ) (defined in PHPUnit\Framework\TestSuite)

Returns the test groups of the suite.

Source Code

public function getGroups(): array
{
    return \array_keys($this->groups);
}

public getIterator( ) (defined in PHPUnit\Framework\TestSuite)

Returns an iterator for this test suite.

Source Code

public function getIterator(): Iterator
{
    $iterator = new TestSuiteIterator($this);

    if ($this->iteratorFilter !== null) {
        $iterator = $this->iteratorFilter->factory($iterator, $this);
    }

    return $iterator;
}

public getName( ) (defined in PHPUnit\Framework\TestSuite)

Returns the name of the suite.

Source Code

public function getName(): string
{
    return $this->name;
}

public injectFilter( ) (defined in PHPUnit\Framework\TestSuite)

Source Code

public function injectFilter(Factory $filter): void
{
    $this->iteratorFilter = $filter;

    foreach ($this as $test) {
        if ($test instanceof self) {
            $test->injectFilter($filter);
        }
    }
}

public static isTestMethod( ) (defined in PHPUnit\Framework\TestSuite)

Source Code

public static function isTestMethod(ReflectionMethod $method): bool
{
    if (\strpos($method->name, 'test') === 0) {
        return true;
    }

    $annotations = \PHPUnit\Util\Test::parseAnnotations($method->getDocComment());

    return isset($annotations['test']);
}

public markTestSuiteSkipped( [ string $message = string(0) "" ] ) (defined in PHPUnit\Framework\TestSuite)

Mark the test suite as skipped.

Parameters

  • string $message = string(0) "" -

Tags

Source Code

public function markTestSuiteSkipped($message = ''): void
{
    throw new SkippedTestSuiteError($message);
}

public setBackupGlobals( bool $backupGlobals ) (defined in PHPUnit\Framework\TestSuite)

Parameters

  • bool $backupGlobals required - $backupGlobals

Source Code

public function setBackupGlobals($backupGlobals): void
{
    if (null === $this->backupGlobals && \is_bool($backupGlobals)) {
        $this->backupGlobals = $backupGlobals;
    }
}

public setBackupStaticAttributes( bool $backupStaticAttributes ) (defined in PHPUnit\Framework\TestSuite)

Parameters

  • bool $backupStaticAttributes required - $backupStaticAttributes

Source Code

public function setBackupStaticAttributes($backupStaticAttributes): void
{
    if (null === $this->backupStaticAttributes && \is_bool($backupStaticAttributes)) {
        $this->backupStaticAttributes = $backupStaticAttributes;
    }
}

public setBeStrictAboutChangesToGlobalState( bool $beStrictAboutChangesToGlobalState ) (defined in PHPUnit\Framework\TestSuite)

Parameters

  • bool $beStrictAboutChangesToGlobalState required - $beStrictAboutChangesToGlobalState

Source Code

public function setBeStrictAboutChangesToGlobalState($beStrictAboutChangesToGlobalState): void
{
    if (null === $this->beStrictAboutChangesToGlobalState && \is_bool($beStrictAboutChangesToGlobalState)) {
        $this->beStrictAboutChangesToGlobalState = $beStrictAboutChangesToGlobalState;
    }
}

public setGroupDetails( ) (defined in PHPUnit\Framework\TestSuite)

Set tests groups of the test case

Source Code

public function setGroupDetails(array $groups): void
{
    $this->groups = $groups;
}

public setName( ) (defined in PHPUnit\Framework\TestSuite)

Source Code

public function setName(string $name): void
{
    $this->name = $name;
}

public setRunTestInSeparateProcess( ) (defined in PHPUnit\Framework\TestSuite)

Source Code

public function setRunTestInSeparateProcess(bool $runTestInSeparateProcess): void
{
    $this->runTestInSeparateProcess = $runTestInSeparateProcess;
}

public setTests( Test[] $tests ) (defined in PHPUnit\Framework\TestSuite)

Set tests of the test suite

Parameters

  • Test[] $tests required - $tests

Source Code

public function setTests(array $tests): void
{
    $this->tests = $tests;
}

public testAt( ) (defined in PHPUnit\Framework\TestSuite)

Returns the test at the given index.

Return Values

  • false|Test

Source Code

public function testAt(int $index)
{
    if (isset($this->tests[$index])) {
        return $this->tests[$index];
    }

    return false;
}

public tests( ) (defined in PHPUnit\Framework\TestSuite)

Returns the tests as an enumeration.

Return Values

  • Test[]

Source Code

public function tests(): array
{
    return $this->tests;
}

public toString( ) (defined in PHPUnit\Framework\TestSuite)

Returns a string representation of the test suite.

Source Code

public function toString(): string
{
    return $this->getName();
}

protected addTestMethod( ) (defined in PHPUnit\Framework\TestSuite)

Tags

Source Code

protected function addTestMethod(ReflectionClass $class, ReflectionMethod $method): void
{
    if (!$this->isTestMethod($method)) {
        return;
    }

    $name = $method->getName();

    if (!$method->isPublic()) {
        $this->addTest(
            self::warning(
                \sprintf(
                    'Test method "%s" in test class "%s" is not public.',
                    $name,
                    $class->getName()
                )
            )
        );

        return;
    }

    $test = self::createTest($class, $name);

    if ($test instanceof TestCase || $test instanceof DataProviderTestSuite) {
        $test->setDependencies(
            \PHPUnit\Util\Test::getDependencies($class->getName(), $name)
        );
    }

    $this->addTest(
        $test,
        \PHPUnit\Util\Test::getGroups($class->getName(), $name)
    );
}

protected createResult( ) (defined in PHPUnit\Framework\TestSuite)

Creates a default TestResult object.

Source Code

protected function createResult(): TestResult
{
    return new TestResult;
}

protected static incompleteTest( string $class , string $methodName , string $message ) (defined in PHPUnit\Framework\TestSuite)

Parameters

  • string $class required - $class
  • string $methodName required - $methodName
  • string $message required - $message

Source Code

protected static function incompleteTest($class, $methodName, $message): IncompleteTestCase
{
    return new IncompleteTestCase($class, $methodName, $message);
}

protected setUp( ) (defined in PHPUnit\Framework\TestSuite)

Template Method that is called before the tests of this test suite are run.

Source Code

protected function setUp(): void
{
}

protected static skipTest( string $class , string $methodName , string $message ) (defined in PHPUnit\Framework\TestSuite)

Parameters

  • string $class required - $class
  • string $methodName required - $methodName
  • string $message required - $message

Source Code

protected static function skipTest($class, $methodName, $message): SkippedTestCase
{
    return new SkippedTestCase($class, $methodName, $message);
}

protected tearDown( ) (defined in PHPUnit\Framework\TestSuite)

Template Method that is called after the tests of this test suite have finished running.

Source Code

protected function tearDown(): void
{
}

protected static warning( string $message ) (defined in PHPUnit\Framework\TestSuite)

Parameters

  • string $message required - $message

Source Code

protected static function warning($message): WarningTestCase
{
    return new WarningTestCase($message);
}