2007-03-22 10:30:00 -07:00
|
|
|
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
|
|
|
/* ***** BEGIN LICENSE BLOCK *****
|
|
|
|
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
|
|
|
*
|
|
|
|
* The contents of this file are subject to the Mozilla Public License Version
|
|
|
|
* 1.1 (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.mozilla.org/MPL/
|
|
|
|
*
|
|
|
|
* Software distributed under the License is distributed on an "AS IS" basis,
|
|
|
|
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
|
|
|
* for the specific language governing rights and limitations under the
|
|
|
|
* License.
|
|
|
|
*
|
|
|
|
* The Original Code is mozilla.org code.
|
|
|
|
*
|
|
|
|
* The Initial Developer of the Original Code is
|
|
|
|
* Netscape Communications Corporation.
|
|
|
|
* Portions created by the Initial Developer are Copyright (C) 1998
|
|
|
|
* the Initial Developer. All Rights Reserved.
|
|
|
|
*
|
|
|
|
* Contributor(s):
|
|
|
|
* Bob Clary <http://bclary.com/>
|
|
|
|
*
|
|
|
|
* Alternatively, the contents of this file may be used under the terms of
|
|
|
|
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
|
|
|
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
|
|
|
* in which case the provisions of the GPL or the LGPL are applicable instead
|
|
|
|
* of those above. If you wish to allow use of your version of this file only
|
|
|
|
* under the terms of either the GPL or the LGPL, and not to allow others to
|
|
|
|
* use your version of this file under the terms of the MPL, indicate your
|
|
|
|
* decision by deleting the provisions above and replace them with the notice
|
|
|
|
* and other provisions required by the GPL or the LGPL. If you do not delete
|
|
|
|
* the provisions above, a recipient may use your version of this file under
|
|
|
|
* the terms of any one of the MPL, the GPL or the LGPL.
|
|
|
|
*
|
|
|
|
* ***** END LICENSE BLOCK ***** */
|
|
|
|
|
|
|
|
var gTotalCount = 0;
|
|
|
|
var gTotalSelected = 0;
|
|
|
|
|
|
|
|
function setCursor(aCursor)
|
|
|
|
{
|
|
|
|
if (document.body && document.body.style)
|
|
|
|
{
|
|
|
|
document.body.style.cursor = aCursor;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
function selectAll(suiteName, testDirName)
|
|
|
|
{
|
|
|
|
setCursor('wait');
|
|
|
|
|
|
|
|
suiteName = suiteName || '';
|
|
|
|
testDirName = testDirName || '';
|
|
|
|
|
|
|
|
setTimeout('_selectAll("' + suiteName + '", "' + testDirName + '")', 200);
|
|
|
|
}
|
|
|
|
|
|
|
|
function _selectAll(suiteName, testDirName)
|
|
|
|
{
|
|
|
|
if (!suiteName)
|
|
|
|
{
|
|
|
|
for (suiteName in suites)
|
|
|
|
{
|
|
|
|
setAllDirs(suiteName, true);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else if (!testDirName)
|
|
|
|
{
|
|
|
|
setAllDirs(suiteName, true);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
setAllTests(suiteName, testDirName, true);
|
|
|
|
}
|
|
|
|
|
|
|
|
setCursor('auto');
|
|
|
|
}
|
|
|
|
|
|
|
|
function selectNone(suiteName, testDirName)
|
|
|
|
{
|
|
|
|
setCursor('wait');
|
|
|
|
|
|
|
|
suiteName = suiteName || '';
|
|
|
|
testDirName = testDirName || '';
|
|
|
|
|
|
|
|
setTimeout('_selectNone("' + suiteName + '", "' + testDirName + '")', 200);
|
|
|
|
}
|
|
|
|
|
|
|
|
function _selectNone(suiteName, testDirName)
|
|
|
|
{
|
|
|
|
if (!suiteName)
|
|
|
|
{
|
|
|
|
for (suiteName in suites)
|
|
|
|
{
|
|
|
|
setAllDirs(suiteName, false);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else if (!testDirName)
|
|
|
|
{
|
|
|
|
setAllDirs(suiteName, false);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
setAllTests(suiteName, testDirName, false);
|
|
|
|
}
|
|
|
|
|
|
|
|
setCursor('auto');
|
|
|
|
}
|
|
|
|
|
|
|
|
function updateCounts(suiteName)
|
|
|
|
{
|
|
|
|
var suite = suites[suiteName];
|
|
|
|
var pct = parseInt((suite.selected / suite.count) * 100);
|
|
|
|
if (isNaN(pct))
|
|
|
|
pct = 0;
|
2007-05-25 17:19:18 -07:00
|
|
|
|
|
|
|
document.forms.testCases.elements['SUMMARY_' + suiteName].value =
|
2007-03-22 10:30:00 -07:00
|
|
|
suite.selected + '/' + suite.count +
|
|
|
|
' (' + pct + '%) selected';
|
|
|
|
|
|
|
|
pct = parseInt((gTotalSelected / gTotalCount) * 100);
|
|
|
|
if (isNaN(pct))
|
|
|
|
pct = 0;
|
2007-05-25 17:19:18 -07:00
|
|
|
|
|
|
|
document.forms.testCases.elements['TOTAL'].value =
|
2007-03-22 10:30:00 -07:00
|
|
|
gTotalSelected + '/' + gTotalCount + ' (' +
|
|
|
|
pct + '%) selected';
|
|
|
|
}
|
|
|
|
|
|
|
|
function onRadioClick(radio)
|
|
|
|
{
|
|
|
|
var info = radio.id.split(':');
|
|
|
|
var suiteName = info[0];
|
|
|
|
var suite = suites[suiteName];
|
|
|
|
var incr = (radio.checked ? 1 : -1);
|
|
|
|
suite.selected += incr;
|
|
|
|
gTotalSelected += incr;
|
|
|
|
|
|
|
|
updateCounts(suiteName);
|
|
|
|
|
|
|
|
return true;
|
|
|
|
}
|
2007-05-25 17:19:18 -07:00
|
|
|
|
2007-03-22 10:30:00 -07:00
|
|
|
function updateTotals()
|
|
|
|
{
|
|
|
|
setCursor('wait');
|
|
|
|
|
|
|
|
setTimeout('_updateTotals()', 200);
|
|
|
|
}
|
|
|
|
|
|
|
|
function _updateTotals()
|
|
|
|
{
|
|
|
|
gTotalCount = 0;
|
|
|
|
gTotalSelected = 0;
|
|
|
|
|
|
|
|
for (var suiteName in suites)
|
|
|
|
{
|
|
|
|
gTotalCount += suites[suiteName].count;
|
|
|
|
}
|
|
|
|
for (suiteName in suites)
|
|
|
|
{
|
|
|
|
updateCounts(suiteName);
|
|
|
|
}
|
|
|
|
setCursor('auto');
|
|
|
|
}
|
|
|
|
|
|
|
|
function setAllDirs(suiteName, value)
|
|
|
|
{
|
|
|
|
var testDirs = suites[suiteName].testDirs;
|
|
|
|
|
|
|
|
for (var testDirName in testDirs)
|
|
|
|
{
|
|
|
|
setAllTests(suiteName, testDirName, value);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
function setAllTests(suiteName, testDirName, value)
|
|
|
|
{
|
|
|
|
var suite = suites[suiteName];
|
|
|
|
var tests = suite.testDirs[testDirName].tests;
|
|
|
|
var elements = document.forms['testCases'].elements;
|
|
|
|
var incr = 0;
|
|
|
|
|
|
|
|
for (var testName in tests)
|
|
|
|
{
|
|
|
|
var radioName = tests[testName].id;
|
|
|
|
var radio = elements[radioName];
|
|
|
|
if (radio.checked && !value)
|
|
|
|
{
|
|
|
|
incr--;
|
|
|
|
}
|
|
|
|
else if (!radio.checked && value)
|
|
|
|
{
|
|
|
|
incr++;
|
|
|
|
}
|
|
|
|
radio.checked = value;
|
|
|
|
}
|
2007-05-25 17:19:18 -07:00
|
|
|
|
2007-03-22 10:30:00 -07:00
|
|
|
suite.selected += incr;
|
|
|
|
gTotalSelected += incr;
|
|
|
|
|
|
|
|
updateCounts(suiteName);
|
|
|
|
}
|
|
|
|
|
|
|
|
function createList()
|
|
|
|
{
|
|
|
|
var suiteName;
|
|
|
|
var elements = document.forms['testCases'].elements;
|
|
|
|
var win = window.open('about:blank', 'other_window');
|
|
|
|
var writer = new CachedWriter(win.document);
|
|
|
|
|
|
|
|
win.document.open();
|
|
|
|
writer.writeln('<pre>');
|
2007-05-25 17:19:18 -07:00
|
|
|
|
2007-03-22 10:30:00 -07:00
|
|
|
writer.writeln('# Created ' + new Date());
|
|
|
|
|
|
|
|
for (suiteName in suites)
|
|
|
|
{
|
2007-05-25 17:19:18 -07:00
|
|
|
writer.writeln('# ' + suiteName + ': ' +
|
2007-03-22 10:30:00 -07:00
|
|
|
elements['SUMMARY_' + suiteName].value);
|
|
|
|
}
|
|
|
|
|
|
|
|
writer.writeln('# TOTAL: ' + elements['TOTAL'].value);
|
|
|
|
|
|
|
|
for (suiteName in suites)
|
|
|
|
{
|
|
|
|
var testDirs = suites[suiteName].testDirs;
|
|
|
|
for (var testDirName in testDirs)
|
|
|
|
{
|
|
|
|
var tests = testDirs[testDirName].tests;
|
2007-05-25 17:19:18 -07:00
|
|
|
for (var testName in tests)
|
|
|
|
{
|
2007-03-22 10:30:00 -07:00
|
|
|
var radioName = tests[testName].id;
|
|
|
|
var radio = elements[radioName];
|
|
|
|
if (radio.checked)
|
|
|
|
writer.writeln(suiteName + '/' + testDirName + '/' + radio.value);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
writer.writeln('<\/pre>');
|
2007-05-25 17:19:18 -07:00
|
|
|
|
2007-03-22 10:30:00 -07:00
|
|
|
writer.close();
|
|
|
|
}
|
|
|
|
|
|
|
|
var gTests;
|
|
|
|
var gTestNumber;
|
|
|
|
var gWindow;
|
|
|
|
|
|
|
|
function executeList()
|
|
|
|
{
|
|
|
|
var elements = document.forms['testCases'].elements;
|
|
|
|
|
|
|
|
gTests = [];
|
|
|
|
gTestNumber = -1;
|
|
|
|
|
|
|
|
for (var suiteName in suites)
|
|
|
|
{
|
|
|
|
var testDirs = suites[suiteName].testDirs;
|
|
|
|
for (var testDirName in testDirs)
|
|
|
|
{
|
|
|
|
var tests = testDirs[testDirName].tests;
|
|
|
|
for (var testName in tests)
|
2007-05-25 17:19:18 -07:00
|
|
|
{
|
2007-03-22 10:30:00 -07:00
|
|
|
var test = tests[testName];
|
|
|
|
var radioName = test.id;
|
|
|
|
var radio = elements[radioName];
|
|
|
|
delete test.testCases;
|
|
|
|
if (radio.checked)
|
|
|
|
{
|
|
|
|
gTests[gTests.length] = test;
|
|
|
|
test.path = suiteName + '/' + testDirName + '/' + radio.value;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
runNextTest();
|
|
|
|
}
|
|
|
|
|
|
|
|
function runNextTest()
|
|
|
|
{
|
|
|
|
var iTestCase;
|
|
|
|
|
|
|
|
if (gTestNumber != -1)
|
|
|
|
{
|
|
|
|
// tests have already run in gWindow, collect the results
|
|
|
|
// for later reporting.
|
|
|
|
|
|
|
|
var e;
|
|
|
|
try
|
|
|
|
{
|
|
|
|
var test = gTests[gTestNumber];
|
|
|
|
test.testCases = [];
|
2007-05-25 17:19:18 -07:00
|
|
|
//test.testCases = test.testCases.concat(gWindow.gTestcases);
|
2007-03-22 10:30:00 -07:00
|
|
|
// note MSIE6 has a bug where instead of concating the new arrays
|
|
|
|
// it concats them to the first element. work around...
|
2007-05-25 17:19:18 -07:00
|
|
|
var origtestcases = gWindow.gTestcases;
|
2007-03-22 10:30:00 -07:00
|
|
|
for (iTestCase = 0; iTestCase < origtestcases.length; iTestCase++)
|
|
|
|
{
|
|
|
|
// test.testCases[test.testCases.length] = origtestcases[iTestCase];
|
|
|
|
var origtestcase = origtestcases[iTestCase];
|
|
|
|
var testCase = test.testCases[test.testCases.length] = {};
|
|
|
|
testCase.name = new String(origtestcase.name);
|
|
|
|
testCase.description = new String(origtestcase.description);
|
|
|
|
testCase.expect = new String(origtestcase.expect);
|
|
|
|
testCase.actual = new String(origtestcase.actual);
|
|
|
|
testCase.passed = origtestcase.passed ? true : false;
|
|
|
|
testCase.reason = new String(origtestcase.reason);
|
|
|
|
testCase.bugnumber = new String(origtestcase.bugnumber?origtestcase.bugnumber:'');
|
|
|
|
}
|
|
|
|
origtestcases = origtestcase = null;
|
|
|
|
}
|
|
|
|
catch(e)
|
|
|
|
{
|
|
|
|
;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
++gTestNumber;
|
|
|
|
|
|
|
|
if (gTestNumber < gTests.length)
|
|
|
|
{
|
|
|
|
// run test
|
|
|
|
test = gTests[gTestNumber];
|
|
|
|
|
2007-05-25 17:19:18 -07:00
|
|
|
gWindow = window.open('js-test-driver-' +
|
|
|
|
document.forms.testCases.doctype.value +
|
|
|
|
'.html?test=' +
|
|
|
|
test.path +
|
|
|
|
';language=' +
|
|
|
|
document.forms.testCases.language.value,
|
2007-03-22 10:30:00 -07:00
|
|
|
'output');
|
|
|
|
if (!gWindow)
|
|
|
|
{
|
2007-05-25 17:19:18 -07:00
|
|
|
alert('This test suite requires popup windows.\n' +
|
2007-03-22 10:30:00 -07:00
|
|
|
'Please enable them for this site.');
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else if (document.forms.testCases.outputformat.value == 'html')
|
|
|
|
{
|
|
|
|
// all tests completed, display report
|
|
|
|
reportHTML();
|
|
|
|
}
|
|
|
|
else if (document.forms.testCases.outputformat.value == 'javascript')
|
|
|
|
{
|
|
|
|
// all tests completed, display report
|
|
|
|
reportJavaScript();
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
function reportHTML()
|
|
|
|
{
|
|
|
|
var errorsOnly = document.forms.testCases.failures.checked;
|
|
|
|
var totalTestCases = 0;
|
|
|
|
var totalTestCasesPassed = 0;
|
|
|
|
var totalTestCasesFailed = 0;
|
|
|
|
|
|
|
|
gWindow.document.close();
|
|
|
|
|
|
|
|
var writer = new CachedWriter(gWindow.document);
|
|
|
|
|
|
|
|
writer.writeln('<!DOCTYPE HTML PUBLIC ' +
|
2007-05-25 17:19:18 -07:00
|
|
|
'"-//W3C//DTD HTML 4.01 Transitional//EN" ' +
|
2007-03-22 10:30:00 -07:00
|
|
|
'"http://www.w3.org/TR/html4/loose.dtd">');
|
|
|
|
|
|
|
|
writer.writeln('<html>');
|
|
|
|
writer.writeln('<head>');
|
2007-05-25 17:19:18 -07:00
|
|
|
writer.writeln('<title>JavaScript Tests Browser: ' +
|
|
|
|
navigator.userAgent + ' Language: ' +
|
|
|
|
document.forms.testCases.language.value +
|
2007-03-22 10:30:00 -07:00
|
|
|
'<\/title>');
|
|
|
|
writer.writeln('<style type="text/css">');
|
|
|
|
writer.writeln(' .passed { } .failed { background-color: red; }');
|
|
|
|
writer.writeln('table {}');
|
|
|
|
writer.writeln('th.description, th.actual, th.expect { width: 30em;}');
|
|
|
|
writer.writeln('<\/style>');
|
|
|
|
|
|
|
|
writer.writeln('<\/head>');
|
|
|
|
writer.writeln('<body>');
|
2007-05-25 17:19:18 -07:00
|
|
|
writer.writeln('<h2>JavaScript Tests Browser: ' +
|
|
|
|
navigator.userAgent + ' Language: ' +
|
|
|
|
document.forms.testCases.language.value +
|
2007-03-22 10:30:00 -07:00
|
|
|
'<\/h2>');
|
|
|
|
|
|
|
|
writer.writeln('<table border="1">');
|
|
|
|
writer.writeln('<thead>');
|
|
|
|
writer.writeln('<tr>');
|
|
|
|
writer.writeln('<th>Suite<\/th>');
|
|
|
|
writer.writeln('<th>Directory<\/th>');
|
|
|
|
writer.writeln('<th>Test<\/th>');
|
|
|
|
writer.writeln('<th>Passed<\/th>');
|
|
|
|
writer.writeln('<th class="description">Description<\/th>');
|
|
|
|
writer.writeln('<th class="actual">Actual<\/th>');
|
|
|
|
writer.writeln('<th class="expect">Expect<\/th>');
|
|
|
|
writer.writeln('<th>BugNumber<\/th>');
|
|
|
|
writer.writeln('<th>Reason<\/th>');
|
|
|
|
writer.writeln('<\/tr>');
|
|
|
|
writer.writeln('<\/thead>');
|
|
|
|
writer.writeln('<tbody>');
|
|
|
|
|
|
|
|
writer.writeln('<\/tr>');
|
|
|
|
|
|
|
|
for (var suiteName in suites)
|
|
|
|
{
|
|
|
|
var suiteTotals = {passed: 0, failed: 0};
|
|
|
|
var testDirs = suites[suiteName].testDirs;
|
|
|
|
|
|
|
|
for (var testDirName in testDirs)
|
|
|
|
{
|
|
|
|
var dirTotals = {passed: 0, failed: 0};
|
|
|
|
var tests = testDirs[testDirName].tests;
|
|
|
|
|
|
|
|
for (var testName in tests)
|
|
|
|
{
|
|
|
|
var nameTotals = {passed: 0, failed: 0};
|
|
|
|
var test = tests[testName];
|
|
|
|
|
|
|
|
if (! ('testCases' in test) )
|
|
|
|
{
|
|
|
|
// test not run
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
|
|
|
var testCases = test.testCases;
|
|
|
|
|
|
|
|
for (var iTestCase = 0; iTestCase < testCases.length; iTestCase++)
|
|
|
|
{
|
|
|
|
var testCase = testCases[iTestCase];
|
|
|
|
++totalTestCases;
|
|
|
|
if (testCase.passed)
|
|
|
|
{
|
|
|
|
++totalTestCasesPassed;
|
|
|
|
++nameTotals.passed;
|
|
|
|
++dirTotals.passed;
|
|
|
|
++suiteTotals.passed;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
++totalTestCasesFailed;
|
|
|
|
++nameTotals.failed;
|
|
|
|
++dirTotals.failed;
|
|
|
|
++suiteTotals.failed;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (errorsOnly && testCase.passed)
|
|
|
|
{
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
2007-05-25 17:19:18 -07:00
|
|
|
writer.writeln('<tr class="' +
|
2007-03-22 10:30:00 -07:00
|
|
|
(testCase.passed ? 'passed' : 'failed') + '">' +
|
|
|
|
'<td title="Suite">' + suiteName + '<\/td>' +
|
|
|
|
'<td title="Directory">' + testDirName + '<\/td>' +
|
|
|
|
'<td title="Test">' + testName + '<\/td>' +
|
2007-05-25 17:19:18 -07:00
|
|
|
'<td title="Status">' +
|
|
|
|
(testCase.passed ? 'Test Passed':'Test Failed') +
|
2007-03-22 10:30:00 -07:00
|
|
|
'<\/td>' +
|
2007-05-25 17:19:18 -07:00
|
|
|
'<td title="Description">' +
|
|
|
|
splitString(testCase.description, '<br>', 30) +
|
2007-03-22 10:30:00 -07:00
|
|
|
'<\/td>' +
|
2007-05-25 17:19:18 -07:00
|
|
|
'<td title="Actual">' +
|
|
|
|
splitString(testCase.actual, '<br>', 30) +
|
2007-03-22 10:30:00 -07:00
|
|
|
'<\/td>' +
|
2007-05-25 17:19:18 -07:00
|
|
|
'<td title="Expected">' +
|
|
|
|
splitString(testCase.expect, '<br>', 30) +
|
2007-03-22 10:30:00 -07:00
|
|
|
'<\/td>' +
|
2007-05-25 17:19:18 -07:00
|
|
|
'<td title="Bug">' +
|
|
|
|
(testCase.bugnumber?testCase.bugnumber:'') +
|
2007-03-22 10:30:00 -07:00
|
|
|
'<\/td>' +
|
|
|
|
'<td title="Reason">' + testCase.reason + '<\/td>' +
|
|
|
|
'<\/tr>');
|
|
|
|
} // for iTestCase
|
|
|
|
|
|
|
|
if (!errorsOnly && nameTotals.passed + nameTotals.failed > 0)
|
|
|
|
{
|
|
|
|
writer.writeln('<tr>' +
|
|
|
|
'<td>' + suiteName + '<\/td>' +
|
|
|
|
'<td>' + testDirName + '<\/td>' +
|
2007-05-25 17:19:18 -07:00
|
|
|
'<td colspan="7" style="font-weight:bold;">' +
|
2007-03-22 10:30:00 -07:00
|
|
|
testName + ' ' +
|
|
|
|
'Passed = ' + nameTotals.passed.toString() + ' ' +
|
|
|
|
'Failed = ' + nameTotals.failed.toString() +
|
|
|
|
'<\/td>' +
|
|
|
|
'<\/tr>');
|
|
|
|
}
|
|
|
|
|
|
|
|
} // for (var testName in tests)
|
|
|
|
|
|
|
|
if (!errorsOnly && dirTotals.passed + dirTotals.failed > 0)
|
|
|
|
{
|
|
|
|
writer.writeln('<tr>' +
|
|
|
|
'<td>' + suiteName + '<\/td>' +
|
2007-05-25 17:19:18 -07:00
|
|
|
'<td colspan="8" style="font-weight:bold;">' +
|
2007-03-22 10:30:00 -07:00
|
|
|
testDirName + ' ' +
|
|
|
|
'Passed = ' + dirTotals.passed.toString() + ' ' +
|
|
|
|
'Failed = ' + dirTotals.failed.toString() +
|
|
|
|
'<\/td>' +
|
|
|
|
'<\/tr>');
|
|
|
|
}
|
|
|
|
|
|
|
|
} // for (var testDirName in testDirs)
|
|
|
|
|
|
|
|
if (!errorsOnly && suiteTotals.passed + suiteTotals.failed > 0)
|
|
|
|
{
|
|
|
|
writer.writeln('<tr>' +
|
2007-05-25 17:19:18 -07:00
|
|
|
'<td colspan="9" style="font-weight:bold;">' +
|
2007-03-22 10:30:00 -07:00
|
|
|
suiteName + ' ' +
|
|
|
|
'Passed = ' + suiteTotals.passed.toString() + ' ' +
|
|
|
|
'Failed = ' + suiteTotals.failed.toString() +
|
|
|
|
'<\/td>' +
|
|
|
|
'<\/tr>');
|
|
|
|
}
|
|
|
|
|
|
|
|
} // for (var suiteName in suites)
|
|
|
|
|
|
|
|
writer.writeln('<\/tbody>');
|
|
|
|
writer.writeln('<\/table>');
|
2007-05-25 17:19:18 -07:00
|
|
|
|
|
|
|
writer.writeln('<p>Total TestCases = ' + totalTestCases +
|
|
|
|
', Passed = ' + totalTestCasesPassed +
|
|
|
|
', Failed = ' + totalTestCasesFailed +
|
2007-03-22 10:30:00 -07:00
|
|
|
'<\/p>');
|
|
|
|
writer.writeln('<\/body>');
|
|
|
|
writer.writeln('<\/html>');
|
|
|
|
|
|
|
|
writer.close();
|
|
|
|
}
|
|
|
|
|
|
|
|
// return a string with delim inserted every pos characters
|
|
|
|
// if there are no spaces to break the line
|
|
|
|
function splitString(str, delim, pos)
|
|
|
|
{
|
|
|
|
var newstr = '';
|
|
|
|
var length = str.length;
|
|
|
|
|
|
|
|
if (str.indexOf(' ') != -1)
|
|
|
|
{
|
|
|
|
return str;
|
|
|
|
}
|
|
|
|
for (var i = 0; i < length; i += pos)
|
|
|
|
{
|
|
|
|
newstr += str.substr(i, pos) + delim;
|
|
|
|
}
|
|
|
|
return newstr;
|
|
|
|
}
|
|
|
|
function reportJavaScript()
|
|
|
|
{
|
|
|
|
gWindow.document.close();
|
|
|
|
|
|
|
|
var errorsOnly = document.forms.testCases.failures.checked;
|
|
|
|
var writer = new CachedWriter(gWindow.document);
|
|
|
|
|
|
|
|
writer.writeln('<html>');
|
|
|
|
writer.writeln('<head>');
|
2007-05-25 17:19:18 -07:00
|
|
|
writer.writeln('<title>JavaScript Tests Browser: ' +
|
|
|
|
navigator.userAgent + ' Language: ' +
|
|
|
|
document.forms.testCases.language.value +
|
2007-03-22 10:30:00 -07:00
|
|
|
'<\/title>');
|
|
|
|
writer.writeln('<script type="text/javascript">');
|
|
|
|
writer.writeln('var global = window.parent;');
|
|
|
|
writer.writeln('if (!global.gUAHash) {');
|
|
|
|
writer.writeln(' global.gUAHash = {};');
|
|
|
|
writer.writeln(' global.gUAList = {};');
|
|
|
|
writer.writeln(' global.gUA_id = -1;');
|
|
|
|
writer.writeln(' global.gTestResults = {};');
|
|
|
|
writer.writeln('}');
|
|
|
|
writer.writeln('var gUA = "' + navigator.userAgent + '";');
|
|
|
|
writer.writeln('var gUA_id = global.gUAHash[gUA];');
|
|
|
|
writer.writeln('if (typeof(gUA_id) != "number") {');
|
|
|
|
writer.writeln(' gUA_id = global.gUAHash[gUA] = ++global.gUA_id;');
|
|
|
|
writer.writeln(' global.gUAList[gUA_id] = gUA;');
|
|
|
|
writer.writeln('}');
|
|
|
|
writer.writeln('var gTestResults = global.gTestResults;');
|
|
|
|
writer.writeln('var gLanguage = \'' + document.forms.testCases.language.value + '\';');
|
|
|
|
writer.writeln('var gResult;');
|
|
|
|
writer.writeln('var gResultId;');
|
|
|
|
writer.writeln('var gUAResult;');
|
|
|
|
writer.writeln('var gJSResult;');
|
|
|
|
writer.writeln('var gSuiteId;');
|
|
|
|
writer.writeln('var gSuite;');
|
|
|
|
writer.writeln('var gDirId;');
|
|
|
|
writer.writeln('var gDir;');
|
|
|
|
writer.writeln('var gTestId;');
|
|
|
|
writer.writeln('var gTest;');
|
|
|
|
|
|
|
|
writer.writeln('gUAResult = gTestResults[gUA_id];');
|
|
|
|
writer.writeln('if (!gUAResult) {');
|
|
|
|
writer.writeln(' gUAResult = gTestResults[gUA_id] = {};');
|
|
|
|
writer.writeln('}');
|
|
|
|
writer.writeln('gJSResult = gUAResult[gLanguage];');
|
|
|
|
writer.writeln('if (!gJSResult) {');
|
|
|
|
writer.writeln(' gJSResult = gUAResult[gLanguage] = {};');
|
|
|
|
writer.writeln('}');
|
|
|
|
|
|
|
|
|
|
|
|
for (var suiteName in suites)
|
|
|
|
{
|
|
|
|
var suiteheader = '';
|
|
|
|
|
|
|
|
suiteheader += 'gSuiteId = "' + suiteName + '";\n';
|
|
|
|
suiteheader += 'gSuite = gJSResult[gSuiteId];\n';
|
|
|
|
suiteheader += 'if (!gSuite) {\n';
|
|
|
|
suiteheader += ' gSuite = gJSResult[gSuiteId] = {};\n';
|
|
|
|
suiteheader += '}\n';
|
|
|
|
|
|
|
|
var testDirs = suites[suiteName].testDirs;
|
|
|
|
|
|
|
|
for (var testDirName in testDirs)
|
|
|
|
{
|
|
|
|
var dirheader = '';
|
|
|
|
|
|
|
|
dirheader += 'gDirId = "' + testDirName + '";\n';
|
|
|
|
dirheader += 'gDir = gSuite[gDirId];\n';
|
|
|
|
dirheader += 'if (!gDir) {\n';
|
|
|
|
dirheader += ' gDir = gSuite[gDirId] = {};\n';
|
|
|
|
dirheader += '}\n';
|
|
|
|
|
|
|
|
var tests = testDirs[testDirName].tests;
|
|
|
|
|
|
|
|
for (var testName in tests)
|
|
|
|
{
|
|
|
|
var test = tests[testName];
|
|
|
|
|
|
|
|
if (! ('testCases' in test) )
|
|
|
|
{
|
|
|
|
// test not run
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
|
|
|
var testCases = test.testCases;
|
|
|
|
var resultId = suiteName + '/' + testDirName + '/' + testName;
|
|
|
|
|
|
|
|
var testheader = '';
|
|
|
|
testheader += 'gTestId = "' + testName + '";\n';
|
|
|
|
testheader += 'gTest = gDir[gTestId];\n';
|
|
|
|
testheader += 'if (!gTest) {\n';
|
|
|
|
testheader += ' gTest = gDir[gTestId] = [];\n';
|
|
|
|
testheader += '}\n';
|
|
|
|
|
|
|
|
for (var iTestCase = 0; iTestCase < testCases.length; iTestCase++)
|
|
|
|
{
|
|
|
|
var testCase = testCases[iTestCase];
|
|
|
|
if (errorsOnly && testCase.passed)
|
|
|
|
{
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (suiteheader)
|
|
|
|
{
|
|
|
|
writer.writeln(suiteheader);
|
|
|
|
suiteheader = '';
|
|
|
|
}
|
|
|
|
if (dirheader)
|
|
|
|
{
|
|
|
|
writer.writeln(dirheader);
|
|
|
|
dirheader = '';
|
|
|
|
}
|
|
|
|
if (testheader)
|
|
|
|
{
|
|
|
|
writer.writeln(testheader);
|
|
|
|
testheader = '';
|
|
|
|
}
|
|
|
|
|
|
|
|
var name = escape(testCase.name);
|
|
|
|
var desc = escape(testCase.description);
|
|
|
|
var actual = escape(testCase.actual);
|
|
|
|
var expect = escape(testCase.expect);
|
|
|
|
var reason = escape(testCase.reason);
|
2007-05-25 17:19:18 -07:00
|
|
|
|
2007-03-22 10:30:00 -07:00
|
|
|
var buffer = '';
|
|
|
|
|
|
|
|
buffer += 'gTest[gTest.length] = \n';
|
|
|
|
buffer += '{\n';
|
|
|
|
buffer += 'name: "' + name + '",\n';
|
|
|
|
buffer += 'description: "' + desc + '",\n';
|
|
|
|
buffer += 'expect: "' + expect + '",\n';
|
|
|
|
buffer += 'actual: "' + actual + '",\n';
|
|
|
|
buffer += 'passed: ' + testCase.passed + ',\n';
|
|
|
|
buffer += 'reason: "' + reason + '",\n';
|
2007-05-25 17:19:18 -07:00
|
|
|
buffer += 'bugnumber: "' + (testCase.bugnumber ?
|
2007-03-22 10:30:00 -07:00
|
|
|
testCase.bugnumber : '') + '"\n';
|
|
|
|
buffer += '};\n';
|
|
|
|
|
|
|
|
writer.writeln(buffer);
|
|
|
|
buffer = '';
|
|
|
|
|
|
|
|
} // for iTestCase
|
2007-05-25 17:19:18 -07:00
|
|
|
|
2007-03-22 10:30:00 -07:00
|
|
|
} // for testName
|
|
|
|
|
|
|
|
} // for testDirName
|
|
|
|
|
|
|
|
} // for (var suiteName in suites)
|
|
|
|
|
|
|
|
writer.writeln('<\/script>');
|
|
|
|
writer.writeln('<\/head>');
|
|
|
|
writer.writeln('<body>');
|
2007-05-25 17:19:18 -07:00
|
|
|
writer.writeln('<p>JavaScript Tests Browser: ' +
|
|
|
|
navigator.userAgent + ' Language: ' +
|
|
|
|
document.forms.testCases.language.value +
|
2007-03-22 10:30:00 -07:00
|
|
|
'<\/p>');
|
|
|
|
writer.writeln('<\/body>')
|
2007-05-25 17:19:18 -07:00
|
|
|
writer.writeln('<\/html>');
|
2007-03-22 10:30:00 -07:00
|
|
|
writer.close();
|
|
|
|
}
|
2007-05-25 17:19:18 -07:00
|
|
|
|
2007-03-22 10:30:00 -07:00
|
|
|
// improve IE's performance. Mozilla's is fine. ;-)
|
|
|
|
function CachedWriter(doc, limit)
|
|
|
|
{
|
|
|
|
this.document = doc;
|
|
|
|
this.pendingCount = 0;
|
|
|
|
this.pendingLimit = limit ? limit : 100;
|
|
|
|
this.lines = [];
|
|
|
|
}
|
|
|
|
|
|
|
|
CachedWriter.prototype.destroy = function _cachedWriterDestroy()
|
|
|
|
{
|
|
|
|
this.document = null;
|
|
|
|
this.pendingCount = 0;
|
|
|
|
this.pendingLimit = 0;
|
|
|
|
this.lines = null;
|
|
|
|
}
|
|
|
|
|
2007-05-25 17:19:18 -07:00
|
|
|
CachedWriter.prototype.writeln = function _cachedWriterWriteLine(s)
|
2007-03-22 10:30:00 -07:00
|
|
|
{
|
|
|
|
this.lines[this.lines.length] = s;
|
|
|
|
if (++this.pendingCount >= this.pendingLimit)
|
|
|
|
{
|
|
|
|
this.flush();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
CachedWriter.prototype.flush = function _cachedWriterFlush()
|
|
|
|
{
|
|
|
|
var s = this.lines.join('\n');
|
|
|
|
this.pendingCount = 0;
|
|
|
|
this.lines = [];
|
|
|
|
if (!window.opera)
|
|
|
|
{
|
|
|
|
for (var ibadchar = 0; ibadchar < 32; ++ibadchar)
|
|
|
|
{
|
|
|
|
if (ibadchar != 10 && ibadchar != 13)
|
|
|
|
{
|
|
|
|
var badchar = String.fromCharCode(ibadchar);
|
|
|
|
var badregx = new RegExp(badchar, 'mg');
|
|
|
|
var escchar = '\\0x' + ibadchar.toString(16);
|
|
|
|
s = s.replace(badregx, escchar);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
this.document.writeln(s);
|
|
|
|
}
|
|
|
|
|
2007-05-25 17:19:18 -07:00
|
|
|
CachedWriter.prototype.close = function _cachedWriterClose()
|
2007-03-22 10:30:00 -07:00
|
|
|
{
|
|
|
|
this.flush();
|
|
|
|
this.document.close();
|
|
|
|
this.destroy();
|
|
|
|
}
|