PageRenderTime 61ms CodeModel.GetById 24ms RepoModel.GetById 1ms app.codeStats 0ms

/tests/ZFToolTest/Diagnostics/RunnerTest.php

https://github.com/maximecorbeau/ZFTool
PHP | 403 lines | 340 code | 54 blank | 9 comment | 14 complexity | 4dbc2b0d44ff0467e2fa075f0af2ef58 MD5 | raw file
  1. <?php
  2. namespace ZFToolTest\Diagnostics;
  3. use ZFTool\Diagnostics\Config;
  4. use ZFTool\Diagnostics\Reporter\BasicConsole;
  5. use ZFTool\Diagnostics\Result\Failure;
  6. use ZFTool\Diagnostics\Result\Success;
  7. use ZFTool\Diagnostics\Result\Unknown;
  8. use ZFTool\Diagnostics\Result\Warning;
  9. use ZFTool\Diagnostics\RunEvent;
  10. use ZFTool\Diagnostics\Runner;
  11. use ZFToolTest\Diagnostics\TestAsset\AlwaysSuccessTest;
  12. use ZFToolTest\Diagnostics\TestAsset\ReturnThisTest;
  13. use ZFToolTest\Diagnostics\TestAsset\ThrowExceptionTest;
  14. use ZFToolTest\Diagnostics\TestAsset\TriggerUserErrorTest;
  15. use ZFToolTest\Diagnostics\TestAsset\TriggerWarningTest;
  16. use ZFToolTest\Diagnostics\TestAssets\ConsoleAdapter;
  17. use Zend\EventManager\EventManager;
  18. require_once __DIR__.'/TestAsset/ReturnThisTest.php';
  19. require_once __DIR__.'/TestAsset/ThrowExceptionTest.php';
  20. require_once __DIR__.'/TestAsset/TriggerUserErrorTest.php';
  21. require_once __DIR__.'/TestAsset/TriggerWarningTest.php';
  22. require_once __DIR__.'/TestAsset/AlwaysSuccessTest.php';
  23. require_once __DIR__.'/TestAsset/ConsoleAdapter.php';
  24. class RunnerTest extends \PHPUnit_Framework_TestCase
  25. {
  26. /**
  27. * @var Runner
  28. */
  29. protected $runner;
  30. public function setUp()
  31. {
  32. $this->runner = new Runner();
  33. }
  34. public function testsAndResultsProvider()
  35. {
  36. return array(
  37. array(
  38. $success = new Success(),
  39. $success,
  40. ),
  41. array(
  42. $warning = new Warning(),
  43. $warning,
  44. ),
  45. array(
  46. $failure = new Failure(),
  47. $failure,
  48. ),
  49. array(
  50. $unknown = new Unknown(),
  51. $unknown,
  52. ),
  53. array(
  54. true,
  55. 'ZFTool\Diagnostics\Result\Success'
  56. ),
  57. array(
  58. false,
  59. 'ZFTool\Diagnostics\Result\Failure'
  60. ),
  61. array(
  62. null,
  63. 'ZFTool\Diagnostics\Result\Failure',
  64. ),
  65. array(
  66. new \stdClass(),
  67. 'ZFTool\Diagnostics\Result\Failure',
  68. ),
  69. array(
  70. 'abc',
  71. 'ZFTool\Diagnostics\Result\Warning',
  72. ),
  73. );
  74. }
  75. public function testConfig()
  76. {
  77. $this->assertInstanceOf('ZFTool\Diagnostics\Config', $this->runner->getConfig());
  78. $this->assertInstanceOf('ZFTool\Diagnostics\ConfigInterface', $this->runner->getConfig());
  79. $newConfig = new Config();
  80. $this->runner->setConfig($newConfig);
  81. $this->assertInstanceOf('ZFTool\Diagnostics\Config', $this->runner->getConfig());
  82. $this->assertSame($newConfig, $this->runner->getConfig());
  83. $newConfig->setBreakOnFailure(true);
  84. $this->assertTrue($newConfig->getBreakOnFailure());
  85. $newConfig->setDefaultRunListenerClass('\stdClass');
  86. $this->assertSame('\stdClass', $newConfig->getDefaultRunListenerClass());
  87. $em = new EventManager();
  88. $this->runner->setEventManager($em);
  89. $this->assertSame($em, $this->runner->getEventManager());
  90. }
  91. public function testManagingTests()
  92. {
  93. $test1 = new AlwaysSuccessTest();
  94. $test2 = new AlwaysSuccessTest();
  95. $test3 = new AlwaysSuccessTest();
  96. $this->runner->addTest($test1);
  97. $this->runner->addTests(array(
  98. $test2,
  99. $test3
  100. ));
  101. $this->assertContains($test1, $this->runner->getTests());
  102. $this->assertContains($test2, $this->runner->getTests());
  103. $this->assertContains($test3, $this->runner->getTests());
  104. }
  105. public function testAddInvalidtest()
  106. {
  107. $this->setExpectedException('ZFTool\Diagnostics\Exception\InvalidArgumentException');
  108. $this->runner->addTests(array( new \stdClass()));
  109. }
  110. public function testAddWrongParam()
  111. {
  112. $this->setExpectedException('ZFTool\Diagnostics\Exception\InvalidArgumentException');
  113. $this->runner->addTests('foo');
  114. }
  115. public function testRunEventWrongTarget()
  116. {
  117. $e = new RunEvent();
  118. $this->setExpectedException('ZFTool\Diagnostics\Exception\InvalidArgumentException');
  119. $e->setTarget(new \stdClass());
  120. }
  121. public function testAddReporter()
  122. {
  123. $reporter = new BasicConsole(new ConsoleAdapter());
  124. $this->runner->addReporter($reporter);
  125. $found = false;
  126. foreach($this->runner->getEventManager()->getListeners(RunEvent::EVENT_AFTER_RUN) as $l){
  127. /* @var $l \Zend\Stdlib\CallbackHandler */
  128. $callback = $l->getCallback();
  129. if(is_array($callback) && isset($callback[0]) && $callback[0] === $reporter){
  130. $found = true;
  131. break;
  132. }
  133. }
  134. $this->assertTrue($found);
  135. }
  136. public function testStart()
  137. {
  138. $eventFired = false;
  139. $self = $this;
  140. $test = new AlwaysSuccessTest();
  141. $this->runner->addTest($test);
  142. $this->runner->getEventManager()->attach(RunEvent::EVENT_START, function(RunEvent $e) use (&$self, &$test, &$eventFired){
  143. $eventFired = true;
  144. $self->assertInstanceOf('ZFTool\Diagnostics\Result\Collection', $e->getResults());
  145. $self->assertNull($e->getLastResult());
  146. $self->assertContains($test, $e->getParam('tests'));
  147. });
  148. $this->runner->run();
  149. $this->assertTrue($eventFired);
  150. }
  151. public function testBeforeRun()
  152. {
  153. $eventFired = false;
  154. $self = $this;
  155. $test = new AlwaysSuccessTest();
  156. $this->runner->addTest($test);
  157. $this->runner->getEventManager()->attach(RunEvent::EVENT_BEFORE_RUN, function(RunEvent $e) use (&$self, &$test, &$eventFired){
  158. $eventFired = true;
  159. $self->assertInstanceOf('ZFTool\Diagnostics\Result\Collection', $e->getResults());
  160. $self->assertNull($e->getLastResult());
  161. $self->assertSame($test, $e->getTarget());
  162. $self->assertContains($test, $e->getParam('tests'));
  163. });
  164. $this->runner->run();
  165. $this->assertTrue($eventFired);
  166. }
  167. public function testRunEvent()
  168. {
  169. $eventFired = false;
  170. $self = $this;
  171. $test = new AlwaysSuccessTest();
  172. $this->runner->addTest($test);
  173. $this->runner->getEventManager()->attach(RunEvent::EVENT_RUN, function(RunEvent $e) use (&$self, &$test, &$eventFired){
  174. $eventFired = true;
  175. $self->assertInstanceOf('ZFTool\Diagnostics\Result\Collection', $e->getResults());
  176. $self->assertNull($e->getLastResult());
  177. $self->assertSame($test, $e->getTarget());
  178. $self->assertContains($test, $e->getParam('tests'));
  179. return new Success();
  180. }, 100);
  181. $this->runner->run();
  182. $this->assertTrue($eventFired);
  183. }
  184. public function testRunListenerWithUnknownResult()
  185. {
  186. $eventFired = false;
  187. $self = $this;
  188. $test = new AlwaysSuccessTest();
  189. $this->runner->addTest($test);
  190. $this->runner->getEventManager()->clearListeners(RunEvent::EVENT_RUN);
  191. $this->runner->getEventManager()->attach(RunEvent::EVENT_RUN, function(RunEvent $e) use (&$self, &$test, &$eventFired){
  192. return 'foo';
  193. }, 100);
  194. $this->setExpectedException('ZFTool\Diagnostics\Exception\RuntimeException');
  195. $this->runner->run();
  196. }
  197. public function testSummaryWithWarnings()
  198. {
  199. $reporter = new BasicConsole(new ConsoleAdapter());
  200. $this->runner->addReporter($reporter);
  201. $tests = array();
  202. for ($x = 0; $x < 15; $x++) {
  203. $tests[] = $test = new AlwaysSuccessTest();
  204. }
  205. for ($x = 0; $x < 5; $x++) {
  206. $tests[] = $test = new ReturnThisTest(new Warning());
  207. }
  208. for ($x = 0; $x < 5; $x++) {
  209. $tests[] = $test = new ReturnThisTest(new Unknown());
  210. }
  211. $this->runner->addTests($tests);
  212. ob_start();
  213. $this->runner->run();
  214. $this->assertStringMatchesFormat('%A5 warnings, 15 successful tests, 5 unknown test results%A', trim(ob_get_clean()));
  215. }
  216. public function testSummaryWithFailures()
  217. {
  218. $reporter = new BasicConsole(new ConsoleAdapter());
  219. $this->runner->addReporter($reporter);
  220. $tests = array();
  221. for ($x = 0; $x < 15; $x++) {
  222. $tests[] = $test = new AlwaysSuccessTest();
  223. }
  224. for ($x = 0; $x < 5; $x++) {
  225. $tests[] = $test = new ReturnThisTest(new Warning());
  226. }
  227. for ($x = 0; $x < 5; $x++) {
  228. $tests[] = $test = new ReturnThisTest(new Unknown());
  229. }
  230. for ($x = 0; $x < 5; $x++) {
  231. $tests[] = $test = new ReturnThisTest(new Failure());
  232. }
  233. $this->runner->addTests($tests);
  234. ob_start();
  235. \PHPUnit_Framework_Error_Notice::$enabled = false;
  236. $this->runner->run();
  237. $this->assertStringMatchesFormat(
  238. '%A5 failures, 5 warnings, 15 successful tests, 5 unknown test results%A',
  239. trim(ob_get_clean())
  240. );
  241. }
  242. /**
  243. * @dataProvider testsAndResultsProvider
  244. */
  245. public function testStandardResults($value, $expectedResult)
  246. {
  247. $test = new ReturnThisTest($value);
  248. $this->runner->addTest($test);
  249. $results = $this->runner->run();
  250. if(is_string($expectedResult)){
  251. $this->assertInstanceOf($expectedResult, $results[$test]);
  252. } else {
  253. $this->assertSame($expectedResult, $results[$test]);
  254. }
  255. }
  256. public function testExceptionResultsInFailure()
  257. {
  258. $exception = new \Exception();
  259. $test = new ThrowExceptionTest($exception);
  260. $this->runner->addTest($test);
  261. $results = $this->runner->run();
  262. $this->assertInstanceOf('ZFTool\Diagnostics\Result\Failure', $results[$test]);
  263. }
  264. public function testPHPWarningResultsInFailure()
  265. {
  266. $test = new TriggerWarningTest();
  267. $this->runner->addTest($test);
  268. $results = $this->runner->run();
  269. $this->assertInstanceOf('ZFTool\Diagnostics\Result\Failure', $results[$test]);
  270. $this->assertInstanceOf('ErrorException', $results[$test]->getData());
  271. $this->assertEquals(E_WARNING, $results[$test]->getData()->getSeverity());
  272. }
  273. public function testPHPUserErrorResultsInFailure()
  274. {
  275. $test = new TriggerUserErrorTest('error', E_USER_ERROR);
  276. $this->runner->addTest($test);
  277. $results = $this->runner->run();
  278. $this->assertInstanceOf('ZFTool\Diagnostics\Result\Failure', $results[$test]);
  279. $this->assertInstanceOf('ErrorException', $results[$test]->getData());
  280. $this->assertEquals(E_USER_ERROR, $results[$test]->getData()->getSeverity());
  281. }
  282. public function testBreakOnFirstFailure()
  283. {
  284. $eventFired = false;
  285. $self = $this;
  286. $test = new ReturnThisTest(false);
  287. $this->runner->getConfig()->setBreakOnFailure(true);
  288. $this->runner->addTest($test);
  289. $this->runner->getEventManager()->attach(RunEvent::EVENT_STOP, function(RunEvent $e) use (&$self, &$test, &$eventFired){
  290. $eventFired = true;
  291. $self->assertInstanceOf('ZFTool\Diagnostics\Result\Collection', $e->getResults());
  292. $self->assertInstanceOf('ZFTool\Diagnostics\Result\Failure', $e->getLastResult());
  293. $self->assertSame($test, $e->getTarget());
  294. });
  295. $results = $this->runner->run();
  296. $self->assertInstanceOf('ZFTool\Diagnostics\Result\Failure', $results[$test]);
  297. $this->assertTrue($eventFired);
  298. }
  299. public function testBeforeRunSkipTest()
  300. {
  301. $eventFired = false;
  302. $self = $this;
  303. $test1 = new AlwaysSuccessTest();
  304. $test2 = new ReturnThisTest(new Failure());
  305. $this->runner->addTest($test1);
  306. $this->runner->addTest($test2);
  307. $this->runner->getEventManager()->attach(RunEvent::EVENT_BEFORE_RUN, function(RunEvent $e) use (&$self, &$test1, &$eventFired){
  308. $eventFired = true;
  309. $self->assertInstanceOf('ZFTool\Diagnostics\Test\TestInterface', $e->getTarget());
  310. // skip the first test
  311. if($e->getTarget() === $test1){
  312. return false;
  313. }
  314. });
  315. $results = $this->runner->run();
  316. $this->assertTrue($eventFired);
  317. $this->assertNotContains($test1, $results);
  318. $this->assertNotNull($results[$test2]);
  319. }
  320. public function testAfterRunStopTesting()
  321. {
  322. $eventFired = false;
  323. $eventFired2 = false;
  324. $self = $this;
  325. $test1 = new AlwaysSuccessTest();
  326. $test2 = new ReturnThisTest(new Failure());
  327. $this->runner->addTest($test1);
  328. $this->runner->addTest($test2);
  329. $this->runner->getEventManager()->attach(RunEvent::EVENT_AFTER_RUN, function(RunEvent $e) use (&$self, &$test1, &$eventFired){
  330. $eventFired = true;
  331. $self->assertInstanceOf('ZFTool\Diagnostics\Test\TestInterface', $e->getTarget());
  332. // stop testing after first test
  333. if($e->getTarget() === $test1){
  334. return false;
  335. }
  336. });
  337. $this->runner->getEventManager()->attach(RunEvent::EVENT_STOP, function(RunEvent $e) use (&$self, &$test1, &$eventFired2){
  338. $eventFired2 = true;
  339. $self->assertInstanceOf('ZFTool\Diagnostics\Result\Collection', $e->getResults());
  340. $self->assertInstanceOf('ZFTool\Diagnostics\Result\Success', $e->getLastResult());
  341. $self->assertSame($test1, $e->getTarget());
  342. });
  343. $results = $this->runner->run();
  344. $this->assertTrue($eventFired);
  345. $this->assertTrue($eventFired2);
  346. $this->assertNotNull($results[$test1]);
  347. $this->assertNotContains($test2, $results);
  348. }
  349. }