<?php

/*
 * @copyright NetMonsters <team@netmonsters.ru>
 * @link http://netmonsters.ru
 * @package Majestic
 * @subpackage UnitTests
 * @since 2011-10-..
 * 
 * Unit tests for Load class
 */

require dirname(__FILE__) . '/../Load.php';

class LoadTest extends PHPUnit_Framework_TestCase
{

    private static $inc_dirs = array();
    private static $file;

    /**
     * @TODO: Load->buildAutoload() should recieve AutoloadBuilder as a parameter
     * @TODO: Load->buildAutoload() - uses two paths - PATH . '/' . APP . '/src' and PATH . '/lib' those are not checked. Can couse error.
     * @expectedException UnexpectedValueException
     * @expectedException PHPUnit_Framework_Error
     */
    public static function setUpBeforeClass()
    {
        if (!defined('PATH')) {
            define('PATH', realpath(dirname(__FILE__) . '/../../..'));
        }

// default application name
        if (!defined('APP')) {
            define('APP', 'lib/core/tests/face');
        }

        self::$file = PATH . '/' . APP . '/cache/autoload.php';

        // value - if dir exists (to delete it if it was created), default true
        self::$inc_dirs[PATH . '/' . APP . '/src'] = true;
        self::$inc_dirs[PATH . '/' . APP . '/cache'] = true;
        self::$inc_dirs[PATH . '/lib'] = true;

        foreach (self::$inc_dirs as $dir => &$is_exist) {
            if (!file_exists($dir)) {
                $is_exist = false;
                mkdir($dir, 0777, true);
            }
        }
    }

    public function testSetAutoLoadFrom()
    {
        // autoload
        Load::setAutoloadFrom(self::$file);

        $autoload = require(self::$file);
        $this->assertNotEmpty($autoload);
        Load::autoload('Action');
    }
    
    /**
     * @TODO: Load::autoload() needs self::$autoload = require(self::$file); after self::buildAutoload();
     */
    public function testDebugAutoload()
    {
        Load::setAutoloadFrom(self::$file);

        $autoload = require(self::$file);
        $this->assertNotEmpty($autoload);
        
        define('DEBUG', true);
        Load::autoload('Func');
        Load::autoload('Captcha');        
    }

    public function testAutoloadArrayExists()
    {
        $this->assertFileExists(self::$file);
    }

    /**
     * @TODO: Load - check if input file returns array
     */
    public function testFileForArray()
    {
        $autoload = require(self::$file);
        $this->assertInternalType('array', $autoload);
    }

    public function testAutoloadArrayNotEmpty()
    {
        $autoload = require(self::$file);
        $this->assertNotEmpty($autoload);
        $this->assertArrayHasKey('Action', $autoload);
    }

    public function testAutoloadGetFilePath()
    {
        $autoload = require(self::$file);
        $this->assertNotEmpty(Load::getFilePath('Registry'));
    }

    /**
     * @TODO: Load::getFilePath - check for wrong index
     * @expectedException PHPUnit_Framework_Error
     */
    public function testAutoloadGetFilePathNullIndex()
    {
        $autoload = require(self::$file);
        $this->assertNotEmpty(Load::getFilePath('anton'));
    }

    public static function tearDownAfterClass()
    {
        if (file_exists(self::$file)) {
            unlink(self::$file);
        }

        foreach (self::$inc_dirs as $dir => $is_exist) {
            if (!$is_exist) {
                rmdir($dir);
            }
        }
        rmdir(PATH . '/' . APP);
    }

}