Basic js-test-driver configuration added.
svn path=/plone.app.discussion/trunk/; revision=40892
This commit is contained in:
parent
81dcdeaea3
commit
0820d3771f
13
plone/app/discussion/tests/jsTestDriver.conf
Normal file
13
plone/app/discussion/tests/jsTestDriver.conf
Normal file
@ -0,0 +1,13 @@
|
||||
server: http://localhost:9876
|
||||
|
||||
load:
|
||||
# Add these lines to load the equiv function and adapter in order, before the
|
||||
# tests (assuming they are saved to tests/qunit/)
|
||||
- qunit/equiv.js
|
||||
- qunit/QUnitAdapter.js
|
||||
|
||||
# This is where we load the qunit tests
|
||||
- javascripts/*.js
|
||||
|
||||
# And this loads the source files we are testing
|
||||
- ../browser/javascripts/*.js
|
5
plone/app/discussion/tests/jsTestDriver.txt
Normal file
5
plone/app/discussion/tests/jsTestDriver.txt
Normal file
@ -0,0 +1,5 @@
|
||||
==============
|
||||
JS TEST DRIVER
|
||||
==============
|
||||
|
||||
java -jar JsTestDriver.jar --port 9876 --config jsTestDriver.conf --browser /usr/bin/firefox --tests all
|
85
plone/app/discussion/tests/qunit/QUnitAdapter.js
Normal file
85
plone/app/discussion/tests/qunit/QUnitAdapter.js
Normal file
@ -0,0 +1,85 @@
|
||||
/*
|
||||
QUnitAdapter
|
||||
Version: 1.1.0
|
||||
|
||||
Run qunit tests using JS Test Driver
|
||||
|
||||
This provides almost the same api as qunit.
|
||||
|
||||
Tests must run sychronously, which means no use of stop and start methods.
|
||||
You can use jsUnit Clock object to deal with timeouts and intervals:
|
||||
http://googletesting.blogspot.com/2007/03/javascript-simulating-time-in-jsunit.html
|
||||
|
||||
The qunit #main DOM element is not included. If you need to do any DOM manipulation
|
||||
you need to set it up and tear it down in each test.
|
||||
|
||||
*/
|
||||
(function() {
|
||||
|
||||
if(!(window.equiv)) {
|
||||
throw new Error("QUnitAdapter.js - Unable to find equiv function. Ensure you have added equiv.js to the load section of your jsTestDriver.conf");
|
||||
}
|
||||
|
||||
var QUnitTestCase;
|
||||
|
||||
window.module = function(name, lifecycle) {
|
||||
QUnitTestCase = TestCase(name);
|
||||
QUnitTestCase.prototype.lifecycle = lifecycle || {};
|
||||
};
|
||||
|
||||
window.test = function(name, expected, test) {
|
||||
QUnitTestCase.prototype['test ' + name] = function() {
|
||||
if(this.lifecycle.setup) {
|
||||
this.lifecycle.setup();
|
||||
}
|
||||
if(expected.constructor === Number) {
|
||||
expectAsserts(expected);
|
||||
} else {
|
||||
test = expected;
|
||||
}
|
||||
test.call(this.lifecycle);
|
||||
|
||||
if(this.lifecycle.teardown) {
|
||||
this.lifecycle.teardown();
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
window.expect = function(count) {
|
||||
expectAsserts(count);
|
||||
};
|
||||
|
||||
window.ok = function(actual, msg) {
|
||||
assertTrue(msg ? msg : '', !!actual);
|
||||
};
|
||||
|
||||
window.equals = function(a, b, msg) {
|
||||
assertEquals(msg ? msg : '', b, a);
|
||||
};
|
||||
|
||||
window.start = window.stop = function() {
|
||||
fail('start and stop methods are not available when using JS Test Driver.\n' +
|
||||
'Use jsUnit Clock object to deal with timeouts and intervals:\n' +
|
||||
'http://googletesting.blogspot.com/2007/03/javascript-simulating-time-in-jsunit.html.');
|
||||
};
|
||||
|
||||
window.same = function(a, b, msg) {
|
||||
assertTrue(msg ? msg : '', window.equiv(b, a));
|
||||
};
|
||||
|
||||
window.reset = function() {
|
||||
fail('reset method is not available when using JS Test Driver');
|
||||
};
|
||||
|
||||
window.isLocal = function() {
|
||||
return false;
|
||||
};
|
||||
|
||||
window.QUnit = {
|
||||
equiv: window.equiv,
|
||||
ok: window.ok
|
||||
};
|
||||
|
||||
module('Default Module');
|
||||
|
||||
})();
|
185
plone/app/discussion/tests/qunit/equiv.js
Normal file
185
plone/app/discussion/tests/qunit/equiv.js
Normal file
@ -0,0 +1,185 @@
|
||||
|
||||
// Tests for equality any JavaScript type and structure without unexpected results.
|
||||
// Discussions and reference: http://philrathe.com/articles/equiv
|
||||
// Test suites: http://philrathe.com/tests/equiv
|
||||
// Author: Philippe Rath <prathe@gmail.com>
|
||||
window.equiv = function () {
|
||||
|
||||
var innerEquiv; // the real equiv function
|
||||
var callers = []; // stack to decide between skip/abort functions
|
||||
|
||||
// Determine what is o.
|
||||
function hoozit(o) {
|
||||
if (typeof o === "string") {
|
||||
return "string";
|
||||
|
||||
} else if (typeof o === "boolean") {
|
||||
return "boolean";
|
||||
|
||||
} else if (typeof o === "number") {
|
||||
|
||||
if (isNaN(o)) {
|
||||
return "nan";
|
||||
} else {
|
||||
return "number";
|
||||
}
|
||||
|
||||
} else if (typeof o === "undefined") {
|
||||
return "undefined";
|
||||
|
||||
// consider: typeof null === object
|
||||
} else if (o === null) {
|
||||
return "null";
|
||||
|
||||
// consider: typeof [] === object
|
||||
} else if (o instanceof Array) {
|
||||
return "array";
|
||||
|
||||
// consider: typeof new Date() === object
|
||||
} else if (o instanceof Date) {
|
||||
return "date";
|
||||
|
||||
// consider: /./ instanceof Object;
|
||||
// /./ instanceof RegExp;
|
||||
// typeof /./ === "function"; // => false in IE and Opera,
|
||||
// true in FF and Safari
|
||||
} else if (o instanceof RegExp) {
|
||||
return "regexp";
|
||||
|
||||
} else if (typeof o === "object") {
|
||||
return "object";
|
||||
|
||||
} else if (o instanceof Function) {
|
||||
return "function";
|
||||
}
|
||||
}
|
||||
|
||||
// Call the o related callback with the given arguments.
|
||||
function bindCallbacks(o, callbacks, args) {
|
||||
var prop = hoozit(o);
|
||||
if (prop) {
|
||||
if (hoozit(callbacks[prop]) === "function") {
|
||||
return callbacks[prop].apply(callbacks, args);
|
||||
} else {
|
||||
return callbacks[prop]; // or undefined
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
var callbacks = function () {
|
||||
|
||||
// for string, boolean, number and null
|
||||
function useStrictEquality(b, a) {
|
||||
return a === b;
|
||||
}
|
||||
|
||||
return {
|
||||
"string": useStrictEquality,
|
||||
"boolean": useStrictEquality,
|
||||
"number": useStrictEquality,
|
||||
"null": useStrictEquality,
|
||||
"undefined": useStrictEquality,
|
||||
|
||||
"nan": function (b) {
|
||||
return isNaN(b);
|
||||
},
|
||||
|
||||
"date": function (b, a) {
|
||||
return hoozit(b) === "date" && a.valueOf() === b.valueOf();
|
||||
},
|
||||
|
||||
"regexp": function (b, a) {
|
||||
return hoozit(b) === "regexp" &&
|
||||
a.source === b.source && // the regex itself
|
||||
a.global === b.global && // and its modifers (gmi) ...
|
||||
a.ignoreCase === b.ignoreCase &&
|
||||
a.multiline === b.multiline;
|
||||
},
|
||||
|
||||
// - skip when the property is a method of an instance (OOP)
|
||||
// - abort otherwise,
|
||||
// initial === would have catch identical references anyway
|
||||
"function": function () {
|
||||
var caller = callers[callers.length - 1];
|
||||
return caller !== Object &&
|
||||
typeof caller !== "undefined";
|
||||
},
|
||||
|
||||
"array": function (b, a) {
|
||||
var i;
|
||||
var len;
|
||||
|
||||
// b could be an object literal here
|
||||
if ( ! (hoozit(b) === "array")) {
|
||||
return false;
|
||||
}
|
||||
|
||||
len = a.length;
|
||||
if (len !== b.length) { // safe and faster
|
||||
return false;
|
||||
}
|
||||
for (i = 0; i < len; i++) {
|
||||
if( ! innerEquiv(a[i], b[i])) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
},
|
||||
|
||||
"object": function (b, a) {
|
||||
var i;
|
||||
var eq = true; // unless we can proove it
|
||||
var aProperties = [], bProperties = []; // collection of strings
|
||||
|
||||
// comparing constructors is more strict than using instanceof
|
||||
if ( a.constructor !== b.constructor) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// stack constructor before traversing properties
|
||||
callers.push(a.constructor);
|
||||
|
||||
for (i in a) { // be strict: don't ensures hasOwnProperty and go deep
|
||||
|
||||
aProperties.push(i); // collect a's properties
|
||||
|
||||
if ( ! innerEquiv(a[i], b[i])) {
|
||||
eq = false;
|
||||
}
|
||||
}
|
||||
|
||||
callers.pop(); // unstack, we are done
|
||||
|
||||
for (i in b) {
|
||||
bProperties.push(i); // collect b's properties
|
||||
}
|
||||
|
||||
// Ensures identical properties name
|
||||
return eq && innerEquiv(aProperties.sort(), bProperties.sort());
|
||||
}
|
||||
};
|
||||
}();
|
||||
|
||||
innerEquiv = function () { // can take multiple arguments
|
||||
var args = Array.prototype.slice.apply(arguments);
|
||||
if (args.length < 2) {
|
||||
return true; // end transition
|
||||
}
|
||||
|
||||
return (function (a, b) {
|
||||
if (a === b) {
|
||||
return true; // catch the most you can
|
||||
|
||||
} else if (typeof a !== typeof b || a === null || b === null || typeof a === "undefined" || typeof b === "undefined") {
|
||||
return false; // don't lose time with error prone cases
|
||||
|
||||
} else {
|
||||
return bindCallbacks(a, callbacks, [b, a]);
|
||||
}
|
||||
|
||||
// apply transition with (1..n) arguments
|
||||
})(args[0], args[1]) && arguments.callee.apply(this, args.splice(1, args.length -1));
|
||||
};
|
||||
|
||||
return innerEquiv;
|
||||
}(); // equiv
|
Loading…
Reference in New Issue
Block a user