<?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.
 *
 * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0
 * @version //autogentag//
 * @filesource
 * @package EventLog
 * @subpackage Tests
 */

/**
 * @package EventLog
 * @subpackage Tests
 */
class ezcLogMessageTest extends ezcTestCase
{
    protected $tm;
    
    public static function suite()
    {
        return new PHPUnit_Framework_TestSuite("ezcLogMessageTest");
    }

    protected function setUp()
    {
        $this->tm = new TestMessages();
    }

    public function testObjectMother()
    {
        $this->assertEquals( "[Laverne, Female] This is all your fault Bernard.", $this->tm->getMessage(0, true, true) );
        $this->assertEquals( "[Female] This is all your fault Bernard.", $this->tm->getMessage(0, false, true) );
        $this->assertEquals( "[Laverne] This is all your fault Bernard.", $this->tm->getMessage(0, true, false) );
        $this->assertEquals( "This is all your fault Bernard.", $this->tm->getMessage(0, false, false) );
    }
    

    public function testMessageOnly()
    {
        $msg = new ezcLogMessage($this->tm->getMessage(0, false, false), E_USER_WARNING, false, false );

        $this->assertEquals( "This is all your fault Bernard.", $msg->message );
        $this->assertFalse( $msg->category, "Category should be false" );
        $this->assertFalse( $msg->source, "Source should be false" );
    }

    public function testCategory()
    {
        $msg = new ezcLogMessage($this->tm->getMessage(0, false, true), E_USER_WARNING, false, false );

        $this->assertEquals( "This is all your fault Bernard.", $msg->message );
        $this->assertEquals( "Female", $msg->category );
        $this->assertFalse( $msg->source, "Source should be false" );
    }

    public function testSourceAndCategory()
    {
        $msg = new ezcLogMessage($this->tm->getMessage(0, true, true), E_USER_WARNING, false, false );

        $this->assertEquals( "This is all your fault Bernard.", $msg->message );
        $this->assertEquals( "Laverne", $msg->source );
        $this->assertEquals( "Female", $msg->category );
    }

    public function testManyMessages()
    {
        $msg = new ezcLogMessage($this->tm->getMessage(1, true, true), E_USER_WARNING, false, false );

        $this->assertEquals( "Behold, children! The Chron-O-John!", $msg->message );
        $this->assertEquals( "Dr. Fred", $msg->source );
        $this->assertEquals( "Male", $msg->category );

        $msg = new ezcLogMessage($this->tm->getMessage(2, false, true), E_USER_WARNING, false, false );
        $this->assertEquals( "Doc, can't you just send Bernard?", $msg->message );
        $this->assertFalse( $msg->source, "No source expected" );
        $this->assertEquals( "Male", $msg->category );
    }

    public function testSeverities()
    {
        $msg = new ezcLogMessage($this->tm->getMessage(1, true, true), E_USER_WARNING, false, false );
        $this->assertEquals( ezcLog::WARNING, $msg->severity );

        $msg = new ezcLogMessage($this->tm->getMessage(1, true, true), E_USER_ERROR, false, false );
        $this->assertEquals( ezcLog::ERROR, $msg->severity );

        $msg = new ezcLogMessage($this->tm->getMessage(1, true, true), E_USER_NOTICE, false, false );
        $this->assertEquals( ezcLog::NOTICE, $msg->severity );
    }

    public function testProperties()
    {
        $msg = new ezcLogMessage( $this->tm->getMessage( 1, true, true ), E_USER_WARNING, false, false );
        try
        {
            $val = $msg->no_such_property;
            $this->fail( "Expected exception was not thrown" );
        }
        catch ( ezcBasePropertyNotFoundException $e )
        {
            $this->assertEquals( "No such property name 'no_such_property'.", $e->getMessage() );
        }
        try
        {
            $msg->no_such_property = "xxx";
            $this->fail( "Expected exception was not thrown" );
        }
        catch ( ezcBasePropertyNotFoundException $e )
        {
            $this->assertEquals( "No such property name 'no_such_property'.", $e->getMessage() );
        }
        $msg = new ezcLogMessage( $this->tm->getMessage( 1, true, true ), false, false, false );
        $this->assertEquals( false, $msg->severity );
    }

    public function testIsSet()
    {
        $msg = new ezcLogMessage( $this->tm->getMessage( 1, true, true ), E_USER_WARNING, false, false );
        $this->assertEquals( true, isset( $msg->message ) );
        $this->assertEquals( true, isset( $msg->source ) );
        $this->assertEquals( true, isset( $msg->category ) );
        $this->assertEquals( true, isset( $msg->severity ) );
        $this->assertEquals( false, isset( $msg->no_such_property ) );
    }

    // See issue #12907
    public function testSeverityEncapsulation()
    {
        $msg = new ezcLogMessage( '[my source, my category, debug ] James broke another component!', E_USER_NOTICE, false, false );
        $this->assertEquals( 'my source', $msg->source, 'Source should match the passed value' );
        $this->assertEquals( 'my category', $msg->category, 'Category should match the passed value' );
        $this->assertEquals( 'James broke another component!', $msg->message, 'Message should match the passed value' );
        $this->assertEquals( ezcLog::DEBUG, $msg->severity );
    }

    // See issue #12907
    public function testWrongSeverityEncapsulation()
    {
        try
        {
            $msg = new ezcLogMessage( '[my source, my category, unknown ] James broke another component!', E_USER_NOTICE, false, false );
            self::fail( "Expected exception not thrown." );
        }
        catch ( ezcLogWrongSeverityException $e )
        {
            self::assertEquals( "There is no severity named 'unknown'.", $e->getMessage() );
        }
    }

    public function testParseWithSpaces()
    {
        $msg = new ezcLogMessage( '[ my source, my category, debug ] James broke another component!', E_USER_NOTICE, false, false );
        $this->assertEquals( 'my source', $msg->source, 'Source should match the passed value' );

        $msg = new ezcLogMessage( '[ my source, my category, debug] James broke another component!', E_USER_NOTICE, false, false );
        $this->assertEquals( ezcLog::DEBUG, $msg->severity );
    }
}

class TestMessages
{
    /**
     * This method makes it easy to change the messages in the future. (Instead of changing every test.) 
     */
    public function getMessage($number = 0, $source = false, $category = false)
    {
        $msg = "";

        if ($source || $category)
        {
            $msg .= "[";

            if ( $source )               $msg .= $this->getSource($number);
            if ( $source && $category )  $msg .= ", ";
            if ( $category )             $msg .= $this->getCategory($number);

            $msg .= "] ";
        }
        
        switch ($number)
        {
            case 0: $msg .= "This is all your fault Bernard."; break;
            case 1: $msg .= "Behold, children! The Chron-O-John!"; break;
            case 2: $msg .= "Doc, can't you just send Bernard?"; break;
            case 3: $msg .= "No, you must all go to increase the odds that one of you will make it there alive."; break;
            case 4: $msg .= "Has any people even been hurt in this thing?"; break;
            case 5: $msg .= "Of course not! This is the first time, I never tried it on people."; break;
        }

        return $msg;
    }

    public function getSource($number)
    {
        switch ($number)
        {
            case 0: return "Laverne";
            case 1: return "Dr. Fred";
            case 2: return "Hoagie";
            case 3: return "Dr. Fred";
            case 4: return "Bernard";
            case 5: return "Dr. Fred";
        }
    }

    public function getCategory($number)
    {
        switch ($number)
        {
            case 0: return "Female";
            case 1: return "Male";
            case 2: return "Male";
            case 3: return "Male";
            case 4: return "Male";
            case 5: return "Male";
        }
    }
    
}
?>
