tims-todo/application/third_party/CIUnit/libraries/CIUnit.php

256 lines
6.1 KiB
PHP
Executable File

<?php
/*
* fooStack, CIUnit for CodeIgniter
* Copyright (c) 2008-2009 Clemens Gruenberger
* Released under the MIT license, see:
* http://www.opensource.org/licenses/mit-license.php
*/
//load Testing
require_once CIUPATH . 'libraries/CIUnitTestCase.php';
/**
* CIUnit Class
* guides CI to behave nicely during tests..
*
* during the tests you can use:
*
* in setUp function:
* $this->CI = set_controller('controller_to_test');
* to set a different CI controller active
*
* use your controller functions simply like:
* $this->CI->function();
*
* created browser output is accessible like so
* $output = output();
* this function yields only once and is then reset to an empty string
*
* template vars like so:
* $vars = viewvars();
* they are also reset after this call
*/
class CIUnit {
private static $instance;
public static $controller;
public static $current;
public static $controllers = array();
public static $spyc;
public static $fixture;
/**
* If this class is suppose to be a Singleton shouldn't the constructor be private?
* Correct me if I am wrong but this doesn't prevent multiple instances of this class.
*/
public function __construct()
{
self::$instance =& $this;
}
public function &get_CIU()
{
return self::$instance;
}
public static function &set_controller($controller = 'CI_Controller', $path = FALSE)
{
$controller_name = array_pop(explode('/', $controller));
//echo "\nc name ".$controller_name;
//is it the current controller?
if ($controller_name == self::$current)
{
//we have nothing to do, return current controller
//echo "current found!"; die();
output();
viewvars();
return self::$controller;
}
// the current controller must be archieved before littered
$loader = load_class('Loader', 'core');
// reset all loaded data
$loader->reset();
//echo 'Var Dump of self::$controllers -- ';
//var_dump(self::$controllers);
/*
=========================================================
I don't understand this section of code.
self::$controllers[self::$current] is never set when testing
models. Maybe it will be set when testing controllers?
=========================================================
if (isset(self::$controllers[self::$current]))
{
self::$controllers[self::$current]['models'] = $loader->_ci_models;
//this might be an update if it was there before
// FIXME, all additional properties of the loader / controllers
// that have to be reset must go in some test config file..
//'components' => $loader->_ci_components,
//'classes' => $loader->_ci_classes
}
===================================================
I don't understand why this code is clearing out
all the loaded components such as autoloaded models
-- this is very frustrating
==================================================
//clean up the current controllers mess
//reset models
$loader->_ci_models = array();
//reset components
//$loader->_ci_components = array();
//reset saved queries
self::$controller->db->queries = array();
*/
//clean output / viewvars as well;
if (isset(self::$controller->output))
{
output();
viewvars();
}
//the requested controller was loaded before?
if (isset(self::$controllers[$controller_name]))
{
//echo "saved found! $controller_name";
//load it
$old =& self::$controllers[$controller_name];
self::$controller =& $old['address'];
self::$current = $controller_name;
//$loader->_ci_models = $old['models'];
//$loader->_ci_components = $old['components'];
//$loader->_ci_classes = &$old['classes'];
}
else
{
//echo "load new $controller_name";
//it was not loaded before
if ( ! class_exists($controller_name))
{
if ($path && file_exists($path . $controller . EXT))
{
include_once($path . $controller . EXT);
}
else
{
include_once(APPPATH . 'controllers/' . $controller . EXT);
}
}
self::$current = $controller_name;
self::$controllers[$controller_name] = array(
'address' => new $controller_name(),
'models' => array()
);
self::$controller =& self::$controllers[$controller_name]['address'];
}
// var_dump(self::$controllers); die();
// var_dump(self::$controller); die();
//CI_Base::$instance = &self::$controller; //so get_instance() provides the correct controller
return self::$controller;
}
public static function &get_controller()
{
return self::$controller;
}
/**
* get filenames eg for running test suites
* $path is relative
*/
public static function files($pattern, $path = ".", $addpath = FALSE)
{
// Swap directory separators to Unix style for consistency
$path = str_replace("\\", "/", $path);
if (substr($path, -1) !== "/")
{
$path .= "/";
}
$dir_handle = @opendir($path) or die("Unable to open $path");
$outarr = array();
while ( false != ($file = readdir($dir_handle)) )
{
if (preg_match($pattern, $file))
{
if ($addpath)
{
$file = $path . $file;
}
$outarr[] = $file;
}
}
//could also use preg_grep!
closedir($dir_handle);
return $outarr;
}
}
//=== convenience functions ===
// instead of referring to CIUnit directly
/**
* retrieves current CIUnit Class Singleton
*/
function &get_CIU()
{
return CIUnit::get_CIU();
}
/**
* sets CI controller
*/
function &set_controller($controller = 'CI_Controller', $path = FALSE)
{
return CIUnit::set_controller($controller, $path);
}
/**
* retrieves current CI controller from CIUnit
*/
function &get_controller()
{
return CIUnit::get_controller();
}
/**
* retrieves the cached output from the output class
* and resets it
*/
function output()
{
return CIUnit::$controller->output->pop_output();
}
/**
* retrieves the cached template vars from the loader class (stored here for assignment to views)
* and resets them
*/
function viewvars()
{
if( isset(CIUnit::$controller->load->_ci_cached_vars) )
{
$out = CIUnit::$controller->load->_ci_cached_vars;
CIUnit::$controller->load->_ci_cached_vars = array();
return $out;
}
return array();
}
/* End of file CIUnit.php */
/* Location: ./application/third_party/CIUnit/libraries/CIUnit.php */