test_autoloader.php 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. <?php
  2. require_once 'autoloader.php';
  3. use webbasics\Autoloader;
  4. define('PATH', 'tests/_files/');
  5. class AutoloaderTest extends PHPUnit_Framework_TestCase {
  6. function setUp() {
  7. $this->autoloader = new Autoloader(PATH);
  8. }
  9. function testSetRootNamespace() {
  10. $this->assertAttributeEquals('\\', 'root_namespace', $this->autoloader);
  11. $this->autoloader->setRootNamespace('Foo');
  12. $this->assertAttributeEquals('Foo\\', 'root_namespace', $this->autoloader);
  13. $this->autoloader->setRootNamespace('Foo\\');
  14. $this->assertAttributeEquals('Foo\\', 'root_namespace', $this->autoloader);
  15. }
  16. /**
  17. * @depends testSetRootNamespace
  18. */
  19. function testGetRootNamespace() {
  20. $this->autoloader->setRootNamespace('Foo');
  21. $this->assertEquals($this->autoloader->getRootNamespace(), 'Foo\\');
  22. }
  23. /**
  24. * @depends testSetRootNamespace
  25. */
  26. function testConstructRootNamespace() {
  27. $autoloader = new Autoloader(PATH, 'Foo');
  28. $this->assertAttributeEquals('Foo\\', 'root_namespace', $autoloader);
  29. }
  30. /**
  31. * @depends testSetRootNamespace
  32. */
  33. function testStripRootNamespace() {
  34. $strip = new ReflectionMethod('webbasics\Autoloader', 'stripRootNamespace');
  35. $strip->setAccessible(true);
  36. $this->autoloader->setRootNamespace('Foo');
  37. $this->assertEquals($strip->invoke($this->autoloader, 'Foo\Bar'), 'Bar');
  38. }
  39. function testSetRootDirectory() {
  40. $this->autoloader->setRootDirectory('tests');
  41. $this->assertEquals($this->autoloader->getRootDirectory(), 'tests/');
  42. }
  43. function testClassnameToFilename() {
  44. $this->assertEquals(Autoloader::classnameToFilename('Foo'), 'foo');
  45. $this->assertEquals(Autoloader::classnameToFilename('FooBar'), 'foo_bar');
  46. $this->assertEquals(Autoloader::classnameToFilename('fooBar'), 'foo_bar');
  47. $this->assertEquals(Autoloader::classnameToFilename('FooBarBaz'), 'foo_bar_baz');
  48. }
  49. /**
  50. * @depends testClassnameToFilename
  51. */
  52. function testCreatePath() {
  53. $this->assertEquals($this->autoloader->createPath('Foo'), PATH.'foo.php');
  54. $this->assertEquals($this->autoloader->createPath('\Foo'), PATH.'foo.php');
  55. $this->assertEquals($this->autoloader->createPath('Foo\Bar'), PATH.'foo/bar.php');
  56. $this->assertEquals($this->autoloader->createPath('Foo\Bar\Baz'), PATH.'foo/bar/baz.php');
  57. $this->assertEquals($this->autoloader->createPath('FooBar\Baz'), PATH.'foo_bar/baz.php');
  58. }
  59. function testThrowErrors() {
  60. $this->assertFalse($this->autoloader->getThrowErrors());
  61. $this->autoloader->setThrowErrors(true);
  62. $this->assertTrue($this->autoloader->getThrowErrors());
  63. }
  64. /**
  65. * @depends testCreatePath
  66. * @depends testThrowErrors
  67. */
  68. function testLoadClassNotFound() {
  69. $this->assertFalse($this->autoloader->loadClass('foobar'));
  70. }
  71. /**
  72. * @depends testLoadClassNotFound
  73. * @expectedException webbasics\FileNotFoundError
  74. * @expectedExceptionMessage File "tests/_files/foobar.php" does not exist.
  75. */
  76. function testLoadClassNotFoundError() {
  77. $this->autoloader->setThrowErrors(true);
  78. $this->autoloader->loadClass('foobar');
  79. }
  80. /**
  81. * @depends testLoadClassNotFound
  82. * @expectedException webbasics\FileNotFoundError
  83. * @expectedExceptionMessage File "tests/_files/foobar.php" does not exist.
  84. */
  85. function testLoadClassNotFoundNoerrorOverwrite() {
  86. $this->autoloader->loadClass('foobar', true);
  87. }
  88. /**
  89. * @depends testLoadClassNotFound
  90. */
  91. function testLoadClassNotFoundErrorOverwrite() {
  92. $this->autoloader->setThrowErrors(true);
  93. $this->assertFalse($this->autoloader->loadClass('foobar', false));
  94. }
  95. /**
  96. * @depends testLoadClassNotFound
  97. */
  98. function testLoadClass() {
  99. $this->assertTrue($this->autoloader->loadClass('Foo'));
  100. $this->assertTrue(class_exists('Foo', false));
  101. $this->assertTrue($this->autoloader->loadClass('Foo\Bar'));
  102. $this->assertTrue(class_exists('Foo\Bar', false));
  103. }
  104. /**
  105. * @depends testLoadClass
  106. * @depends testStripRootNamespace
  107. */
  108. function testLoadClassRootNamespace() {
  109. $autoloader = new Autoloader(PATH.'foo');
  110. $autoloader->setRootNamespace('Foo');
  111. $this->assertTrue($autoloader->loadClass('Bar'));
  112. $this->assertTrue(class_exists('Foo\Bar', false));
  113. }
  114. /**
  115. * @depends testLoadClass
  116. */
  117. function testRegister() {
  118. $this->autoloader->register();
  119. $this->assertTrue(class_exists('Baz'));
  120. }
  121. /**
  122. * @depends testRegister
  123. * @depends testThrowErrors
  124. */
  125. function testRegisterPrepend() {
  126. $second_loader = new Autoloader(PATH.'second');
  127. $this->autoloader->register();
  128. $second_loader->register(true); // Prepend so that the second loader attemps to load Bar first
  129. $this->assertInstanceOf('Foo', new FooBaz());
  130. }
  131. }
  132. ?>