<?php

return [

    /*
    |--------------------------------------------------------------------------
    | Application Environment
    |--------------------------------------------------------------------------
    |
    | This value determines the "environment" your application is currently
    | running in. This may determine how you prefer to configure various
    | services your application utilizes. Set this in your ".env" file.
    |
    */

    'env' => env('APP_ENV', 'production'),

    /*
    |--------------------------------------------------------------------------
    | Application Debug Mode
    |--------------------------------------------------------------------------
    |
    | When your application is in debug mode, detailed error messages with
    | stack traces will be shown on every error that occurs within your
    | application. If disabled, a simple generic error page is shown.
    |
    */

    'debug' => env('APP_DEBUG', true),

    /*
    |--------------------------------------------------------------------------
    | Application URL
    |--------------------------------------------------------------------------
    |
    | This URL is used by the console to properly generate URLs when using
    | the Artisan command line tool. You should set this to the root of
    | your application so that it is used when running Artisan tasks.
    |
    */

    'url' => env('APP_URL', 'http://localhost'),

    /*
    |--------------------------------------------------------------------------
    | Application Timezone
    |--------------------------------------------------------------------------
    |
    | Here you may specify the default timezone for your application, which
    | will be used by the PHP date and date-time functions. We have gone
    | ahead and set this to a sensible default for you out of the box.
    |
    */

    'timezone' => 'UTC',

    /*
    |--------------------------------------------------------------------------
    | Application Locale Configuration
    |--------------------------------------------------------------------------
    |
    | The application locale determines the default locale that will be used
    | by the translation service provider. You are free to set this value
    | to any of the locales which will be supported by the application.
    |
    */

    'locale' => 'en',

    /*
    |--------------------------------------------------------------------------
    | Application Fallback Locale
    |--------------------------------------------------------------------------
    |
    | The fallback locale determines the locale to use when the current one
    | is not available. You may change the value to correspond to any of
    | the language folders that are provided through your application.
    |
    */

    'fallback_locale' => 'en',

    /*
    |--------------------------------------------------------------------------
    | Encryption Key
    |--------------------------------------------------------------------------
    |
    | This key is used by the Illuminate encrypter service and should be set
    | to a random, 32 character string, otherwise these encrypted strings
    | will not be safe. Please do this before deploying an application!
    |
    */

    'key' => env('APP_KEY'),

    'cipher' => 'AES-256-CBC',

    /*
    |--------------------------------------------------------------------------
    | Logging Configuration
    |--------------------------------------------------------------------------
    |
    | Here you may configure the log settings for your application. Out of
    | the box, Laravel uses the Monolog PHP logging library. This gives
    | you a variety of powerful log handlers / formatters to utilize.
    |
    | Available Settings: "single", "daily", "syslog", "errorlog"
    |
    */

    'log' => env('APP_LOG', 'daily'),

    /*
    |--------------------------------------------------------------------------
    | Autoloaded Service Providers
    |--------------------------------------------------------------------------
    |
    | The service providers listed here will be automatically loaded on the
    | request to your application. Feel free to add your own services to
    | this array to grant expanded functionality to your applications.
    |
    */

    'providers' => [

        /*
         * Laravel Framework Service Providers...
         */
        Illuminate\Auth\AuthServiceProvider::class,
        Illuminate\Broadcasting\BroadcastServiceProvider::class,
        Illuminate\Bus\BusServiceProvider::class,
        Illuminate\Cache\CacheServiceProvider::class,
        Illuminate\Foundation\Providers\ConsoleSupportServiceProvider::class,
        Illuminate\Cookie\CookieServiceProvider::class,
        Illuminate\Database\DatabaseServiceProvider::class,
        Illuminate\Encryption\EncryptionServiceProvider::class,
        Illuminate\Filesystem\FilesystemServiceProvider::class,
        Illuminate\Foundation\Providers\FoundationServiceProvider::class,
        Illuminate\Hashing\HashServiceProvider::class,
        Illuminate\Mail\MailServiceProvider::class,
        Illuminate\Pagination\PaginationServiceProvider::class,
        Illuminate\Pipeline\PipelineServiceProvider::class,
        Illuminate\Queue\QueueServiceProvider::class,
        Illuminate\Redis\RedisServiceProvider::class,
        Illuminate\Auth\Passwords\PasswordResetServiceProvider::class,
        Illuminate\Session\SessionServiceProvider::class,
        Illuminate\Translation\TranslationServiceProvider::class,
        Illuminate\Validation\ValidationServiceProvider::class,
        Illuminate\View\ViewServiceProvider::class,

        /*
         * Application Service Providers...
         */
        App\Providers\AppServiceProvider::class,
        App\Providers\AuthServiceProvider::class,
        App\Providers\EventServiceProvider::class,
        App\Providers\RouteServiceProvider::class,

        /*
         * Entrust Service Provider
         */
        Zizaco\Entrust\EntrustServiceProvider::class,

        /*
         * LaravelCollective Html Form & Html
         */
        Collective\Html\HtmlServiceProvider::class,
        Laravel\Socialite\SocialiteServiceProvider::class,
    ],

    /*
    |--------------------------------------------------------------------------
    | Class Aliases
    |--------------------------------------------------------------------------
    |
    | This array of class aliases will be registered when this application
    | is started. However, feel free to register as many as you wish as
    | the aliases are "lazy" loaded so they don't hinder performance.
    |
    */

    'aliases' => [

        'App' => Illuminate\Support\Facades\App::class,
        'Artisan' => Illuminate\Support\Facades\Artisan::class,
        'Auth' => Illuminate\Support\Facades\Auth::class,
        'Blade' => Illuminate\Support\Facades\Blade::class,
        'Cache' => Illuminate\Support\Facades\Cache::class,
        'Config' => Illuminate\Support\Facades\Config::class,
        'Cookie' => Illuminate\Support\Facades\Cookie::class,
        'Crypt' => Illuminate\Support\Facades\Crypt::class,
        'DB' => Illuminate\Support\Facades\DB::class,
        'Eloquent' => Illuminate\Database\Eloquent\Model::class,
        'Event' => Illuminate\Support\Facades\Event::class,
        'File' => Illuminate\Support\Facades\File::class,
        'Gate' => Illuminate\Support\Facades\Gate::class,
        'Hash' => Illuminate\Support\Facades\Hash::class,
        'Lang' => Illuminate\Support\Facades\Lang::class,
        'Log' => Illuminate\Support\Facades\Log::class,
        'Mail' => Illuminate\Support\Facades\Mail::class,
        'Password' => Illuminate\Support\Facades\Password::class,
        'Queue' => Illuminate\Support\Facades\Queue::class,
        'Redirect' => Illuminate\Support\Facades\Redirect::class,
        'Redis' => Illuminate\Support\Facades\Redis::class,
        'Request' => Illuminate\Support\Facades\Request::class,
        'Response' => Illuminate\Support\Facades\Response::class,
        'Route' => Illuminate\Support\Facades\Route::class,
        'Schema' => Illuminate\Support\Facades\Schema::class,
        'Session' => Illuminate\Support\Facades\Session::class,
        'Storage' => Illuminate\Support\Facades\Storage::class,
        'URL' => Illuminate\Support\Facades\URL::class,
        'Validator' => Illuminate\Support\Facades\Validator::class,
        'View' => Illuminate\Support\Facades\View::class,

        /*
         * Entrust alias
         */
        'Entrust'   => Zizaco\Entrust\EntrustFacade::class,

        /*
         * LaravelCollective Html Form & Html
         */
        'Form'      => Collective\Html\FormFacade::class,
        'Html'      => Collective\Html\HtmlFacade::class,

        'Socialite' => Laravel\Socialite\Facades\Socialite::class,

    ],
];


<?php

App::uses('ShellDispatcher', 'Console');
App::uses('TestShell', 'Console/Command');

/**
 * TestTestShell
 *
 * @package       Cake.Test.Case.Console.Command
 */
class TestTestShell extends TestShell {

	public function mapFileToCase($file, $category, $throwOnMissingFile = true) {
		return $this->_mapFileToCase($file, $category, $throwOnMissingFile);
	}

	public function mapFileToCategory($file) {
		return $this->_mapFileToCategory($file);
	}

}

/**
 * TestShellTest
 *
 * @package       Cake.Test.Case.Console.Command
 */
class TestShellTest extends CakeTestCase {

/**
 * setUp test case
 *
 * @return void
 */
	public function setUp() {
		parent::setUp();
		$out = $this->getMock('ConsoleOutput', array(), array(), '', false);
		$in = $this->getMock('ConsoleInput', array(), array(), '', false);

		$this->Shell = $this->getMock(
			'TestTestShell',
			array('in', 'out', 'hr', 'help', 'error', 'err', '_stop', 'initialize', '_run', 'clear'),
			array($out, $out, $in)
		);
		$this->Shell->OptionParser = $this->getMock('ConsoleOptionParser', array(), array(null, false));
	}

/**
 * tearDown method
 *
 * @return void
 */
	public function tearDown() {
		parent::tearDown();
		unset($this->Dispatch, $this->Shell);
	}

/**
 * testMapCoreFileToCategory
 *
 * @return void
 */
	public function testMapCoreFileToCategory() {
		$this->Shell->startup();

		$return = $this->Shell->mapFileToCategory('lib/Cake/basics.php');
		$this->assertSame('core', $return);

		$return = $this->Shell->mapFileToCategory('lib/Cake/Core/App.php');
		$this->assertSame('core', $return);

		$return = $this->Shell->mapFileToCategory('lib/Cake/Some/Deeply/Nested/Structure.php');
		$this->assertSame('core', $return);
	}

/**
 * testMapCoreFileToCase
 *
 * basics.php is a slightly special case - it's the only file in the core with a test that isn't Capitalized
 *
 * @return void
 */
	public function testMapCoreFileToCase() {
		$this->Shell->startup();

		$return = $this->Shell->mapFileToCase('lib/Cake/basics.php', 'core');
		$this->assertSame('Basics', $return);

		$return = $this->Shell->mapFileToCase('lib/Cake/Core/App.php', 'core');
		$this->assertSame('Core/App', $return);

		$return = $this->Shell->mapFileToCase('lib/Cake/Some/Deeply/Nested/Structure.php', 'core', false);
		$this->assertSame('Some/Deeply/Nested/Structure', $return);
	}

/**
 * testMapAppFileToCategory
 *
 * @return void
 */
	public function testMapAppFileToCategory() {
		$this->Shell->startup();

		$return = $this->Shell->mapFileToCategory(APP . 'Controller/ExampleController.php');
		$this->assertSame('app', $return);

		$return = $this->Shell->mapFileToCategory(APP . 'My/File/Is/Here.php');
		$this->assertSame('app', $return);
	}

/**
 * testMapAppFileToCase
 *
 * @return void
 */
	public function testMapAppFileToCase() {
		$this->Shell->startup();

		$return = $this->Shell->mapFileToCase(APP . 'Controller/ExampleController.php', 'app', false);
		$this->assertSame('Controller/ExampleController', $return);

		$return = $this->Shell->mapFileToCase(APP . 'My/File/Is/Here.php', 'app', false);
		$this->assertSame('My/File/Is/Here', $return);
	}

/**
 * testMapPluginFileToCategory
 *
 * @return void
 */
	public function testMapPluginFileToCategory() {
		$this->Shell->startup();

		$return = $this->Shell->mapFileToCategory(APP . 'Plugin/awesome/Controller/ExampleController.php');
		$this->assertSame('awesome', $return);

		$return = $this->Shell->mapFileToCategory(dirname(CAKE) . 'plugins/awesome/Controller/ExampleController.php');
		$this->assertSame('awesome', $return);
	}

/**
 * testMapPluginFileToCase
 *
 * @return void
 */
	public function testMapPluginFileToCase() {
		$this->Shell->startup();

		$return = $this->Shell->mapFileToCase(APP . 'Plugin/awesome/Controller/ExampleController.php', 'awesome', false);
		$this->assertSame('Controller/ExampleController', $return);

		$return = $this->Shell->mapFileToCase(dirname(CAKE) . 'plugins/awesome/Controller/ExampleController.php', 'awesome', false);
		$this->assertSame('Controller/ExampleController', $return);
	}

/**
 * testMapCoreTestToCategory
 *
 * @return void
 */
	public function testMapCoreTestToCategory() {
		$this->Shell->startup();

		$return = $this->Shell->mapFileToCategory('lib/Cake/Test/Case/BasicsTest.php');
		$this->assertSame('core', $return);

		$return = $this->Shell->mapFileToCategory('lib/Cake/Test/Case/BasicsTest.php');
		$this->assertSame('core', $return);

		$return = $this->Shell->mapFileToCategory('lib/Cake/Test/Case/Some/Deeply/Nested/StructureTest.php');
		$this->assertSame('core', $return);
	}

/**
 * testMapCoreTestToCase
 *
 * basics.php is a slightly special case - it's the only file in the core with a test that isn't Capitalized
 *
 * @return void
 */
	public function testMapCoreTestToCase() {
		$this->Shell->startup();

		$return = $this->Shell->mapFileToCase('lib/Cake/Test/Case/BasicsTest.php', 'core');
		$this->assertSame('Basics', $return);

		$return = $this->Shell->mapFileToCase('lib/Cake/Test/Case/Core/AppTest.php', 'core');
		$this->assertSame('Core/App', $return);

		$return = $this->Shell->mapFileToCase('lib/Cake/Test/Case/Some/Deeply/Nested/StructureTest.php', 'core', false);
		$this->assertSame('Some/Deeply/Nested/Structure', $return);
	}

/**
 * testMapAppTestToCategory
 *
 * @return void
 */
	public function testMapAppTestToCategory() {
		$this->Shell->startup();

		$return = $this->Shell->mapFileToCategory(APP . 'Test/Case/Controller/ExampleControllerTest.php');
		$this->assertSame('app', $return);

		$return = $this->Shell->mapFileToCategory(APP . 'Test/Case/My/File/Is/HereTest.php');
		$this->assertSame('app', $return);
	}

/**
 * testMapAppTestToCase
 *
 * @return void
 */
	public function testMapAppTestToCase() {
		$this->Shell->startup();

		$return = $this->Shell->mapFileToCase(APP . 'Test/Case/Controller/ExampleControllerTest.php', 'app', false);
		$this->assertSame('Controller/ExampleController', $return);

		$return = $this->Shell->mapFileToCase(APP . 'Test/Case/My/File/Is/HereTest.php', 'app', false);
		$this->assertSame('My/File/Is/Here', $return);
	}

/**
 * testMapPluginTestToCategory
 *
 * @return void
 */
	public function testMapPluginTestToCategory() {
		$this->Shell->startup();

		$return = $this->Shell->mapFileToCategory(APP . 'Plugin/awesome/Test/Case/Controller/ExampleControllerTest.php');
		$this->assertSame('awesome', $return);

		$return = $this->Shell->mapFileToCategory(dirname(CAKE) . 'plugins/awesome/Test/Case/Controller/ExampleControllerTest.php');
		$this->assertSame('awesome', $return);
	}

/**
 * testMapPluginTestToCase
 *
 * @return void
 */
	public function testMapPluginTestToCase() {
		$this->Shell->startup();

		$return = $this->Shell->mapFileToCase(APP . 'Plugin/awesome/Test/Case/Controller/ExampleControllerTest.php', 'awesome', false);
		$this->assertSame('Controller/ExampleController', $return);

		$return = $this->Shell->mapFileToCase(dirname(CAKE) . 'plugins/awesome/Test/Case/Controller/ExampleControllerTest.php', 'awesome', false);
		$this->assertSame('Controller/ExampleController', $return);
	}

/**
 * testMapNotTestToNothing
 *
 * @return void
 */
	public function testMapNotTestToNothing() {
		$this->Shell->startup();

		$return = $this->Shell->mapFileToCategory(APP . 'Test/Case/NotATestFile.php');
		$this->assertSame('app', $return);

		$return = $this->Shell->mapFileToCase(APP . 'Test/Case/NotATestFile.php', false, false);
		$this->assertFalse($return);

		$return = $this->Shell->mapFileToCategory(APP . 'Test/Fixture/SomeTest.php');
		$this->assertSame('app', $return);

		$return = $this->Shell->mapFileToCase(APP . 'Test/Fixture/SomeTest.php', false, false);
		$this->assertFalse($return);
	}

/**
 * test available list of test cases for an empty category
 *
 * @return void
 */
	public function testAvailableWithEmptyList() {
		$this->Shell->startup();
		$this->Shell->args = array('unexistant-category');
		$this->Shell->expects($this->at(0))->method('out')->with(__d('cake_console', "No test cases available \n\n"));
		$this->Shell->OptionParser->expects($this->once())->method('help');
		$this->Shell->available();
	}

/**
 * test available list of test cases for core category
 *
 * @return void
 */
	public function testAvailableCoreCategory() {
		$this->Shell->startup();
		$this->Shell->args = array('core');
		$this->Shell->expects($this->at(0))->method('out')->with('Core Test Cases:');
		$this->Shell->expects($this->at(1))->method('out')
			->with($this->stringContains('[1]'));
		$this->Shell->expects($this->at(2))->method('out')
			->with($this->stringContains('[2]'));

		$this->Shell->expects($this->once())->method('in')
			->with(__d('cake_console', 'What test case would you like to run?'), null, 'q')
			->will($this->returnValue('1'));

		$this->Shell->expects($this->once())->method('_run');
		$this->Shell->available();
		$this->assertEquals(array('core', 'AllBehaviors'), $this->Shell->args);
	}

/**
 * Tests that correct option for test runner are passed
 *
 * @return void
 */
	public function testRunnerOptions() {
		$this->Shell->startup();
		$this->Shell->args = array('core', 'Basics');
		$this->Shell->params = array('filter' => 'myFilter', 'colors' => true, 'verbose' => true);

		$this->Shell->expects($this->once())->method('_run')
			->with(
				array('app' => false, 'plugin' => null, 'core' => true, 'output' => 'text', 'case' => 'Basics'),
				array('--filter', 'myFilter', '--colors', '--verbose')
			);
		$this->Shell->main();
	}

/**
 * Tests that the 'quiet' parameter gets swallowed before calling PHPUnit
 *
 * @return void
 */
	public function testRunnerOptionsQuiet() {
		$this->Shell->startup();
		$this->Shell->args = array('core', 'Basics');
		$this->Shell->params = array('quiet' => true);

		$this->Shell->expects($this->once())->method('_run')
			->with(
				array('app' => false, 'plugin' => null, 'core' => true, 'output' => 'text', 'case' => 'Basics'),
				array('--colors')
			);
		$this->Shell->main();
	}

/**
 * Tests that the '--directive' parameter change to '-d' before calling PHPUnit
 *
 * @return void
 */
	public function testRunnerOptionsDirective() {
		$this->Shell->startup();
		$this->Shell->args = array('core', 'Basics');
		$this->Shell->params = array('directive' => 'memory_limit=128M');

		$this->Shell->expects($this->once())->method('_run')
			->with(
				array('app' => false, 'plugin' => null, 'core' => true, 'output' => 'text', 'case' => 'Basics'),
				array('-d', 'memory_limit=128M', '--colors')
			);
		$this->Shell->main();
	}
}


<?php
/**
 * EventManager.php
 * 2013 Petr Dvorak, petr-dvorak.cz / 15.4.13 20:21
 */

namespace ITILSimulator\Runtime\Events;

use ITILSimulator\Runtime\Training\ActiveConfigurationItem;

/**
 * EventManager for publishing and subscribing to events of various types.
 * Events are fired by workflow or UI.
 * @package ITILSimulator\Runtime\Events
 */
class EventManager
{
	/**
	 * Event channel listeners
	 * @var array
	 */
	protected $listeners = array('*' => array());

	/**
	 * IO channel listeners
	 * @var array
	 */
	protected $ioListeners = array();

	#region "Event channel"

	/**
	 * Dispatch new event through Event channel
	 * @param $eventName
	 * @param Event $event
	 */
	public function dispatch($eventName, Event $event) {
		$listeners = $this->listeners['*'];

		if (array_key_exists($eventName, $this->listeners)) {
			$listeners = array_merge($listeners, $this->listeners[$eventName]);
		}

		if (!$listeners)
			return;

		$event->setName($eventName);

		foreach ($listeners as $listener) {
			call_user_func($listener, $event);

			if ($event->isPropagationStopped()) {
				break;
			}
		}
	}

	/**
	 * Add new listener to Event channel
	 * @param $eventName
	 * @param $callback
	 */
	public function addListener($eventName, $callback) {
		$eventName = (string) $eventName;
		if (!array_key_exists($eventName, $this->listeners))
			$this->listeners[$eventName] = array();

		$this->listeners[$eventName][] = $callback;
	}

	#endregion

	#region "IO channel"

	/**
	 * Dispatch event through IO channel
	 * @param $ioId
	 */
	public function dispatchIO($ioId) {
		if (!isset($this->ioListeners[$ioId]))
			return;

		foreach($this->ioListeners[$ioId] as $item) {
			/** @var $item ActiveConfigurationItem */
			$item->receiveInput($ioId);
		}
	}

	/**
	 * Add new listener to IO channel
	 * @param $ioId
	 * @param ActiveConfigurationItem $item
	 */
	public function addIOListener($ioId, ActiveConfigurationItem $item) {
		if (!isset($this->ioListeners[$ioId]))
			$this->ioListeners[$ioId] = array();

		$this->ioListeners[$ioId][] = $item;
	}

	#endregion
}