mirror of https://gitee.com/bigwinds/arangodb
201 lines
6.3 KiB
JavaScript
201 lines
6.3 KiB
JavaScript
/**
|
|
* @depend util/core.js
|
|
* @depend extend.js
|
|
* @depend spy.js
|
|
* @depend behavior.js
|
|
* @depend walk.js
|
|
*/
|
|
/**
|
|
* Stub functions
|
|
*
|
|
* @author Christian Johansen (christian@cjohansen.no)
|
|
* @license BSD
|
|
*
|
|
* Copyright (c) 2010-2013 Christian Johansen
|
|
*/
|
|
(function (sinonGlobal) {
|
|
"use strict";
|
|
|
|
function makeApi(sinon) {
|
|
function stub(object, property, func) {
|
|
if (!!func && typeof func !== "function" && typeof func !== "object") {
|
|
throw new TypeError("Custom stub should be a function or a property descriptor");
|
|
}
|
|
|
|
var wrapper;
|
|
|
|
if (func) {
|
|
if (typeof func === "function") {
|
|
wrapper = sinon.spy && sinon.spy.create ? sinon.spy.create(func) : func;
|
|
} else {
|
|
wrapper = func;
|
|
if (sinon.spy && sinon.spy.create) {
|
|
var types = sinon.objectKeys(wrapper);
|
|
for (var i = 0; i < types.length; i++) {
|
|
wrapper[types[i]] = sinon.spy.create(wrapper[types[i]]);
|
|
}
|
|
}
|
|
}
|
|
} else {
|
|
var stubLength = 0;
|
|
if (typeof object === "object" && typeof object[property] === "function") {
|
|
stubLength = object[property].length;
|
|
}
|
|
wrapper = stub.create(stubLength);
|
|
}
|
|
|
|
if (!object && typeof property === "undefined") {
|
|
return sinon.stub.create();
|
|
}
|
|
|
|
if (typeof property === "undefined" && typeof object === "object") {
|
|
sinon.walk(object || {}, function (value, prop, propOwner) {
|
|
// we don't want to stub things like toString(), valueOf(), etc. so we only stub if the object
|
|
// is not Object.prototype
|
|
if (
|
|
propOwner !== Object.prototype &&
|
|
prop !== "constructor" &&
|
|
typeof sinon.getPropertyDescriptor(propOwner, prop).value === "function"
|
|
) {
|
|
stub(object, prop);
|
|
}
|
|
});
|
|
|
|
return object;
|
|
}
|
|
|
|
return sinon.wrapMethod(object, property, wrapper);
|
|
}
|
|
|
|
|
|
/*eslint-disable no-use-before-define*/
|
|
function getParentBehaviour(stubInstance) {
|
|
return (stubInstance.parent && getCurrentBehavior(stubInstance.parent));
|
|
}
|
|
|
|
function getDefaultBehavior(stubInstance) {
|
|
return stubInstance.defaultBehavior ||
|
|
getParentBehaviour(stubInstance) ||
|
|
sinon.behavior.create(stubInstance);
|
|
}
|
|
|
|
function getCurrentBehavior(stubInstance) {
|
|
var behavior = stubInstance.behaviors[stubInstance.callCount - 1];
|
|
return behavior && behavior.isPresent() ? behavior : getDefaultBehavior(stubInstance);
|
|
}
|
|
/*eslint-enable no-use-before-define*/
|
|
|
|
var uuid = 0;
|
|
|
|
var proto = {
|
|
create: function create(stubLength) {
|
|
var functionStub = function () {
|
|
return getCurrentBehavior(functionStub).invoke(this, arguments);
|
|
};
|
|
|
|
functionStub.id = "stub#" + uuid++;
|
|
var orig = functionStub;
|
|
functionStub = sinon.spy.create(functionStub, stubLength);
|
|
functionStub.func = orig;
|
|
|
|
sinon.extend(functionStub, stub);
|
|
functionStub.instantiateFake = sinon.stub.create;
|
|
functionStub.displayName = "stub";
|
|
functionStub.toString = sinon.functionToString;
|
|
|
|
functionStub.defaultBehavior = null;
|
|
functionStub.behaviors = [];
|
|
|
|
return functionStub;
|
|
},
|
|
|
|
resetBehavior: function () {
|
|
var i;
|
|
|
|
this.defaultBehavior = null;
|
|
this.behaviors = [];
|
|
|
|
delete this.returnValue;
|
|
delete this.returnArgAt;
|
|
this.returnThis = false;
|
|
|
|
if (this.fakes) {
|
|
for (i = 0; i < this.fakes.length; i++) {
|
|
this.fakes[i].resetBehavior();
|
|
}
|
|
}
|
|
},
|
|
|
|
onCall: function onCall(index) {
|
|
if (!this.behaviors[index]) {
|
|
this.behaviors[index] = sinon.behavior.create(this);
|
|
}
|
|
|
|
return this.behaviors[index];
|
|
},
|
|
|
|
onFirstCall: function onFirstCall() {
|
|
return this.onCall(0);
|
|
},
|
|
|
|
onSecondCall: function onSecondCall() {
|
|
return this.onCall(1);
|
|
},
|
|
|
|
onThirdCall: function onThirdCall() {
|
|
return this.onCall(2);
|
|
}
|
|
};
|
|
|
|
function createBehavior(behaviorMethod) {
|
|
return function () {
|
|
this.defaultBehavior = this.defaultBehavior || sinon.behavior.create(this);
|
|
this.defaultBehavior[behaviorMethod].apply(this.defaultBehavior, arguments);
|
|
return this;
|
|
};
|
|
}
|
|
|
|
for (var method in sinon.behavior) {
|
|
if (sinon.behavior.hasOwnProperty(method) &&
|
|
!proto.hasOwnProperty(method) &&
|
|
method !== "create" &&
|
|
method !== "withArgs" &&
|
|
method !== "invoke") {
|
|
proto[method] = createBehavior(method);
|
|
}
|
|
}
|
|
|
|
sinon.extend(stub, proto);
|
|
sinon.stub = stub;
|
|
|
|
return stub;
|
|
}
|
|
|
|
var isNode = typeof module !== "undefined" && module.exports && typeof require === "function";
|
|
var isAMD = typeof define === "function" && typeof define.amd === "object" && define.amd;
|
|
|
|
function loadDependencies(require, exports, module) {
|
|
var core = require("./util/core");
|
|
require("./behavior");
|
|
require("./spy");
|
|
require("./extend");
|
|
module.exports = makeApi(core);
|
|
}
|
|
|
|
if (isAMD) {
|
|
define(loadDependencies);
|
|
return;
|
|
}
|
|
|
|
if (isNode) {
|
|
loadDependencies(require, module.exports, module);
|
|
return;
|
|
}
|
|
|
|
if (sinonGlobal) {
|
|
makeApi(sinonGlobal);
|
|
}
|
|
}(
|
|
typeof sinon === "object" && sinon // eslint-disable-line no-undef
|
|
));
|