diff options
author | Nils Adermann <naderman@naderman.de> | 2010-06-25 14:24:04 +0200 |
---|---|---|
committer | Nils Adermann <naderman@naderman.de> | 2010-07-05 15:40:46 +0200 |
commit | 22c3041e128bd2d10d37672bdf5c7c1eb4112b12 (patch) | |
tree | 07f1ace82305fecee57cd6260c49278df3e637d4 /tests/class_loader | |
parent | 55a22363fa4e0cc49a55478ccd238b078003fd78 (diff) | |
download | forums-22c3041e128bd2d10d37672bdf5c7c1eb4112b12.tar forums-22c3041e128bd2d10d37672bdf5c7c1eb4112b12.tar.gz forums-22c3041e128bd2d10d37672bdf5c7c1eb4112b12.tar.bz2 forums-22c3041e128bd2d10d37672bdf5c7c1eb4112b12.tar.xz forums-22c3041e128bd2d10d37672bdf5c7c1eb4112b12.zip |
[feature/auto-loading] Added a phpBB autoloader with caching support.
phpBB class name lookups follow these rules:
- All classes are prefixed with phpbb_
- All classes reside in includes/ or a subdirectory thereof
- Directories must not contain underscores
- The class name is separated into parts by underscores, the parts
are checked from first to last, until one is found which is not
a directory, all remaining parts make up the file name. If no parts
are left, the last directory name is used.
Examples:
directory structure:
includes/
class_name.php
dir/
class_name.php
dir.php
subdir/
class_name.php
lookups:
phpbb_class_name -> includes/class_name.php
phpbb_dir_class_name -> includes/dir/class_name.php
phpbb_dir -> includes/dir/dir.php
phpbb_dir_subdir_class_name -> includes/dir/subdir/class_name.php
Optionally the class can be supplied with a cache instance, either in the
constructor or via set_cache() at a later time. This allows for the lookups to
be cached, so the directories do not have to be traveresed on every request.
This makes it necessary for the cache and its dependency to continue to be
loaded the old way - without autoloading.
The code will not be changed to use autoloading, but it will rather only be
used for new classes where applicable.
PHPBB3-9682
Diffstat (limited to 'tests/class_loader')
-rw-r--r-- | tests/class_loader/all_tests.php | 41 | ||||
-rw-r--r-- | tests/class_loader/cache_mock.php | 29 | ||||
-rw-r--r-- | tests/class_loader/class_loader_test.php | 65 | ||||
-rw-r--r-- | tests/class_loader/includes/class_name.php | 6 | ||||
-rw-r--r-- | tests/class_loader/includes/dir/class_name.php | 6 | ||||
-rw-r--r-- | tests/class_loader/includes/dir/subdir/class_name.php | 6 |
6 files changed, 153 insertions, 0 deletions
diff --git a/tests/class_loader/all_tests.php b/tests/class_loader/all_tests.php new file mode 100644 index 0000000000..451a1b02c2 --- /dev/null +++ b/tests/class_loader/all_tests.php @@ -0,0 +1,41 @@ +<?php +/** +* +* @package testing +* @copyright (c) 2008 phpBB Group +* @license http://opensource.org/licenses/gpl-license.php GNU Public License +* +*/ + +if (!defined('PHPUnit_MAIN_METHOD')) +{ + define('PHPUnit_MAIN_METHOD', 'phpbb_class_loader_all_tests::main'); +} + +require_once 'test_framework/framework.php'; +require_once 'PHPUnit/TextUI/TestRunner.php'; + +require_once 'class_loader/class_loader_test.php'; + +class phpbb_class_loader_all_tests +{ + public static function main() + { + PHPUnit_TextUI_TestRunner::run(self::suite()); + } + + public static function suite() + { + $suite = new PHPUnit_Framework_TestSuite('phpBB Class Loader'); + + $suite->addTestSuite('phpbb_class_loader_test'); + + return $suite; + } +} + +if (PHPUnit_MAIN_METHOD == 'phpbb_class_loader_all_tests::main') +{ + phpbb_class_loader_all_tests::main(); +} + diff --git a/tests/class_loader/cache_mock.php b/tests/class_loader/cache_mock.php new file mode 100644 index 0000000000..c8069fa9cc --- /dev/null +++ b/tests/class_loader/cache_mock.php @@ -0,0 +1,29 @@ +<?php +/** +* +* @package testing +* @version $Id$ +* @copyright (c) 2008 phpBB Group +* @license http://opensource.org/licenses/gpl-license.php GNU Public License +* +*/ + +class phpbb_cache_mock +{ + private $variables = array(); + + function get($var_name) + { + if (isset($this->variables[$var_name])) + { + return $this->variables[$var_name]; + } + + return false; + } + + function put($var_name, $value) + { + $this->variables[$var_name] = $value; + } +}
\ No newline at end of file diff --git a/tests/class_loader/class_loader_test.php b/tests/class_loader/class_loader_test.php new file mode 100644 index 0000000000..37c11657c4 --- /dev/null +++ b/tests/class_loader/class_loader_test.php @@ -0,0 +1,65 @@ +<?php +/** +* +* @package testing +* @version $Id$ +* @copyright (c) 2008 phpBB Group +* @license http://opensource.org/licenses/gpl-license.php GNU Public License +* +*/ + +require_once 'test_framework/framework.php'; +require_once 'class_loader/cache_mock.php'; + +require_once '../phpBB/includes/class_loader.php'; + + +class phpbb_class_loader_test extends PHPUnit_Framework_TestCase +{ + public function test_resolve_path() + { + $prefix = 'class_loader/'; + $class_loader = new phpbb_class_loader($prefix); + + $prefix .= 'includes/'; + + $this->assertEquals( + $prefix . 'class_name.php', + $class_loader->resolve_path('phpbb_class_name'), + 'Top level class' + ); + $this->assertEquals( + $prefix . 'dir/class_name.php', + $class_loader->resolve_path('phpbb_dir_class_name'), + 'Class in a directory' + ); + $this->assertEquals( + $prefix . 'dir/subdir/class_name.php', + $class_loader->resolve_path('phpbb_dir_subdir_class_name'), + 'Class in a sub-directory' + ); + } + + public function test_resolve_cached() + { + $cache = new phpbb_cache_mock; + $cache->put('class_loader', array('phpbb_a_cached_name' => 'a/cached_name')); + + $prefix = 'class_loader/'; + $class_loader = new phpbb_class_loader($prefix, '.php', $cache); + + $prefix .= 'includes/'; + + $this->assertEquals( + $prefix . 'dir/class_name.php', + $class_loader->resolve_path('phpbb_dir_class_name'), + 'Class in a directory' + ); + + $this->assertEquals( + $prefix . 'a/cached_name.php', + $class_loader->resolve_path('phpbb_a_cached_name'), + 'Class in a directory' + ); + } +} diff --git a/tests/class_loader/includes/class_name.php b/tests/class_loader/includes/class_name.php new file mode 100644 index 0000000000..e941173cdd --- /dev/null +++ b/tests/class_loader/includes/class_name.php @@ -0,0 +1,6 @@ +<?php + +class phpbb_class_name +{ +} + diff --git a/tests/class_loader/includes/dir/class_name.php b/tests/class_loader/includes/dir/class_name.php new file mode 100644 index 0000000000..0675aa8fc5 --- /dev/null +++ b/tests/class_loader/includes/dir/class_name.php @@ -0,0 +1,6 @@ +<?php + +class phpbb_dir_class_name +{ +} + diff --git a/tests/class_loader/includes/dir/subdir/class_name.php b/tests/class_loader/includes/dir/subdir/class_name.php new file mode 100644 index 0000000000..7321a609cc --- /dev/null +++ b/tests/class_loader/includes/dir/subdir/class_name.php @@ -0,0 +1,6 @@ +<?php + +class phpbb_dir_subdir_class_name +{ +} + |