/tests/units/classes/asserters/phpClass.php

https://github.com/Calak/atoum · PHP · 375 lines · 303 code · 72 blank · 0 comment · 0 complexity · 5b1c702c01cd94593aa93972d277b5e1 MD5 · raw file

  1. <?php
  2. namespace mageekguy\atoum\tests\units\asserters;
  3. use
  4. mageekguy\atoum,
  5. mageekguy\atoum\asserter,
  6. mageekguy\atoum\asserters
  7. ;
  8. require_once(__DIR__ . '/../../runner.php');
  9. class phpClass extends atoum\test
  10. {
  11. public function beforeTestMethod($testMethod)
  12. {
  13. $this->mockGenerator
  14. ->shunt('__construct')
  15. ->generate('reflectionClass')
  16. ;
  17. }
  18. public function testClass()
  19. {
  20. $this->assert
  21. ->testedClass->isSubclassOf('mageekguy\atoum\asserter')
  22. ;
  23. }
  24. public function test__construct()
  25. {
  26. $asserter = new asserters\phpClass($generator = new asserter\generator($this));
  27. $this->assert
  28. ->object($asserter->getScore())->isIdenticalTo($this->getScore())
  29. ->object($asserter->getLocale())->isIdenticalTo($this->getLocale())
  30. ->object($asserter->getGenerator())->isIdenticalTo($generator)
  31. ;
  32. }
  33. public function testGetClass()
  34. {
  35. $asserter = new asserters\phpClass(new asserter\generator($this));
  36. $this->assert
  37. ->variable($asserter->getClass())->isNull()
  38. ;
  39. $asserter->setWith(__CLASS__);
  40. $this->assert
  41. ->string($asserter->getClass())->isEqualTo(__CLASS__)
  42. ;
  43. }
  44. public function testSetReflectionClassInjector()
  45. {
  46. $asserter = new asserters\phpClass(new asserter\generator($this));
  47. $this->assert
  48. ->object($asserter->setReflectionClassInjector(function($class) use (& $reflectionClass) { return ($reflectionClass = new \mock\reflectionClass($class)); }))->isIdenticalTo($asserter)
  49. ->object($asserter->getReflectionClass($class = uniqid()))->isIdenticalTo($reflectionClass)
  50. ->exception(function() use ($asserter) {
  51. $asserter->setReflectionClassInjector(function() {});
  52. }
  53. )
  54. ->isInstanceOf('mageekguy\atoum\exceptions\logic\invalidArgument')
  55. ->hasMessage('Reflection class injector must take one argument')
  56. ;
  57. }
  58. public function testGetReflectionClass()
  59. {
  60. $asserter = new asserters\phpClass(new asserter\generator($this));
  61. $this->assert
  62. ->object($asserter->getReflectionClass(__CLASS__))->isInstanceOf('reflectionClass')
  63. ->string($asserter->getReflectionClass(__CLASS__)->getName())->isEqualTo(__CLASS__)
  64. ;
  65. $asserter->setReflectionClassInjector(function($class) use (& $reflectionClass) { return ($reflectionClass = new \mock\reflectionClass($class)); });
  66. $this->assert
  67. ->object($asserter->getReflectionClass($class = uniqid()))->isIdenticalTo($reflectionClass)
  68. ->mock($reflectionClass)->call('__construct')->withArguments($class)->once()
  69. ;
  70. $asserter->setReflectionClassInjector(function($class) use (& $reflectionClass) { return uniqid(); });
  71. $this->assert
  72. ->exception(function() use ($asserter) {
  73. $asserter->getReflectionClass(uniqid());
  74. }
  75. )
  76. ->isInstanceOf('mageekguy\atoum\exceptions\runtime\unexpectedValue')
  77. ->hasMessage('Reflection class injector must return a \reflectionClass instance')
  78. ;
  79. }
  80. public function testSetWith()
  81. {
  82. $asserter = new asserters\phpClass(new asserter\generator($test = new self($score = new atoum\score())));
  83. $mockController = new atoum\mock\controller();
  84. $mockController->__construct = function() { throw new \reflectionException();};
  85. $asserter->setReflectionClassInjector(function($class) use ($mockController) { return new \mock\reflectionClass($class, $mockController); });
  86. $class = uniqid();
  87. $this->assert
  88. ->exception(function() use ($asserter, $class) {
  89. $asserter->setWith($class);
  90. }
  91. )
  92. ->isInstanceOf('mageekguy\atoum\asserter\exception')
  93. ->hasMessage(sprintf($test->getLocale()->_('Class \'%s\' does not exist'), $class))
  94. ->integer($score->getFailNumber())->isEqualTo(1)
  95. ->integer($score->getPassNumber())->isZero()
  96. ;
  97. $asserter = new asserters\phpClass(new asserter\generator($test = new self($score = new atoum\score())));
  98. $this->assert
  99. ->object($asserter->setWith(__CLASS__))->isIdenticalTo($asserter)
  100. ->string($asserter->getClass())->isEqualTo(__CLASS__)
  101. ->integer($score->getFailNumber())->isZero()
  102. ->integer($score->getPassNumber())->isEqualTo(1)
  103. ;
  104. }
  105. public function testHasParent()
  106. {
  107. $asserter = new asserters\phpClass(new asserter\generator($test = new self($score = new atoum\score())));
  108. $this->assert
  109. ->exception(function() use ($asserter) {
  110. $asserter->hasParent(uniqid());
  111. }
  112. )
  113. ->isInstanceOf('logicException')
  114. ->hasMessage('Class is undefined')
  115. ;
  116. $class = uniqid();
  117. $parent = uniqid();
  118. $mockController = new atoum\mock\controller();
  119. $mockController->__construct = function() {};
  120. $mockController->getName = function() use ($class) { return $class; };
  121. $asserter
  122. ->setReflectionClassInjector(function($class) use ($mockController) { return new \mock\reflectionClass($class, $mockController); })
  123. ->setWith($class)
  124. ->getScore()->reset()
  125. ;
  126. $parentMockController = new atoum\mock\controller();
  127. $parentMockController->__construct = function() {};
  128. $parentMockController->getName = function() { return uniqid(); };
  129. $mockController->getParentClass = function() use ($parent, $parentMockController) { return new \mock\reflectionClass($parent, $parentMockController); };
  130. $this->assert
  131. ->exception(function() use ($asserter, $parent) {
  132. $asserter->hasParent($parent);
  133. }
  134. )
  135. ->isInstanceOf('mageekguy\atoum\asserter\exception')
  136. ->hasMessage(sprintf($test->getLocale()->_('%s is not the parent of class %s'), $parent, $class))
  137. ->integer($score->getFailNumber())->isEqualTo(1)
  138. ->integer($score->getPassNumber())->isZero()
  139. ;
  140. $parentMockController->getName = function() use ($parent) { return $parent; };
  141. $this->assert
  142. ->object($asserter->hasParent($parent))->isIdenticalTo($asserter)
  143. ->integer($score->getFailNumber())->isEqualTo(1)
  144. ->integer($score->getPassNumber())->isEqualTo(1)
  145. ;
  146. }
  147. public function testHasNoParent()
  148. {
  149. $asserter = new asserters\phpClass(new asserter\generator($test = new self($score = new atoum\score())));
  150. $this->assert
  151. ->exception(function() use ($asserter) {
  152. $asserter->hasNoParent();
  153. }
  154. )
  155. ->isInstanceOf('logicException')
  156. ->hasMessage('Class is undefined')
  157. ;
  158. $reflectionClass = new \mock\reflectionClass($className = uniqid());
  159. $asserter
  160. ->setReflectionClassInjector(function($class) use ($reflectionClass) { return $reflectionClass; })
  161. ->setWith($class = uniqid())
  162. ->getScore()
  163. ->reset()
  164. ;
  165. $reflectionClass->getMockController()->getName = function() use ($className) { return $className; };
  166. $reflectionClass->getMockController()->getParentClass = function() { return false; };
  167. $this->assert
  168. ->object($asserter->hasNoParent())->isIdenticalTo($asserter)
  169. ->integer($score->getFailNumber())->isZero()
  170. ->integer($score->getPassNumber())->isEqualTo(1)
  171. ;
  172. $parentClass = new \mock\reflectionClass($parentClassName = uniqid());
  173. $parentClass->getMockController()->__toString = function() use ($parentClassName) { return $parentClassName; };
  174. $reflectionClass->getMockController()->getParentClass = function() use ($parentClass) { return $parentClass; };
  175. $this->assert
  176. ->exception(function() use ($asserter) {
  177. $asserter->hasNoParent();
  178. }
  179. )
  180. ->isInstanceOf('mageekguy\atoum\asserter\exception')
  181. ->hasMessage(sprintf($test->getLocale()->_('class %s has parent %s'), $className, $parentClass))
  182. ->integer($score->getFailNumber())->isEqualTo(1)
  183. ->integer($score->getPassNumber())->isEqualTo(1)
  184. ;
  185. }
  186. public function testHasInterface()
  187. {
  188. $asserter = new asserters\phpClass(new asserter\generator($test = new self($score = new atoum\score())));
  189. $this->assert
  190. ->exception(function() use ($asserter) {
  191. $asserter->hasInterface(uniqid());
  192. }
  193. )
  194. ->isInstanceOf('logicException')
  195. ->hasMessage('Class is undefined')
  196. ;
  197. $class = uniqid();
  198. $interface = uniqid();
  199. $mockController = new atoum\mock\controller();
  200. $mockController->__construct = function() {};
  201. $mockController->getName = function() use ($class) { return $class; };
  202. $asserter
  203. ->setReflectionClassInjector(function($class) use ($mockController) { return new \mock\reflectionClass($class, $mockController); })
  204. ->setWith($class)
  205. ->getScore()->reset()
  206. ;
  207. $mockController->getInterfaceNames = array();
  208. $this->assert
  209. ->exception(function() use ($asserter, $interface) {
  210. $asserter->hasInterface($interface);
  211. }
  212. )
  213. ->isInstanceOf('mageekguy\atoum\asserter\exception')
  214. ->hasMessage(sprintf($test->getLocale()->_('Class %s does not implement interface %s'), $class, $interface))
  215. ->integer($score->getFailNumber())->isEqualTo(1)
  216. ->integer($score->getPassNumber())->isZero()
  217. ;
  218. $mockController->getInterfaceNames = array(uniqid(), $interface, uniqid());
  219. $this->assert
  220. ->object($asserter->hasInterface($interface))->isIdenticalTo($asserter)
  221. ->integer($score->getFailNumber())->isEqualTo(1)
  222. ->integer($score->getPassNumber())->isEqualTo(1)
  223. ;
  224. }
  225. public function testIsAbstract()
  226. {
  227. $asserter = new asserters\phpClass(new asserter\generator($test = new self($score = new atoum\score())));
  228. $this->assert
  229. ->exception(function() use ($asserter) {
  230. $asserter->isAbstract();
  231. }
  232. )
  233. ->isInstanceOf('logicException')
  234. ->hasMessage('Class is undefined')
  235. ;
  236. $class = uniqid();
  237. $mockController = new atoum\mock\controller();
  238. $mockController->__construct = function() {};
  239. $mockController->getName = function() use ($class) { return $class; };
  240. $asserter
  241. ->setReflectionClassInjector(function($class) use ($mockController) { return new \mock\reflectionClass($class, $mockController); })
  242. ->setWith($class)
  243. ->getScore()->reset()
  244. ;
  245. $mockController->isAbstract = false;
  246. $this->assert
  247. ->exception(function() use ($asserter) {
  248. $asserter->isAbstract();
  249. }
  250. )
  251. ->isInstanceOf('mageekguy\atoum\asserter\exception')
  252. ->hasMessage(sprintf($test->getLocale()->_('Class %s is not abstract'), $class))
  253. ->integer($score->getFailNumber())->isEqualTo(1)
  254. ->integer($score->getPassNumber())->isZero()
  255. ;
  256. $mockController->isAbstract = true;
  257. $this->assert
  258. ->object($asserter->isAbstract())->isIdenticalTo($asserter)
  259. ->integer($score->getFailNumber())->isEqualTo(1)
  260. ->integer($score->getPassNumber())->isEqualTo(1)
  261. ;
  262. }
  263. public function testHasMethod()
  264. {
  265. $asserter = new asserters\phpClass(new asserter\generator($test = new self($score = new atoum\score())));
  266. $this->assert
  267. ->exception(function() use ($asserter) {
  268. $asserter->hasMethod(uniqid());
  269. }
  270. )
  271. ->isInstanceOf('logicException')
  272. ->hasMessage('Class is undefined')
  273. ;
  274. $class = uniqid();
  275. $method = uniqid();
  276. $reflectionClass = new \mock\reflectionClass($class = uniqid());
  277. $reflectionClassController = $reflectionClass->getMockController();
  278. $reflectionClassController->getName = $class;
  279. $reflectionClassController->hasMethod = false;
  280. $asserter
  281. ->setReflectionClassInjector(function($class) use ($reflectionClass) { return $reflectionClass; })
  282. ->setWith($class)
  283. ->getScore()->reset()
  284. ;
  285. $this->assert
  286. ->exception(function() use ($asserter, $method) {
  287. $asserter->hasMethod($method);
  288. }
  289. )
  290. ->isInstanceOf('mageekguy\atoum\asserter\exception')
  291. ->hasMessage(sprintf($test->getLocale()->_('Method %s::%s() does not exist'), $class, $method))
  292. ->integer($score->getFailNumber())->isEqualTo(1)
  293. ->integer($score->getPassNumber())->isZero()
  294. ;
  295. $reflectionClassController->hasMethod = true;
  296. $this->assert
  297. ->object($asserter->hasMethod(uniqid()))->isIdenticalTo($asserter)
  298. ->integer($score->getFailNumber())->isEqualTo(1)
  299. ->integer($score->getPassNumber())->isEqualTo(1)
  300. ;
  301. }
  302. }
  303. ?>