| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147 | <?phpnamespace Psr\Log\Test;use Psr\Log\AbstractLogger;/** * Used for testing purposes. * * It records all records and gives you access to them for verification. * * @method bool hasEmergency($record) * @method bool hasAlert($record) * @method bool hasCritical($record) * @method bool hasError($record) * @method bool hasWarning($record) * @method bool hasNotice($record) * @method bool hasInfo($record) * @method bool hasDebug($record) * * @method bool hasEmergencyRecords() * @method bool hasAlertRecords() * @method bool hasCriticalRecords() * @method bool hasErrorRecords() * @method bool hasWarningRecords() * @method bool hasNoticeRecords() * @method bool hasInfoRecords() * @method bool hasDebugRecords() * * @method bool hasEmergencyThatContains($message) * @method bool hasAlertThatContains($message) * @method bool hasCriticalThatContains($message) * @method bool hasErrorThatContains($message) * @method bool hasWarningThatContains($message) * @method bool hasNoticeThatContains($message) * @method bool hasInfoThatContains($message) * @method bool hasDebugThatContains($message) * * @method bool hasEmergencyThatMatches($message) * @method bool hasAlertThatMatches($message) * @method bool hasCriticalThatMatches($message) * @method bool hasErrorThatMatches($message) * @method bool hasWarningThatMatches($message) * @method bool hasNoticeThatMatches($message) * @method bool hasInfoThatMatches($message) * @method bool hasDebugThatMatches($message) * * @method bool hasEmergencyThatPasses($message) * @method bool hasAlertThatPasses($message) * @method bool hasCriticalThatPasses($message) * @method bool hasErrorThatPasses($message) * @method bool hasWarningThatPasses($message) * @method bool hasNoticeThatPasses($message) * @method bool hasInfoThatPasses($message) * @method bool hasDebugThatPasses($message) */class TestLogger extends AbstractLogger{    /**     * @var array     */    public $records = [];    public $recordsByLevel = [];    /**     * @inheritdoc     */    public function log($level, $message, array $context = [])    {        $record = [            'level' => $level,            'message' => $message,            'context' => $context,        ];        $this->recordsByLevel[$record['level']][] = $record;        $this->records[] = $record;    }    public function hasRecords($level)    {        return isset($this->recordsByLevel[$level]);    }    public function hasRecord($record, $level)    {        if (is_string($record)) {            $record = ['message' => $record];        }        return $this->hasRecordThatPasses(function ($rec) use ($record) {            if ($rec['message'] !== $record['message']) {                return false;            }            if (isset($record['context']) && $rec['context'] !== $record['context']) {                return false;            }            return true;        }, $level);    }    public function hasRecordThatContains($message, $level)    {        return $this->hasRecordThatPasses(function ($rec) use ($message) {            return strpos($rec['message'], $message) !== false;        }, $level);    }    public function hasRecordThatMatches($regex, $level)    {        return $this->hasRecordThatPasses(function ($rec) use ($regex) {            return preg_match($regex, $rec['message']) > 0;        }, $level);    }    public function hasRecordThatPasses(callable $predicate, $level)    {        if (!isset($this->recordsByLevel[$level])) {            return false;        }        foreach ($this->recordsByLevel[$level] as $i => $rec) {            if (call_user_func($predicate, $rec, $i)) {                return true;            }        }        return false;    }    public function __call($method, $args)    {        if (preg_match('/(.*)(Debug|Info|Notice|Warning|Error|Critical|Alert|Emergency)(.*)/', $method, $matches) > 0) {            $genericMethod = $matches[1] . ('Records' !== $matches[3] ? 'Record' : '') . $matches[3];            $level = strtolower($matches[2]);            if (method_exists($this, $genericMethod)) {                $args[] = $level;                return call_user_func_array([$this, $genericMethod], $args);            }        }        throw new \BadMethodCallException('Call to undefined method ' . get_class($this) . '::' . $method . '()');    }    public function reset()    {        $this->records = [];        $this->recordsByLevel = [];    }}
 |