annotate vendor/psr/log/Psr/Log/Test/TestLogger.php @ 19:fa3358dc1485 tip

Add ndrum files
author Chris Cannam
date Wed, 28 Aug 2019 13:14:47 +0100
parents 129ea1e6d783
children
rev   line source
Chris@17 1 <?php
Chris@17 2
Chris@17 3 namespace Psr\Log\Test;
Chris@17 4
Chris@17 5 use Psr\Log\AbstractLogger;
Chris@17 6
Chris@17 7 /**
Chris@17 8 * Used for testing purposes.
Chris@17 9 *
Chris@17 10 * It records all records and gives you access to them for verification.
Chris@17 11 *
Chris@17 12 * @method bool hasEmergency($record)
Chris@17 13 * @method bool hasAlert($record)
Chris@17 14 * @method bool hasCritical($record)
Chris@17 15 * @method bool hasError($record)
Chris@17 16 * @method bool hasWarning($record)
Chris@17 17 * @method bool hasNotice($record)
Chris@17 18 * @method bool hasInfo($record)
Chris@17 19 * @method bool hasDebug($record)
Chris@17 20 *
Chris@17 21 * @method bool hasEmergencyRecords()
Chris@17 22 * @method bool hasAlertRecords()
Chris@17 23 * @method bool hasCriticalRecords()
Chris@17 24 * @method bool hasErrorRecords()
Chris@17 25 * @method bool hasWarningRecords()
Chris@17 26 * @method bool hasNoticeRecords()
Chris@17 27 * @method bool hasInfoRecords()
Chris@17 28 * @method bool hasDebugRecords()
Chris@17 29 *
Chris@17 30 * @method bool hasEmergencyThatContains($message)
Chris@17 31 * @method bool hasAlertThatContains($message)
Chris@17 32 * @method bool hasCriticalThatContains($message)
Chris@17 33 * @method bool hasErrorThatContains($message)
Chris@17 34 * @method bool hasWarningThatContains($message)
Chris@17 35 * @method bool hasNoticeThatContains($message)
Chris@17 36 * @method bool hasInfoThatContains($message)
Chris@17 37 * @method bool hasDebugThatContains($message)
Chris@17 38 *
Chris@17 39 * @method bool hasEmergencyThatMatches($message)
Chris@17 40 * @method bool hasAlertThatMatches($message)
Chris@17 41 * @method bool hasCriticalThatMatches($message)
Chris@17 42 * @method bool hasErrorThatMatches($message)
Chris@17 43 * @method bool hasWarningThatMatches($message)
Chris@17 44 * @method bool hasNoticeThatMatches($message)
Chris@17 45 * @method bool hasInfoThatMatches($message)
Chris@17 46 * @method bool hasDebugThatMatches($message)
Chris@17 47 *
Chris@17 48 * @method bool hasEmergencyThatPasses($message)
Chris@17 49 * @method bool hasAlertThatPasses($message)
Chris@17 50 * @method bool hasCriticalThatPasses($message)
Chris@17 51 * @method bool hasErrorThatPasses($message)
Chris@17 52 * @method bool hasWarningThatPasses($message)
Chris@17 53 * @method bool hasNoticeThatPasses($message)
Chris@17 54 * @method bool hasInfoThatPasses($message)
Chris@17 55 * @method bool hasDebugThatPasses($message)
Chris@17 56 */
Chris@17 57 class TestLogger extends AbstractLogger
Chris@17 58 {
Chris@17 59 /**
Chris@17 60 * @var array
Chris@17 61 */
Chris@17 62 public $records = [];
Chris@17 63
Chris@17 64 public $recordsByLevel = [];
Chris@17 65
Chris@17 66 /**
Chris@17 67 * @inheritdoc
Chris@17 68 */
Chris@17 69 public function log($level, $message, array $context = [])
Chris@17 70 {
Chris@17 71 $record = [
Chris@17 72 'level' => $level,
Chris@17 73 'message' => $message,
Chris@17 74 'context' => $context,
Chris@17 75 ];
Chris@17 76
Chris@17 77 $this->recordsByLevel[$record['level']][] = $record;
Chris@17 78 $this->records[] = $record;
Chris@17 79 }
Chris@17 80
Chris@17 81 public function hasRecords($level)
Chris@17 82 {
Chris@17 83 return isset($this->recordsByLevel[$level]);
Chris@17 84 }
Chris@17 85
Chris@17 86 public function hasRecord($record, $level)
Chris@17 87 {
Chris@17 88 if (is_string($record)) {
Chris@17 89 $record = ['message' => $record];
Chris@17 90 }
Chris@17 91 return $this->hasRecordThatPasses(function ($rec) use ($record) {
Chris@17 92 if ($rec['message'] !== $record['message']) {
Chris@17 93 return false;
Chris@17 94 }
Chris@17 95 if (isset($record['context']) && $rec['context'] !== $record['context']) {
Chris@17 96 return false;
Chris@17 97 }
Chris@17 98 return true;
Chris@17 99 }, $level);
Chris@17 100 }
Chris@17 101
Chris@17 102 public function hasRecordThatContains($message, $level)
Chris@17 103 {
Chris@17 104 return $this->hasRecordThatPasses(function ($rec) use ($message) {
Chris@17 105 return strpos($rec['message'], $message) !== false;
Chris@17 106 }, $level);
Chris@17 107 }
Chris@17 108
Chris@17 109 public function hasRecordThatMatches($regex, $level)
Chris@17 110 {
Chris@17 111 return $this->hasRecordThatPasses(function ($rec) use ($regex) {
Chris@17 112 return preg_match($regex, $rec['message']) > 0;
Chris@17 113 }, $level);
Chris@17 114 }
Chris@17 115
Chris@17 116 public function hasRecordThatPasses(callable $predicate, $level)
Chris@17 117 {
Chris@17 118 if (!isset($this->recordsByLevel[$level])) {
Chris@17 119 return false;
Chris@17 120 }
Chris@17 121 foreach ($this->recordsByLevel[$level] as $i => $rec) {
Chris@17 122 if (call_user_func($predicate, $rec, $i)) {
Chris@17 123 return true;
Chris@17 124 }
Chris@17 125 }
Chris@17 126 return false;
Chris@17 127 }
Chris@17 128
Chris@17 129 public function __call($method, $args)
Chris@17 130 {
Chris@17 131 if (preg_match('/(.*)(Debug|Info|Notice|Warning|Error|Critical|Alert|Emergency)(.*)/', $method, $matches) > 0) {
Chris@17 132 $genericMethod = $matches[1] . ('Records' !== $matches[3] ? 'Record' : '') . $matches[3];
Chris@17 133 $level = strtolower($matches[2]);
Chris@17 134 if (method_exists($this, $genericMethod)) {
Chris@17 135 $args[] = $level;
Chris@17 136 return call_user_func_array([$this, $genericMethod], $args);
Chris@17 137 }
Chris@17 138 }
Chris@17 139 throw new \BadMethodCallException('Call to undefined method ' . get_class($this) . '::' . $method . '()');
Chris@17 140 }
Chris@17 141
Chris@17 142 public function reset()
Chris@17 143 {
Chris@17 144 $this->records = [];
Chris@17 145 }
Chris@17 146 }