No Description

ValidClassNamePassTest.php 5.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. <?php
  2. /*
  3. * This file is part of Psy Shell
  4. *
  5. * (c) 2012-2014 Justin Hileman
  6. *
  7. * For the full copyright and license information, please view the LICENSE
  8. * file that was distributed with this source code.
  9. */
  10. namespace Psy\Test\CodeCleaner;
  11. use Psy\CodeCleaner\ValidClassNamePass;
  12. use Psy\Exception\Exception;
  13. class ValidClassNamePassTest extends CodeCleanerTestCase
  14. {
  15. public function setUp()
  16. {
  17. $this->setPass(new ValidClassNamePass());
  18. }
  19. /**
  20. * @dataProvider getInvalid
  21. */
  22. public function testProcessInvalid($code, $php54 = false)
  23. {
  24. try {
  25. $stmts = $this->parse($code);
  26. $this->traverse($stmts);
  27. $this->fail();
  28. } catch (Exception $e) {
  29. if ($php54 && version_compare(PHP_VERSION, '5.4', '<')) {
  30. $this->assertInstanceOf('Psy\Exception\ParseErrorException', $e);
  31. } else {
  32. $this->assertInstanceOf('Psy\Exception\FatalErrorException', $e);
  33. }
  34. }
  35. }
  36. public function getInvalid()
  37. {
  38. // class declarations
  39. return array(
  40. // core class
  41. array('class stdClass {}'),
  42. // capitalization
  43. array('class stdClass {}'),
  44. // collisions with interfaces and traits
  45. array('interface stdClass {}'),
  46. array('trait stdClass {}', true),
  47. // collisions inside the same code snippet
  48. array("
  49. class Psy_Test_CodeCleaner_ValidClassNamePass_Alpha {}
  50. class Psy_Test_CodeCleaner_ValidClassNamePass_Alpha {}
  51. "),
  52. array("
  53. class Psy_Test_CodeCleaner_ValidClassNamePass_Alpha {}
  54. trait Psy_Test_CodeCleaner_ValidClassNamePass_Alpha {}
  55. ", true),
  56. array("
  57. trait Psy_Test_CodeCleaner_ValidClassNamePass_Alpha {}
  58. class Psy_Test_CodeCleaner_ValidClassNamePass_Alpha {}
  59. ", true),
  60. array("
  61. trait Psy_Test_CodeCleaner_ValidClassNamePass_Alpha {}
  62. interface Psy_Test_CodeCleaner_ValidClassNamePass_Alpha {}
  63. ", true),
  64. array("
  65. interface Psy_Test_CodeCleaner_ValidClassNamePass_Alpha {}
  66. trait Psy_Test_CodeCleaner_ValidClassNamePass_Alpha {}
  67. ", true),
  68. array("
  69. interface Psy_Test_CodeCleaner_ValidClassNamePass_Alpha {}
  70. class Psy_Test_CodeCleaner_ValidClassNamePass_Alpha {}
  71. "),
  72. array("
  73. class Psy_Test_CodeCleaner_ValidClassNamePass_Alpha {}
  74. interface Psy_Test_CodeCleaner_ValidClassNamePass_Alpha {}
  75. "),
  76. // namespaced collisions
  77. array("
  78. namespace Psy\\Test\\CodeCleaner {
  79. class ValidClassNamePassTest {}
  80. }
  81. "),
  82. array("
  83. namespace Psy\\Test\\CodeCleaner\\ValidClassNamePass {
  84. class Beta {}
  85. }
  86. namespace Psy\\Test\\CodeCleaner\\ValidClassNamePass {
  87. class Beta {}
  88. }
  89. "),
  90. // extends and implements
  91. array('class ValidClassNamePassTest extends NotAClass {}'),
  92. array('class ValidClassNamePassTest extends ArrayAccess {}'),
  93. array('class ValidClassNamePassTest implements stdClass {}'),
  94. array('class ValidClassNamePassTest implements ArrayAccess, stdClass {}'),
  95. array('interface ValidClassNamePassTest extends stdClass {}'),
  96. array('interface ValidClassNamePassTest extends ArrayAccess, stdClass {}'),
  97. // class instantiations
  98. array('new Psy_Test_CodeCleaner_ValidClassNamePass_Gamma();'),
  99. array("
  100. namespace Psy\\Test\\CodeCleaner\\ValidClassNamePass {
  101. new Psy_Test_CodeCleaner_ValidClassNamePass_Delta();
  102. }
  103. "),
  104. // class constant fetch
  105. array('Psy\\Test\\CodeCleaner\\ValidClassNamePass\\NotAClass::FOO'),
  106. );
  107. }
  108. /**
  109. * @dataProvider getValid
  110. */
  111. public function testProcessValid($code)
  112. {
  113. $stmts = $this->parse($code);
  114. $this->traverse($stmts);
  115. }
  116. public function getValid()
  117. {
  118. return array(
  119. // class declarations
  120. array('class Psy_Test_CodeCleaner_ValidClassNamePass_Epsilon {}'),
  121. array('namespace Psy\Test\CodeCleaner\ValidClassNamePass; class Zeta {}'),
  122. array("
  123. namespace { class Psy_Test_CodeCleaner_ValidClassNamePass_Eta {}; }
  124. namespace Psy\\Test\\CodeCleaner\\ValidClassNamePass {
  125. class Psy_Test_CodeCleaner_ValidClassNamePass_Eta {}
  126. }
  127. "),
  128. array('namespace Psy\Test\CodeCleaner\ValidClassNamePass { class stdClass {} }'),
  129. // class instantiations
  130. array('new stdClass();'),
  131. array('new stdClass();'),
  132. array("
  133. namespace Psy\\Test\\CodeCleaner\\ValidClassNamePass {
  134. class Theta {}
  135. }
  136. namespace Psy\\Test\\CodeCleaner\\ValidClassNamePass {
  137. new Theta();
  138. }
  139. "),
  140. array("
  141. namespace Psy\\Test\\CodeCleaner\\ValidClassNamePass {
  142. class Iota {}
  143. new Iota();
  144. }
  145. "),
  146. array("
  147. namespace Psy\\Test\\CodeCleaner\\ValidClassNamePass {
  148. class Kappa {}
  149. }
  150. namespace {
  151. new \\Psy\\Test\\CodeCleaner\\ValidClassNamePass\\Kappa();
  152. }
  153. "),
  154. // Class constant fetch (ValidConstantPassTest validates the actual constant)
  155. array('class A {} A::FOO'),
  156. array('$a = new DateTime; $a::ATOM'),
  157. );
  158. }
  159. }