Dustin Wilson
1 year ago
2 changed files with 144 additions and 1 deletions
@ -0,0 +1,143 @@ |
|||
<?php |
|||
/** |
|||
* @license MIT |
|||
* Copyright 2022 Dustin Wilson, et al. |
|||
* See LICENSE and AUTHORS files for details |
|||
*/ |
|||
|
|||
declare(strict_types=1); |
|||
namespace MensBeam\Catcher\Test; |
|||
use MensBeam\Catcher\{ |
|||
Error, |
|||
ThrowableController, |
|||
UnderflowException |
|||
}; |
|||
|
|||
|
|||
/** @covers \MensBeam\Catcher\ThrowableController */ |
|||
class TestThrowableController extends \PHPUnit\Framework\TestCase { |
|||
|
|||
/** @dataProvider provideErrorTypeTests */ |
|||
public function testErrorTypes(\Throwable $throwable, ?string $expectedType = null): void { |
|||
$c = new ThrowableController($throwable); |
|||
$this->assertSame($expectedType, $c->getErrorType()); |
|||
// Tests caching |
|||
$this->assertSame($expectedType, $c->getErrorType()); |
|||
} |
|||
|
|||
/** @dataProvider provideGettingFramesTests */ |
|||
public function testGettingFrames(\Throwable $throwable): void { |
|||
$c = new ThrowableController($throwable); |
|||
$f = $c->getFrames(rand(0, 10)); |
|||
$this->assertNotNull($f); |
|||
$this->assertGreaterThan(0, count($f)); |
|||
// Tests caching |
|||
$this->assertNotNull($c->getFrames()); |
|||
} |
|||
|
|||
/** @dataProvider provideGettingFramesInCallUserFuncTests */ |
|||
public function testGettingFramesInCallUserFunc(\Closure $closure): void { |
|||
$f = false; |
|||
try { |
|||
$closure(); |
|||
call_user_func_array(function() { |
|||
throw new \Exception('Ook!'); |
|||
}, []); |
|||
} catch (\Throwable $t) { |
|||
$c = new ThrowableController($t); |
|||
$f = $c->getFrames(); |
|||
} finally { |
|||
$this->assertNotNull($f); |
|||
$this->assertGreaterThan(0, count($f)); |
|||
} |
|||
} |
|||
|
|||
public function testGetPrevious(): void { |
|||
$t = new ThrowableController(new \Exception(message: 'Ook!', previous: new Error(message: 'Ook!', code: \E_ERROR, previous: new \Exception('Ook!')))); |
|||
$this->assertInstanceOf(\Exception::class, $t->getThrowable()); |
|||
$t2 = $t->getPrevious(); |
|||
$this->assertInstanceOf(Error::class, $t2->getThrowable()); |
|||
$t3 = $t2->getPrevious(); |
|||
$this->assertInstanceOf(\Exception::class, $t3->getThrowable()); |
|||
// Tests caching |
|||
$t3 = $t2->getPrevious(); |
|||
$this->assertInstanceOf(\Exception::class, $t3->getThrowable()); |
|||
} |
|||
|
|||
|
|||
public function testFatalError(): void { |
|||
$this->expectException(UnderflowException::class); |
|||
$c = new ThrowableController(new \Exception('ook')); |
|||
$f = $c->getFrames(-1); |
|||
} |
|||
|
|||
public static function provideErrorTypeTests(): iterable { |
|||
$options = [ |
|||
[ new Error('Ook!', \E_ERROR, '/dev/null', 0), 'PHP Fatal Error' ], |
|||
[ new Error('Ook!', \E_WARNING, '/dev/null', 0), 'PHP Warning' ], |
|||
[ new Error('Ook!', \E_PARSE, '/dev/null', 0), 'PHP Parsing Error' ], |
|||
[ new Error('Ook!', \E_NOTICE, '/dev/null', 0), 'PHP Notice' ], |
|||
[ new Error('Ook!', \E_CORE_ERROR, '/dev/null', 0), 'PHP Core Error' ], |
|||
[ new Error('Ook!', \E_CORE_WARNING, '/dev/null', 0), 'PHP Core Warning' ], |
|||
[ new Error('Ook!', \E_COMPILE_ERROR, '/dev/null', 0), 'Compile Error' ], |
|||
[ new Error('Ook!', \E_COMPILE_WARNING, '/dev/null', 0), 'Compile Warning' ], |
|||
[ new Error('Ook!', \E_STRICT, '/dev/null', 0), 'Runtime Notice' ], |
|||
[ new Error('Ook!', \E_RECOVERABLE_ERROR, '/dev/null', 0), 'Recoverable Error' ], |
|||
[ new Error('Ook!', \E_DEPRECATED, '/dev/null', 0), 'Deprecated' ], |
|||
[ new Error('Ook!', \E_USER_DEPRECATED, '/dev/null', 0), 'Deprecated' ], |
|||
[ new Error('Ook!', \E_USER_ERROR, '/dev/null', 0), 'Fatal Error' ], |
|||
[ new Error('Ook!', \E_USER_WARNING, '/dev/null', 0), 'Warning' ], |
|||
[ new Error('Ook!', \E_USER_NOTICE, '/dev/null', 0), 'Notice' ], |
|||
[ new Error('Ook!', \E_ALL, '/dev/null', 0) ], |
|||
[ new \Exception('Ook!') ], |
|||
]; |
|||
|
|||
foreach ($options as $o) { |
|||
yield $o; |
|||
} |
|||
} |
|||
|
|||
public static function provideGettingFramesTests(): iterable { |
|||
$options = [ |
|||
[ new Error('Ook!', \E_ERROR, '/dev/null', 0) ], |
|||
[ new Error('Ook!', \E_WARNING, '/dev/null', 0) ], |
|||
[ new Error('Ook!', \E_PARSE, '/dev/null', 0) ], |
|||
[ new Error('Ook!', \E_NOTICE, '/dev/null', 0) ], |
|||
[ new Error('Ook!', \E_CORE_ERROR, '/dev/null', 0) ], |
|||
[ new Error('Ook!', \E_CORE_WARNING, '/dev/null', 0) ], |
|||
[ new Error('Ook!', \E_COMPILE_ERROR, '/dev/null', 0) ], |
|||
[ new Error('Ook!', \E_COMPILE_WARNING, '/dev/null', 0) ], |
|||
[ new Error('Ook!', \E_STRICT, '/dev/null', 0) ], |
|||
[ new Error('Ook!', \E_RECOVERABLE_ERROR, '/dev/null', 0) ], |
|||
[ new Error('Ook!', \E_DEPRECATED, '/dev/null', 0) ], |
|||
[ new Error('Ook!', \E_USER_DEPRECATED, '/dev/null', 0) ], |
|||
[ new Error('Ook!', \E_USER_ERROR, '/dev/null', 0) ], |
|||
[ new Error('Ook!', \E_USER_WARNING, '/dev/null', 0) ], |
|||
[ new Error('Ook!', \E_USER_NOTICE, '/dev/null', 0) ], |
|||
[ new \Exception('Ook!') ], |
|||
[ new \Exception(message: 'Ook!', previous: new Error(message: 'Ook!', code: \E_ERROR, previous: new \Exception('Ook!'))) ] |
|||
]; |
|||
|
|||
foreach ($options as $o) { |
|||
yield $o; |
|||
} |
|||
} |
|||
|
|||
public static function provideGettingFramesInCallUserFuncTests(): iterable { |
|||
$options = [ |
|||
function () { |
|||
call_user_func_array(function() { |
|||
throw new \Exception('Ook!'); |
|||
}, []); |
|||
}, |
|||
function () { |
|||
function ook() {} |
|||
call_user_func('ook', []); |
|||
} |
|||
]; |
|||
|
|||
foreach ($options as $o) { |
|||
yield [ $o ]; |
|||
} |
|||
} |
|||
} |
Loading…
Reference in new issue