mirror of https://gitee.com/bigwinds/arangodb
174 lines
4.5 KiB
JavaScript
174 lines
4.5 KiB
JavaScript
/**
|
|
* @depend util/core.js
|
|
* @depend spy.js
|
|
* @depend stub.js
|
|
* @depend mock.js
|
|
*/
|
|
/**
|
|
* Collections of stubs, spies and mocks.
|
|
*
|
|
* @author Christian Johansen (christian@cjohansen.no)
|
|
* @license BSD
|
|
*
|
|
* Copyright (c) 2010-2013 Christian Johansen
|
|
*/
|
|
(function (sinonGlobal) {
|
|
"use strict";
|
|
|
|
var push = [].push;
|
|
var hasOwnProperty = Object.prototype.hasOwnProperty;
|
|
|
|
function getFakes(fakeCollection) {
|
|
if (!fakeCollection.fakes) {
|
|
fakeCollection.fakes = [];
|
|
}
|
|
|
|
return fakeCollection.fakes;
|
|
}
|
|
|
|
function each(fakeCollection, method) {
|
|
var fakes = getFakes(fakeCollection);
|
|
|
|
for (var i = 0, l = fakes.length; i < l; i += 1) {
|
|
if (typeof fakes[i][method] === "function") {
|
|
fakes[i][method]();
|
|
}
|
|
}
|
|
}
|
|
|
|
function compact(fakeCollection) {
|
|
var fakes = getFakes(fakeCollection);
|
|
var i = 0;
|
|
while (i < fakes.length) {
|
|
fakes.splice(i, 1);
|
|
}
|
|
}
|
|
|
|
function makeApi(sinon) {
|
|
var collection = {
|
|
verify: function resolve() {
|
|
each(this, "verify");
|
|
},
|
|
|
|
restore: function restore() {
|
|
each(this, "restore");
|
|
compact(this);
|
|
},
|
|
|
|
reset: function restore() {
|
|
each(this, "reset");
|
|
},
|
|
|
|
verifyAndRestore: function verifyAndRestore() {
|
|
var exception;
|
|
|
|
try {
|
|
this.verify();
|
|
} catch (e) {
|
|
exception = e;
|
|
}
|
|
|
|
this.restore();
|
|
|
|
if (exception) {
|
|
throw exception;
|
|
}
|
|
},
|
|
|
|
add: function add(fake) {
|
|
push.call(getFakes(this), fake);
|
|
return fake;
|
|
},
|
|
|
|
spy: function spy() {
|
|
return this.add(sinon.spy.apply(sinon, arguments));
|
|
},
|
|
|
|
stub: function stub(object, property, value) {
|
|
if (property) {
|
|
var original = object[property];
|
|
|
|
if (typeof original !== "function") {
|
|
if (!hasOwnProperty.call(object, property)) {
|
|
throw new TypeError("Cannot stub non-existent own property " + property);
|
|
}
|
|
|
|
object[property] = value;
|
|
|
|
return this.add({
|
|
restore: function () {
|
|
object[property] = original;
|
|
}
|
|
});
|
|
}
|
|
}
|
|
if (!property && !!object && typeof object === "object") {
|
|
var stubbedObj = sinon.stub.apply(sinon, arguments);
|
|
|
|
for (var prop in stubbedObj) {
|
|
if (typeof stubbedObj[prop] === "function") {
|
|
this.add(stubbedObj[prop]);
|
|
}
|
|
}
|
|
|
|
return stubbedObj;
|
|
}
|
|
|
|
return this.add(sinon.stub.apply(sinon, arguments));
|
|
},
|
|
|
|
mock: function mock() {
|
|
return this.add(sinon.mock.apply(sinon, arguments));
|
|
},
|
|
|
|
inject: function inject(obj) {
|
|
var col = this;
|
|
|
|
obj.spy = function () {
|
|
return col.spy.apply(col, arguments);
|
|
};
|
|
|
|
obj.stub = function () {
|
|
return col.stub.apply(col, arguments);
|
|
};
|
|
|
|
obj.mock = function () {
|
|
return col.mock.apply(col, arguments);
|
|
};
|
|
|
|
return obj;
|
|
}
|
|
};
|
|
|
|
sinon.collection = collection;
|
|
return collection;
|
|
}
|
|
|
|
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 sinon = require("./util/core");
|
|
require("./mock");
|
|
require("./spy");
|
|
require("./stub");
|
|
module.exports = makeApi(sinon);
|
|
}
|
|
|
|
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
|
|
));
|