ResourceTest.php 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377
  1. <?php
  2. /**
  3. * Zend Framework
  4. *
  5. * LICENSE
  6. *
  7. * This source file is subject to the new BSD license that is bundled
  8. * with this package in the file LICENSE.txt.
  9. * It is also available through the world-wide-web at this URL:
  10. * http://framework.zend.com/license/new-bsd
  11. * If you did not receive a copy of the license and are unable to
  12. * obtain it through the world-wide-web, please send an email
  13. * to license@zend.com so we can send you a copy immediately.
  14. *
  15. * @category Zend
  16. * @package Zend_Loader
  17. * @subpackage UnitTests
  18. * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com)
  19. * @license http://framework.zend.com/license/new-bsd New BSD License
  20. * @version $Id$
  21. */
  22. if (!defined('PHPUnit_MAIN_METHOD')) {
  23. define('PHPUnit_MAIN_METHOD', 'Zend_Loader_Autoloader_ResourceTest::main');
  24. }
  25. /**
  26. * Test helper
  27. */
  28. require_once dirname(__FILE__) . '/../../../TestHelper.php';
  29. /**
  30. * @see Zend_Loader_Autoloader
  31. */
  32. require_once 'Zend/Loader/Autoloader.php';
  33. /**
  34. * @see Zend_Loader_Autoloader_Resource
  35. */
  36. require_once 'Zend/Loader/Autoloader/Resource.php';
  37. /**
  38. * @see Zend_Loader_Autoloader_Interface
  39. */
  40. require_once 'Zend/Loader/Autoloader/Interface.php';
  41. /** Zend_Config */
  42. require_once 'Zend/Config.php';
  43. /**
  44. * @category Zend
  45. * @package Zend_Loader
  46. * @subpackage UnitTests
  47. * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com)
  48. * @license http://framework.zend.com/license/new-bsd New BSD License
  49. */
  50. class Zend_Loader_Autoloader_ResourceTest extends PHPUnit_Framework_TestCase
  51. {
  52. public static function main()
  53. {
  54. $suite = new PHPUnit_Framework_TestSuite(__CLASS__);
  55. $result = PHPUnit_TextUI_TestRunner::run($suite);
  56. }
  57. public function setUp()
  58. {
  59. // Store original autoloaders
  60. $this->loaders = spl_autoload_functions();
  61. if (!is_array($this->loaders)) {
  62. // spl_autoload_functions does not return empty array when no
  63. // autoloaders registered...
  64. $this->loaders = array();
  65. }
  66. // Store original include_path
  67. $this->includePath = get_include_path();
  68. Zend_Loader_Autoloader::resetInstance();
  69. $this->autoloader = Zend_Loader_Autoloader::getInstance();
  70. // initialize 'error' member for tests that utilize error handling
  71. $this->error = null;
  72. $this->loader = new Zend_Loader_Autoloader_Resource(array(
  73. 'namespace' => 'FooBar',
  74. 'basePath' => realpath(dirname(__FILE__) . '/_files'),
  75. ));
  76. }
  77. public function tearDown()
  78. {
  79. // Restore original autoloaders
  80. $loaders = spl_autoload_functions();
  81. foreach ($loaders as $loader) {
  82. spl_autoload_unregister($loader);
  83. }
  84. foreach ($this->loaders as $loader) {
  85. spl_autoload_register($loader);
  86. }
  87. // Retore original include_path
  88. set_include_path($this->includePath);
  89. }
  90. /**
  91. * @expectedException Zend_Loader_Exception
  92. */
  93. public function testAutoloaderInstantiationShouldRaiseExceptionWithoutNamespace()
  94. {
  95. $loader = new Zend_Loader_Autoloader_Resource(array('basePath' => dirname(__FILE__)));
  96. }
  97. /**
  98. * @expectedException Zend_Loader_Exception
  99. */
  100. public function testAutoloaderInstantiationShouldRaiseExceptionWithoutBasePath()
  101. {
  102. $loader = new Zend_Loader_Autoloader_Resource(array('namespace' => 'Foo'));
  103. }
  104. /**
  105. * @expectedException Zend_Loader_Exception
  106. */
  107. public function testAutoloaderInstantiationShouldRaiseExceptionWhenInvalidOptionsTypeProvided()
  108. {
  109. $loader = new Zend_Loader_Autoloader_Resource('foo');
  110. }
  111. public function testAutoloaderConstructorShouldAcceptZendConfigObject()
  112. {
  113. $config = new Zend_Config(array('namespace' => 'Foo', 'basePath' => dirname(__FILE__)));
  114. $loader = new Zend_Loader_Autoloader_Resource($config);
  115. }
  116. public function testAutoloaderShouldAllowRetrievingNamespace()
  117. {
  118. $this->assertEquals('FooBar', $this->loader->getNamespace());
  119. }
  120. public function testAutoloaderShouldAllowRetrievingBasePath()
  121. {
  122. $this->assertEquals(realpath(dirname(__FILE__) . '/_files'), $this->loader->getBasePath());
  123. }
  124. public function testNoResourceTypesShouldBeRegisteredByDefault()
  125. {
  126. $resourceTypes = $this->loader->getResourceTypes();
  127. $this->assertTrue(is_array($resourceTypes));
  128. $this->assertTrue(empty($resourceTypes));
  129. }
  130. /**
  131. * @expectedException Zend_Loader_Exception
  132. */
  133. public function testInitialResourceTypeDefinitionShouldRequireNamespace()
  134. {
  135. $this->loader->addResourceType('foo', 'foo');
  136. }
  137. /**
  138. * @expectedException Zend_Loader_Exception
  139. */
  140. public function testPassingNonStringPathWhenAddingResourceTypeShouldRaiseAnException()
  141. {
  142. $this->loader->addResourceType('foo', array('foo'), 'Foo');
  143. }
  144. public function testAutoloaderShouldAllowAddingArbitraryResourceTypes()
  145. {
  146. $this->loader->addResourceType('models', 'models', 'Model');
  147. $resources = $this->loader->getResourceTypes();
  148. $this->assertTrue(array_key_exists('models', $resources));
  149. $this->assertEquals($this->loader->getNamespace() . '_Model', $resources['models']['namespace']);
  150. $this->assertContains('/models', $resources['models']['path']);
  151. }
  152. public function testAutoloaderShouldAllowAddingResettingResourcePaths()
  153. {
  154. $this->loader->addResourceType('models', 'models', 'Model');
  155. $this->loader->addResourceType('models', 'apis');
  156. $resources = $this->loader->getResourceTypes();
  157. $this->assertNotContains('/models', $resources['models']['path']);
  158. $this->assertContains('/apis', $resources['models']['path']);
  159. }
  160. public function testAutoloaderShouldSupportAddingMultipleResourceTypesAtOnce()
  161. {
  162. $this->loader->addResourceTypes(array(
  163. 'model' => array('path' => 'models', 'namespace' => 'Model'),
  164. 'form' => array('path' => 'forms', 'namespace' => 'Form'),
  165. ));
  166. $resources = $this->loader->getResourceTypes();
  167. $this->assertContains('model', array_keys($resources));
  168. $this->assertContains('form', array_keys($resources));
  169. }
  170. /**
  171. * @expectedException Zend_Loader_Exception
  172. */
  173. public function testAddingMultipleResourceTypesShouldRaiseExceptionWhenReceivingNonArrayItem()
  174. {
  175. $this->loader->addResourceTypes(array('foo' => 'bar'));
  176. }
  177. /**
  178. * @expectedException Zend_Loader_Exception
  179. */
  180. public function testAddingMultipleResourceTypesShouldRaiseExceptionWhenMissingResourcePath()
  181. {
  182. $this->loader->addResourceTypes(array('model' => array('namespace' => 'Model')));
  183. }
  184. public function testSetResourceTypesShouldOverwriteExistingResourceTypes()
  185. {
  186. $this->loader->addResourceTypes(array(
  187. 'model' => array('path' => 'models', 'namespace' => 'Model'),
  188. 'form' => array('path' => 'forms', 'namespace' => 'Form'),
  189. ));
  190. $this->loader->setResourceTypes(array(
  191. 'view' => array('path' => 'views', 'namespace' => 'View'),
  192. 'layout' => array('path' => 'layouts', 'namespace' => 'Layout'),
  193. ));
  194. $resources = $this->loader->getResourceTypes();
  195. $this->assertNotContains('model', array_keys($resources));
  196. $this->assertNotContains('form', array_keys($resources));
  197. $this->assertContains('view', array_keys($resources));
  198. $this->assertContains('layout', array_keys($resources));
  199. }
  200. public function testHasResourceTypeShouldReturnFalseWhenTypeNotDefined()
  201. {
  202. $this->assertFalse($this->loader->hasResourceType('model'));
  203. }
  204. public function testHasResourceTypeShouldReturnTrueWhenTypeIsDefined()
  205. {
  206. $this->loader->addResourceTypes(array(
  207. 'model' => array('path' => 'models', 'namespace' => 'Model'),
  208. ));
  209. $this->assertTrue($this->loader->hasResourceType('model'));
  210. }
  211. public function testRemoveResourceTypeShouldRemoveResourceFromList()
  212. {
  213. $this->loader->addResourceTypes(array(
  214. 'model' => array('path' => 'models', 'namespace' => 'Model'),
  215. 'form' => array('path' => 'forms', 'namespace' => 'Form'),
  216. ));
  217. $this->loader->removeResourceType('form');
  218. $resources = $this->loader->getResourceTypes();
  219. $this->assertContains('model', array_keys($resources));
  220. $this->assertNotContains('form', array_keys($resources));
  221. }
  222. public function testAutoloaderShouldAllowSettingDefaultResourceType()
  223. {
  224. $this->loader->addResourceTypes(array(
  225. 'model' => array('path' => 'models', 'namespace' => 'Model'),
  226. ));
  227. $this->loader->setDefaultResourceType('model');
  228. $this->assertEquals('model', $this->loader->getDefaultResourceType());
  229. }
  230. public function testSettingDefaultResourceTypeToUndefinedTypeShouldHaveNoEffect()
  231. {
  232. $this->loader->setDefaultResourceType('model');
  233. $this->assertNull($this->loader->getDefaultResourceType());
  234. }
  235. /**
  236. * @expectedException Zend_Loader_Exception
  237. */
  238. public function testLoadShouldRaiseExceptionWhenNotTypePassedAndNoDefaultSpecified()
  239. {
  240. $this->loader->load('Foo');
  241. }
  242. /**
  243. * @expectedException Zend_Loader_Exception
  244. */
  245. public function testLoadShouldRaiseExceptionWhenResourceTypeDoesNotExist()
  246. {
  247. $this->loader->load('Foo', 'model');
  248. }
  249. public function testLoadShouldReturnObjectOfExpectedClass()
  250. {
  251. $this->loader->addResourceTypes(array(
  252. 'model' => array('path' => 'models', 'namespace' => 'Model'),
  253. ));
  254. $object = $this->loader->load('ZendLoaderAutoloaderResourceTest', 'model');
  255. $this->assertTrue($object instanceof FooBar_Model_ZendLoaderAutoloaderResourceTest);
  256. }
  257. public function testSuccessiveCallsToLoadSameResourceShouldReturnSameObject()
  258. {
  259. $this->loader->addResourceTypes(array(
  260. 'form' => array('path' => 'forms', 'namespace' => 'Form'),
  261. ));
  262. $object = $this->loader->load('ZendLoaderAutoloaderResourceTest', 'form');
  263. $this->assertTrue($object instanceof FooBar_Form_ZendLoaderAutoloaderResourceTest);
  264. $test = $this->loader->load('ZendLoaderAutoloaderResourceTest', 'form');
  265. $this->assertSame($object, $test);
  266. }
  267. public function testAutoloadShouldAllowEmptyNamespacing()
  268. {
  269. $loader = new Zend_Loader_Autoloader_Resource(array(
  270. 'namespace' => '',
  271. 'basePath' => realpath(dirname(__FILE__) . '/_files'),
  272. ));
  273. $loader->addResourceTypes(array(
  274. 'service' => array('path' => 'services', 'namespace' => 'Service'),
  275. ));
  276. $test = $loader->load('ZendLoaderAutoloaderResourceTest', 'service');
  277. $this->assertTrue($test instanceof Service_ZendLoaderAutoloaderResourceTest);
  278. }
  279. public function testPassingClassOfDifferentNamespaceToAutoloadShouldReturnFalse()
  280. {
  281. $this->assertFalse($this->loader->autoload('Foo_Bar_Baz'));
  282. }
  283. public function testPassingClassWithoutBothComponentAndClassSegmentsToAutoloadShouldReturnFalse()
  284. {
  285. $this->assertFalse($this->loader->autoload('FooBar_Baz'));
  286. }
  287. public function testPassingClassWithUnmatchedResourceTypeToAutoloadShouldReturnFalse()
  288. {
  289. $this->assertFalse($this->loader->autoload('FooBar_Baz_Bat'));
  290. }
  291. /**
  292. * @expectedException Zend_Loader_Exception
  293. */
  294. public function testMethodOverloadingShouldRaiseExceptionForNonGetterMethodCalls()
  295. {
  296. $this->loader->lalalalala();
  297. }
  298. /**
  299. * @expectedException Zend_Loader_Exception
  300. */
  301. public function testMethodOverloadingShouldRaiseExceptionWhenRequestedResourceDoesNotExist()
  302. {
  303. $this->loader->getModel('Foo');
  304. }
  305. /**
  306. * @expectedException Zend_Loader_Exception
  307. */
  308. public function testMethodOverloadingShouldRaiseExceptionWhenNoArgumentPassed()
  309. {
  310. $this->loader->addResourceTypes(array(
  311. 'model' => array('path' => 'models', 'namespace' => 'Model'),
  312. ));
  313. $this->loader->getModel();
  314. }
  315. public function testMethodOverloadingShouldReturnObjectOfExpectedType()
  316. {
  317. $this->loader->addResourceTypes(array(
  318. 'model' => array('path' => 'models', 'namespace' => 'Model'),
  319. ));
  320. $test = $this->loader->getModel('ZendLoaderAutoloaderResourceMethodOverloading');
  321. $this->assertTrue($test instanceof FooBar_Model_ZendLoaderAutoloaderResourceMethodOverloading);
  322. }
  323. }
  324. if (PHPUnit_MAIN_METHOD == 'Zend_Loader_Autoloader_ResourceTest::main') {
  325. Zend_Loader_Autoloader_ResourceTest::main();
  326. }