]> CyberLeo.Net >> Repos - Github/sugarcrm.git/blob - tests/PHPUnit/PHP/CodeCoverage/Report/HTML/Renderer/Dashboard.php
Merge branch 'master' of github.com:sugarcrm/sugarcrm_dev
[Github/sugarcrm.git] / tests / PHPUnit / PHP / CodeCoverage / Report / HTML / Renderer / Dashboard.php
1 <?php
2 /**
3  * PHP_CodeCoverage
4  *
5  * Copyright (c) 2009-2011, Sebastian Bergmann <sb@sebastian-bergmann.de>.
6  * All rights reserved.
7  *
8  * Redistribution and use in source and binary forms, with or without
9  * modification, are permitted provided that the following conditions
10  * are met:
11  *
12  *   * Redistributions of source code must retain the above copyright
13  *     notice, this list of conditions and the following disclaimer.
14  *
15  *   * Redistributions in binary form must reproduce the above copyright
16  *     notice, this list of conditions and the following disclaimer in
17  *     the documentation and/or other materials provided with the
18  *     distribution.
19  *
20  *   * Neither the name of Sebastian Bergmann nor the names of his
21  *     contributors may be used to endorse or promote products derived
22  *     from this software without specific prior written permission.
23  *
24  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
25  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
26  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
27  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
28  * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
29  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
30  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
31  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
32  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
33  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
34  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
35  * POSSIBILITY OF SUCH DAMAGE.
36  *
37  * @category   PHP
38  * @package    CodeCoverage
39  * @author     Sebastian Bergmann <sb@sebastian-bergmann.de>
40  * @copyright  2009-2011 Sebastian Bergmann <sb@sebastian-bergmann.de>
41  * @license    http://www.opensource.org/licenses/bsd-license.php  BSD License
42  * @link       http://github.com/sebastianbergmann/php-code-coverage
43  * @since      File available since Release 1.1.0
44  */
45
46 /**
47  * Renders the dashboard for a PHP_CodeCoverage_Report_Node_Directory node.
48  *
49  * @category   PHP
50  * @package    CodeCoverage
51  * @author     Sebastian Bergmann <sb@sebastian-bergmann.de>
52  * @copyright  2009-2011 Sebastian Bergmann <sb@sebastian-bergmann.de>
53  * @license    http://www.opensource.org/licenses/bsd-license.php  BSD License
54  * @version    Release: 1.1.1
55  * @link       http://github.com/sebastianbergmann/php-code-coverage
56  * @since      Class available since Release 1.1.0
57  */
58 class PHP_CodeCoverage_Report_HTML_Renderer_Dashboard extends PHP_CodeCoverage_Report_HTML_Renderer
59 {
60     /**
61      * @param PHP_CodeCoverage_Report_Node_Directory $node
62      * @param string                                 $file
63      * @param string                                 $title
64      */
65     public function render(PHP_CodeCoverage_Report_Node_Directory $node, $file, $title = NULL)
66     {
67         if ($title === NULL) {
68             $title = $node->getName();
69         }
70
71         $classes  = array_merge($node->getClasses(), $node->getTraits());
72         $template = new Text_Template(
73           $this->templatePath . 'dashboard.html'
74         );
75
76         $this->setCommonTemplateVariables($template, $title);
77
78         $template->setVar(
79           array(
80             'least_tested_methods' => $this->leastTestedMethods($classes),
81             'top_project_risks'    => $this->topProjectRisks($classes),
82             'cc_values'            => $this->classComplexity($classes),
83             'ccd_values'           => $this->classCoverageDistribution($classes),
84             'backlink'             => basename(str_replace('.dashboard', '', $file))
85           )
86         );
87
88         $template->renderTo($file);
89     }
90
91     /**
92      * Returns the data for the Class Complexity chart.
93      *
94      * @param  array $classes
95      * @return string
96      */
97     protected function classComplexity(array $classes)
98     {
99         $data = array();
100
101         foreach ($classes as $name => $class) {
102             $data[] = array(
103               $class['coverage'],
104               $class['ccn'],
105               sprintf(
106                 '<a href="%s">%s</a>',
107                 $class['link'],
108                 $name
109               )
110             );
111         }
112
113         return json_encode($data);
114     }
115
116     /**
117      * Returns the data for the Class Coverage Distribution chart.
118      *
119      * @param  array $classes
120      * @return string
121      */
122     protected function classCoverageDistribution(array $classes)
123     {
124         $data = array(
125           '0%'      => 0,
126           '0-10%'   => 0,
127           '10-20%'  => 0,
128           '20-30%'  => 0,
129           '30-40%'  => 0,
130           '40-50%'  => 0,
131           '50-60%'  => 0,
132           '60-70%'  => 0,
133           '70-80%'  => 0,
134           '80-90%'  => 0,
135           '90-100%' => 0,
136           '100%'    => 0
137         );
138
139         foreach ($classes as $class) {
140             if ($class['coverage'] == 0) {
141                 $data['0%']++;
142             }
143
144             else if ($class['coverage'] == 100) {
145                 $data['100%']++;
146             }
147
148             else {
149                 $key = floor($class['coverage']/10)*10;
150                 $key = $key . '-' . ($key + 10) . '%';
151                 $data[$key]++;
152             }
153         }
154
155         return json_encode(array_values($data));
156     }
157
158     /**
159      * Returns the least tested methods.
160      *
161      * @param  array   $classes
162      * @param  integer $max
163      * @return string
164      */
165     protected function leastTestedMethods(array $classes, $max = 10)
166     {
167         $methods = array();
168
169         foreach ($classes as $className => $class) {
170             foreach ($class['methods'] as $methodName => $method) {
171                 if ($method['coverage'] < 100) {
172                     if ($className != '*') {
173                         $key = $className . '::' . $methodName;
174                     } else {
175                         $key = $methodName;
176                     }
177
178                     $methods[$key] = $method['coverage'];
179                 }
180             }
181         }
182
183         asort($methods);
184
185         $methods = array_slice($methods, 0, min($max, count($methods)));
186         $buffer  = '';
187
188         foreach ($methods as $name => $coverage) {
189             list($class, $method) = explode('::', $name);
190
191             $buffer .= sprintf(
192               '              <li><a href="%s">%s</a> (%d%%)</li>' . "\n",
193               $classes[$class]['methods'][$method]['link'],
194               $name,
195               $coverage
196             );
197         }
198
199         return $buffer;
200     }
201
202     /**
203      * Returns the top project risks according to the CRAP index.
204      *
205      * @param  array   $classes
206      * @param  integer $max
207      * @return string
208      */
209     protected function topProjectRisks(array $classes, $max = 10)
210     {
211         $risks = array();
212
213         foreach ($classes as $className => $class) {
214             if ($class['coverage'] < 100 &&
215                 $class['ccn'] > count($class['methods'])) {
216                 $risks[$className] = $class['crap'];
217             }
218         }
219
220         arsort($risks);
221
222         $buffer = '';
223         $risks  = array_slice($risks, 0, min($max, count($risks)));
224
225         foreach ($risks as $name => $crap) {
226             $buffer .= sprintf(
227               '              <li><a href="%s">%s</a> (%d)</li>' . "\n",
228               $classes[$name]['link'],
229               $name,
230               $crap
231             );
232         }
233
234         return $buffer;
235     }
236 }