test262/website/scripts/sections.js

163 lines
5.4 KiB
JavaScript
Raw Normal View History

/// Copyright (c) 2012 Ecma International. All rights reserved.
/// Ecma International makes this code available under the terms and conditions set
/// forth on http://hg.ecmascript.org/tests/test262/raw-file/tip/LICENSE (the
/// "Use Terms"). Any redistribution of this code must retain the above
/// copyright and this notice and otherwise comply with the Use Terms.
/* 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++;
test\harness\*: - a lot of JS harness code written in strings have been moved out to actual physical files such as ed.js (syntax error detection for globally scoped tests) and gs.js (global scope test case validator). This change makes it far easier to maintain the test harness code - reorganized helper.js providing a clear indication which methods are used by external objects, which are implementation details, and which are unequivocally test262-specific. I've also added, openErrorWindow, which will be used to open a descriptive error message window for each test case failure reported on the 'Run' tab - improved the error message for syntax errors occurring when a test case fails to load - sta.js no longer tries to pickle all helper functions it contains! Instead, we load the file directly from sth.js. The performance of fnGlobalObject has been improved. Finally, the ES5Harness object has been moved from sth.js (in a string) to here - sth.js now has a browser implementer hook, controller.implementerHook, which allows browser implementers to handle test case failures in their own way (e.g., log to the filesystem). The 'run' function was basically re-written Added 37 new test cases from the "IE Test Center" Build release. There were 14 modifications to existing test cases as well. Refactored SputnikGlobalScope.js such that test case paths are now used as indices into the GlobalScopeTests array. TestCasePackager.py had the concept of templated test harnesses introduced - see templates\runner.test262.html. Also added support for one HTML test harness per ES5 chapter. Last but not least, TestCasePackagerConfig.py now has a 'source control' abstraction class which abstracts away source control adds|edits when dynamically generating *.json and *.html test chapters.
2011-08-25 20:18:44 +02:00
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();
}
};
}