<?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   
 * @package    log4php
 * @subpackage helpers
 * @license    http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0
 * @link       http://logging.apache.org/log4php
 */

/**
 * @group helpers
 * 
 * TODO: Should also test complex patterns like: "%d{Y-m-d H:i:s} %-5p %c %X{username}: %m in %F at %L%n"
 */
class LoggerPatternParserTest extends PHPUnit_Framework_TestCase {
        
    public function testErrorLayout() {
// 		$event = new LoggerLoggingEvent("LoggerLayoutXml", new Logger("TEST"), LoggerLevel::getLevelError(), "testmessage");
// 		$expected = 'ERROR TEST : testmessage in NA at NA'.PHP_EOL;
		
// 		$patternParser = new LoggerPatternParser("%-5p %c %X{username}: %m in %F at %L%n");
// 		$c = $patternParser->parse();
		
// 		$actual = '';
// 		$c->format($actual, $event);
//		self::assertEquals($expected, $actual);

    }
    
    public function testClassname() {
// 		$event = new LoggerLoggingEvent("MyClass", new Logger("TEST"), LoggerLevel::getLevelError(), "testmessage");
// 		$expected = 'MyClass';
// 		$patternParser = new LoggerPatternParser("%C");
// 		$c = $patternParser->parse();
// 		$actual = '';
// 		$c->format($actual, $event);
// 		self::assertEquals($expected, $actual);
    }
}
