/
fake.js
113 lines (88 loc) · 2.31 KB
/
fake.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
"use strict";
var spy = require("./spy");
var nextTick = require("./util/core/next-tick");
function getError(value) {
return value instanceof Error ? value : new Error(value);
}
function cleanProxy(f) {
var undesirableProperties = [
"instantiateFake",
"callArg",
"callArgOn",
"callArgOnWith",
"callArgWith",
"invokeCallback",
"throwArg",
"withArgs",
"yield",
"yieldOn",
"yieldTo",
"yieldToOn"
];
undesirableProperties.forEach(function (key) {
delete f[key];
});
return f;
}
function wrapFunc(f) {
return cleanProxy(spy(f));
}
function fake(f) {
if (typeof func !== "undefined" && typeof func !== "function") {
throw new TypeError("Expected func argument to be a Function");
}
return wrapFunc(f);
}
fake.returns = function returns(value) {
function f() {
return value;
}
return wrapFunc(f);
};
fake.throws = function throws(value) {
function f() {
throw getError(value);
}
return wrapFunc(f);
};
fake.resolves = function resolves(value) {
function f() {
return Promise.resolve(value);
}
return wrapFunc(f);
};
fake.rejects = function rejects(value) {
function f() {
return Promise.reject(getError(value));
}
return wrapFunc(f);
};
function yieldInternal(async, callback, values) {
function f() {
if (async) {
nextTick(function () {
callback.apply(null, values);
});
} else {
callback.apply(null, values);
}
}
return wrapFunc(f);
}
fake.yields = function yields() {
var callback = Array.prototype.slice.call(arguments, 0, 1)[0];
var values = Array.prototype.slice.call(arguments, 1);
if (typeof callback !== "function") {
throw new TypeError("Expected callback to be a Function");
}
return yieldInternal(false, callback, values);
};
fake.yieldsAsync = function yieldsAsync() {
var callback = Array.prototype.slice.call(arguments, 0, 1)[0];
var values = Array.prototype.slice.call(arguments, 1);
if (typeof callback !== "function") {
throw new TypeError("Expected callback to be a Function");
}
return yieldInternal(true, callback, values);
};
module.exports = fake;