1<?xml version="1.0" encoding="utf-8"?>
2<!--
3#
4# Copyright (C) 2006 Daniel Berrange
5#
6# This program is free software; you can redistribute it and/or modify
7# it under the terms of the GNU General Public License as published by
8# the Free Software Foundation; either version 2 of the License, or
9# (at your option) any later version.
10#
11# This program is distributed in the hope that it will be useful,
12# but WITHOUT ANY WARRANTY; without even the implied warranty of
13# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14# GNU General Public License for more details.
15#
16# You should have received a copy of the GNU General Public License
17# along with this program; if not, write to the Free Software
18# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
19-->
20<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
21                version="1.0">
22
23  <xsl:output method="html"/>
24
25  <xsl:template match="coverage">
26    <html>
27      <head>
28        <title>Coverage report</title>
29        <style type="text/css">
30          tbody tr.odd td.label {
31            border-top: 1px solid rgb(128,128,128);
32            border-bottom: 1px solid rgb(128,128,128);
33          }
34          tbody tr.odd td.label {
35            background: rgb(200,200,200);
36          }
37
38          thead, tfoot {
39            background: rgb(60,60,60);
40            color: white;
41            font-weight: bold;
42          }
43
44          tr td.perfect {
45            background: rgb(0,255,0);
46            color: black;
47          }
48          tr td.excellant {
49            background: rgb(140,255,140);
50            color: black;
51          }
52          tr td.good {
53            background: rgb(160,255,0);
54            color: black;
55          }
56          tr td.poor {
57            background: rgb(255,160,0);
58            color: black;
59          }
60          tr td.bad {
61            background: rgb(255,140,140);
62            color: black;
63          }
64          tr td.terrible {
65            background: rgb(255,0,0);
66            color: black;
67          }
68        </style>
69      </head>
70      <body>
71        <h1>Coverage report</h1>
72        <xsl:apply-templates/>
73      </body>
74    </html>
75  </xsl:template>
76
77  <xsl:template match="functions">
78    <h2>Function coverage</h2>
79    <xsl:call-template name="content">
80      <xsl:with-param name="type" select="'function'"/>
81    </xsl:call-template>
82  </xsl:template>
83
84
85  <xsl:template match="files">
86    <h2>File coverage</h2>
87    <xsl:call-template name="content">
88      <xsl:with-param name="type" select="'file'"/>
89    </xsl:call-template>
90  </xsl:template>
91
92  <xsl:template name="content">
93    <xsl:param name="type"/>
94    <table>
95      <thead>
96        <tr>
97          <th>Name</th>
98          <th>Lines</th>
99          <th>Branches</th>
100          <th>Conditions</th>
101          <th>Calls</th>
102        </tr>
103      </thead>
104      <tbody>
105        <xsl:for-each select="entry">
106          <xsl:call-template name="entry">
107            <xsl:with-param name="type" select="$type"/>
108            <xsl:with-param name="class">
109              <xsl:choose>
110                <xsl:when test="position() mod 2">
111                  <xsl:text>odd</xsl:text>
112                </xsl:when>
113                <xsl:otherwise>
114                  <xsl:text>even</xsl:text>
115                </xsl:otherwise>
116              </xsl:choose>
117            </xsl:with-param>
118          </xsl:call-template>
119        </xsl:for-each>
120      </tbody>
121      <tfoot>
122        <xsl:for-each select="summary">
123          <xsl:call-template name="entry">
124            <xsl:with-param name="type" select="'summary'"/>
125            <xsl:with-param name="class">
126              <xsl:choose>
127                <xsl:when test="position() mod 2">
128                  <xsl:text>odd</xsl:text>
129                </xsl:when>
130                <xsl:otherwise>
131                  <xsl:text>even</xsl:text>
132                </xsl:otherwise>
133              </xsl:choose>
134            </xsl:with-param>
135          </xsl:call-template>
136        </xsl:for-each>
137      </tfoot>
138    </table>
139  </xsl:template>
140
141  <xsl:template name="entry">
142    <xsl:param name="type"/>
143    <xsl:param name="class"/>
144    <tr class="{$class}">
145      <xsl:choose>
146        <xsl:when test="$type = 'function'">
147          <td class="label"><a href="{@details}.html#{@name}"><xsl:value-of select="@name"/></a></td>
148        </xsl:when>
149        <xsl:when test="$type = 'file'">
150          <td class="label"><a href="{@details}.html"><xsl:value-of select="@name"/></a></td>
151        </xsl:when>
152        <xsl:otherwise>
153          <td class="label">Summary</td>
154        </xsl:otherwise>
155      </xsl:choose>
156
157      <xsl:if test="count(lines)">
158        <xsl:apply-templates select="lines"/>
159      </xsl:if>
160      <xsl:if test="not(count(lines))">
161        <xsl:call-template name="missing"/>
162      </xsl:if>
163
164      <xsl:if test="count(branches)">
165        <xsl:apply-templates select="branches"/>
166      </xsl:if>
167      <xsl:if test="not(count(branches))">
168        <xsl:call-template name="missing"/>
169      </xsl:if>
170
171      <xsl:if test="count(conditions)">
172        <xsl:apply-templates select="conditions"/>
173      </xsl:if>
174      <xsl:if test="not(count(conditions))">
175        <xsl:call-template name="missing"/>
176      </xsl:if>
177
178      <xsl:if test="count(calls)">
179        <xsl:apply-templates select="calls"/>
180      </xsl:if>
181      <xsl:if test="not(count(calls))">
182        <xsl:call-template name="missing"/>
183      </xsl:if>
184
185    </tr>
186  </xsl:template>
187
188  <xsl:template match="lines">
189    <xsl:call-template name="row"/>
190  </xsl:template>
191
192  <xsl:template match="branches">
193    <xsl:call-template name="row"/>
194  </xsl:template>
195
196  <xsl:template match="conditions">
197    <xsl:call-template name="row"/>
198  </xsl:template>
199
200  <xsl:template match="calls">
201    <xsl:call-template name="row"/>
202  </xsl:template>
203
204  <xsl:template name="missing">
205    <td></td>
206  </xsl:template>
207
208  <xsl:template name="row">
209    <xsl:variable name="quality">
210      <xsl:choose>
211        <xsl:when test="@coverage = 100">
212          <xsl:text>perfect</xsl:text>
213        </xsl:when>
214        <xsl:when test="@coverage >= 80.0">
215          <xsl:text>excellant</xsl:text>
216        </xsl:when>
217        <xsl:when test="@coverage >= 60.0">
218          <xsl:text>good</xsl:text>
219        </xsl:when>
220        <xsl:when test="@coverage >= 40.0">
221          <xsl:text>poor</xsl:text>
222        </xsl:when>
223        <xsl:when test="@coverage >= 20.0">
224          <xsl:text>bad</xsl:text>
225        </xsl:when>
226        <xsl:otherwise>
227          <xsl:text>terrible</xsl:text>
228        </xsl:otherwise>
229      </xsl:choose>
230    </xsl:variable>
231
232    <td class="{$quality}"><xsl:value-of select="@coverage"/>% of <xsl:value-of select="@count"/></td>
233  </xsl:template>
234
235</xsl:stylesheet>
236