diff options
author | Pascal Kriete <pascal.kriete@ellislab.com> | 2011-04-21 03:44:54 +0200 |
---|---|---|
committer | Pascal Kriete <pascal.kriete@ellislab.com> | 2011-04-21 03:44:54 +0200 |
commit | 69c97a71476e4eaa6c629022fcd4ec7f36d4ec0d (patch) | |
tree | 5cba214cb636df83b41a3aa7f29f9b191c3ab70b /tests/lib | |
parent | ba2430b5778b5b2414b94b818354fa1ff7cfd0db (diff) |
Adding early bootstrap ideas for core test suite
Diffstat (limited to 'tests/lib')
-rw-r--r-- | tests/lib/ci_testcase.php | 110 | ||||
-rw-r--r-- | tests/lib/common.php | 120 |
2 files changed, 230 insertions, 0 deletions
diff --git a/tests/lib/ci_testcase.php b/tests/lib/ci_testcase.php new file mode 100644 index 000000000..a8a272db2 --- /dev/null +++ b/tests/lib/ci_testcase.php @@ -0,0 +1,110 @@ +<?php + + +// Need a way to change dependencies (core libs and laoded libs) +// Need a way to set the CI class + +class CodeIgniterTestCase extends PHPUnit_Framework_TestCase { + + public $ci_instance; + public static $test_instance; + public static $global_map = array( + 'benchmark' => 'bm', + 'config' => 'cfg', + 'hooks' => 'ext', + 'utf8' => 'uni', + 'router' => 'rtr', + 'output' => 'out', + 'security' => 'sec', + 'input' => 'in', + 'lang' => 'lang', + + // @todo the loader is an edge case + 'loader' => 'load' + ); + + function __construct() + { + parent::__construct(); + } + + // -------------------------------------------------------------------- + + // Change what get_instance returns + function ci_instance($obj) + { + $this->ci_instance = $obj; + } + + // -------------------------------------------------------------------- + + function ci_set_instance_var($name, $obj) + { + $this->ci_instance->$name =& $obj; + } + + // -------------------------------------------------------------------- + + // Set a class to a mock before it is loaded + function ci_library($name) + { + + } + + // -------------------------------------------------------------------- + + /** + * Grab a core class + * + * Loads the correct core class without extensions + * and returns a reference to the class name in the + * globals array with the correct key. This way the + * test can modify the variable it assigns to and + * still maintain the global. + */ + function &ci_core_class($name) + { + $name = strtolower($name); + + if (isset(self::$global_map[$name])) + { + $class_name = ucfirst($name); + $global_name = self::$global_map[$name]; + } + elseif (in_array($name, self::$global_map)) + { + $class_name = ucfirst(array_search($name, self::$global_map)); + $global_name = $name; + } + else + { + throw new Exception('Not a valid core class.'); + } + + if ( ! class_exists('CI_'.$class_name)) + { + require_once BASEPATH.'core/'.$class_name.'.php'; + } + + $GLOBALS[strtoupper($global_name)] = 'CI_'.$class_name; + return $GLOBALS[strtoupper($global_name)]; + } + + // -------------------------------------------------------------------- + + // convenience function for global mocks + function ci_set_core_class($name, $obj) + { + $orig =& $this->ci_core_class($name); + $orig = $obj; + } + + // -------------------------------------------------------------------- + + static function ci_config($item) + { + return ''; + } +} + +// EOF
\ No newline at end of file diff --git a/tests/lib/common.php b/tests/lib/common.php new file mode 100644 index 000000000..482721a9a --- /dev/null +++ b/tests/lib/common.php @@ -0,0 +1,120 @@ +<?php + +// Set up the global CI functions in their most minimal core representation + +function &get_instance() +{ + $test = CodeIgniterTestCase::$test_instance; + return $test->ci_instance; +} + +// Config Stuff | @todo High priority! +// -------------------------------------------------------------------- + +function get_config() { die('implement me'); } + +function config_item($item) +{ + return CodeIgniterTestCase::ci_config($item); +} + +// -------------------------------------------------------------------- + +function load_class($class, $directory = 'libraries', $prefix = 'CI_') +{ + if ($directory != 'core' OR $prefix != 'CI_') + { + throw new Exception('Not Implemented: Non-core load_class()'); + } + + $test = CodeIgniterTestCase::$test_instance; + + $obj =& $test->ci_core_class($class); + + if (is_string($obj)) + { + throw new Exception('Bad Isolation: Use ci_set_core_class to set '.$class.''); + } + + return $obj; +} + +// This is sort of meh. Should probably be mocked up with +// controllable output, so that we can test some of our +// security code. The function itself will be tested in the +// bootstrap testsuite. +// -------------------------------------------------------------------- + +function remove_invisible_characters($str, $url_encoded = TRUE) +{ + $non_displayables = array(); + + // every control character except newline (dec 10) + // carriage return (dec 13), and horizontal tab (dec 09) + + if ($url_encoded) + { + $non_displayables[] = '/%0[0-8bcef]/'; // url encoded 00-08, 11, 12, 14, 15 + $non_displayables[] = '/%1[0-9a-f]/'; // url encoded 16-31 + } + + $non_displayables[] = '/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]+/S'; // 00-08, 11, 12, 14-31, 127 + + do + { + $str = preg_replace($non_displayables, '', $str, -1, $count); + } + while ($count); + + return $str; +} + + +// Clean up error messages +// -------------------------------------------------------------------- + +function show_error($message, $status_code = 500, $heading = 'An Error Was Encountered') +{ + throw new Exception('CI Error: '.$message); +} + +function show_404($page = '', $log_error = TRUE) +{ + throw new Exception('CI Error: 404'); +} + +function _exception_handler($severity, $message, $filepath, $line) +{ + throw new Exception('CI Exception: '.$message.' | '.$filepath.' | '.$line); +} + + +// We assume a few things about our environment ... +// -------------------------------------------------------------------- + +function is_php($version = '5.0.0') +{ + return ! (version_compare(PHP_VERSION, $version) < 0); +} + +function is_really_writable($file) +{ + return is_writable($file); +} + +function is_loaded() +{ + throw new Exception('Bad Isolation: mock up environment'); +} + +function log_message($level = 'error', $message, $php_error = FALSE) +{ + return TRUE; +} + +function set_status_header($code = 200, $text = '') +{ + return TRUE; +} + +// EOF
\ No newline at end of file |