Project

General

Profile

Feature #5520 » cov.ftl

Шаблон ftl - Радек Мария, 06/17/2016 06:02 PM

 
<#--
/* Copyright 2009-2011 ISP RAS (http://www.ispras.ru), UniTESK Lab (http://www.unitesk.com)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-->
<#macro getCoverageClass node>
<#local covnum = coverage.getCoverageClass(node)/>
<#local covclass = "red"/>
<#if covnum = 1>
<#local covclass = "yellow"/>
<#else>
<#if covnum = 2>
<#local covclass = "green"/>
</#if>
</#if>
<#assign cclass = covclass/>
</#macro>

<#macro errordetect bool><#assign err=bool/></#macro>

<#macro finderror ferr lvl>
<#local node = ferr/>
<#local childrenList = node.getSortedChildren()/>
<#list childrenList as child>
<#if child.getType() = "Requirement">
<#local hasChild = 1/>
<#else>
<#if child.getType() = "TestPurpose">
<#local hasChild = 1/>
</#if>
</#if>
</#list>
<#local testsCount = coverage.getCoverageTestCount(node.getQualifiedId())/>
<#if (testsCount>0)>
<#local testPathList = coverage.getCoveragePaths(node.getQualifiedId())/>
<#list testPathList as path>
<#if coverage.hasErrors(node.getQualifiedId(),path)><@errordetect 1/></#if>
</#list>
</#if>
<#if (hasChild!0) != 0>
<#local childrenTestPurposeList = node.getSortedChildren("TestPurpose")/>
<#list childrenTestPurposeList as childTestPurpose>
<#local testsCount = coverage.getCoverageTestCount(childTestPurpose.getQualifiedId())/>
<#local testPathList = coverage.getCoveragePaths(childTestPurpose.getQualifiedId())/>
<#if (testsCount>0)>
<#list testPathList as path>
<#if coverage.hasErrors(childTestPurpose.getQualifiedId(),path)><@errordetect 1/></#if>
</#list>
</#if>
</#list>
</#if>
<#list childrenList as child>
<#if child.getType() = "Requirement"><@finderror child lvl+1/></#if>
</#list>
</#macro>

<#macro num bl><#assign block= bl/></#macro>

<#macro showreq req lvl>
<#local node = req/>
<#local childrenList = node.getSortedChildren()/>
<@getCoverageClass node/>
<#local covclass = cclass/>
<#list childrenList as child>
<#if child.getType() = "Requirement">
<#local hasChild = 1/>
<#else>
<#if child.getType() = "TestPurpose">
<#local hasChild = 1/>
</#if>
</#if>
</#list>
<#local testsCount = coverage.getCoverageTestCount(node.getQualifiedId())/>
<#if (testsCount>0)>
<#local testPathList = coverage.getCoveragePaths(node.getQualifiedId())/>
<#local testCntList = coverage.getCoverageCounts(node.getQualifiedId())/>
</#if>
<@errordetect 0/>
<#if (testsCount>0)>
<#list testPathList as path>
<#if coverage.hasErrors(node.getQualifiedId(),path)><@errordetect 1/></#if>
</#list>
</#if>
<#if err==0>
<#if (hasChild!0) != 0><#list childrenList as child>
<@finderror child lvl+1/>
</#list></#if>
</#if>
<#if err==1>
<h${lvl} style="margin-bottom:0px;" class="markerror"><table style="border-radius:5px 5px 0px 0px; border: outset 1px ${covclass}; width:100%;" class="${covclass}">
<tr>
<td onClick="toggle('block${block}', '${block}');">
<img id="${block}" width="20px" height="20px" src="data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs%3D" onLoad="this.onload=null; this.src=get_png_image_src(0);"/>
<text style="text-align:center;"><strong>${utils.htmlEscape(node.getUserFriendlyName(true))}</strong></text><text style="color:red"><strong> *</strong></text>
</td>
<#if showbuttons><td><button class="addtest" style="float:right;" onclick='callAddTest("${node.getQualifiedId()}");return false'>Add test</button></td></#if>
</tr>
</table></h${lvl}>
<div id = "block${block}" class="block" style="border-color:${covclass}">
<#else>
<h${lvl} style="margin-bottom:0px;"><table style="border-radius:5px 5px 0px 0px; border: outset 1px ${covclass}; width:100%;" class="${covclass}">
<tr>
<td onClick="toggle('block${block}', '${block}');">
<img id="${block}" width="20px" height="20px" src="data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs%3D" onLoad="this.onload=null; this.src=get_png_image_src(0);"/>
<text style="text-align:center"><strong>${utils.htmlEscape(node.getUserFriendlyName(true))}</strong></text></td>
<#if showbuttons><td><button class="addtest" style="float:right;" onclick='callAddTest("${node.getQualifiedId()}");return false'>Add test</button></td></#if>
</tr>
</table></h${lvl}>
<div id = "block${block}" class="block" style="border-color:${covclass}">
</#if>
<@num block+1/>
<#if (testsCount>0)>
<#local iterate = 0/>
<#list testPathList as path>
<table style="text-align:left; word-break: break-all; width:100%">
<tr>
<td style="width:45px;"><strong>Test: </strong></td>
<td><a onclick = 'if(typeof openEditor != "undefined"){if(openEditor("${path}")!=null)return false;}window.location.href="${path}";' href = "#">${path}</a></td>
<#if (testCntList[iterate]>-1)>
<td rowspan = "2" style="padding-left:30px;">
<#else>
<td rowspan = "1" style="padding-left:30px;">
</#if>
<#if coverage.hasErrors(node.getQualifiedId(),path)>
<table id="errortable" max-width = "50%" align = "right">
<tr>
<th style="padding:5px;">Наименование ошибки</th>
<th style="padding:5px;">Описание ошибки</th>
</tr>
<#local errors_names=coverage.getErrorNamesForNodeAndTest(node.getQualifiedId(),path)/>
<#local errors_desc=coverage.getErrorDescriptionsForNodeAndTest(node.getQualifiedId(),path)/>
<#local errors_links=coverage.getErrorLinksForNodeAndTest(node.getQualifiedId(),path)/>
<#list 0..errors_names?size-1 as i>
<#local error_name=(errors_names[i])>
<#local error_desc=errors_desc[i]>
<#local error_link=errors_links[i]>
<tr>
<td style="text-align:center"><#if error_link!=""><a title='${error_link}' onclick = 'if(typeof openEditor != "undefined"){if(openEditor("${error_link}")!=null)return false;}window.location.href="${error_link}";' href = "#">${error_name}</a><#else>${error_name}</#if></td>
<td style="text-align:center">${error_desc}</td>
</tr>
</#list>
</table>
</#if>
</td>
</tr>
<#if (testCntList[iterate]>-1)>
<tr>
<td style="width:45px;"><strong>Hits: </strong></td>
<td>${testCntList[iterate]}</td>
</tr>
</#if>
</table>
<br/>
<#local iterate = iterate + 1/>
</#list>
</#if>
<#if (hasChild!0) != 0>
<div style="margin:10px;">
<#if node.getDescription(reportLocation)?has_content>
${utils.htmlSpaces(node.getDescription(reportLocation))}
<#else>
<#if node.getType() == "Requirement">
<#list node.getLocations() as location>
<#if (li!0) != 0>
<br/>...
</#if>
<#if !location.isHidden()>
${utils.htmlSpaces(location.getDescription(reportLocation))}
</#if>
<#local li = 1/>
</#list>
</#if>
</#if>
</div>

<#local childrenTestPurposeList = node.getSortedChildren("TestPurpose")/>
<#if childrenTestPurposeList?size != 0>
<table id="report">
<tr>
<th>Номер</th>
<th>Описание</th>
<th>Ожидаемые результаты</th>
<th>Teсты</th>
<th>Статус</th>
</tr>
<#list childrenTestPurposeList as childTestPurpose>
<@getCoverageClass childTestPurpose/>
<tr class="${cclass}">
<td>${utils.htmlEscape(childTestPurpose.getId())}</td>
<td>${utils.htmlSpaces(childTestPurpose.getDescription(reportLocation))!""}</td>
<td>${utils.htmlSpaces(childTestPurpose.getExpectedResults(reportLocation))}</td>
<td style="text-align:right;">
<#local testsCount = coverage.getCoverageTestCount(childTestPurpose.getQualifiedId())/>
<#local testPathList = coverage.getCoveragePaths(childTestPurpose.getQualifiedId())/>
<#local testCntList = coverage.getCoverageCounts(childTestPurpose.getQualifiedId())/>
<table style="width:100%"><tr>
<#if (testsCount>1)>
<td style="text-align:left; border: none;" >
<div style="width:105px;text-align:center;">
<img class="${block}" style="display:inline; float:left;" width="20px" height="20px" src="data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs%3D" onLoad="this.onload=null; this.src=get_png_image_src(1);"/>
<text onClick="toggletest('block${block}', '${block}');" class="${block}" style="cursor: pointer; cursor: hand; text-align:left; font-weight: bold; border-bottom: 1px dashed;">Развернуть список тестов</text></div>
</td>
</#if>
<#if showbuttons>
<td style="text-align:right; vertical-align:middle; border: none;"><button class="addtest" onclick='callAddTest("${childTestPurpose.getQualifiedId()}");return false'>Add test</button></td></#if>
</tr></table>
<#if (testsCount>0)>
<#local iterate = 0/>
<#if (testsCount>1)><div id = "block${block}" class="hidden"></#if>
<table id="report">
<tr><td style="border-width: 0px; border:none;">
<#list testPathList as path>
<hr/>
<table>
<tr>
<td style="text-align:left; border: 0px;"><strong>Test: </strong></td>
<td style="border: 0px;"><a onclick = 'if(typeof openEditor != "undefined"){if(openEditor("${path}")!=null)return false;}window.location.href="${path}";' href = "#">${path}</a></td>
</tr>
<#if (testCntList[iterate]>-1)>
<tr>
<td style="text-align:left; border: 0px;"><strong>Hits: </strong></td>
<td style="border: 0px;">${testCntList[iterate]}</td>
</tr>
</#if>
<#if coverage.hasErrors(childTestPurpose.getQualifiedId(),path)>
<#local errors_names=coverage.getErrorNamesForNodeAndTest(childTestPurpose.getQualifiedId(),path)/>
<#local errors_desc=coverage.getErrorDescriptionsForNodeAndTest(childTestPurpose.getQualifiedId(),path)/>
<#local errors_links=coverage.getErrorLinksForNodeAndTest(childTestPurpose.getQualifiedId(),path)/>
<tr>
<td style="text-align:left; border: 0px;"><strong>Errors: </strong></td>
<td style="border: 0px;">
<ul style="margin: 0px;">
<#list 0..errors_names?size-1 as i>
<#local error_name=(errors_names[i])>
<#local error_desc=errors_desc[i]>
<#local error_link=errors_links[i]>
<li><div title='${error_desc}'>
<#if error_link!="">
<a class="error" style="color:black; text-decoration:none;" onclick = 'if(typeof openEditor != "undefined"){if(openEditor("${error_link}")!=null)return false;}window.location.href="${error_link}";' href = "#">${error_name}</a>
<#else>${error_name}</#if>
</div></li>
</#list>
</ul></td>
</tr>
</#if>
</table>
<#local iterate = iterate + 1/>
</#list>
</td></tr>
</table>
<#if (testsCount>1)>
</div>
<@num block+1/>
</#if>
</#if>
</td>
<td>${childTestPurpose.getAttributeValue("_status", "")}</td>
</tr>
</#list>
</table>
</#if>
<#list childrenList as child>
<#if child.getType() = "Requirement">
<ul>
<li>
<@showreq child lvl+1/>
</li>
</ul>
</#if>
</#list>
<#else>
<div style="margin-left:${(lvl-1)*10}px;">
<#if node.getDescription(reportLocation)?has_content>
${utils.htmlSpaces(node.getDescription(reportLocation))}
<#else>
<#if node.getType()=="Requirement">
<#list node.getLocations() as location>
<#if (li!0) != 0 >
<br/>...
</#if>
<#if !location.isHidden()>
${utils.htmlSpaces(location.getDescription(reportLocation))}
</#if>
<#local li = 1/>
</#list>
</#if>
</#if>
</div>
</#if>
</div>
</#macro>

<#macro statistic req>
<#assign rev = statman.getArrayData(req, coverage)/>
<table class="table">
<tr><th>Measure</th><th>Requirements</th><th>Test purposes</th><th>Leaves</th><#if coverage.loadStorage()><th>Covered</th><th>Not covered</th></#if></tr>
<tr>
<td>Count</td>
<td>${rev["number of requirements"]}</td>
<td>${rev["number of test purposes"]}</td>
<td>${rev["number of leaves"]}</td>
<#if coverage.loadStorage()>
<td>${rev["number coverage (green status)"]}</td>
<td>${rev["number coverage (red status)"]}</td>
</tr>
<tr>
<td>Percent</td>
<td>-</td>
<td>-</td>
<td>-</td>
<td>${rev["percent coverage (green status)"]}%</td>
<td>${rev["percent coverage (red status)"]}%</td>
</#if>
</tr>
</table>
</#macro>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<style type="text/css">
.green {
background: #bcee68;
}
.red {
background: pink;
}
.yellow {
background: #fff68f;
}

.addtest{
width: 100px;
cursor: pointer; cursor: hand;
}

ul {
list-style-type: none;
margin-bottom: 10px;
margin-left:-25px;
margin-right:-10px;
}

a:link{
color:#236b8e;
}
a:visited{
color:#191970;
}
a:focus {
color:#2f2f4f;
text-shadow: 0px 0px 1px #2f2f4f, 1px 1px 2px #2f2f4f;
}
a:hover{
text-shadow: 0px 0px 1px grey;
}

.block {
width:auto;
clear:both;
padding:10px;
background:rgba(184,186,198, 0.1);
border: outset 1px #1e90ff;
border-top:none;
border-left:dotted 1px #1e90ff;
border-radius: 0px 0px 5px 5px;
box-shadow: 5px 5px 10px rgba(122, 122, 122, 0.5);
}

.hidden{
height:0px;
overflow: hidden;
}

.error{
text-shadow: 0px 0px 1px red, 2px 2px 3px rgb(255, 182, 193);
}

#errortable{
background: rgb(255, 182, 193);
border-collapse:collapse;
box-shadow: 5px 5px 10px rgba(122, 122, 122, 0.5);
}

#errortable td, #errortable th{
font-size:1em;
border:1px outset #FF69B4;
padding:3px 7px 2px 7px;
color:#000000;
}
#errortable th {
text-align:center;
padding-top:5px;
padding-bottom:4px;
background: rgb(204,204,204); /* Old browsers */
background: -moz-linear-gradient(top, rgba(204,204,204,1) 0%, rgba(238,238,238,1) 100%); /* FF3.6+ */
background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,rgba(204,204,204,1)), color-stop(100%,rgba(238,238,238,1))); /* Chrome,Safari4+ */
background: -webkit-linear-gradient(top, rgba(204,204,204,1) 0%,rgba(238,238,238,1) 100%); /* Chrome10+,Safari5.1+ */
background: -o-linear-gradient(top, rgba(204,204,204,1) 0%,rgba(238,238,238,1) 100%); /* Opera 11.10+ */
background: -ms-linear-gradient(top, rgba(204,204,204,1) 0%,rgba(238,238,238,1) 100%); /* IE10+ */
background: linear-gradient(to bottom, rgba(204,204,204,1) 0%,rgba(238,238,238,1) 100%); /* W3C */
filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#cccccc', endColorstr='#eeeeee',GradientType=0 ); /* IE6-9 */
}

.table{
background: white;
border-collapse:collapse;
box-shadow: 5px 5px 10px rgba(122, 122, 122, 0.5);
margin: 25px;
}

.table td, .table th{
font-size:1em;
border:1px outset black;
padding:3px 7px 2px 7px;
color:#000000;
}
.table th {
text-align:center;
padding-top:5px;
padding-bottom:4px;
background: rgb(204,204,204); /* Old browsers */
background: -moz-linear-gradient(top, rgba(204,204,204,1) 0%, rgba(238,238,238,1) 100%); /* FF3.6+ */
background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,rgba(204,204,204,1)), color-stop(100%,rgba(238,238,238,1))); /* Chrome,Safari4+ */
background: -webkit-linear-gradient(top, rgba(204,204,204,1) 0%,rgba(238,238,238,1) 100%); /* Chrome10+,Safari5.1+ */
background: -o-linear-gradient(top, rgba(204,204,204,1) 0%,rgba(238,238,238,1) 100%); /* Opera 11.10+ */
background: -ms-linear-gradient(top, rgba(204,204,204,1) 0%,rgba(238,238,238,1) 100%); /* IE10+ */
background: linear-gradient(to bottom, rgba(204,204,204,1) 0%,rgba(238,238,238,1) 100%); /* W3C */
filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#cccccc', endColorstr='#eeeeee',GradientType=0 ); /* IE6-9 */
}

#report td, #report th {
font-size:1em;
border:1px solid #666666;
color:#000000;
}
#report td{
vertical-align: text-top;
text-align:left;
}
#report th {
text-align:center;
padding-top:5px;
padding-bottom:4px;
background: rgb(204,204,204); /* Old browsers */
background: -moz-linear-gradient(top, rgba(204,204,204,1) 0%, rgba(238,238,238,1) 100%); /* FF3.6+ */
background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,rgba(204,204,204,1)), color-stop(100%,rgba(238,238,238,1))); /* Chrome,Safari4+ */
background: -webkit-linear-gradient(top, rgba(204,204,204,1) 0%,rgba(238,238,238,1) 100%); /* Chrome10+,Safari5.1+ */
background: -o-linear-gradient(top, rgba(204,204,204,1) 0%,rgba(238,238,238,1) 100%); /* Opera 11.10+ */
background: -ms-linear-gradient(top, rgba(204,204,204,1) 0%,rgba(238,238,238,1) 100%); /* IE10+ */
background: linear-gradient(to bottom, rgba(204,204,204,1) 0%,rgba(238,238,238,1) 100%); /* W3C */
filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#cccccc', endColorstr='#eeeeee',GradientType=0 ); /* IE6-9 */
}
#report{
width:100%;
border-collapse:collapse;
}

#container {
min-width: 570px;
max-width: auto;
background: white;
}
#header {
height: 70px;
border-radius: 5px 5px 0 0;
background: rgb(204,204,204);
background: -moz-linear-gradient(top, rgba(204,204,204,1) 0%, white 100%); /* FF3.6+ */
background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,rgba(204,204,204,1)), color-stop(100%, white)); /* Chrome,Safari4+ */
background: -webkit-linear-gradient(top, rgba(204,204,204,1) 0%, white 100%); /* Chrome10+,Safari5.1+ */
background: -o-linear-gradient(top, rgba(204,204,204,1) 0%, white 100%); /* Opera 11.10+ */
background: -ms-linear-gradient(top, rgba(204,204,204,1) 0%, white 100%); /* IE10+ */
background: linear-gradient(to bottom, rgba(204,204,204,1) 0%, white 100%); /* W3C */
filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#cccccc', endColorstr='white',GradientType=0 ); /* IE6-9 */
}

#header h1{
font: bold 36px Arial serif;
margin: 0px;
padding-top:10px;
text-align: center;
text-shadow: 1px 1px 0 #8E9FA5;
}
#footer {
height: 30px;
text-align: right;
padding-top:10px;
border-radius: 0 0 5px 5px;
background: rgb(245,246,246);
background: -moz-linear-gradient(top, white 0%, rgba(219,220,226,1) 54%, rgba(184,186,198,1) 97%, rgba(184,186,198,1) 97%); /* FF3.6+ */
background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, white), color-stop(54%,rgba(219,220,226,1)), color-stop(97%,rgba(184,186,198,1)), color-stop(97%,rgba(184,186,198,1))); /* Chrome,Safari4+ */
background: -webkit-linear-gradient(top, white 0%,rgba(219,220,226,1) 54%,rgba(184,186,198,1) 97%,rgba(184,186,198,1) 97%); /* Chrome10+,Safari5.1+ */
background: -o-linear-gradient(top, white 0%,rgba(219,220,226,1) 54%,rgba(184,186,198,1) 97%,rgba(184,186,198,1) 97%); /* Opera 11.10+ */
background: -ms-linear-gradient(top, white 0%,rgba(219,220,226,1) 54%,rgba(184,186,198,1) 97%,rgba(184,186,198,1) 97%); /* IE10+ */
background: linear-gradient(to bottom, white 0%,rgba(219,220,226,1) 54%,rgba(184,186,198,1) 97%,rgba(184,186,198,1) 97%); /* W3C */
filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='white', endColorstr='#b8bac6',GradientType=0 ); /* IE6-9 */
}
</style>
<script>
const png1 = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3wEMCzYiCCOtIgAAAIlJREFUOMvt080KAWEUxvEfZcFGYitpMgy5OpfCvaCUDOUOXIqlLLwLpslHZvn+l+c5nfM8nQ6RSCV0scbkTU+KLXpFoV7S3EYHK8xK9AGWaKD1rcsEG+wwfqpnOAVt/mv0BGfkYVAfexwKS16ofRiahug3NHHFApd/jjTEMTibVnX5DKP4AJEHd6dzEM+IXu5IAAAAAElFTkSuQmCC',
png2 = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAQAAAAngNWGAAAAAmJLR0QAAKqNIzIAAAAJcEhZcwAAAEgAAABIAEbJaz4AAABoSURBVCjP1c/NCkBAGIXhN1nasUXI+Mv1z9BEI8Ud2dpaqPmWnOXp6dSB/yUhk8GJhVECFROGRkJzdhy9hHasaBlNcTjqZxW8woiLgNC317AxU/jYgOVA+ViLxVD5b2hOCYOYUsK+mRuFlREpEzrazAAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAxNS0wOS0wOFQwNzowNTozOS0wNDowMEXWUfsAAAAldEVYdGRhdGU6bW9kaWZ5ADIwMTUtMDktMDhUMDc6MDU6MzktMDQ6MDA0i+lHAAAAAElFTkSuQmCC",
png3 = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAACYktHRAAAqo0jMgAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAxNS0wOS0wOFQwNzowNTozOS0wNDowMEXWUfsAAAAldEVYdGRhdGU6bW9kaWZ5ADIwMTUtMDktMDhUMDc6MDU6MzktMDQ6MDA0i+lHAAAAhklEQVQ4T+3QXQqCQBhG4cEt6K2KRmmFS3UBrsSCSKwgN+S959WIELTM2znw4MwInz/GZnu3xX5Yru+AGndEOpjLeV2n0rB8WJoWBXb97o8S6M0q+NAn3/DEBovKcMIDn/9OD7lA934eGuCKM0IdjDpCQxvEOviWBw2b+1cpSrj9zmZbkzEd1M4RHiv7IOMAAAAASUVORK5CYII=";

function get_png_image_src(ind){
if(ind == 0)
return png2;
return png1;
}

function toggle(id, i)
{
var g = document.getElementById(i);
if(g.src==png1)
g.src = png2;
else
g.src = png1;
var e = document.getElementById(id);
var elems = e.getElementsByTagName('*');
if (e.className == "hidden"){
e.className = "block";
}else{
e.className = "hidden";
}
return true;
}
function toggletest(id, i)
{
var elms = document.getElementsByClassName(i);
for (index = 0; index < elms.length; ++index) {
var g = elms[index];
if (g.nodeName == 'IMG'){
if(g.src==png1)
g.src = png3;
else
g.src = png1;
}
if (g.nodeName == 'TEXT'){
//alert(g.parentNode + g.parentNode.offsetWidth);
if(g.innerHTML=='Развернуть список тестов'){
g.innerHTML = 'Свернуть список тестов';
}
else
g.innerHTML = 'Развернуть список тестов';
}
}

var e = document.getElementById(id);
var elems = e.getElementsByTagName('*');
if (e.className == "hidden")
{
e.className = "visible";
return true;
}
else
{
e.className = "hidden";
return true;
}
return false;
}
</script>
</head>
<body>
<div id="container">
<div id="header"><h1>Requality Project</h1></div>

<#if coverageFilePath?? || coverageStorageType??>
<#if coverage.loadStorage()>
<#if noAddTestButtons?? && noAddTestButtons!="false">
<#global showbuttons = false>
<#else>
<#global showbuttons = true>
</#if>
<@num 0/>
<@statistic rootReq/>
<@showreq rootReq 1/>
<#else>
<#if coverageFilePath??>
Coverage information cannot be loaded from ${coverageFilePath}. Errors: ${coverage.getLastErrors()}
<#else>
Coverage information cannot be loaded from chosen source. Errors: ${coverage.getLastErrors()}
</#if>
</#if>
<#else>
There is no source of coverage information.<br>
If using Eclipse plugin please press 'Update Coverage Source' button on report settings' properties.<br>
If using console mode please set 'coverageFilePath' parameter as -coverageFilePath="path to coverage info file".
</#if>


<div id="footer">${progress.getDateTime()}</div>
</div>
</body>
</html>
(8-8/10)