<?php

/**
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 * @category   tests
 * @license    http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0
 * @link       http://logging.apache.org/log4php
 */

namespace Apache\Log4php\Tests;

use Apache\Log4php\Filters\AbstractFilter;
use Apache\Log4php\Level;
use Apache\Log4php\Logger;
use Apache\Log4php\LoggingEvent;

/** A set of helper functions for running tests. */
class TestHelper
{
    /**
     * Returns a test logging event with level set to TRACE.
     * @return LoggingEvent
     */
    public static function getTraceEvent($message = 'test', $logger = "test")
    {
        return new LoggingEvent(__CLASS__, new Logger($logger), Level::getLevelTrace(), $message);
    }

    /**
     * Returns a test logging event with level set to DEBUG.
     * @return LoggingEvent
     */
    public static function getDebugEvent($message = 'test', $logger = "test")
    {
        return new LoggingEvent(__CLASS__, new Logger($logger), Level::getLevelDebug(), $message);
    }

    /**
     * Returns a test logging event with level set to INFO.
     * @return LoggingEvent
     */
    public static function getInfoEvent($message = 'test', $logger = "test")
    {
        return new LoggingEvent(__CLASS__, new Logger($logger), Level::getLevelInfo(), $message);
    }

    /**
     * Returns a test logging event with level set to WARN.
     * @return LoggingEvent
     */
    public static function getWarnEvent($message = 'test', $logger = "test")
    {
        return new LoggingEvent(__CLASS__, new Logger($logger), Level::getLevelWarn(), $message);
    }

    /**
     * Returns a test logging event with level set to ERROR.
     * @return LoggingEvent
     */
    public static function getErrorEvent($message = 'test', $logger = "test")
    {
        return new LoggingEvent(__CLASS__, new Logger($logger), Level::getLevelError(), $message);
    }

    /**
     * Returns a test logging event with level set to FATAL.
     * @return LoggingEvent
     */
    public static function getFatalEvent($message = 'test', $logger = "test")
    {
        return new LoggingEvent(__CLASS__, new Logger($logger), Level::getLevelFatal(), $message);
    }

    /**
     * Returns an array of logging events, one for each level, sorted ascending
     * by severitiy.
     */
    public static function getAllEvents($message = 'test')
    {
        return array(
            self::getTraceEvent($message),
            self::getDebugEvent($message),
            self::getInfoEvent($message),
            self::getWarnEvent($message),
            self::getErrorEvent($message),
            self::getFatalEvent($message),
        );
    }

    /** Returns an array of all existing levels, sorted ascending by severity. */
    public static function getAllLevels()
    {
        return array(
            Level::getLevelTrace(),
            Level::getLevelDebug(),
            Level::getLevelInfo(),
            Level::getLevelWarn(),
            Level::getLevelError(),
            Level::getLevelFatal(),
        );
    }

    /** Returns a string representation of a filter decision. */
    public static function decisionToString($decision)
    {
        switch ($decision) {
            case AbstractFilter::ACCEPT: return 'ACCEPT';
            case AbstractFilter::NEUTRAL: return 'NEUTRAL';
            case AbstractFilter::DENY: return 'DENY';
        }
    }

    /** Returns a simple configuration with one echo appender tied to root logger. */
    public static function getEchoConfig()
    {
        return array(
            'threshold' => 'ALL',
            'rootLogger' => array(
                'level' => 'trace',
                'appenders' => array('default'),
            ),
            'appenders' => array(
                'default' => array(
                    'class' => 'EchoAppender',
                    'layout' => array(
                        'class' => 'SimpleLayout',
                    ),
                ),
            ),
        );
    }

    /** Returns a simple configuration with one echo appender using the pattern layout. */
    public static function getEchoPatternConfig($pattern)
    {
        return array(
            'threshold' => 'ALL',
            'rootLogger' => array(
                'level' => 'trace',
                'appenders' => array('default'),
            ),
            'appenders' => array(
                'default' => array(
                    'class' => 'EchoAppender',
                    'layout' => array(
                        'class' => 'PatternLayout',
                        'params' => array(
                            'conversionPattern' => $pattern
                        )
                    ),
                ),
            ),
        );
    }
}
