/**
  * Formats a logging event according to this layout
  *
  * @param   util.log.LoggingEvent event
  * @return  string
  */
 public function format(\util\log\LoggingEvent $event)
 {
     $out = '';
     foreach ($this->format as $token) {
         switch ($token) {
             case '%m':
                 $out .= implode(' ', array_map([$this, 'stringOf'], $event->getArguments()));
                 break;
             case '%t':
                 $out .= gmdate('H:i:s', $event->getTimestamp());
                 break;
             case '%c':
                 $out .= $event->getCategory()->identifier;
                 break;
             case '%l':
                 $out .= strtolower(\util\log\LogLevel::nameOf($event->getLevel()));
                 break;
             case '%L':
                 $out .= strtoupper(\util\log\LogLevel::nameOf($event->getLevel()));
                 break;
             case '%p':
                 $out .= $event->getProcessId();
                 break;
             case '%x':
                 $out .= null == ($context = $event->getContext()) ? '' : $context->format();
                 break;
             default:
                 $out .= $token;
         }
     }
     return $out;
 }
 /**
  * Create a mock appender which simply stores all messages passed to 
  * its append() method.
  *
  * @return  util.log.Appender
  */
 private function mockAppender()
 {
     $appender = newinstance(Appender::class, [], ['messages' => [], 'append' => function (LoggingEvent $event) {
         $this->messages[] = [strtolower(LogLevel::nameOf($event->getLevel())), $this->layout->format($event)];
     }]);
     return $appender->withLayout(new PatternLayout('%m'));
 }
 public function nameOf_illegal_loglevel()
 {
     LogLevel::nameOf(-1);
 }