@qooxdoo/framework
Version:
The JS Framework for Coders
193 lines (161 loc) • 5.22 kB
JavaScript
/* ************************************************************************
qooxdoo - the new era of web development
http://qooxdoo.org
Copyright:
2007-2008 1&1 Internet AG, Germany, http://www.1und1.de
License:
MIT: https://opensource.org/licenses/MIT
See the LICENSE file in the project's top-level directory for details.
Authors:
* Fabian Jakobs (fjakobs)
* Daniel Wagner (d_wagner)
************************************************************************ */
/**
* This mixin contains the methods needed to implement a loader that will
* create a suite of unit tests from a given namespace and run it directly or
* provide the necessary information to a more advanced runner application
*/
qx.Mixin.define("qx.dev.unit.MTestLoader", {
/*
*****************************************************************************
PROPERTIES
*****************************************************************************
*/
properties: {
/** The test suite */
suite: {
check: "qx.dev.unit.TestSuite",
nullable: true,
init: null
}
},
/*
*****************************************************************************
PROPERTIES
*****************************************************************************
*/
members: {
/**
* Parses the url parameters and tries to find the classes to test.
* The pattern is like <code>index.html?testclass=qx.test</code>
*
* @return {String} the class/namespace to test
*/
_getClassNameFromUrl() {
var params = window.location.search;
var className = params.match(/[\?&]testclass=([A-Za-z0-9_\.]+)/);
if (className) {
className = className[1];
} else {
className = "__unknown_class__";
}
return className;
},
/**
* Sets the top level namespace of the test cases to test. All classes
* below this namespace extending {@link TestCase} will be tested.
*
* @param namespace {Object} Namespace to add
*/
setTestNamespace(namespace) {
var suite = new qx.dev.unit.TestSuite();
suite.add(namespace);
this.setSuite(suite);
},
/**
* Run all tests and export the results to JSUnit
*/
runJsUnit() {
var testResult = new qx.dev.unit.JsUnitTestResult();
this.getSuite().run(testResult);
testResult.exportToJsUnit();
},
/**
* Run tests as standalone application
*/
runStandAlone() {
var testResult = new qx.dev.unit.TestResult();
testResult.addListener("failure", e => {
var ex = e.getData()[0].exception;
var test = e.getData()[0].test;
this.error(
"Test '" +
test.getFullName() +
"' failed: " +
ex.message +
" - " +
ex.getComment()
);
if (ex.getStackTrace) {
this.error("Stack trace: " + ex.getStackTrace().join("\n"));
}
});
testResult.addListener("error", e => {
var ex = e.getData()[0].exception;
var test = e.getData()[0].test;
this.error(
"The test '" + test.getFullName() + "' had an error: " + ex,
ex
);
});
this.getSuite().run(testResult);
},
/**
* Get a list of test descriptions
*
* @return {String} A description of all tests.
*/
getTestDescriptions() {
var desc = [];
var classes = this.getSuite().getTestClasses();
for (var i = 0; i < classes.length; i++) {
var cls = classes[i];
var clsDesc = {};
clsDesc.classname = cls.getName();
clsDesc.tests = [];
var methods = cls.getTestMethods();
for (var j = 0; j < methods.length; j++) {
clsDesc.tests.push(methods[j].getName());
}
desc.push(clsDesc);
}
return qx.lang.Json.stringify(desc);
},
/**
* Runs exactly one test from the test suite
*
* @param testResult {qx.dev.unit.TestResult} the result logger
* @param className {String} Name of the test class
* @param methodName {String} Name of the test method
*/
runTests(testResult, className, methodName) {
var classes = this.getSuite().getTestClasses();
for (var i = 0; i < classes.length; i++) {
if (className == classes[i].getName()) {
var methods = classes[i].getTestMethods();
for (var j = 0; j < methods.length; j++) {
if (methodName && methods[j].getName() != methodName) {
continue;
}
methods[j].run(testResult);
}
return;
}
}
},
/**
* Runs all tests inside of the given namespace
*
* @param testResult {qx.dev.unit.TestResult} the result logger
* @param namespaceName {String} Namespace of the tests to run
*/
runTestsFromNamespace(testResult, namespaceName) {
var classes = this.getSuite().getTestClasses();
for (var i = 0; i < classes.length; i++) {
if (classes[i].getName().indexOf(namespaceName) == 0) {
classes[i].run(testResult);
}
}
}
}
});