<?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
 * @license    http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0
 * @link       http://logging.apache.org/log4php
 */

/**
 * @group main
 */
class LoggerNDCTest extends PHPUnit_Framework_TestCase {
	
	public function testItemHandling()
	{
		// Test the empty stack
		self::assertSame('', LoggerNDC::get());
		self::assertSame('', LoggerNDC::peek());
		self::assertSame(0, LoggerNDC::getDepth());
		self::assertSame('', LoggerNDC::pop());
		
		// Add some data to the stack
		LoggerNDC::push('1');
		LoggerNDC::push('2');
		LoggerNDC::push('3');
		
		self::assertSame('1 2 3', LoggerNDC::get());
		self::assertSame('3', LoggerNDC::peek());
		self::assertSame(3, LoggerNDC::getDepth());

		// Remove last item
		self::assertSame('3', LoggerNDC::pop());
		self::assertSame('1 2', LoggerNDC::get());
		self::assertSame('2', LoggerNDC::peek());
		self::assertSame(2, LoggerNDC::getDepth());

		// Remove all items
		LoggerNDC::remove();

		// Test the empty stack
		self::assertSame('', LoggerNDC::get());
		self::assertSame('', LoggerNDC::peek());
		self::assertSame(0, LoggerNDC::getDepth());
		self::assertSame('', LoggerNDC::pop());
	}
	
	public function testMaxDepth()
	{
		// Clear stack; add some testing data
		LoggerNDC::clear();
		LoggerNDC::push('1');
		LoggerNDC::push('2');
		LoggerNDC::push('3');
		LoggerNDC::push('4');
		LoggerNDC::push('5');
		LoggerNDC::push('6');
		
		self::assertSame('1 2 3 4 5 6', LoggerNDC::get());
		
		// Edge case, should not change stack
		LoggerNDC::setMaxDepth(6);
		self::assertSame('1 2 3 4 5 6', LoggerNDC::get());
		self::assertSame(6, LoggerNDC::getDepth());
		
		LoggerNDC::setMaxDepth(3);
		self::assertSame('1 2 3', LoggerNDC::get());
		self::assertSame(3, LoggerNDC::getDepth());
		
		LoggerNDC::setMaxDepth(0);
		self::assertSame('', LoggerNDC::get());
		self::assertSame(0, LoggerNDC::getDepth());
	}
}

?>
