catjs
Version:
(Mobile) Web Automation Framework
271 lines (206 loc) • 8.48 kB
JavaScript
_cat.core.manager.statecontroller = function () {
// jshint supernew: true
var _queue =
/**
* General queue class
*/
function () {
this._queue = [];
this._busy = false;
this.add = function (obj) {
this._queue.push(obj);
};
this.next = function () {
return this._queue.shift();
};
this.hasnext = function () {
return (this._queue.length > 0 ? true : false);
};
this.empty = function () {
return (this._queue.length === 0 ? true : false);
};
this.clean = function () {
this._queue = [];
};
this.busy = function (status) {
if (status !== undefined) {
this._busy = status;
}
return this._busy;
};
},
_q = new _queue(),
_steps = 10,
_defer,
_module,
_scrapspool = new _queue(),
// in case resolve flag is false, wait until the user executed 'resolve' called manually
_masterresolve = true;
_module = {
defer: function (def) {
if (def) {
_defer = def;
}
return _defer;
},
resolve: function (obj) {
_defer.resolve(obj);
},
wait: function (config) {
var counter = 0,
ihandle,
match,
me = this,
__wait, __onready;
function _test(item) {
var valid = 0,
test, testobj;
if ("match" in item) {
match = item.match;
if (match && match !== "undefined") {
if (typeof match === "function") {
test = match.apply(me, ("context" in config ? config.context : []));
} else if (typeof match === "object" || typeof match === "string") {
testobj = _cat.utils.plugins.jqhelper.getElt(match);
if (testobj) {
testobj = _cat.utils.plugins.jqhelper.dom(testobj);
if (testobj) {
test = true;
}
}
}
if (!test) {
valid++;
}
}
}
return (valid > 0 ? false : true);
}
function _wait(item) {
var steps = ( ("steps" in item) ? (item.steps || 1) : _steps ),
resolve = ( ("resolve" in item ) ? item.resolve : true ),
wait = Math.max(Math.floor(item.delay / steps), 0);
if ( config.context && config.context.scrap && "$resolve" in config.context.scrap ) {
resolve = config.context.scrap["$resolve"];
}
if (!resolve) {
_masterresolve = false;
}
ihandle = setInterval(function () {
var test;
counter++;
test = _test(item);
if (test) {
//console.log("test is valid!... continue");
if ("match" in item) {
counter = steps;
}
}
if (counter === steps) {
if (!test) {
console.warn("[catjs wait] One or more Objects was not resolved, but the timeout expired");
if (chai) {
chai.assert.ok(test, 'One or more Objects was not resolved, but the timeout expired');
}
}
if ("callback" in item) {
var temp = item.callback.apply(_module, ("context" in config ? config.context : []));
}
counter = 0;
clearInterval(ihandle);
if (!resolve) {
_defer.promise.done(function() {
_masterresolve = true;
resolve = true;
});
}
if (_q.empty()) {
_q.busy(false);
if (_masterresolve) {
_defer.resolve();
}
} else {
_q.busy(true);
_wait(_q.next());
}
}
}, wait);
}
__onready = function (config) {
if (_q.busy()) {
_q.add(config);
} else {
_q.busy(true);
_wait(config);
}
};
__wait = function () {
var args = arguments;
__onready(args[0]);
return {
promise: _defer.promise,
wait: __wait
};
};
__onready(config);
return {
promise: _defer.promise,
wait: __wait
};
},
next: function (config, callback) {
var defer, methods, delay,
currentconfig, nextTest, catconfig,
clientManager = _cat.core.manager.client,
runStatus, done;
if (config) {
_scrapspool.add(config);
}
if (!_scrapspool.busy()) {
currentconfig = _scrapspool.next();
catconfig = _cat.core.getConfig();
nextTest = catconfig.getNextTest();
if (nextTest) {
// we have more tests to run
clientManager.setFailureInterval(catconfig, ( nextTest ? {id: nextTest.name, name: nextTest.name} : undefined ));
if (!catconfig.hasNextTest() ) {
done = function () {
// last scrap done callback
};
}
} else {
// this is the last test
runStatus = clientManager.getRunStatus();
clientManager.endTest({}, runStatus);
if (callback) {
callback.call();
}
}
if (!currentconfig) {
return undefined;
}
defer = currentconfig.defer;
methods = currentconfig.methods;
delay = ("delay" in currentconfig ? currentconfig.delay : 0);
_scrapspool.busy(true);
defer.delay(delay).then(function () {
defer.fcall(function () {
var cell = methods.shift(),
def = Q.defer();
_module.defer(def);
(function () {
cell.call(this, def, done);
return def;
})(def).promise.then(function () {
_scrapspool.busy(false);
_module.next(undefined, callback);
});
});
}).catch(function (err) {
console.error(err);
});
}
}
};
return _module;
}();