/// 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 = ''; if(options.header) { html += "Chapter " + this.id + " - " + this.name + "" + "" + this.passPercent() + "%"; } for(var i = 0; i < this.tests.length;i++) { test = this.tests[i]; html += "" + test.id + "" + "" + test.description + "" + "[source]" + "" + test.result + ""; } 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 += "Chapter " + section.id + " - " + section.name + "" + "" + section.passPercent() + "%"; } } } return html + ""; }; /* Render this section as XML. Used for the report page. */ this.toXML = function() { var xml = ""; if(this.id != 0) { xml += "
\r\n"; for (var i = 0; i < this.tests.length; i++) { xml += '\r\n' + ' ' + this.tests[i].id + '\r\n' + ' ' + this.tests[i].result + '\r\n' + '\r\n'; } } for (var subsection in this.subsections) { xml += this.subsections[subsection].toXML(); } if(this.id != 0) { xml += '
\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(); } }; }