/// Copyright (c) 2012 Ecma International. All rights reserved. /// This code is governed by the BSD license found in the LICENSE file. /* A section of the spec. Stores test results and subsections and some rolled up stats on how many tests passed or * failed under that section */ function Section(parentSection, id, name) { this.parentSection = parentSection; this.id = id; this.name = name; this.subsections = {}; this.tests = []; this.totalTests = 0; this.totalPassed = 0; this.totalFailed = 0; this.totalFailedToLoad = 0; var section = this, RED_LIMIT = 50, YELLOW_LIMIT = 75, GREEN_LIMIT = 99.9; /* Get the class for a result cell given the pass percent. */ function rollupCellClass(passPercent) { if(passPercent >= GREEN_LIMIT) { return "reportGreen"; } else if (passPercent >= YELLOW_LIMIT) { return "reportLightGreen"; } else if (passPercent >= RED_LIMIT) { return "reportYellow"; } return "reportRed"; } /* Calculate pass percent */ this.passPercent = function() { if(this.totalTests === 0) { return 0; } return Math.round((this.totalPassed / this.totalTests) * 100); }; /* Add a test result to this section. Pushes the result to the * test array and passes the result to addTestResult to tabulate * pass/fail numbers */ this.addTest = function(test) { this.tests.push(test); this.addTestResult(test); }; /* Increments the various rollup counters for this section and all * parent sections */ this.addTestResult = function(test) { this.totalTests++; if(test.result === "pass") this.totalPassed++; else this.totalFailed++; if (test.error === 'Failed to load test case (probable parse error).') this.totalFailedToLoad++; if(this.parentSection !== null) this.parentSection.addTestResult(test); }; /* Renders this section as HTML. Used for the report page.*/ this.toHTML = function(options) { var defaultOptions = {header: false, renderSubsections: true}; if (typeof options === undefined) { options = defaultOptions; } else { options = $.extend(defaultOptions, options); } var html = '<tbody id="section_' + this.id.replace(/\./g, "_") + '">'; if(options.header) { html += "<tr><td class='tblHeader' colspan='3'>Chapter " + this.id + " - " + this.name + "</td>" + "<td class='" + rollupCellClass(this.passPercent()) + "'>" + this.passPercent() + "%</td></tr>"; } for(var i = 0; i < this.tests.length;i++) { test = this.tests[i]; html += "<tr><td>" + test.id + "</td>" + "<td>" + test.description + "</td>" + "<td><a class='showSource' href='#" + test.id + "'>[source]</a></td>" + "<td class='" + test.result + "'>" + test.result + "</td></tr>"; } for(var sectionId in this.subsections) { var section = this.subsections[sectionId]; if(section.totalTests > 0) { if(options.renderSubsections) { html += section.toHTML({ header: true, renderSubsections: false}); } else { html += "<tr><td colspan='3'><a class='section' href='#" + section.id + "'>Chapter " + section.id + " - " + section.name + "</a></td>" + "<td class='" + rollupCellClass(section.passPercent()) + "'>" + section.passPercent() + "%</td></tr>"; } } } return html + "</tbody>"; }; /* Render this section as XML. Used for the report page. */ this.toXML = function() { var xml = ""; if(this.id != 0) { xml += "<section id='" + this.id + "' name='" + this.name + "'>\r\n"; for (var i = 0; i < this.tests.length; i++) { xml += '<test>\r\n' + ' <testId>' + this.tests[i].id + '</testId>\r\n' + ' <res>' + this.tests[i].result + '</res>\r\n' + '</test>\r\n'; } } for (var subsection in this.subsections) { xml += this.subsections[subsection].toXML(); } if(this.id != 0) { xml += '</section>\r\n'; } return xml; }; /* Reset counts and remove tests. */ this.reset = function() { this.tests = []; this.totalTests = 0; this.totalPassed = 0; this.totalFailed = 0; this.totalFailedToLoad = 0; for(var subsection in this.subsections) { this.subsections[subsection].reset(); } }; }