LOG4PHP-178: 
* Updated Logger::setLevel() to accept null.
* Updated LoggerRoot::setLevel() to deny null.
* Added error reporting to LoggerRoot.
* Updated tests.

git-svn-id: https://svn.apache.org/repos/asf/logging/log4php/trunk@1343190 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/src/main/php/Logger.php b/src/main/php/Logger.php
index b2df0dc..efd6982 100644
--- a/src/main/php/Logger.php
+++ b/src/main/php/Logger.php
@@ -379,9 +379,9 @@
 	 * Use LoggerLevel::getLevelXXX() methods to get a LoggerLevel object, e.g.
 	 * <code>$logger->setLevel(LoggerLevel::getLevelInfo());</code>
 	 *
-	 * @param LoggerLevel $level the level to set
+	 * @param LoggerLevel $level The level to set, or NULL to clear the logger level.
 	 */
-	public function setLevel(LoggerLevel $level) {
+	public function setLevel(LoggerLevel $level = null) {
 		$this->level = $level;
 	}
 	
@@ -393,9 +393,8 @@
 	 */
 	public function isAttached(LoggerAppender $appender) {
 		return isset($this->appenders[$appender->getName()]);
-	} 
-		   
-
+	}
+	
 	/**
 	 * Sets the parent logger.
 	 * @param Logger $logger
diff --git a/src/main/php/LoggerRoot.php b/src/main/php/LoggerRoot.php
index 102c5c4..315837d 100644
--- a/src/main/php/LoggerRoot.php
+++ b/src/main/php/LoggerRoot.php
@@ -31,7 +31,7 @@
 	 *
 	 * @param integer $level initial log level
 	 */
-	public function __construct($level = null) {
+	public function __construct(LoggerLevel $level = null) {
 		parent::__construct('root');
 
 		if($level == null) {
@@ -43,28 +43,29 @@
 	/**
 	 * @return LoggerLevel the level
 	 */
-	public function getChainedLevel() {
-		return parent::getLevel();
-	} 
+	public function getEffectiveLevel() {
+		return $this->getLevel();
+	}
 	
 	/**
-	 * Setting a null value to the level of the root category may have catastrophic results.
+	 * Override level setter to prevent setting the root logger's level to 
+	 * null. Root logger must always have a level.
+	 * 
 	 * @param LoggerLevel $level
 	 */
-	public function setLevel($level) {
-		if($level != null) {
+	public function setLevel(LoggerLevel $level = null) {
+		if (isset($level)) {
 			parent::setLevel($level);
-		}	 
+		} else {
+			trigger_error("log4php: Cannot set LoggerRoot level to null.", E_USER_WARNING);
+		}
 	}
 	
 	/**
-	 * Always returns false.
-	 * Because LoggerRoot has no parents, it returns false.
+	 * Override parent setter. Root logger cannot have a parent.
 	 * @param Logger $parent
-	 * @return boolean
 	 */
 	public function setParent(Logger $parent) {
-		return false;
+		trigger_error("log4php: LoggerRoot cannot have a parent.", E_USER_WARNING);
 	}
-
 }
diff --git a/src/test/php/LoggerHierarchyTest.php b/src/test/php/LoggerHierarchyTest.php
index c61bbc7..68f4f86 100644
--- a/src/test/php/LoggerHierarchyTest.php
+++ b/src/test/php/LoggerHierarchyTest.php
@@ -33,38 +33,23 @@
 		$this->hierarchy = new LoggerHierarchy(new LoggerRoot());
 	}
 	
-	public function testIfLevelIsInitiallyLevelAllg() {
-		self::assertEquals('ALL', $this->hierarchy->getRootLogger()->getLevel()->toString());
-	}
-
-	public function testIfNameIsRoot() {
-		self::assertEquals('root', $this->hierarchy->getRootLogger()->getName());
-	}
-
-	public function testIfParentIsNull() {
-		self::assertSame(null, $this->hierarchy->getRootLogger()->getParent());
-	}
-
-	public function testSetParent() {
-		$l = $this->hierarchy->getLogger('dummy');
-		$this->hierarchy->getRootLogger()->setParent($l);
-		$this->testIfParentIsNull();
-	}
-        
 	public function testResetConfiguration() {
 		$root = $this->hierarchy->getRootLogger();
 		$appender = new LoggerAppenderConsole('A1');
 		$root->addAppender($appender);
+
 		$logger = $this->hierarchy->getLogger('test');
-		self::assertEquals(count($this->hierarchy->getCurrentLoggers()), 1);
+		self::assertEquals(1, count($this->hierarchy->getCurrentLoggers()));
+		
 		$this->hierarchy->resetConfiguration();
-		self::assertEquals($this->hierarchy->getRootLogger()->getLevel()->toString(), 'DEBUG');
-		self::assertEquals($this->hierarchy->getThreshold()->toString(), 'ALL');
-		self::assertEquals(count($this->hierarchy->getCurrentLoggers()), 1);
-		foreach($this->hierarchy->getCurrentLoggers() as $l) {
-			self::assertEquals($l->getLevel(), null);
-			self::assertTrue($l->getAdditivity());
-			self::assertEquals(count($l->getAllAppenders()), 0);
+		self::assertEquals(LoggerLevel::getLevelDebug(), $root->getLevel());
+		self::assertEquals(LoggerLevel::getLevelAll(), $this->hierarchy->getThreshold());
+		self::assertEquals(1, count($this->hierarchy->getCurrentLoggers()));
+		
+		foreach($this->hierarchy->getCurrentLoggers() as $logger) {
+			self::assertNull($logger->getLevel());
+			self::assertTrue($logger->getAdditivity());
+			self::assertEquals(0, count($logger->getAllAppenders()), 0);
 		}
 	}
 	
diff --git a/src/test/php/LoggerRootTest.php b/src/test/php/LoggerRootTest.php
index 46c4304..cf76fe4 100644
--- a/src/test/php/LoggerRootTest.php
+++ b/src/test/php/LoggerRootTest.php
@@ -26,30 +26,38 @@
  * @group main
  */
 class LoggerRootTest extends PHPUnit_Framework_TestCase {
-        
-	private $loggerRoot;
-        
-	protected function setUp() {
-		$this->loggerRoot = new LoggerRoot();
-	}
-        
-	public function testIfLevelIsInitiallyLevelAll() {
-		self::assertEquals($this->loggerRoot->getLevel()->toString(), 'ALL');
+    
+	public function testInitialSetup() {
+		$root = new LoggerRoot();
+		self::assertSame(LoggerLevel::getLevelAll(), $root->getLevel());
+		self::assertSame(LoggerLevel::getLevelAll(), $root->getEffectiveLevel());
+		self::assertSame('root', $root->getName());
+		self::assertNull($root->getParent());
 	}
 
-	public function testIfNameIsRoot() {
-		self::assertEquals($this->loggerRoot->getName(), 'root');
+	/**
+	 * @expectedException PHPUnit_Framework_Error
+	 * @expectedExceptionMessage log4php: LoggerRoot cannot have a parent.
+	 */
+	public function testSetParentWarning() {
+		$root = new LoggerRoot();
+		$logger = new Logger('test');
+		$root->setParent($logger);
 	}
-
-	public function testIfParentIsNull() {
-		self::assertSame($this->loggerRoot->getParent(), null);
+	
+	public function testSetParentResult() {
+		$root = new LoggerRoot();
+		$logger = new Logger('test');
+		@$root->setParent($logger);
+		self::assertNull($root->getParent());
 	}
-
-	public function testSetParent() {
-		$hierarchy = new LoggerHierarchy(new LoggerRoot());
-		$l = $hierarchy->getLogger('dummy');
-		$this->loggerRoot->setParent($l);
-		$this->testIfParentIsNull();
+	
+	/**
+	 * @expectedException PHPUnit_Framework_Error
+	 * @expectedExceptionMessage log4php: Cannot set LoggerRoot level to null.
+	 */
+	public function testNullLevelWarning() {
+		$root = new LoggerRoot();
+		$root->setLevel(null);
 	}
-
 }