public static function error(callable $function, $expectedType, $expectedMessage = NULL)
{
if (is_string($expectedType) && !preg_match('#^E_[A-Z_]+\\z#', $expectedType)) {
return static::exception($function, $expectedType, $expectedMessage);
}
self::$counter++;
$expected = is_array($expectedType) ? $expectedType : [[$expectedType, $expectedMessage]];
foreach ($expected as &$item) {
list($expectedType, $expectedMessage) = $item;
if (is_int($expectedType)) {
$item[2] = Helpers::errorTypeToString($expectedType);
} elseif (is_string($expectedType)) {
$item[0] = constant($item[2] = $expectedType);
} else {
throw new \Exception('Error type must be E_* constant.');
}
}
set_error_handler(function ($severity, $message, $file, $line) use(&$expected) {
if (($severity & error_reporting()) !== $severity) {
return;
}
$errorStr = Helpers::errorTypeToString($severity) . ($message ? " ({$message})" : '');
list($expectedType, $expectedMessage, $expectedTypeStr) = array_shift($expected);
if ($expectedType === NULL) {
self::fail("Generated more errors than expected: {$errorStr} was generated in file {$file} on line {$line}");
} elseif ($severity !== $expectedType) {
self::fail("{$expectedTypeStr} was expected, but {$errorStr} was generated in file {$file} on line {$line}");
} elseif ($expectedMessage && !self::isMatching($expectedMessage, $message)) {
self::fail("{$expectedTypeStr} with a message matching %2 was expected but got %1", $message, $expectedMessage);
}
});
reset($expected);
try {
call_user_func($function);
restore_error_handler();
} catch (\Exception $e) {
restore_error_handler();
throw $e;
}
if ($expected) {
self::fail('Error was expected, but was not generated');
}
}