UNPKG

catjs

Version:

(Mobile) Web Automation Framework

271 lines (206 loc) 8.48 kB
_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; }();