<?php namespace Yoast\PHPUnitPolyfills\Polyfills; use PHPUnit\SebastianBergmann\Exporter\Exporter as Exporter_In_Phar; use SebastianBergmann\Exporter\Exporter; use Yoast\PHPUnitPolyfills\Helpers\ResourceHelper; /** * Polyfill the Assert::assertIsClosedResource() and Assert::assertIsNotClosedResource() methods. * * Introduced in PHPUnit 9.3.0. * * @link https://github.com/sebastianbergmann/phpunit/issues/4276 * @link https://github.com/sebastianbergmann/phpunit/pull/4365 */ trait AssertClosedResource { /** * Asserts that a variable is of type resource and is closed. * * @param mixed $actual The variable to test. * @param string $message Optional failure message to display. * * @return void */ public static function assertIsClosedResource( $actual, $message = '' ) { $exporter = \class_exists( Exporter::class ) ? new Exporter() : new Exporter_In_Phar(); $msg = \sprintf( 'Failed asserting that %s is of type "resource (closed)"', $exporter->export( $actual ) ); if ( $message !== '' ) { $msg = $message . \PHP_EOL . $msg; } static::assertTrue( ResourceHelper::isClosedResource( $actual ), $msg ); } /** * Asserts that a variable is not of type resource or is an open resource. * * @param mixed $actual The variable to test. * @param string $message Optional failure message to display. * * @return void */ public static function assertIsNotClosedResource( $actual, $message = '' ) { $exporter = \class_exists( Exporter::class ) ? new Exporter() : new Exporter_In_Phar(); $type = $exporter->export( $actual ); if ( $type === 'NULL' ) { $type = 'resource (closed)'; } $msg = \sprintf( 'Failed asserting that %s is not of type "resource (closed)"', $type ); if ( $message !== '' ) { $msg = $message . \PHP_EOL . $msg; } static::assertFalse( ResourceHelper::isClosedResource( $actual ), $msg ); } /** * Helper function to determine whether an assertion regarding a resource's state should be skipped. * * Due to some bugs in PHP itself, the "is closed resource" determination * cannot always be done reliably. * * This method can determine whether or not the current value in combination with * the current PHP version on which the test is being run is affected by this. * * Use this function to skip running a test using `assertIs[Not]ClosedResource()` or * to skip running just that particular assertion. * * @param mixed $actual The variable to test. * * @return bool */ public static function shouldClosedResourceAssertionBeSkipped( $actual ) { return ( ResourceHelper::isResourceStateReliable( $actual ) === false ); } }