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

/**
 * @group layouts
 */
class LoggerLayoutPatternTest extends PHPUnit_Framework_TestCase {

	/** Pattern used for testing. */
	private $pattern = "%-6level %logger: %msg from %class::%method() in %file at %line%n";
	
	public function testComplexLayout() {
		
		$config = LoggerTestHelper::getEchoPatternConfig($this->pattern);
		Logger::configure($config);
		
		ob_start();
		$log = Logger::getLogger('LoggerTest');
		$log->error("my message"); $line = __LINE__;
		$actual = ob_get_contents();
		ob_end_clean();
		
		$file = __FILE__;
		$class = __CLASS__;
		$method = __FUNCTION__;
		
		$expected = "ERROR  LoggerTest: my message from $class::$method() in $file at $line" . PHP_EOL;
		self::assertSame($expected, $actual);
		
		Logger::resetConfiguration();
    }
}
