fune/devtools/shared/gcli/source/lib/gcli/commands/test.js

215 lines
6.6 KiB
JavaScript

/*
* Copyright 2012, Mozilla Foundation and contributors
*
* 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.
*/
'use strict';
var examiner = require('../testharness/examiner');
var stati = require('../testharness/status').stati;
var helpers = require('../test/helpers');
var suite = require('../test/suite');
var cli = require('../cli');
var Requisition = require('../cli').Requisition;
var createRequisitionAutomator = require('../test/automators/requisition').createRequisitionAutomator;
var isNode = (typeof(process) !== 'undefined' &&
process.title.includes('node'));
suite.init(isNode);
exports.optionsContainer = [];
exports.items = [
{
item: 'type',
name: 'suite',
parent: 'selection',
cacheable: true,
lookup: function() {
return Object.keys(examiner.suites).map(function(name) {
return { name: name, value: examiner.suites[name] };
});
}
},
{
item: 'command',
name: 'test',
description: 'Run GCLI unit tests',
params: [
{
name: 'suite',
type: 'suite',
description: 'Test suite to run.',
defaultValue: examiner
},
{
name: 'usehost',
type: 'boolean',
description: 'Run the unit tests in the host window',
option: true
}
],
returnType: 'examiner-output',
noRemote: true,
exec: function(args, context) {
if (args.usehost && exports.optionsContainer.length === 0) {
throw new Error('Can\'t use --usehost without injected options');
}
var options;
if (args.usehost) {
options = exports.optionsContainer[0];
}
else {
var env = {
document: document,
window: window
};
options = {
isNode: isNode,
isFirefox: false,
isPhantomjs: false,
requisition: new Requisition(context.system, { environment: env })
};
options.automator = createRequisitionAutomator(options.requisition);
}
var requisition = options.requisition;
requisition.system.commands.get('mocks').on(requisition);
helpers.resetResponseTimes();
examiner.reset();
return args.suite.run(options).then(function() {
requisition.system.commands.get('mocks').off(requisition);
var output = context.typedData('examiner-output', examiner.toRemote());
if (output.data.summary.status === stati.pass) {
return output;
}
else {
cli.logErrors = false;
throw output;
}
});
}
},
{
item: 'converter',
from: 'examiner-output',
to: 'string',
exec: function(output, conversionContext) {
return '\n' + examiner.detailedResultLog('NodeJS/NoDom') +
'\n' + helpers.timingSummary;
}
},
{
item: 'converter',
from: 'examiner-output',
to: 'view',
exec: function(output, conversionContext) {
return {
html:
'<div>\n' +
' <table class="gcliTestResults">\n' +
' <thead>\n' +
' <tr>\n' +
' <th class="gcliTestSuite">Suite</th>\n' +
' <th>Test</th>\n' +
' <th>Results</th>\n' +
' <th>Checks</th>\n' +
' <th>Notes</th>\n' +
' </tr>\n' +
' </thead>\n' +
' <tbody foreach="suite in ${suites}">\n' +
' <tr foreach="test in ${suite.tests}" title="${suite.name}.${test.name}()">\n' +
' <td class="gcliTestSuite">${suite.name}</td>\n' +
' <td class="gcliTestTitle">${test.title}</td>\n' +
' <td class="gcliTest${test.status.name}">${test.status.name}</td>\n' +
' <td class="gcliTestChecks">${test.checks}</td>\n' +
' <td class="gcliTestMessages">\n' +
' <div foreach="failure in ${test.failures}">\n' +
' ${failure.message}\n' +
' <ul if="${failure.params}">\n' +
' <li>P1: ${failure.p1}</li>\n' +
' <li>P2: ${failure.p2}</li>\n' +
' </ul>\n' +
' </div>\n' +
' </td>\n' +
' </tr>\n' +
' </tbody>\n' +
' <tfoot>\n' +
' <tr>\n' +
' <th></th>\n' +
' <th>Total</th>\n' +
' <th>${summary.status.name}</th>\n' +
' <th class="gcliTestChecks">${summary.checks}</th>\n' +
' <th></th>\n' +
' </tr>\n' +
' </tfoot>\n' +
' </table>\n' +
'</div>',
css:
'.gcliTestSkipped {\n' +
' background-color: #EEE;\n' +
' color: #000;\n' +
'}\n' +
'\n' +
'.gcliTestExecuting {\n' +
' background-color: #888;\n' +
' color: #FFF;\n' +
'}\n' +
'\n' +
'.gcliTestWaiting {\n' +
' background-color: #FFA;\n' +
' color: #000;\n' +
'}\n' +
'\n' +
'.gcliTestPass {\n' +
' background-color: #8F8;\n' +
' color: #000;\n' +
'}\n' +
'\n' +
'.gcliTestFail {\n' +
' background-color: #F00;\n' +
' color: #FFF;\n' +
'}\n' +
'\n' +
'td.gcliTestSuite {\n' +
' font-family: monospace;\n' +
' font-size: 90%;\n' +
' text-align: right;\n' +
'}\n' +
'\n' +
'.gcliTestResults th.gcliTestSuite,\n' +
'.gcliTestResults .gcliTestChecks {\n' +
' text-align: right;\n' +
'}\n' +
'\n' +
'.gcliTestResults th {\n' +
' text-align: left;\n' +
'}\n' +
'\n' +
'.gcliTestMessages ul {\n' +
' margin: 0 0 10px;\n' +
' padding-left: 20px;\n' +
' list-style-type: square;\n' +
'}\n',
cssId: 'gcli-test',
data: output,
options: { allowEval: true, stack: 'test.html' }
};
}
}
];