PageRenderTime 29ms CodeModel.GetById 0ms RepoModel.GetById 0ms app.codeStats 0ms

/cake/tests/cases/libs/code_coverage_manager.test.php

http://github.com/Datawalke/Coordino
PHP | 516 lines | 355 code | 40 blank | 121 comment | 22 complexity | e72462e83dc35e3c888015d18338dfec MD5 | raw file
  1. <?php
  2. /**
  3. * CodeCoverageManagerTest file
  4. *
  5. * PHP versions 4 and 5
  6. *
  7. * CakePHP(tm) Tests <http://book.cakephp.org/view/1196/Testing>
  8. * Copyright 2005-2012, Cake Software Foundation, Inc. (http://cakefoundation.org)
  9. *
  10. * Licensed under The Open Group Test Suite License
  11. * Redistributions of files must retain the above copyright notice.
  12. *
  13. * @copyright Copyright 2005-2012, Cake Software Foundation, Inc. (http://cakefoundation.org)
  14. * @link http://book.cakephp.org/view/1196/Testing CakePHP(tm) Tests
  15. * @package cake
  16. * @subpackage cake.tests.cases.libs
  17. * @since CakePHP(tm) v 1.2.0.4206
  18. * @license http://www.opensource.org/licenses/opengroup.php The Open Group Test Suite License
  19. */
  20. require_once CAKE . 'tests' . DS . 'lib' . DS . 'code_coverage_manager.php';
  21. require_once CAKE . 'tests' . DS . 'lib' . DS . 'reporter' . DS . 'cake_cli_reporter.php';
  22. /**
  23. * CodeCoverageManagerTest class
  24. *
  25. * @package cake
  26. * @subpackage cake.tests.cases.libs
  27. */
  28. class CodeCoverageManagerTest extends CakeTestCase {
  29. /**
  30. * Skip if XDebug not installed
  31. *
  32. * @access public
  33. */
  34. function skip() {
  35. $this->skipIf(!extension_loaded('xdebug'), '%s XDebug not installed');
  36. }
  37. /**
  38. * startTest Method
  39. * Store reference of $_GET to restore later.
  40. *
  41. * @return void
  42. */
  43. function startCase() {
  44. $this->_get = $_GET;
  45. }
  46. /**
  47. * End Case - restore GET vars.
  48. *
  49. * @return void
  50. */
  51. function endCase() {
  52. $_GET = $this->_get;
  53. }
  54. /**
  55. * testNoTestCaseSupplied method
  56. *
  57. * @access public
  58. * @return void
  59. */
  60. function testNoTestCaseSupplied() {
  61. if ($this->skipIf(PHP_SAPI == 'cli', 'Is cli, cannot run this test %s')) {
  62. return;
  63. }
  64. $reporter =& new CakeHtmlReporter(null, array('group' => false, 'app' => false, 'plugin' => false));
  65. CodeCoverageManager::init(substr(md5(microtime()), 0, 5), $reporter);
  66. CodeCoverageManager::report(false);
  67. $this->assertError();
  68. CodeCoverageManager::init('tests' . DS . 'lib' . DS . basename(__FILE__), $reporter);
  69. CodeCoverageManager::report(false);
  70. $this->assertError();
  71. }
  72. /**
  73. * Test that test cases don't cause errors
  74. *
  75. * @return void
  76. */
  77. function testNoTestCaseSuppliedNoErrors() {
  78. if ($this->skipIf(PHP_SAPI == 'cli', 'Is cli, cannot run this test %s')) {
  79. return;
  80. }
  81. $reporter =& new CakeHtmlReporter(null, array('group' => false, 'app' => false, 'plugin' => false));
  82. $path = LIBS;
  83. if (strpos(LIBS, ROOT) === false) {
  84. $path = ROOT.DS.LIBS;
  85. }
  86. App::import('Core', 'Folder');
  87. $folder = new Folder();
  88. $folder->cd($path);
  89. $contents = $folder->read();
  90. $contents[1] = array_filter($contents[1], array(&$this, '_basenameFilter'));
  91. foreach ($contents[1] as $file) {
  92. CodeCoverageManager::init('libs' . DS . $file, $reporter);
  93. CodeCoverageManager::report(false);
  94. $this->assertNoErrors('libs' . DS . $file);
  95. }
  96. }
  97. /**
  98. * Remove file names that don't share a basename with the current file.
  99. *
  100. * @return void
  101. */
  102. function _basenameFilter($var) {
  103. return ($var != basename(__FILE__));
  104. }
  105. /**
  106. * testGetTestObjectFileNameFromTestCaseFile method
  107. *
  108. * @access public
  109. * @return void
  110. */
  111. function testGetTestObjectFileNameFromTestCaseFile() {
  112. $manager =& CodeCoverageManager::getInstance();
  113. $manager->reporter = new CakeHtmlReporter();
  114. $expected = $manager->__testObjectFileFromCaseFile('models/some_file.test.php', true);
  115. $this->assertIdentical(APP.'models'.DS.'some_file.php', $expected);
  116. $expected = $manager->__testObjectFileFromCaseFile('models/datasources/some_file.test.php', true);
  117. $this->assertIdentical(APP.'models'.DS.'datasources'.DS.'some_file.php', $expected);
  118. $expected = $manager->__testObjectFileFromCaseFile('controllers/some_file.test.php', true);
  119. $this->assertIdentical(APP.'controllers'.DS.'some_file.php', $expected);
  120. $expected = $manager->__testObjectFileFromCaseFile('views/some_file.test.php', true);
  121. $this->assertIdentical(APP.'views'.DS.'some_file.php', $expected);
  122. $expected = $manager->__testObjectFileFromCaseFile('behaviors/some_file.test.php', true);
  123. $this->assertIdentical(APP.'models'.DS.'behaviors'.DS.'some_file.php', $expected);
  124. $expected = $manager->__testObjectFileFromCaseFile('components/some_file.test.php', true);
  125. $this->assertIdentical(APP.'controllers'.DS.'components'.DS.'some_file.php', $expected);
  126. $expected = $manager->__testObjectFileFromCaseFile('helpers/some_file.test.php', true);
  127. $this->assertIdentical(APP.'views'.DS.'helpers'.DS.'some_file.php', $expected);
  128. $manager->pluginTest = 'bugs';
  129. $expected = $manager->__testObjectFileFromCaseFile('models/some_file.test.php', false);
  130. $this->assertIdentical(APP.'plugins'.DS.'bugs'.DS.'models'.DS.'some_file.php', $expected);
  131. $manager->pluginTest = false;
  132. $manager->reporter = new CakeCliReporter;
  133. $expected = $manager->__testObjectFileFromCaseFile('libs/set.test.php', false);
  134. $this->assertIdentical(ROOT.DS.'cake'.DS.'libs'.DS.'set.php', $expected);
  135. }
  136. /**
  137. * testOfHtmlDiffReport method
  138. *
  139. * @access public
  140. * @return void
  141. */
  142. function testOfHtmlDiffReport() {
  143. $manager =& CodeCoverageManager::getInstance();
  144. $code = <<<PHP
  145. /**
  146. * Set class
  147. *
  148. * @package cake
  149. * @subpackage cake.tests.cases.libs
  150. */
  151. class Set extends Object {
  152. /**
  153. * Value of the Set object.
  154. *
  155. * @var array
  156. * @access public
  157. */
  158. var \$value = array();
  159. /**
  160. * Constructor. Defaults to an empty array.
  161. *
  162. * @access public
  163. */
  164. function __construct() {
  165. if (func_num_args() == 1 && is_array(func_get_arg(0))) {
  166. \$this->value = func_get_arg(0);
  167. } else {
  168. \$this->value = func_get_args();
  169. }
  170. }
  171. /**
  172. * Returns the contents of the Set object
  173. *
  174. * @return array
  175. * @access public
  176. */
  177. function &get() {
  178. return \$this->value;
  179. }
  180. /**
  181. * This function can be thought of as a hybrid between PHP's array_merge and array_merge_recursive. The difference
  182. * to the two is that if an array key contains another array then the function behaves recursive (unlike array_merge)
  183. * but does not do if for keys containing strings (unlike array_merge_recursive). See the unit test for more information.
  184. *
  185. * Note: This function will work with an unlimited amount of arguments and typecasts non-array parameters into arrays.
  186. *
  187. * @param array \$arr1 Array to be merged
  188. * @param array \$arr2 Array to merge with
  189. * @return array Merged array
  190. * @access public
  191. */
  192. function merge(\$arr1, \$arr2 = null) {
  193. \$args = func_get_args();
  194. if (isset(\$this) && is_a(\$this, 'set')) {
  195. \$backtrace = debug_backtrace();
  196. \$previousCall = strtolower(\$backtrace[1]['class'].'::'.\$backtrace[1]['function']);
  197. if (\$previousCall != 'set::merge') {
  198. \$r =& \$this->value;
  199. array_unshift(\$args, null);
  200. }
  201. }
  202. if (!isset(\$r)) {
  203. \$r = (array)current(\$args);
  204. }
  205. while ((\$arg = next(\$args)) !== false) {
  206. if (is_a(\$arg, 'set')) {
  207. \$arg = \$arg->get();
  208. }
  209. foreach ((array)\$arg as \$key => \$val) {
  210. if (is_array(\$val) && isset(\$r[\$key]) && is_array(\$r[\$key])) {
  211. \$r[\$key] = Set::merge(\$r[\$key], \$val);
  212. } elseif (is_int(\$key)) {
  213. } else {
  214. \$r[\$key] = \$val;
  215. }
  216. }
  217. }
  218. return \$r;
  219. }
  220. PHP;
  221. $testObjectFile = explode("\n", $code);
  222. $coverageData = array(
  223. 0 => 1,
  224. 1 => 1,
  225. 2 => -2,
  226. 3 => -2,
  227. 4 => -2,
  228. 5 => -2,
  229. 6 => -2,
  230. 7 => -2,
  231. 8 => -1,
  232. 9 => -2,
  233. 10 => -2,
  234. 11 => -2,
  235. 12 => -2,
  236. 13 => -2,
  237. 14 => 1,
  238. 15 => 1,
  239. 16 => -1,
  240. 17 => 1,
  241. 18 => 1,
  242. 19 => -1,
  243. 20 => 1,
  244. 21 => -2,
  245. 22 => -2,
  246. 23 => -2,
  247. 24 => -2,
  248. 25 => -2,
  249. 26 => -2,
  250. 27 => 1,
  251. 28 => -1,
  252. 29 => 1,
  253. 30 => 1,
  254. 31 => -2,
  255. 32 => -2,
  256. 33 => -2,
  257. 34 => -2,
  258. 35 => -2,
  259. 36 => -2,
  260. 37 => -2,
  261. 38 => -2,
  262. 39 => -2,
  263. 40 => -2,
  264. 41 => -2,
  265. 42 => -2,
  266. 43 => -1,
  267. 44 => -2,
  268. 45 => -2,
  269. 46 => -2,
  270. 47 => -2,
  271. 48 => 1,
  272. 49 => 1,
  273. 50 => -1,
  274. 51 => 1,
  275. 52 => 1,
  276. 53 => -2,
  277. 54 => -2,
  278. 55 => 1,
  279. 56 => 1,
  280. 57 => 1,
  281. 58 => 1,
  282. 59 => -1,
  283. 60 => 1,
  284. 61 => 1,
  285. 62 => -2,
  286. 63 => -2,
  287. 64 => 1,
  288. 65 => -2,
  289. 66 => 1,
  290. 67 => -1,
  291. 68 => -2,
  292. 69 => -1,
  293. 70 => -1,
  294. 71 => 1,
  295. 72 => -2,
  296. );
  297. $expected = array(
  298. 0 => 'ignored',
  299. 1 => 'ignored',
  300. 2 => 'ignored',
  301. 3 => 'ignored',
  302. 4 => 'ignored',
  303. 5 => 'ignored show start realstart',
  304. 6 => 'ignored show',
  305. 7 => 'ignored show',
  306. 8 => 'uncovered show',
  307. 9 => 'ignored show',
  308. 10 => 'ignored show',
  309. 11 => 'ignored show end',
  310. 12 => 'ignored',
  311. 13 => 'ignored show start',
  312. 14 => 'covered show',
  313. 15 => 'covered show',
  314. 16 => 'uncovered show',
  315. 17 => 'covered show show',
  316. 18 => 'covered show show',
  317. 19 => 'uncovered show',
  318. 20 => 'covered show',
  319. 21 => 'ignored show',
  320. 22 => 'ignored show end',
  321. 23 => 'ignored',
  322. 24 => 'ignored',
  323. 25 => 'ignored show start',
  324. 26 => 'ignored show',
  325. 27 => 'covered show',
  326. 28 => 'uncovered show',
  327. 29 => 'covered show',
  328. 30 => 'covered show',
  329. 31 => 'ignored show end',
  330. 32 => 'ignored',
  331. 33 => 'ignored',
  332. 34 => 'ignored',
  333. 35 => 'ignored',
  334. 36 => 'ignored',
  335. 37 => 'ignored',
  336. 38 => 'ignored',
  337. 39 => 'ignored',
  338. 40 => 'ignored show start',
  339. 41 => 'ignored show',
  340. 42 => 'ignored show',
  341. 43 => 'uncovered show',
  342. 41 => 'ignored show',
  343. 42 => 'ignored show',
  344. 43 => 'uncovered show',
  345. 44 => 'ignored show',
  346. 45 => 'ignored show',
  347. 46 => 'ignored show',
  348. 47 => 'ignored show',
  349. 48 => 'covered show',
  350. 49 => 'covered show',
  351. 50 => 'uncovered show',
  352. 51 => 'covered show',
  353. 52 => 'covered show',
  354. 53 => 'ignored show end',
  355. 54 => 'ignored',
  356. 55 => 'covered',
  357. 56 => 'covered show start',
  358. 57 => 'covered show',
  359. 58 => 'covered show',
  360. 59 => 'uncovered show',
  361. 60 => 'covered show',
  362. 61 => 'covered show',
  363. 62 => 'ignored show end',
  364. 63 => 'ignored',
  365. 64 => 'covered show start',
  366. 65 => 'ignored show',
  367. 66 => 'covered show show',
  368. 67 => 'uncovered show',
  369. 68 => 'ignored show',
  370. 69 => 'uncovered show',
  371. 70 => 'uncovered show',
  372. 71 => 'covered show',
  373. 72 => 'ignored show',
  374. 73 => 'ignored show end end',
  375. );
  376. $execCodeLines = range(0, 72);
  377. $result = explode("</div>", $report = $manager->reportCaseHtmlDiff($testObjectFile, $coverageData, $execCodeLines, 3));
  378. foreach ($result as $line) {
  379. preg_match('/<span class="line-num">(.*?)<\/span>/', $line, $matches);
  380. if (!isset($matches[1])) {
  381. continue;
  382. }
  383. $num = $matches[1];
  384. $class = $expected[$num];
  385. $pattern = '/<div class="code-line '.$class.'">/';
  386. $this->assertPattern($pattern, $line, $num.': '.$line." fails");
  387. }
  388. }
  389. /**
  390. * testArrayStrrpos method
  391. *
  392. * @access public
  393. * @return void
  394. */
  395. function testArrayStrrpos() {
  396. $manager =& CodeCoverageManager::getInstance();
  397. $a = array(
  398. 'apples',
  399. 'bananas',
  400. 'oranges'
  401. );
  402. $this->assertEqual(1, $manager->__array_strpos($a, 'ba', true));
  403. $this->assertEqual(2, $manager->__array_strpos($a, 'range', true));
  404. $this->assertEqual(0, $manager->__array_strpos($a, 'pp', true));
  405. $this->assertFalse($manager->__array_strpos('', 'ba', true));
  406. $this->assertFalse($manager->__array_strpos(false, 'ba', true));
  407. $this->assertFalse($manager->__array_strpos(array(), 'ba', true));
  408. $a = array(
  409. 'rang',
  410. 'orange',
  411. 'oranges'
  412. );
  413. $this->assertEqual(0, $manager->__array_strpos($a, 'rang'));
  414. $this->assertEqual(2, $manager->__array_strpos($a, 'rang', true));
  415. $this->assertEqual(1, $manager->__array_strpos($a, 'orange', false));
  416. $this->assertEqual(1, $manager->__array_strpos($a, 'orange'));
  417. $this->assertEqual(2, $manager->__array_strpos($a, 'orange', true));
  418. }
  419. /**
  420. * testGetExecutableLines method
  421. *
  422. * @access public
  423. * @return void
  424. */
  425. function testGetExecutableLines() {
  426. $manager =& CodeCoverageManager::getInstance();
  427. $code = <<<HTML
  428. \$manager =& CodeCoverageManager::getInstance();
  429. HTML;
  430. $result = $manager->__getExecutableLines($code);
  431. foreach ($result as $line) {
  432. $this->assertNotIdentical($line, '');
  433. }
  434. $code = <<<HTML
  435. {
  436. }
  437. <?php?>
  438. ?>
  439. <?php
  440. }
  441. {{}}
  442. (())
  443. @codeCoverageIgnoreStart
  444. some
  445. more
  446. code
  447. here
  448. @codeCoverageIgnoreEnd
  449. HTML;
  450. $result = $manager->__getExecutableLines($code);
  451. foreach ($result as $line) {
  452. $this->assertIdentical(trim($line), '');
  453. }
  454. }
  455. /**
  456. * testCalculateCodeCoverage method
  457. *
  458. * @access public
  459. * @return void
  460. */
  461. function testCalculateCodeCoverage() {
  462. $manager =& CodeCoverageManager::getInstance();
  463. $data = array(
  464. '25' => array(100, 25),
  465. '50' => array(100, 50),
  466. '0' => array(0, 0),
  467. '0' => array(100, 0),
  468. '100' => array(100, 100),
  469. );
  470. foreach ($data as $coverage => $lines) {
  471. $this->assertEqual($coverage, $manager->__calcCoverage($lines[0], $lines[1]));
  472. }
  473. $manager->__calcCoverage(100, 1000);
  474. $this->assertError();
  475. }
  476. }