<?php 
 
/* 
 * This file is part of the PHPReboot/Stopwatch package. 
 * 
 * (c) Kapil Sharma <[email protected]> 
 * 
 * For the full copyright and license information, please view the LICENSE 
 * file that was distributed with this source code. 
 */ 
 
namespace Phpunit\Stopwatch; 
 
use phpDocumentor\Reflection\Types\This; 
use Phpreboot\Stopwatch\StopWatch; 
use Phpreboot\Stopwatch\Timer; 
 
/** 
 * Class StopWatchTest 
 * @package Phpunit\Stopwatch 
 * @group Phpreboot 
 * @group Phpreboot_Stopwatch 
 * @group Phpreboot_Stopwatch_StopWatch 
 */ 
class StopWatchTest extends \PHPUnit_Framework_TestCase 
{ 
    /** @var  StopWatch $stopWatch */ 
    private $stopWatch; 
 
    public function setUp() 
    { 
        $this->stopWatch = new StopWatch(); 
    } 
 
    public function tearDown() 
    { 
        $this->stopWatch = null; 
    } 
 
    /* ******************/ 
    /* Constructor test */ 
    /* ******************/ 
    /** 
     * @group Phpreboot_Stopwatch_StopWatch_constructor 
     */ 
    public function testStopWatchHaveDefaultWatch() 
    { 
        /** @var Timer $defaultWatch */ 
        $defaultWatch = $this->stopWatch->getWatch(); 
 
        $this->assertNotNull($defaultWatch, "No watch available"); 
        $this->assertInstanceOf('Phpreboot\Stopwatch\Timer', $defaultWatch, "Not an instance of Watch"); 
 
        $name = $defaultWatch->getName(); 
 
        $this->assertEquals(StopWatch::STOPWATCH_DEFAULT_NAME, $name, "Default name of StopWatch is not set correctly"); 
    } 
 
    /* ***************/ 
    /* addWatch Test */ 
    /* ***************/ 
    /** 
     * @group Phpreboot_Stopwatch_StopWatch_addWatch 
     */ 
    public function testWatchCanBeAdded() 
    { 
        $this->assertEquals(1, $this->stopWatch->getWatchCount(), "Stopwatch doesn't initialized with default watch."); 
 
        $this->stopWatch->addWatch('testWatch'); 
        $this->assertEquals(2, $this->stopWatch->getWatchCount(), "Stopwatch could not be added"); 
    } 
 
    /** 
     * @group Phpreboot_Stopwatch_StopWatch_addWatch 
     */ 
    public function testWatchCanNotBeAddedWithDuplicateName() 
    { 
        $this->assertEquals(1, $this->stopWatch->getWatchCount(), "Stopwatch doesn't initialized with default watch."); 
        $this->assertFalse($this->stopWatch->addWatch(StopWatch::STOPWATCH_DEFAULT_NAME), "Watch with default name was duplicated."); 
        $this->assertEquals(1, $this->stopWatch->getWatchCount(), "Watch with default name was duplicated."); 
 
        $this->assertTrue($this->stopWatch->addWatch('testWatch'), "New watch couldn't be added."); 
        $this->assertEquals(2, $this->stopWatch->getWatchCount(), "New watch couldn't be added."); 
        $this->assertFalse($this->stopWatch->addWatch('testWatch'), "New watch with duplicate name was added."); 
        $this->assertEquals(2, $this->stopWatch->getWatchCount(), "New watch with duplicate name was added."); 
    } 
 
    /** 
     * @group Phpreboot_Stopwatch_StopWatch_addWatches 
     */ 
    public function testMultipleWatchesCanBeAdded() 
    { 
        $this->assertEquals(1, $this->stopWatch->getWatchCount(), "Stopwatch doesn't initialized with default watch."); 
 
        $this->assertSame(array(true,true), 
            $this->stopWatch->addWatches(array('watch1', 'watch2')), 
            "addWatches returns false for two new watches."); 
        $this->assertEquals(3, $this->stopWatch->getWatchCount(), "Stopwatch doesn't initialized with default watch."); 
    } 
 
    /** 
     * @group Phpreboot_Stopwatch_StopWatch_addWatches 
     */ 
    public function testAddWatchesWithEmptyArrayReturnsFalse() 
    { 
        $this->assertSame(array(), $this->stopWatch->addWatches(array()), "addWatches with empty array returns true."); 
    } 
 
    /** 
     * @group Phpreboot_Stopwatch_StopWatch_addWatches 
     */ 
    public function testAddWatchesWithDuplicateNamesReturnsCorrectStatus() 
    { 
        $this->assertSame(array(true, false), 
            $this->stopWatch->addWatches(array('name', 'name')), 
            "addWatches with duplicate name do not returns correct message."); 
    } 
 
    /* ********************/ 
    /* getWatchCount Test */ 
    /* ********************/ 
    /** 
     * @group Phpreboot_Stopwatch_StopWatch_getWatchCount 
     */ 
    public function testWatchCountIsCorrect() 
    { 
        $totalWatch = $this->stopWatch->getWatchCount(); 
 
        $this->assertEquals(1, $totalWatch, "Watch count is not correct"); 
    } 
 
    /* ***************/ 
    /* getWatch Test */ 
    /* ***************/ 
    /** 
     * @group Phpreboot_Stopwatch_StopWatch_getWatch 
     */ 
    public function testDefaultWatchCouldBeReturned() 
    { 
        $watch = $this->stopWatch->getWatch(); 
        $this->assertInstanceOf('Phpreboot\Stopwatch\Timer', $watch, "Default watch is not an instance of Watch."); 
        $this->assertEquals(StopWatch::STOPWATCH_DEFAULT_NAME, $watch->getName(), "Name of default was was not correctly set."); 
    } 
 
    /** 
     * @group Phpreboot_Stopwatch_StopWatch_getWatch 
     */ 
    public function testWatchCouldBeReturned() 
    { 
        $this->stopWatch->addWatch('newWatch'); 
 
        $newWatch = $this->stopWatch->getWatch("newWatch"); 
        $this->assertInstanceOf('Phpreboot\Stopwatch\Timer', $newWatch, "New watch is not an instance of Watch."); 
    } 
 
    /** 
     * @group Phpreboot_Stopwatch_StopWatch_getWatch 
     * @expectedException \InvalidArgumentException 
     * @expectedExceptionMessage Watch NonExistingWatch does not exist. 
     */ 
    public function testGetWatchForNonExistingWatchThrowsException() 
    { 
        $this->stopWatch->getWatch('NonExistingWatch'); 
    } 
 
    /** 
     * @group Phpreboot_Stopwatch_StopWatch_isWatchExist 
     */ 
    public function testWatchExistenceCanBeChecked() 
    { 
        $this->assertFalse($this->stopWatch->isWatchExist('newWatch')); 
        $this->stopWatch->addWatch("newWatch"); 
        $this->assertTrue($this->stopWatch->isWatchExist('newWatch')); 
    } 
 
    /** 
     * @group Phpreboot_Stopwatch_StopWatch_start 
     */ 
    public function testStopWatchCanBeStarted() 
    { 
        $this->assertSame(Timer::STATE_NOT_STARTED, $this->stopWatch->getWatch()->getState(), "StopWatch timer state is not correct."); 
        $this->assertTrue($this->stopWatch->start(), "StopWatch could not be started"); 
        $this->assertSame(Timer::STATE_STARTED, $this->stopWatch->getWatch()->getState(), "StopWatch timer state is not correct after start."); 
    } 
 
    /** 
     * @group Phpreboot_Stopwatch_StopWatch_start 
     */ 
    public function testNonExistingStopWatchCanNotBeStarted() 
    { 
        $this->assertFalse($this->stopWatch->start('nonExistingWatch')); 
    } 
 
    /** 
     * @group Phpreboot_Stopwatch_StopWatch_pause 
     */ 
    public function testStopWatchCanBePaused() 
    { 
        $this->assertSame(Timer::STATE_NOT_STARTED, $this->stopWatch->getWatch()->getState(), "StopWatch timer state is not correct."); 
        $this->assertTrue($this->stopWatch->start(), "StopWatch could not be started"); 
        $this->assertSame(Timer::STATE_STARTED, $this->stopWatch->getWatch()->getState(), "StopWatch timer state is not correct after start."); 
        $this->assertTrue($this->stopWatch->pause(), "StopWatch could not be paused"); 
        $this->assertSame(Timer::STATE_PAUSED, $this->stopWatch->getWatch()->getState(), "StopWatch timer state is not correct after pause."); 
    } 
 
    /** 
     * @group Phpreboot_Stopwatch_StopWatch_pause 
     */ 
    public function testNonExistingStopWatchCanNotBePaused() 
    { 
        $this->assertFalse($this->stopWatch->pause('nonExistingWatch')); 
    } 
 
    /** 
     * @group Phpreboot_Stopwatch_StopWatch_stop 
     */ 
    public function testStopWatchCanBeStopped() 
    { 
        $this->assertSame(Timer::STATE_NOT_STARTED, $this->stopWatch->getWatch()->getState(), "StopWatch timer state is not correct."); 
        $this->assertTrue($this->stopWatch->start(), "StopWatch could not be started"); 
        $this->assertSame(Timer::STATE_STARTED, $this->stopWatch->getWatch()->getState(), "StopWatch timer state is not correct after start."); 
        $this->assertTrue($this->stopWatch->stop(), "StopWatch could not be stopped"); 
        $this->assertSame(Timer::STATE_STOPPED, $this->stopWatch->getWatch()->getState(), "StopWatch timer state is not correct after stop."); 
    } 
 
    /** 
     * @group Phpreboot_Stopwatch_StopWatch_stop 
     */ 
    public function testNonExistingStopWatchCanNotBeStopped() 
    { 
        $this->assertFalse($this->stopWatch->stop('nonExistingWatch')); 
    } 
}
 
 |