sinon-rails 1.7.3 → 1.9.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +4 -2
- data/lib/sinon/rails/version.rb +1 -1
- data/vendor/assets/javascripts/sinon.js +1151 -647
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b1cb98e6422863e4390638e3ef04849675fb94af
|
4
|
+
data.tar.gz: dfadbf5735f311e238775110b080940c14ccf3bc
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a339a8ffe6f7adeccecd115c4eaac89689d2297e81f1ef493ca0864b0957e0d3205ac11c4e8d1802abbc9dc1d16e245099485e9681972a894123c01d678405ce
|
7
|
+
data.tar.gz: 9329e86f48c0cac9270a433d9f67e70fa06ef6dc8e19ec731b1f6f68449940e4f80a2bcc90bff2d5eadc5ce8bae01f63b7bdf22e404cb51798f1039e30b2b9e3
|
data/README.md
CHANGED
data/lib/sinon/rails/version.rb
CHANGED
@@ -1,12 +1,12 @@
|
|
1
1
|
/**
|
2
|
-
* Sinon.JS 1.
|
2
|
+
* Sinon.JS 1.9.0, 2014/03/05
|
3
3
|
*
|
4
4
|
* @author Christian Johansen (christian@cjohansen.no)
|
5
5
|
* @author Contributors: https://github.com/cjohansen/Sinon.JS/blob/master/AUTHORS
|
6
6
|
*
|
7
7
|
* (The BSD License)
|
8
8
|
*
|
9
|
-
* Copyright (c) 2010-
|
9
|
+
* Copyright (c) 2010-2014, Christian Johansen, christian@cjohansen.no
|
10
10
|
* All rights reserved.
|
11
11
|
*
|
12
12
|
* Redistribution and use in source and binary forms, with or without modification,
|
@@ -34,337 +34,497 @@
|
|
34
34
|
*/
|
35
35
|
|
36
36
|
this.sinon = (function () {
|
37
|
-
var
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
37
|
+
var samsam, formatio;
|
38
|
+
function define(mod, deps, fn) { if (mod == "samsam") { samsam = deps(); } else { formatio = fn(samsam); } }
|
39
|
+
define.amd = true;
|
40
|
+
((typeof define === "function" && define.amd && function (m) { define("samsam", m); }) ||
|
41
|
+
(typeof module === "object" &&
|
42
|
+
function (m) { module.exports = m(); }) || // Node
|
43
|
+
function (m) { this.samsam = m(); } // Browser globals
|
44
|
+
)(function () {
|
45
|
+
var o = Object.prototype;
|
46
|
+
var div = typeof document !== "undefined" && document.createElement("div");
|
47
|
+
|
48
|
+
function isNaN(value) {
|
49
|
+
// Unlike global isNaN, this avoids type coercion
|
50
|
+
// typeof check avoids IE host object issues, hat tip to
|
51
|
+
// lodash
|
52
|
+
var val = value; // JsLint thinks value !== value is "weird"
|
53
|
+
return typeof value === "number" && value !== val;
|
54
|
+
}
|
51
55
|
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
56
|
+
function getClass(value) {
|
57
|
+
// Returns the internal [[Class]] by calling Object.prototype.toString
|
58
|
+
// with the provided value as this. Return value is a string, naming the
|
59
|
+
// internal class, e.g. "Array"
|
60
|
+
return o.toString.call(value).split(/[ \]]/)[1];
|
61
|
+
}
|
58
62
|
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
+
/**
|
64
|
+
* @name samsam.isArguments
|
65
|
+
* @param Object object
|
66
|
+
*
|
67
|
+
* Returns ``true`` if ``object`` is an ``arguments`` object,
|
68
|
+
* ``false`` otherwise.
|
69
|
+
*/
|
70
|
+
function isArguments(object) {
|
71
|
+
if (typeof object !== "object" || typeof object.length !== "number" ||
|
72
|
+
getClass(object) === "Array") {
|
73
|
+
return false;
|
74
|
+
}
|
75
|
+
if (typeof object.callee == "function") { return true; }
|
76
|
+
try {
|
77
|
+
object[object.length] = 6;
|
78
|
+
delete object[object.length];
|
79
|
+
} catch (e) {
|
80
|
+
return true;
|
81
|
+
}
|
82
|
+
return false;
|
83
|
+
}
|
63
84
|
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
85
|
+
/**
|
86
|
+
* @name samsam.isElement
|
87
|
+
* @param Object object
|
88
|
+
*
|
89
|
+
* Returns ``true`` if ``object`` is a DOM element node. Unlike
|
90
|
+
* Underscore.js/lodash, this function will return ``false`` if ``object``
|
91
|
+
* is an *element-like* object, i.e. a regular object with a ``nodeType``
|
92
|
+
* property that holds the value ``1``.
|
93
|
+
*/
|
94
|
+
function isElement(object) {
|
95
|
+
if (!object || object.nodeType !== 1 || !div) { return false; }
|
96
|
+
try {
|
97
|
+
object.appendChild(div);
|
98
|
+
object.removeChild(div);
|
99
|
+
} catch (e) {
|
100
|
+
return false;
|
101
|
+
}
|
102
|
+
return true;
|
103
|
+
}
|
73
104
|
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
105
|
+
/**
|
106
|
+
* @name samsam.keys
|
107
|
+
* @param Object object
|
108
|
+
*
|
109
|
+
* Return an array of own property names.
|
110
|
+
*/
|
111
|
+
function keys(object) {
|
112
|
+
var ks = [], prop;
|
113
|
+
for (prop in object) {
|
114
|
+
if (o.hasOwnProperty.call(object, prop)) { ks.push(prop); }
|
115
|
+
}
|
116
|
+
return ks;
|
117
|
+
}
|
80
118
|
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
119
|
+
/**
|
120
|
+
* @name samsam.isDate
|
121
|
+
* @param Object value
|
122
|
+
*
|
123
|
+
* Returns true if the object is a ``Date``, or *date-like*. Duck typing
|
124
|
+
* of date objects work by checking that the object has a ``getTime``
|
125
|
+
* function whose return value equals the return value from the object's
|
126
|
+
* ``valueOf``.
|
127
|
+
*/
|
128
|
+
function isDate(value) {
|
129
|
+
return typeof value.getTime == "function" &&
|
130
|
+
value.getTime() == value.valueOf();
|
131
|
+
}
|
88
132
|
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
},
|
133
|
+
/**
|
134
|
+
* @name samsam.isNegZero
|
135
|
+
* @param Object value
|
136
|
+
*
|
137
|
+
* Returns ``true`` if ``value`` is ``-0``.
|
138
|
+
*/
|
139
|
+
function isNegZero(value) {
|
140
|
+
return value === 0 && 1 / value === -Infinity;
|
141
|
+
}
|
99
142
|
|
100
|
-
|
101
|
-
|
102
|
-
|
143
|
+
/**
|
144
|
+
* @name samsam.equal
|
145
|
+
* @param Object obj1
|
146
|
+
* @param Object obj2
|
147
|
+
*
|
148
|
+
* Returns ``true`` if two objects are strictly equal. Compared to
|
149
|
+
* ``===`` there are two exceptions:
|
150
|
+
*
|
151
|
+
* - NaN is considered equal to NaN
|
152
|
+
* - -0 and +0 are not considered equal
|
153
|
+
*/
|
154
|
+
function identical(obj1, obj2) {
|
155
|
+
if (obj1 === obj2 || (isNaN(obj1) && isNaN(obj2))) {
|
156
|
+
return obj1 !== 0 || isNegZero(obj1) === isNegZero(obj2);
|
157
|
+
}
|
158
|
+
}
|
103
159
|
|
104
|
-
isArray: function isArray(arr) {
|
105
|
-
return Object.prototype.toString.call(arr) == "[object Array]";
|
106
|
-
},
|
107
160
|
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
161
|
+
/**
|
162
|
+
* @name samsam.deepEqual
|
163
|
+
* @param Object obj1
|
164
|
+
* @param Object obj2
|
165
|
+
*
|
166
|
+
* Deep equal comparison. Two values are "deep equal" if:
|
167
|
+
*
|
168
|
+
* - They are equal, according to samsam.identical
|
169
|
+
* - They are both date objects representing the same time
|
170
|
+
* - They are both arrays containing elements that are all deepEqual
|
171
|
+
* - They are objects with the same set of properties, and each property
|
172
|
+
* in ``obj1`` is deepEqual to the corresponding property in ``obj2``
|
173
|
+
*
|
174
|
+
* Supports cyclic objects.
|
175
|
+
*/
|
176
|
+
function deepEqualCyclic(obj1, obj2) {
|
177
|
+
|
178
|
+
// used for cyclic comparison
|
179
|
+
// contain already visited objects
|
180
|
+
var objects1 = [],
|
181
|
+
objects2 = [],
|
182
|
+
// contain pathes (position in the object structure)
|
183
|
+
// of the already visited objects
|
184
|
+
// indexes same as in objects arrays
|
185
|
+
paths1 = [],
|
186
|
+
paths2 = [],
|
187
|
+
// contains combinations of already compared objects
|
188
|
+
// in the manner: { "$1['ref']$2['ref']": true }
|
189
|
+
compared = {};
|
190
|
+
|
191
|
+
/**
|
192
|
+
* used to check, if the value of a property is an object
|
193
|
+
* (cyclic logic is only needed for objects)
|
194
|
+
* only needed for cyclic logic
|
195
|
+
*/
|
196
|
+
function isObject(value) {
|
197
|
+
|
198
|
+
if (typeof value === 'object' && value !== null &&
|
199
|
+
!(value instanceof Boolean) &&
|
200
|
+
!(value instanceof Date) &&
|
201
|
+
!(value instanceof Number) &&
|
202
|
+
!(value instanceof RegExp) &&
|
203
|
+
!(value instanceof String)) {
|
115
204
|
|
116
|
-
|
117
|
-
for (var i = 0, l = arr.length; i < l; ++i) {
|
118
|
-
callback(arr[i]);
|
205
|
+
return true;
|
119
206
|
}
|
120
|
-
},
|
121
207
|
|
122
|
-
|
123
|
-
|
124
|
-
for (var i = 0, l = arr.length; i < l; ++i) {
|
125
|
-
results.push(callback(arr[i]));
|
126
|
-
}
|
127
|
-
return results;
|
128
|
-
},
|
208
|
+
return false;
|
209
|
+
}
|
129
210
|
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
211
|
+
/**
|
212
|
+
* returns the index of the given object in the
|
213
|
+
* given objects array, -1 if not contained
|
214
|
+
* only needed for cyclic logic
|
215
|
+
*/
|
216
|
+
function getIndex(objects, obj) {
|
217
|
+
|
218
|
+
var i;
|
219
|
+
for (i = 0; i < objects.length; i++) {
|
220
|
+
if (objects[i] === obj) {
|
221
|
+
return i;
|
135
222
|
}
|
136
223
|
}
|
137
|
-
if (fns.length == 0) { return cb(null, []); }
|
138
|
-
var remaining = fns.length, results = [];
|
139
|
-
function makeDone(num) {
|
140
|
-
return function done(err, result) {
|
141
|
-
if (err) { return cb(err); }
|
142
|
-
results[num] = result;
|
143
|
-
if (--remaining == 0) { cb(null, results); }
|
144
|
-
};
|
145
|
-
}
|
146
|
-
for (var i = 0, l = fns.length; i < l; ++i) {
|
147
|
-
fns[i](makeDone(i));
|
148
|
-
}
|
149
|
-
},
|
150
224
|
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
225
|
+
return -1;
|
226
|
+
}
|
227
|
+
|
228
|
+
// does the recursion for the deep equal check
|
229
|
+
return (function deepEqual(obj1, obj2, path1, path2) {
|
230
|
+
var type1 = typeof obj1;
|
231
|
+
var type2 = typeof obj2;
|
232
|
+
|
233
|
+
// == null also matches undefined
|
234
|
+
if (obj1 === obj2 ||
|
235
|
+
isNaN(obj1) || isNaN(obj2) ||
|
236
|
+
obj1 == null || obj2 == null ||
|
237
|
+
type1 !== "object" || type2 !== "object") {
|
238
|
+
|
239
|
+
return identical(obj1, obj2);
|
156
240
|
}
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
241
|
+
|
242
|
+
// Elements are only equal if identical(expected, actual)
|
243
|
+
if (isElement(obj1) || isElement(obj2)) { return false; }
|
244
|
+
|
245
|
+
var isDate1 = isDate(obj1), isDate2 = isDate(obj2);
|
246
|
+
if (isDate1 || isDate2) {
|
247
|
+
if (!isDate1 || !isDate2 || obj1.getTime() !== obj2.getTime()) {
|
248
|
+
return false;
|
164
249
|
}
|
165
250
|
}
|
166
|
-
function next(err, result) {
|
167
|
-
if (err) return cb(err);
|
168
|
-
results.push(result);
|
169
|
-
callNext();
|
170
|
-
}
|
171
|
-
callNext();
|
172
|
-
},
|
173
251
|
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
};
|
178
|
-
}
|
179
|
-
};
|
180
|
-
|
181
|
-
if (typeof process === "object" &&
|
182
|
-
typeof require === "function" && typeof module === "object") {
|
183
|
-
var crypto = require("crypto");
|
184
|
-
var path = require("path");
|
252
|
+
if (obj1 instanceof RegExp && obj2 instanceof RegExp) {
|
253
|
+
if (obj1.toString() !== obj2.toString()) { return false; }
|
254
|
+
}
|
185
255
|
|
186
|
-
|
187
|
-
var
|
188
|
-
|
189
|
-
var
|
256
|
+
var class1 = getClass(obj1);
|
257
|
+
var class2 = getClass(obj2);
|
258
|
+
var keys1 = keys(obj1);
|
259
|
+
var keys2 = keys(obj2);
|
190
260
|
|
191
|
-
if (
|
192
|
-
|
261
|
+
if (isArguments(obj1) || isArguments(obj2)) {
|
262
|
+
if (obj1.length !== obj2.length) { return false; }
|
193
263
|
} else {
|
194
|
-
|
264
|
+
if (type1 !== type2 || class1 !== class2 ||
|
265
|
+
keys1.length !== keys2.length) {
|
266
|
+
return false;
|
267
|
+
}
|
195
268
|
}
|
196
|
-
};
|
197
|
-
}
|
198
269
|
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
270
|
+
var key, i, l,
|
271
|
+
// following vars are used for the cyclic logic
|
272
|
+
value1, value2,
|
273
|
+
isObject1, isObject2,
|
274
|
+
index1, index2,
|
275
|
+
newPath1, newPath2;
|
276
|
+
|
277
|
+
for (i = 0, l = keys1.length; i < l; i++) {
|
278
|
+
key = keys1[i];
|
279
|
+
if (!o.hasOwnProperty.call(obj2, key)) {
|
280
|
+
return false;
|
281
|
+
}
|
282
|
+
|
283
|
+
// Start of the cyclic logic
|
284
|
+
|
285
|
+
value1 = obj1[key];
|
286
|
+
value2 = obj2[key];
|
287
|
+
|
288
|
+
isObject1 = isObject(value1);
|
289
|
+
isObject2 = isObject(value2);
|
290
|
+
|
291
|
+
// determine, if the objects were already visited
|
292
|
+
// (it's faster to check for isObject first, than to
|
293
|
+
// get -1 from getIndex for non objects)
|
294
|
+
index1 = isObject1 ? getIndex(objects1, value1) : -1;
|
295
|
+
index2 = isObject2 ? getIndex(objects2, value2) : -1;
|
296
|
+
|
297
|
+
// determine the new pathes of the objects
|
298
|
+
// - for non cyclic objects the current path will be extended
|
299
|
+
// by current property name
|
300
|
+
// - for cyclic objects the stored path is taken
|
301
|
+
newPath1 = index1 !== -1
|
302
|
+
? paths1[index1]
|
303
|
+
: path1 + '[' + JSON.stringify(key) + ']';
|
304
|
+
newPath2 = index2 !== -1
|
305
|
+
? paths2[index2]
|
306
|
+
: path2 + '[' + JSON.stringify(key) + ']';
|
307
|
+
|
308
|
+
// stop recursion if current objects are already compared
|
309
|
+
if (compared[newPath1 + newPath2]) {
|
213
310
|
return true;
|
214
311
|
}
|
215
|
-
}
|
216
312
|
|
217
|
-
|
218
|
-
|
219
|
-
|
313
|
+
// remember the current objects and their pathes
|
314
|
+
if (index1 === -1 && isObject1) {
|
315
|
+
objects1.push(value1);
|
316
|
+
paths1.push(newPath1);
|
317
|
+
}
|
318
|
+
if (index2 === -1 && isObject2) {
|
319
|
+
objects2.push(value2);
|
320
|
+
paths2.push(newPath2);
|
321
|
+
}
|
220
322
|
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
if (typeof fn != "function") { throw new TypeError(); }
|
233
|
-
|
234
|
-
var res = [];
|
235
|
-
for (var i = 0; i < len; i++) {
|
236
|
-
if (i in t) {
|
237
|
-
var val = t[i]; // in case fun mutates this
|
238
|
-
if (fn.call(thisp, val, i, t)) { res.push(val); }
|
323
|
+
// remember that the current objects are already compared
|
324
|
+
if (isObject1 && isObject2) {
|
325
|
+
compared[newPath1 + newPath2] = true;
|
326
|
+
}
|
327
|
+
|
328
|
+
// End of cyclic logic
|
329
|
+
|
330
|
+
// neither value1 nor value2 is a cycle
|
331
|
+
// continue with next level
|
332
|
+
if (!deepEqual(value1, value2, newPath1, newPath2)) {
|
333
|
+
return false;
|
239
334
|
}
|
240
335
|
}
|
241
336
|
|
242
|
-
return
|
243
|
-
|
337
|
+
return true;
|
338
|
+
|
339
|
+
}(obj1, obj2, '$1', '$2'));
|
244
340
|
}
|
245
341
|
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
342
|
+
var match;
|
343
|
+
|
344
|
+
function arrayContains(array, subset) {
|
345
|
+
if (subset.length === 0) { return true; }
|
346
|
+
var i, l, j, k;
|
347
|
+
for (i = 0, l = array.length; i < l; ++i) {
|
348
|
+
if (match(array[i], subset[0])) {
|
349
|
+
for (j = 0, k = subset.length; j < k; ++j) {
|
350
|
+
if (!match(array[i + j], subset[j])) { return false; }
|
351
|
+
}
|
352
|
+
return true;
|
252
353
|
}
|
253
|
-
}
|
354
|
+
}
|
355
|
+
return false;
|
254
356
|
}
|
255
357
|
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
358
|
+
/**
|
359
|
+
* @name samsam.match
|
360
|
+
* @param Object object
|
361
|
+
* @param Object matcher
|
362
|
+
*
|
363
|
+
* Compare arbitrary value ``object`` with matcher.
|
364
|
+
*/
|
365
|
+
match = function match(object, matcher) {
|
366
|
+
if (matcher && typeof matcher.test === "function") {
|
367
|
+
return matcher.test(object);
|
368
|
+
}
|
261
369
|
|
262
|
-
if (typeof
|
263
|
-
|
264
|
-
}
|
370
|
+
if (typeof matcher === "function") {
|
371
|
+
return matcher(object) === true;
|
372
|
+
}
|
373
|
+
|
374
|
+
if (typeof matcher === "string") {
|
375
|
+
matcher = matcher.toLowerCase();
|
376
|
+
var notNull = typeof object === "string" || !!object;
|
377
|
+
return notNull &&
|
378
|
+
(String(object)).toLowerCase().indexOf(matcher) >= 0;
|
379
|
+
}
|
380
|
+
|
381
|
+
if (typeof matcher === "number") {
|
382
|
+
return matcher === object;
|
383
|
+
}
|
265
384
|
|
266
|
-
|
267
|
-
|
268
|
-
|
385
|
+
if (typeof matcher === "boolean") {
|
386
|
+
return matcher === object;
|
387
|
+
}
|
388
|
+
|
389
|
+
if (getClass(object) === "Array" && getClass(matcher) === "Array") {
|
390
|
+
return arrayContains(object, matcher);
|
391
|
+
}
|
269
392
|
|
270
|
-
|
393
|
+
if (matcher && typeof matcher === "object") {
|
394
|
+
var prop;
|
395
|
+
for (prop in matcher) {
|
396
|
+
if (!match(object[prop], matcher[prop])) {
|
397
|
+
return false;
|
398
|
+
}
|
399
|
+
}
|
400
|
+
return true;
|
401
|
+
}
|
402
|
+
|
403
|
+
throw new Error("Matcher was not a string, a number, a " +
|
404
|
+
"function, a boolean or an object");
|
405
|
+
};
|
406
|
+
|
407
|
+
return {
|
408
|
+
isArguments: isArguments,
|
409
|
+
isElement: isElement,
|
410
|
+
isDate: isDate,
|
411
|
+
isNegZero: isNegZero,
|
412
|
+
identical: identical,
|
413
|
+
deepEqual: deepEqualCyclic,
|
414
|
+
match: match,
|
415
|
+
keys: keys
|
416
|
+
};
|
417
|
+
});
|
418
|
+
((typeof define === "function" && define.amd && function (m) {
|
419
|
+
define("formatio", ["samsam"], m);
|
420
|
+
}) || (typeof module === "object" && function (m) {
|
421
|
+
module.exports = m(require("samsam"));
|
422
|
+
}) || function (m) { this.formatio = m(this.samsam); }
|
423
|
+
)(function (samsam) {
|
271
424
|
|
425
|
+
var formatio = {
|
426
|
+
excludeConstructors: ["Object", /^.$/],
|
427
|
+
quoteStrings: true
|
428
|
+
};
|
429
|
+
|
272
430
|
var hasOwn = Object.prototype.hasOwnProperty;
|
273
431
|
|
274
432
|
var specialObjects = [];
|
275
|
-
if (typeof global
|
276
|
-
specialObjects.push({
|
433
|
+
if (typeof global !== "undefined") {
|
434
|
+
specialObjects.push({ object: global, value: "[object global]" });
|
277
435
|
}
|
278
|
-
if (typeof document
|
279
|
-
specialObjects.push({
|
436
|
+
if (typeof document !== "undefined") {
|
437
|
+
specialObjects.push({
|
438
|
+
object: document,
|
439
|
+
value: "[object HTMLDocument]"
|
440
|
+
});
|
280
441
|
}
|
281
|
-
if (typeof window
|
282
|
-
specialObjects.push({
|
442
|
+
if (typeof window !== "undefined") {
|
443
|
+
specialObjects.push({ object: window, value: "[object Window]" });
|
283
444
|
}
|
284
445
|
|
285
|
-
function
|
286
|
-
|
446
|
+
function functionName(func) {
|
447
|
+
if (!func) { return ""; }
|
448
|
+
if (func.displayName) { return func.displayName; }
|
449
|
+
if (func.name) { return func.name; }
|
450
|
+
var matches = func.toString().match(/function\s+([^\(]+)/m);
|
451
|
+
return (matches && matches[1]) || "";
|
452
|
+
}
|
287
453
|
|
288
|
-
|
289
|
-
|
290
|
-
|
291
|
-
|
292
|
-
|
454
|
+
function constructorName(f, object) {
|
455
|
+
var name = functionName(object && object.constructor);
|
456
|
+
var excludes = f.excludeConstructors ||
|
457
|
+
formatio.excludeConstructors || [];
|
458
|
+
|
459
|
+
var i, l;
|
460
|
+
for (i = 0, l = excludes.length; i < l; ++i) {
|
461
|
+
if (typeof excludes[i] === "string" && excludes[i] === name) {
|
462
|
+
return "";
|
463
|
+
} else if (excludes[i].test && excludes[i].test(name)) {
|
464
|
+
return "";
|
293
465
|
}
|
294
466
|
}
|
295
467
|
|
296
|
-
return
|
468
|
+
return name;
|
297
469
|
}
|
298
470
|
|
299
471
|
function isCircular(object, objects) {
|
300
|
-
if (typeof object
|
301
|
-
|
472
|
+
if (typeof object !== "object") { return false; }
|
473
|
+
var i, l;
|
474
|
+
for (i = 0, l = objects.length; i < l; ++i) {
|
475
|
+
if (objects[i] === object) { return true; }
|
302
476
|
}
|
303
|
-
|
304
|
-
for (var i = 0, l = objects.length; i < l; ++i) {
|
305
|
-
if (objects[i] === object) {
|
306
|
-
return true;
|
307
|
-
}
|
308
|
-
}
|
309
|
-
|
310
477
|
return false;
|
311
478
|
}
|
312
479
|
|
313
|
-
function ascii(object, processed, indent) {
|
314
|
-
if (typeof object
|
315
|
-
var
|
480
|
+
function ascii(f, object, processed, indent) {
|
481
|
+
if (typeof object === "string") {
|
482
|
+
var qs = f.quoteStrings;
|
483
|
+
var quote = typeof qs !== "boolean" || qs;
|
316
484
|
return processed || quote ? '"' + object + '"' : object;
|
317
485
|
}
|
318
486
|
|
319
|
-
if (typeof object
|
487
|
+
if (typeof object === "function" && !(object instanceof RegExp)) {
|
320
488
|
return ascii.func(object);
|
321
489
|
}
|
322
490
|
|
323
491
|
processed = processed || [];
|
324
492
|
|
325
|
-
if (isCircular(object, processed)) {
|
326
|
-
return "[Circular]";
|
327
|
-
}
|
328
|
-
|
329
|
-
if (Object.prototype.toString.call(object) == "[object Array]") {
|
330
|
-
return ascii.array.call(this, object, processed);
|
331
|
-
}
|
493
|
+
if (isCircular(object, processed)) { return "[Circular]"; }
|
332
494
|
|
333
|
-
if (
|
334
|
-
return
|
495
|
+
if (Object.prototype.toString.call(object) === "[object Array]") {
|
496
|
+
return ascii.array.call(f, object, processed);
|
335
497
|
}
|
336
498
|
|
337
|
-
if (
|
338
|
-
|
339
|
-
}
|
499
|
+
if (!object) { return String((1/object) === -Infinity ? "-0" : object); }
|
500
|
+
if (samsam.isElement(object)) { return ascii.element(object); }
|
340
501
|
|
341
|
-
if (typeof object.toString
|
342
|
-
|
502
|
+
if (typeof object.toString === "function" &&
|
503
|
+
object.toString !== Object.prototype.toString) {
|
343
504
|
return object.toString();
|
344
505
|
}
|
345
506
|
|
346
|
-
|
347
|
-
|
507
|
+
var i, l;
|
508
|
+
for (i = 0, l = specialObjects.length; i < l; i++) {
|
509
|
+
if (object === specialObjects[i].object) {
|
348
510
|
return specialObjects[i].value;
|
349
511
|
}
|
350
512
|
}
|
351
513
|
|
352
|
-
return ascii.object.call(
|
514
|
+
return ascii.object.call(f, object, processed, indent);
|
353
515
|
}
|
354
516
|
|
355
517
|
ascii.func = function (func) {
|
356
|
-
return "function " +
|
518
|
+
return "function " + functionName(func) + "() {}";
|
357
519
|
};
|
358
520
|
|
359
521
|
ascii.array = function (array, processed) {
|
360
522
|
processed = processed || [];
|
361
523
|
processed.push(array);
|
362
|
-
var pieces = [];
|
363
|
-
|
364
|
-
|
365
|
-
pieces.push(ascii.call(this, array[i], processed));
|
524
|
+
var i, l, pieces = [];
|
525
|
+
for (i = 0, l = array.length; i < l; ++i) {
|
526
|
+
pieces.push(ascii(this, array[i], processed));
|
366
527
|
}
|
367
|
-
|
368
528
|
return "[" + pieces.join(", ") + "]";
|
369
529
|
};
|
370
530
|
|
@@ -372,13 +532,9 @@ buster.format.ascii = (function () {
|
|
372
532
|
processed = processed || [];
|
373
533
|
processed.push(object);
|
374
534
|
indent = indent || 0;
|
375
|
-
var pieces = [], properties = keys(object)
|
376
|
-
var is = "";
|
535
|
+
var pieces = [], properties = samsam.keys(object).sort();
|
377
536
|
var length = 3;
|
378
|
-
|
379
|
-
for (var i = 0, l = indent; i < l; ++i) {
|
380
|
-
is += " ";
|
381
|
-
}
|
537
|
+
var prop, str, obj, i, l;
|
382
538
|
|
383
539
|
for (i = 0, l = properties.length; i < l; ++i) {
|
384
540
|
prop = properties[i];
|
@@ -387,7 +543,7 @@ buster.format.ascii = (function () {
|
|
387
543
|
if (isCircular(obj, processed)) {
|
388
544
|
str = "[Circular]";
|
389
545
|
} else {
|
390
|
-
str = ascii
|
546
|
+
str = ascii(this, obj, processed, indent + 2);
|
391
547
|
}
|
392
548
|
|
393
549
|
str = (/\s/.test(prop) ? '"' + prop + '"' : prop) + ": " + str;
|
@@ -395,28 +551,28 @@ buster.format.ascii = (function () {
|
|
395
551
|
pieces.push(str);
|
396
552
|
}
|
397
553
|
|
398
|
-
var cons =
|
399
|
-
var prefix = cons ? "[" + cons + "] " : ""
|
554
|
+
var cons = constructorName(this, object);
|
555
|
+
var prefix = cons ? "[" + cons + "] " : "";
|
556
|
+
var is = "";
|
557
|
+
for (i = 0, l = indent; i < l; ++i) { is += " "; }
|
400
558
|
|
401
|
-
|
402
|
-
prefix + "{\n " + is + pieces.join(",\n " + is) + "\n" +
|
403
|
-
|
559
|
+
if (length + indent > 80) {
|
560
|
+
return prefix + "{\n " + is + pieces.join(",\n " + is) + "\n" +
|
561
|
+
is + "}";
|
562
|
+
}
|
563
|
+
return prefix + "{ " + pieces.join(", ") + " }";
|
404
564
|
};
|
405
565
|
|
406
566
|
ascii.element = function (element) {
|
407
567
|
var tagName = element.tagName.toLowerCase();
|
408
|
-
var attrs = element.attributes,
|
409
|
-
|
410
|
-
for (var i = 0, l = attrs.length; i < l; ++i) {
|
411
|
-
attribute = attrs.item(i);
|
412
|
-
attrName = attribute.nodeName.toLowerCase().replace("html:", "");
|
568
|
+
var attrs = element.attributes, attr, pairs = [], attrName, i, l, val;
|
413
569
|
|
414
|
-
|
415
|
-
|
416
|
-
|
417
|
-
|
418
|
-
if (
|
419
|
-
pairs.push(attrName + "=\"" +
|
570
|
+
for (i = 0, l = attrs.length; i < l; ++i) {
|
571
|
+
attr = attrs.item(i);
|
572
|
+
attrName = attr.nodeName.toLowerCase().replace("html:", "");
|
573
|
+
val = attr.nodeValue;
|
574
|
+
if (attrName !== "contenteditable" || val !== "inherit") {
|
575
|
+
if (!!val) { pairs.push(attrName + "=\"" + val + "\""); }
|
420
576
|
}
|
421
577
|
}
|
422
578
|
|
@@ -427,32 +583,36 @@ buster.format.ascii = (function () {
|
|
427
583
|
content = content.substr(0, 20) + "[...]";
|
428
584
|
}
|
429
585
|
|
430
|
-
var res = formatted + pairs.join(" ") + ">" + content +
|
586
|
+
var res = formatted + pairs.join(" ") + ">" + content +
|
587
|
+
"</" + tagName + ">";
|
431
588
|
|
432
589
|
return res.replace(/ contentEditable="inherit"/, "");
|
433
590
|
};
|
434
591
|
|
435
|
-
|
436
|
-
var
|
437
|
-
|
438
|
-
|
439
|
-
for (var i = 0, l = excludes.length; i < l; ++i) {
|
440
|
-
if (typeof excludes[i] == "string" && excludes[i] == name) {
|
441
|
-
return "";
|
442
|
-
} else if (excludes[i].test && excludes[i].test(name)) {
|
443
|
-
return "";
|
444
|
-
}
|
592
|
+
function Formatio(options) {
|
593
|
+
for (var opt in options) {
|
594
|
+
this[opt] = options[opt];
|
445
595
|
}
|
596
|
+
}
|
446
597
|
|
447
|
-
|
448
|
-
|
598
|
+
Formatio.prototype = {
|
599
|
+
functionName: functionName,
|
449
600
|
|
450
|
-
|
451
|
-
|
601
|
+
configure: function (options) {
|
602
|
+
return new Formatio(options);
|
603
|
+
},
|
452
604
|
|
453
|
-
|
454
|
-
|
455
|
-
}
|
605
|
+
constructorName: function (object) {
|
606
|
+
return constructorName(this, object);
|
607
|
+
},
|
608
|
+
|
609
|
+
ascii: function (object, processed, indent) {
|
610
|
+
return ascii(this, object, processed, indent);
|
611
|
+
}
|
612
|
+
};
|
613
|
+
|
614
|
+
return Formatio.prototype;
|
615
|
+
});
|
456
616
|
/*jslint eqeqeq: false, onevar: false, forin: true, nomen: false, regexp: false, plusplus: false*/
|
457
617
|
/*global module, require, __dirname, document*/
|
458
618
|
/**
|
@@ -464,7 +624,7 @@ if (typeof module != "undefined") {
|
|
464
624
|
* Copyright (c) 2010-2013 Christian Johansen
|
465
625
|
*/
|
466
626
|
|
467
|
-
var sinon = (function (
|
627
|
+
var sinon = (function (formatio) {
|
468
628
|
var div = typeof document != "undefined" && document.createElement("div");
|
469
629
|
var hasOwn = Object.prototype.hasOwnProperty;
|
470
630
|
|
@@ -517,26 +677,38 @@ var sinon = (function (buster) {
|
|
517
677
|
throw new TypeError("Method wrapper should be function");
|
518
678
|
}
|
519
679
|
|
520
|
-
var wrappedMethod = object[property]
|
680
|
+
var wrappedMethod = object[property],
|
681
|
+
error;
|
521
682
|
|
522
683
|
if (!isFunction(wrappedMethod)) {
|
523
|
-
|
684
|
+
error = new TypeError("Attempted to wrap " + (typeof wrappedMethod) + " property " +
|
524
685
|
property + " as function");
|
525
686
|
}
|
526
687
|
|
527
688
|
if (wrappedMethod.restore && wrappedMethod.restore.sinon) {
|
528
|
-
|
689
|
+
error = new TypeError("Attempted to wrap " + property + " which is already wrapped");
|
529
690
|
}
|
530
691
|
|
531
692
|
if (wrappedMethod.calledBefore) {
|
532
693
|
var verb = !!wrappedMethod.returns ? "stubbed" : "spied on";
|
533
|
-
|
694
|
+
error = new TypeError("Attempted to wrap " + property + " which is already " + verb);
|
534
695
|
}
|
535
696
|
|
536
|
-
|
537
|
-
|
697
|
+
if (error) {
|
698
|
+
if (wrappedMethod._stack) {
|
699
|
+
error.stack += '\n--------------\n' + wrappedMethod._stack;
|
700
|
+
}
|
701
|
+
throw error;
|
702
|
+
}
|
703
|
+
|
704
|
+
// IE 8 does not support hasOwnProperty on the window object and Firefox has a problem
|
705
|
+
// when using hasOwn.call on objects from other frames.
|
706
|
+
var owned = object.hasOwnProperty ? object.hasOwnProperty(property) : hasOwn.call(object, property);
|
538
707
|
object[property] = method;
|
539
708
|
method.displayName = property;
|
709
|
+
// Set up a stack trace which can be used later to find what line of
|
710
|
+
// code the original method was created on.
|
711
|
+
method._stack = (new Error('Stack Trace for original')).stack;
|
540
712
|
|
541
713
|
method.restore = function () {
|
542
714
|
// For prototype properties try to reset by delete first.
|
@@ -600,31 +772,26 @@ var sinon = (function (buster) {
|
|
600
772
|
return false;
|
601
773
|
}
|
602
774
|
|
775
|
+
if (a instanceof RegExp && b instanceof RegExp) {
|
776
|
+
return (a.source === b.source) && (a.global === b.global) &&
|
777
|
+
(a.ignoreCase === b.ignoreCase) && (a.multiline === b.multiline);
|
778
|
+
}
|
779
|
+
|
603
780
|
var aString = Object.prototype.toString.call(a);
|
604
781
|
if (aString != Object.prototype.toString.call(b)) {
|
605
782
|
return false;
|
606
783
|
}
|
607
784
|
|
608
|
-
if (aString == "[object Array]") {
|
609
|
-
if (a.length !== b.length) {
|
610
|
-
return false;
|
611
|
-
}
|
612
|
-
|
613
|
-
for (var i = 0, l = a.length; i < l; i += 1) {
|
614
|
-
if (!deepEqual(a[i], b[i])) {
|
615
|
-
return false;
|
616
|
-
}
|
617
|
-
}
|
618
|
-
|
619
|
-
return true;
|
620
|
-
}
|
621
|
-
|
622
785
|
if (aString == "[object Date]") {
|
623
786
|
return a.valueOf() === b.valueOf();
|
624
787
|
}
|
625
788
|
|
626
789
|
var prop, aLength = 0, bLength = 0;
|
627
790
|
|
791
|
+
if (aString == "[object Array]" && a.length !== b.length) {
|
792
|
+
return false;
|
793
|
+
}
|
794
|
+
|
628
795
|
for (prop in a) {
|
629
796
|
aLength += 1;
|
630
797
|
|
@@ -731,7 +898,7 @@ var sinon = (function (buster) {
|
|
731
898
|
log: function () {},
|
732
899
|
|
733
900
|
logError: function (label, err) {
|
734
|
-
var msg = label + " threw exception: "
|
901
|
+
var msg = label + " threw exception: ";
|
735
902
|
sinon.log(msg + "[" + err.name + "] " + err.message);
|
736
903
|
if (err.stack) { sinon.log(err.stack); }
|
737
904
|
|
@@ -773,14 +940,21 @@ var sinon = (function (buster) {
|
|
773
940
|
}
|
774
941
|
};
|
775
942
|
|
776
|
-
var isNode = typeof module
|
943
|
+
var isNode = typeof module !== "undefined" && module.exports;
|
944
|
+
var isAMD = typeof define === 'function' && typeof define.amd === 'object' && define.amd;
|
777
945
|
|
778
|
-
if (
|
946
|
+
if (isAMD) {
|
947
|
+
define(function(){
|
948
|
+
return sinon;
|
949
|
+
});
|
950
|
+
} else if (isNode) {
|
779
951
|
try {
|
780
|
-
|
952
|
+
formatio = require("formatio");
|
781
953
|
} catch (e) {}
|
782
954
|
module.exports = sinon;
|
783
955
|
module.exports.spy = require("./sinon/spy");
|
956
|
+
module.exports.spyCall = require("./sinon/call");
|
957
|
+
module.exports.behavior = require("./sinon/behavior");
|
784
958
|
module.exports.stub = require("./sinon/stub");
|
785
959
|
module.exports.mock = require("./sinon/mock");
|
786
960
|
module.exports.collection = require("./sinon/collection");
|
@@ -792,9 +966,8 @@ var sinon = (function (buster) {
|
|
792
966
|
module.exports.match = require("./sinon/match");
|
793
967
|
}
|
794
968
|
|
795
|
-
if (
|
796
|
-
var formatter =
|
797
|
-
formatter.quoteStrings = false;
|
969
|
+
if (formatio) {
|
970
|
+
var formatter = formatio.configure({ quoteStrings: false });
|
798
971
|
sinon.format = function () {
|
799
972
|
return formatter.ascii.apply(formatter, arguments);
|
800
973
|
};
|
@@ -811,7 +984,7 @@ var sinon = (function (buster) {
|
|
811
984
|
}
|
812
985
|
|
813
986
|
return sinon;
|
814
|
-
}(typeof
|
987
|
+
}(typeof formatio == "object" && formatio));
|
815
988
|
|
816
989
|
/* @depend ../sinon.js */
|
817
990
|
/*jslint eqeqeq: false, onevar: false, plusplus: false*/
|
@@ -826,7 +999,7 @@ var sinon = (function (buster) {
|
|
826
999
|
*/
|
827
1000
|
|
828
1001
|
(function (sinon) {
|
829
|
-
var commonJSModule = typeof module
|
1002
|
+
var commonJSModule = typeof module !== 'undefined' && module.exports;
|
830
1003
|
|
831
1004
|
if (!sinon && commonJSModule) {
|
832
1005
|
sinon = require("../sinon");
|
@@ -879,8 +1052,10 @@ var sinon = (function (buster) {
|
|
879
1052
|
}
|
880
1053
|
|
881
1054
|
matcher.or = function (m2) {
|
882
|
-
if (!
|
1055
|
+
if (!arguments.length) {
|
883
1056
|
throw new TypeError("Matcher expected");
|
1057
|
+
} else if (!isMatcher(m2)) {
|
1058
|
+
m2 = match(m2);
|
884
1059
|
}
|
885
1060
|
var m1 = this;
|
886
1061
|
var or = sinon.create(matcher);
|
@@ -892,8 +1067,10 @@ var sinon = (function (buster) {
|
|
892
1067
|
};
|
893
1068
|
|
894
1069
|
matcher.and = function (m2) {
|
895
|
-
if (!
|
1070
|
+
if (!arguments.length) {
|
896
1071
|
throw new TypeError("Matcher expected");
|
1072
|
+
} else if (!isMatcher(m2)) {
|
1073
|
+
m2 = match(m2);
|
897
1074
|
}
|
898
1075
|
var m1 = this;
|
899
1076
|
var and = sinon.create(matcher);
|
@@ -1069,13 +1246,16 @@ var sinon = (function (buster) {
|
|
1069
1246
|
* Copyright (c) 2013 Maximilian Antoni
|
1070
1247
|
*/
|
1071
1248
|
|
1072
|
-
|
1249
|
+
(function (sinon) {
|
1250
|
+
var commonJSModule = typeof module !== 'undefined' && module.exports;
|
1251
|
+
if (!sinon && commonJSModule) {
|
1252
|
+
sinon = require("../sinon");
|
1253
|
+
}
|
1073
1254
|
|
1074
|
-
if (!
|
1075
|
-
|
1076
|
-
}
|
1255
|
+
if (!sinon) {
|
1256
|
+
return;
|
1257
|
+
}
|
1077
1258
|
|
1078
|
-
(function (sinon) {
|
1079
1259
|
function throwYieldError(proxy, text, args) {
|
1080
1260
|
var msg = sinon.functionName(proxy) + text;
|
1081
1261
|
if (args.length) {
|
@@ -1140,8 +1320,8 @@ if (!this.sinon && commonJSModule) {
|
|
1140
1320
|
return this.exception === error || this.exception.name === error;
|
1141
1321
|
},
|
1142
1322
|
|
1143
|
-
calledWithNew: function calledWithNew(
|
1144
|
-
return this.thisValue instanceof this.proxy;
|
1323
|
+
calledWithNew: function calledWithNew() {
|
1324
|
+
return this.proxy.prototype && this.thisValue instanceof this.proxy;
|
1145
1325
|
},
|
1146
1326
|
|
1147
1327
|
calledBefore: function (other) {
|
@@ -1241,14 +1421,20 @@ if (!this.sinon && commonJSModule) {
|
|
1241
1421
|
proxyCall.callId = id;
|
1242
1422
|
|
1243
1423
|
return proxyCall;
|
1244
|
-
}
|
1424
|
+
}
|
1245
1425
|
createSpyCall.toString = callProto.toString; // used by mocks
|
1246
1426
|
|
1247
|
-
|
1427
|
+
if (commonJSModule) {
|
1428
|
+
module.exports = createSpyCall;
|
1429
|
+
} else {
|
1430
|
+
sinon.spyCall = createSpyCall;
|
1431
|
+
}
|
1248
1432
|
}(typeof sinon == "object" && sinon || null));
|
1249
1433
|
|
1434
|
+
|
1250
1435
|
/**
|
1251
1436
|
* @depend ../sinon.js
|
1437
|
+
* @depend call.js
|
1252
1438
|
*/
|
1253
1439
|
/*jslint eqeqeq: false, onevar: false, plusplus: false*/
|
1254
1440
|
/*global module, require, sinon*/
|
@@ -1262,11 +1448,19 @@ if (!this.sinon && commonJSModule) {
|
|
1262
1448
|
*/
|
1263
1449
|
|
1264
1450
|
(function (sinon) {
|
1265
|
-
var commonJSModule = typeof module
|
1451
|
+
var commonJSModule = typeof module !== 'undefined' && module.exports;
|
1266
1452
|
var push = Array.prototype.push;
|
1267
1453
|
var slice = Array.prototype.slice;
|
1268
1454
|
var callId = 0;
|
1269
1455
|
|
1456
|
+
if (!sinon && commonJSModule) {
|
1457
|
+
sinon = require("../sinon");
|
1458
|
+
}
|
1459
|
+
|
1460
|
+
if (!sinon) {
|
1461
|
+
return;
|
1462
|
+
}
|
1463
|
+
|
1270
1464
|
function spy(object, property) {
|
1271
1465
|
if (!property && typeof object == "function") {
|
1272
1466
|
return spy.create(object);
|
@@ -1285,8 +1479,6 @@ if (!this.sinon && commonJSModule) {
|
|
1285
1479
|
return;
|
1286
1480
|
}
|
1287
1481
|
|
1288
|
-
var alen = args.length;
|
1289
|
-
|
1290
1482
|
for (var i = 0, l = fakes.length; i < l; i++) {
|
1291
1483
|
if (fakes[i].matches(args, strict)) {
|
1292
1484
|
return fakes[i];
|
@@ -1393,18 +1585,24 @@ if (!this.sinon && commonJSModule) {
|
|
1393
1585
|
} else {
|
1394
1586
|
returnValue = (this.func || func).apply(thisValue, args);
|
1395
1587
|
}
|
1588
|
+
|
1589
|
+
var thisCall = this.getCall(this.callCount - 1);
|
1590
|
+
if (thisCall.calledWithNew() && typeof returnValue !== 'object') {
|
1591
|
+
returnValue = thisValue;
|
1592
|
+
}
|
1396
1593
|
} catch (e) {
|
1397
|
-
push.call(this.returnValues, undefined);
|
1398
1594
|
exception = e;
|
1399
|
-
throw e;
|
1400
|
-
} finally {
|
1401
|
-
push.call(this.exceptions, exception);
|
1402
1595
|
}
|
1403
1596
|
|
1597
|
+
push.call(this.exceptions, exception);
|
1404
1598
|
push.call(this.returnValues, returnValue);
|
1405
1599
|
|
1406
1600
|
createCallProperties.call(this);
|
1407
1601
|
|
1602
|
+
if (exception !== undefined) {
|
1603
|
+
throw exception;
|
1604
|
+
}
|
1605
|
+
|
1408
1606
|
return returnValue;
|
1409
1607
|
},
|
1410
1608
|
|
@@ -1418,6 +1616,17 @@ if (!this.sinon && commonJSModule) {
|
|
1418
1616
|
this.callIds[i]);
|
1419
1617
|
},
|
1420
1618
|
|
1619
|
+
getCalls: function () {
|
1620
|
+
var calls = [];
|
1621
|
+
var i;
|
1622
|
+
|
1623
|
+
for (i = 0; i < this.callCount; i++) {
|
1624
|
+
calls.push(this.getCall(i));
|
1625
|
+
}
|
1626
|
+
|
1627
|
+
return calls;
|
1628
|
+
},
|
1629
|
+
|
1421
1630
|
calledBefore: function calledBefore(spyFn) {
|
1422
1631
|
if (!this.called) {
|
1423
1632
|
return false;
|
@@ -1454,6 +1663,7 @@ if (!this.sinon && commonJSModule) {
|
|
1454
1663
|
var original = this;
|
1455
1664
|
var fake = this._create();
|
1456
1665
|
fake.matchingAguments = args;
|
1666
|
+
fake.parent = this;
|
1457
1667
|
push.call(this.fakes, fake);
|
1458
1668
|
|
1459
1669
|
fake.withArgs = function () {
|
@@ -1494,7 +1704,7 @@ if (!this.sinon && commonJSModule) {
|
|
1494
1704
|
|
1495
1705
|
if (typeof formatter == "function") {
|
1496
1706
|
return formatter.call(null, spy, args);
|
1497
|
-
} else if (!isNaN(parseInt(specifyer
|
1707
|
+
} else if (!isNaN(parseInt(specifyer, 10))) {
|
1498
1708
|
return sinon.format(args[specifyer - 1]);
|
1499
1709
|
}
|
1500
1710
|
|
@@ -1597,41 +1807,373 @@ if (!this.sinon && commonJSModule) {
|
|
1597
1807
|
return calls.length > 0 ? "\n" + calls.join("\n") : "";
|
1598
1808
|
},
|
1599
1809
|
|
1600
|
-
"t": function (spy) {
|
1601
|
-
var objects = [];
|
1810
|
+
"t": function (spy) {
|
1811
|
+
var objects = [];
|
1812
|
+
|
1813
|
+
for (var i = 0, l = spy.callCount; i < l; ++i) {
|
1814
|
+
push.call(objects, sinon.format(spy.thisValues[i]));
|
1815
|
+
}
|
1816
|
+
|
1817
|
+
return objects.join(", ");
|
1818
|
+
},
|
1819
|
+
|
1820
|
+
"*": function (spy, args) {
|
1821
|
+
var formatted = [];
|
1822
|
+
|
1823
|
+
for (var i = 0, l = args.length; i < l; ++i) {
|
1824
|
+
push.call(formatted, sinon.format(args[i]));
|
1825
|
+
}
|
1826
|
+
|
1827
|
+
return formatted.join(", ");
|
1828
|
+
}
|
1829
|
+
};
|
1830
|
+
|
1831
|
+
sinon.extend(spy, spyApi);
|
1832
|
+
|
1833
|
+
spy.spyCall = sinon.spyCall;
|
1834
|
+
|
1835
|
+
if (commonJSModule) {
|
1836
|
+
module.exports = spy;
|
1837
|
+
} else {
|
1838
|
+
sinon.spy = spy;
|
1839
|
+
}
|
1840
|
+
}(typeof sinon == "object" && sinon || null));
|
1841
|
+
|
1842
|
+
/**
|
1843
|
+
* @depend ../sinon.js
|
1844
|
+
*/
|
1845
|
+
/*jslint eqeqeq: false, onevar: false*/
|
1846
|
+
/*global module, require, sinon, process, setImmediate, setTimeout*/
|
1847
|
+
/**
|
1848
|
+
* Stub behavior
|
1849
|
+
*
|
1850
|
+
* @author Christian Johansen (christian@cjohansen.no)
|
1851
|
+
* @author Tim Fischbach (mail@timfischbach.de)
|
1852
|
+
* @license BSD
|
1853
|
+
*
|
1854
|
+
* Copyright (c) 2010-2013 Christian Johansen
|
1855
|
+
*/
|
1856
|
+
|
1857
|
+
(function (sinon) {
|
1858
|
+
var commonJSModule = typeof module !== 'undefined' && module.exports;
|
1859
|
+
|
1860
|
+
if (!sinon && commonJSModule) {
|
1861
|
+
sinon = require("../sinon");
|
1862
|
+
}
|
1863
|
+
|
1864
|
+
if (!sinon) {
|
1865
|
+
return;
|
1866
|
+
}
|
1867
|
+
|
1868
|
+
var slice = Array.prototype.slice;
|
1869
|
+
var join = Array.prototype.join;
|
1870
|
+
var proto;
|
1871
|
+
|
1872
|
+
var nextTick = (function () {
|
1873
|
+
if (typeof process === "object" && typeof process.nextTick === "function") {
|
1874
|
+
return process.nextTick;
|
1875
|
+
} else if (typeof setImmediate === "function") {
|
1876
|
+
return setImmediate;
|
1877
|
+
} else {
|
1878
|
+
return function (callback) {
|
1879
|
+
setTimeout(callback, 0);
|
1880
|
+
};
|
1881
|
+
}
|
1882
|
+
})();
|
1883
|
+
|
1884
|
+
function throwsException(error, message) {
|
1885
|
+
if (typeof error == "string") {
|
1886
|
+
this.exception = new Error(message || "");
|
1887
|
+
this.exception.name = error;
|
1888
|
+
} else if (!error) {
|
1889
|
+
this.exception = new Error("Error");
|
1890
|
+
} else {
|
1891
|
+
this.exception = error;
|
1892
|
+
}
|
1893
|
+
|
1894
|
+
return this;
|
1895
|
+
}
|
1896
|
+
|
1897
|
+
function getCallback(behavior, args) {
|
1898
|
+
var callArgAt = behavior.callArgAt;
|
1899
|
+
|
1900
|
+
if (callArgAt < 0) {
|
1901
|
+
var callArgProp = behavior.callArgProp;
|
1902
|
+
|
1903
|
+
for (var i = 0, l = args.length; i < l; ++i) {
|
1904
|
+
if (!callArgProp && typeof args[i] == "function") {
|
1905
|
+
return args[i];
|
1906
|
+
}
|
1907
|
+
|
1908
|
+
if (callArgProp && args[i] &&
|
1909
|
+
typeof args[i][callArgProp] == "function") {
|
1910
|
+
return args[i][callArgProp];
|
1911
|
+
}
|
1912
|
+
}
|
1913
|
+
|
1914
|
+
return null;
|
1915
|
+
}
|
1916
|
+
|
1917
|
+
return args[callArgAt];
|
1918
|
+
}
|
1919
|
+
|
1920
|
+
function getCallbackError(behavior, func, args) {
|
1921
|
+
if (behavior.callArgAt < 0) {
|
1922
|
+
var msg;
|
1923
|
+
|
1924
|
+
if (behavior.callArgProp) {
|
1925
|
+
msg = sinon.functionName(behavior.stub) +
|
1926
|
+
" expected to yield to '" + behavior.callArgProp +
|
1927
|
+
"', but no object with such a property was passed.";
|
1928
|
+
} else {
|
1929
|
+
msg = sinon.functionName(behavior.stub) +
|
1930
|
+
" expected to yield, but no callback was passed.";
|
1931
|
+
}
|
1932
|
+
|
1933
|
+
if (args.length > 0) {
|
1934
|
+
msg += " Received [" + join.call(args, ", ") + "]";
|
1935
|
+
}
|
1936
|
+
|
1937
|
+
return msg;
|
1938
|
+
}
|
1939
|
+
|
1940
|
+
return "argument at index " + behavior.callArgAt + " is not a function: " + func;
|
1941
|
+
}
|
1942
|
+
|
1943
|
+
function callCallback(behavior, args) {
|
1944
|
+
if (typeof behavior.callArgAt == "number") {
|
1945
|
+
var func = getCallback(behavior, args);
|
1946
|
+
|
1947
|
+
if (typeof func != "function") {
|
1948
|
+
throw new TypeError(getCallbackError(behavior, func, args));
|
1949
|
+
}
|
1950
|
+
|
1951
|
+
if (behavior.callbackAsync) {
|
1952
|
+
nextTick(function() {
|
1953
|
+
func.apply(behavior.callbackContext, behavior.callbackArguments);
|
1954
|
+
});
|
1955
|
+
} else {
|
1956
|
+
func.apply(behavior.callbackContext, behavior.callbackArguments);
|
1957
|
+
}
|
1958
|
+
}
|
1959
|
+
}
|
1960
|
+
|
1961
|
+
proto = {
|
1962
|
+
create: function(stub) {
|
1963
|
+
var behavior = sinon.extend({}, sinon.behavior);
|
1964
|
+
delete behavior.create;
|
1965
|
+
behavior.stub = stub;
|
1966
|
+
|
1967
|
+
return behavior;
|
1968
|
+
},
|
1969
|
+
|
1970
|
+
isPresent: function() {
|
1971
|
+
return (typeof this.callArgAt == 'number' ||
|
1972
|
+
this.exception ||
|
1973
|
+
typeof this.returnArgAt == 'number' ||
|
1974
|
+
this.returnThis ||
|
1975
|
+
this.returnValueDefined);
|
1976
|
+
},
|
1977
|
+
|
1978
|
+
invoke: function(context, args) {
|
1979
|
+
callCallback(this, args);
|
1980
|
+
|
1981
|
+
if (this.exception) {
|
1982
|
+
throw this.exception;
|
1983
|
+
} else if (typeof this.returnArgAt == 'number') {
|
1984
|
+
return args[this.returnArgAt];
|
1985
|
+
} else if (this.returnThis) {
|
1986
|
+
return context;
|
1987
|
+
}
|
1988
|
+
|
1989
|
+
return this.returnValue;
|
1990
|
+
},
|
1991
|
+
|
1992
|
+
onCall: function(index) {
|
1993
|
+
return this.stub.onCall(index);
|
1994
|
+
},
|
1995
|
+
|
1996
|
+
onFirstCall: function() {
|
1997
|
+
return this.stub.onFirstCall();
|
1998
|
+
},
|
1999
|
+
|
2000
|
+
onSecondCall: function() {
|
2001
|
+
return this.stub.onSecondCall();
|
2002
|
+
},
|
2003
|
+
|
2004
|
+
onThirdCall: function() {
|
2005
|
+
return this.stub.onThirdCall();
|
2006
|
+
},
|
2007
|
+
|
2008
|
+
withArgs: function(/* arguments */) {
|
2009
|
+
throw new Error('Defining a stub by invoking "stub.onCall(...).withArgs(...)" is not supported. ' +
|
2010
|
+
'Use "stub.withArgs(...).onCall(...)" to define sequential behavior for calls with certain arguments.');
|
2011
|
+
},
|
2012
|
+
|
2013
|
+
callsArg: function callsArg(pos) {
|
2014
|
+
if (typeof pos != "number") {
|
2015
|
+
throw new TypeError("argument index is not number");
|
2016
|
+
}
|
2017
|
+
|
2018
|
+
this.callArgAt = pos;
|
2019
|
+
this.callbackArguments = [];
|
2020
|
+
this.callbackContext = undefined;
|
2021
|
+
this.callArgProp = undefined;
|
2022
|
+
this.callbackAsync = false;
|
2023
|
+
|
2024
|
+
return this;
|
2025
|
+
},
|
2026
|
+
|
2027
|
+
callsArgOn: function callsArgOn(pos, context) {
|
2028
|
+
if (typeof pos != "number") {
|
2029
|
+
throw new TypeError("argument index is not number");
|
2030
|
+
}
|
2031
|
+
if (typeof context != "object") {
|
2032
|
+
throw new TypeError("argument context is not an object");
|
2033
|
+
}
|
2034
|
+
|
2035
|
+
this.callArgAt = pos;
|
2036
|
+
this.callbackArguments = [];
|
2037
|
+
this.callbackContext = context;
|
2038
|
+
this.callArgProp = undefined;
|
2039
|
+
this.callbackAsync = false;
|
2040
|
+
|
2041
|
+
return this;
|
2042
|
+
},
|
2043
|
+
|
2044
|
+
callsArgWith: function callsArgWith(pos) {
|
2045
|
+
if (typeof pos != "number") {
|
2046
|
+
throw new TypeError("argument index is not number");
|
2047
|
+
}
|
2048
|
+
|
2049
|
+
this.callArgAt = pos;
|
2050
|
+
this.callbackArguments = slice.call(arguments, 1);
|
2051
|
+
this.callbackContext = undefined;
|
2052
|
+
this.callArgProp = undefined;
|
2053
|
+
this.callbackAsync = false;
|
2054
|
+
|
2055
|
+
return this;
|
2056
|
+
},
|
2057
|
+
|
2058
|
+
callsArgOnWith: function callsArgWith(pos, context) {
|
2059
|
+
if (typeof pos != "number") {
|
2060
|
+
throw new TypeError("argument index is not number");
|
2061
|
+
}
|
2062
|
+
if (typeof context != "object") {
|
2063
|
+
throw new TypeError("argument context is not an object");
|
2064
|
+
}
|
2065
|
+
|
2066
|
+
this.callArgAt = pos;
|
2067
|
+
this.callbackArguments = slice.call(arguments, 2);
|
2068
|
+
this.callbackContext = context;
|
2069
|
+
this.callArgProp = undefined;
|
2070
|
+
this.callbackAsync = false;
|
2071
|
+
|
2072
|
+
return this;
|
2073
|
+
},
|
2074
|
+
|
2075
|
+
yields: function () {
|
2076
|
+
this.callArgAt = -1;
|
2077
|
+
this.callbackArguments = slice.call(arguments, 0);
|
2078
|
+
this.callbackContext = undefined;
|
2079
|
+
this.callArgProp = undefined;
|
2080
|
+
this.callbackAsync = false;
|
2081
|
+
|
2082
|
+
return this;
|
2083
|
+
},
|
2084
|
+
|
2085
|
+
yieldsOn: function (context) {
|
2086
|
+
if (typeof context != "object") {
|
2087
|
+
throw new TypeError("argument context is not an object");
|
2088
|
+
}
|
2089
|
+
|
2090
|
+
this.callArgAt = -1;
|
2091
|
+
this.callbackArguments = slice.call(arguments, 1);
|
2092
|
+
this.callbackContext = context;
|
2093
|
+
this.callArgProp = undefined;
|
2094
|
+
this.callbackAsync = false;
|
2095
|
+
|
2096
|
+
return this;
|
2097
|
+
},
|
2098
|
+
|
2099
|
+
yieldsTo: function (prop) {
|
2100
|
+
this.callArgAt = -1;
|
2101
|
+
this.callbackArguments = slice.call(arguments, 1);
|
2102
|
+
this.callbackContext = undefined;
|
2103
|
+
this.callArgProp = prop;
|
2104
|
+
this.callbackAsync = false;
|
1602
2105
|
|
1603
|
-
|
1604
|
-
|
2106
|
+
return this;
|
2107
|
+
},
|
2108
|
+
|
2109
|
+
yieldsToOn: function (prop, context) {
|
2110
|
+
if (typeof context != "object") {
|
2111
|
+
throw new TypeError("argument context is not an object");
|
1605
2112
|
}
|
1606
2113
|
|
1607
|
-
|
2114
|
+
this.callArgAt = -1;
|
2115
|
+
this.callbackArguments = slice.call(arguments, 2);
|
2116
|
+
this.callbackContext = context;
|
2117
|
+
this.callArgProp = prop;
|
2118
|
+
this.callbackAsync = false;
|
2119
|
+
|
2120
|
+
return this;
|
1608
2121
|
},
|
1609
2122
|
|
1610
|
-
"*": function (spy, args) {
|
1611
|
-
var formatted = [];
|
1612
2123
|
|
1613
|
-
|
1614
|
-
|
2124
|
+
"throws": throwsException,
|
2125
|
+
throwsException: throwsException,
|
2126
|
+
|
2127
|
+
returns: function returns(value) {
|
2128
|
+
this.returnValue = value;
|
2129
|
+
this.returnValueDefined = true;
|
2130
|
+
|
2131
|
+
return this;
|
2132
|
+
},
|
2133
|
+
|
2134
|
+
returnsArg: function returnsArg(pos) {
|
2135
|
+
if (typeof pos != "number") {
|
2136
|
+
throw new TypeError("argument index is not number");
|
1615
2137
|
}
|
1616
2138
|
|
1617
|
-
|
2139
|
+
this.returnArgAt = pos;
|
2140
|
+
|
2141
|
+
return this;
|
2142
|
+
},
|
2143
|
+
|
2144
|
+
returnsThis: function returnsThis() {
|
2145
|
+
this.returnThis = true;
|
2146
|
+
|
2147
|
+
return this;
|
1618
2148
|
}
|
1619
2149
|
};
|
1620
2150
|
|
1621
|
-
|
1622
|
-
|
1623
|
-
|
2151
|
+
// create asynchronous versions of callsArg* and yields* methods
|
2152
|
+
for (var method in proto) {
|
2153
|
+
// need to avoid creating anotherasync versions of the newly added async methods
|
2154
|
+
if (proto.hasOwnProperty(method) &&
|
2155
|
+
method.match(/^(callsArg|yields)/) &&
|
2156
|
+
!method.match(/Async/)) {
|
2157
|
+
proto[method + 'Async'] = (function (syncFnName) {
|
2158
|
+
return function () {
|
2159
|
+
var result = this[syncFnName].apply(this, arguments);
|
2160
|
+
this.callbackAsync = true;
|
2161
|
+
return result;
|
2162
|
+
};
|
2163
|
+
})(method);
|
2164
|
+
}
|
2165
|
+
}
|
1624
2166
|
|
1625
2167
|
if (commonJSModule) {
|
1626
|
-
module.exports =
|
2168
|
+
module.exports = proto;
|
1627
2169
|
} else {
|
1628
|
-
sinon.
|
2170
|
+
sinon.behavior = proto;
|
1629
2171
|
}
|
1630
2172
|
}(typeof sinon == "object" && sinon || null));
|
1631
|
-
|
1632
2173
|
/**
|
1633
2174
|
* @depend ../sinon.js
|
1634
2175
|
* @depend spy.js
|
2176
|
+
* @depend behavior.js
|
1635
2177
|
*/
|
1636
2178
|
/*jslint eqeqeq: false, onevar: false*/
|
1637
2179
|
/*global module, require, sinon*/
|
@@ -1645,7 +2187,7 @@ if (!this.sinon && commonJSModule) {
|
|
1645
2187
|
*/
|
1646
2188
|
|
1647
2189
|
(function (sinon) {
|
1648
|
-
var commonJSModule = typeof module
|
2190
|
+
var commonJSModule = typeof module !== 'undefined' && module.exports;
|
1649
2191
|
|
1650
2192
|
if (!sinon && commonJSModule) {
|
1651
2193
|
sinon = require("../sinon");
|
@@ -1668,11 +2210,11 @@ if (!this.sinon && commonJSModule) {
|
|
1668
2210
|
wrapper = stub.create();
|
1669
2211
|
}
|
1670
2212
|
|
1671
|
-
if (!object &&
|
2213
|
+
if (!object && typeof property === "undefined") {
|
1672
2214
|
return sinon.stub.create();
|
1673
2215
|
}
|
1674
2216
|
|
1675
|
-
if (
|
2217
|
+
if (typeof property === "undefined" && typeof object == "object") {
|
1676
2218
|
for (var prop in object) {
|
1677
2219
|
if (typeof object[prop] === "function") {
|
1678
2220
|
stub(object, prop);
|
@@ -1685,128 +2227,26 @@ if (!this.sinon && commonJSModule) {
|
|
1685
2227
|
return sinon.wrapMethod(object, property, wrapper);
|
1686
2228
|
}
|
1687
2229
|
|
1688
|
-
function
|
1689
|
-
|
1690
|
-
var values = stub[property];
|
1691
|
-
var prop = index in values ? values[index] : values[values.length - 1];
|
1692
|
-
stub[property + "Last"] = prop;
|
1693
|
-
|
1694
|
-
return prop;
|
1695
|
-
}
|
1696
|
-
|
1697
|
-
function getCallback(stub, args) {
|
1698
|
-
var callArgAt = getChangingValue(stub, "callArgAts");
|
1699
|
-
|
1700
|
-
if (callArgAt < 0) {
|
1701
|
-
var callArgProp = getChangingValue(stub, "callArgProps");
|
1702
|
-
|
1703
|
-
for (var i = 0, l = args.length; i < l; ++i) {
|
1704
|
-
if (!callArgProp && typeof args[i] == "function") {
|
1705
|
-
return args[i];
|
1706
|
-
}
|
1707
|
-
|
1708
|
-
if (callArgProp && args[i] &&
|
1709
|
-
typeof args[i][callArgProp] == "function") {
|
1710
|
-
return args[i][callArgProp];
|
1711
|
-
}
|
1712
|
-
}
|
1713
|
-
|
1714
|
-
return null;
|
1715
|
-
}
|
1716
|
-
|
1717
|
-
return args[callArgAt];
|
2230
|
+
function getDefaultBehavior(stub) {
|
2231
|
+
return stub.defaultBehavior || getParentBehaviour(stub) || sinon.behavior.create(stub);
|
1718
2232
|
}
|
1719
2233
|
|
1720
|
-
|
1721
|
-
|
1722
|
-
function getCallbackError(stub, func, args) {
|
1723
|
-
if (stub.callArgAtsLast < 0) {
|
1724
|
-
var msg;
|
1725
|
-
|
1726
|
-
if (stub.callArgPropsLast) {
|
1727
|
-
msg = sinon.functionName(stub) +
|
1728
|
-
" expected to yield to '" + stub.callArgPropsLast +
|
1729
|
-
"', but no object with such a property was passed."
|
1730
|
-
} else {
|
1731
|
-
msg = sinon.functionName(stub) +
|
1732
|
-
" expected to yield, but no callback was passed."
|
1733
|
-
}
|
1734
|
-
|
1735
|
-
if (args.length > 0) {
|
1736
|
-
msg += " Received [" + join.call(args, ", ") + "]";
|
1737
|
-
}
|
1738
|
-
|
1739
|
-
return msg;
|
1740
|
-
}
|
1741
|
-
|
1742
|
-
return "argument at index " + stub.callArgAtsLast + " is not a function: " + func;
|
2234
|
+
function getParentBehaviour(stub) {
|
2235
|
+
return (stub.parent && getCurrentBehavior(stub.parent));
|
1743
2236
|
}
|
1744
2237
|
|
1745
|
-
|
1746
|
-
|
1747
|
-
|
1748
|
-
} else if (typeof setImmediate === "function") {
|
1749
|
-
return setImmediate;
|
1750
|
-
} else {
|
1751
|
-
return function (callback) {
|
1752
|
-
setTimeout(callback, 0);
|
1753
|
-
};
|
1754
|
-
}
|
1755
|
-
})();
|
1756
|
-
|
1757
|
-
function callCallback(stub, args) {
|
1758
|
-
if (stub.callArgAts.length > 0) {
|
1759
|
-
var func = getCallback(stub, args);
|
1760
|
-
|
1761
|
-
if (typeof func != "function") {
|
1762
|
-
throw new TypeError(getCallbackError(stub, func, args));
|
1763
|
-
}
|
1764
|
-
|
1765
|
-
var callbackArguments = getChangingValue(stub, "callbackArguments");
|
1766
|
-
var callbackContext = getChangingValue(stub, "callbackContexts");
|
1767
|
-
|
1768
|
-
if (stub.callbackAsync) {
|
1769
|
-
nextTick(function() {
|
1770
|
-
func.apply(callbackContext, callbackArguments);
|
1771
|
-
});
|
1772
|
-
} else {
|
1773
|
-
func.apply(callbackContext, callbackArguments);
|
1774
|
-
}
|
1775
|
-
}
|
2238
|
+
function getCurrentBehavior(stub) {
|
2239
|
+
var behavior = stub.behaviors[stub.callCount - 1];
|
2240
|
+
return behavior && behavior.isPresent() ? behavior : getDefaultBehavior(stub);
|
1776
2241
|
}
|
1777
2242
|
|
1778
2243
|
var uuid = 0;
|
1779
2244
|
|
1780
2245
|
sinon.extend(stub, (function () {
|
1781
|
-
var
|
1782
|
-
|
1783
|
-
function throwsException(error, message) {
|
1784
|
-
if (typeof error == "string") {
|
1785
|
-
this.exception = new Error(message || "");
|
1786
|
-
this.exception.name = error;
|
1787
|
-
} else if (!error) {
|
1788
|
-
this.exception = new Error("Error");
|
1789
|
-
} else {
|
1790
|
-
this.exception = error;
|
1791
|
-
}
|
1792
|
-
|
1793
|
-
return this;
|
1794
|
-
}
|
1795
|
-
|
1796
|
-
proto = {
|
2246
|
+
var proto = {
|
1797
2247
|
create: function create() {
|
1798
2248
|
var functionStub = function () {
|
1799
|
-
|
1800
|
-
callCallback(functionStub, arguments);
|
1801
|
-
|
1802
|
-
if (functionStub.exception) {
|
1803
|
-
throw functionStub.exception;
|
1804
|
-
} else if (typeof functionStub.returnArgAt == 'number') {
|
1805
|
-
return arguments[functionStub.returnArgAt];
|
1806
|
-
} else if (functionStub.returnThis) {
|
1807
|
-
return this;
|
1808
|
-
}
|
1809
|
-
return functionStub.returnValue;
|
2249
|
+
return getCurrentBehavior(functionStub).invoke(this, arguments);
|
1810
2250
|
};
|
1811
2251
|
|
1812
2252
|
functionStub.id = "stub#" + uuid++;
|
@@ -1814,26 +2254,22 @@ if (!this.sinon && commonJSModule) {
|
|
1814
2254
|
functionStub = sinon.spy.create(functionStub);
|
1815
2255
|
functionStub.func = orig;
|
1816
2256
|
|
1817
|
-
functionStub.callArgAts = [];
|
1818
|
-
functionStub.callbackArguments = [];
|
1819
|
-
functionStub.callbackContexts = [];
|
1820
|
-
functionStub.callArgProps = [];
|
1821
|
-
|
1822
2257
|
sinon.extend(functionStub, stub);
|
1823
2258
|
functionStub._create = sinon.stub.create;
|
1824
2259
|
functionStub.displayName = "stub";
|
1825
2260
|
functionStub.toString = sinon.functionToString;
|
1826
2261
|
|
2262
|
+
functionStub.defaultBehavior = null;
|
2263
|
+
functionStub.behaviors = [];
|
2264
|
+
|
1827
2265
|
return functionStub;
|
1828
2266
|
},
|
1829
2267
|
|
1830
2268
|
resetBehavior: function () {
|
1831
2269
|
var i;
|
1832
2270
|
|
1833
|
-
this.
|
1834
|
-
this.
|
1835
|
-
this.callbackContexts = [];
|
1836
|
-
this.callArgProps = [];
|
2271
|
+
this.defaultBehavior = null;
|
2272
|
+
this.behaviors = [];
|
1837
2273
|
|
1838
2274
|
delete this.returnValue;
|
1839
2275
|
delete this.returnArgAt;
|
@@ -1846,151 +2282,44 @@ if (!this.sinon && commonJSModule) {
|
|
1846
2282
|
}
|
1847
2283
|
},
|
1848
2284
|
|
1849
|
-
|
1850
|
-
this.
|
1851
|
-
|
1852
|
-
return this;
|
1853
|
-
},
|
1854
|
-
|
1855
|
-
returnsArg: function returnsArg(pos) {
|
1856
|
-
if (typeof pos != "number") {
|
1857
|
-
throw new TypeError("argument index is not number");
|
1858
|
-
}
|
1859
|
-
|
1860
|
-
this.returnArgAt = pos;
|
1861
|
-
|
1862
|
-
return this;
|
1863
|
-
},
|
1864
|
-
|
1865
|
-
returnsThis: function returnsThis() {
|
1866
|
-
this.returnThis = true;
|
1867
|
-
|
1868
|
-
return this;
|
1869
|
-
},
|
1870
|
-
|
1871
|
-
"throws": throwsException,
|
1872
|
-
throwsException: throwsException,
|
1873
|
-
|
1874
|
-
callsArg: function callsArg(pos) {
|
1875
|
-
if (typeof pos != "number") {
|
1876
|
-
throw new TypeError("argument index is not number");
|
1877
|
-
}
|
1878
|
-
|
1879
|
-
this.callArgAts.push(pos);
|
1880
|
-
this.callbackArguments.push([]);
|
1881
|
-
this.callbackContexts.push(undefined);
|
1882
|
-
this.callArgProps.push(undefined);
|
1883
|
-
|
1884
|
-
return this;
|
1885
|
-
},
|
1886
|
-
|
1887
|
-
callsArgOn: function callsArgOn(pos, context) {
|
1888
|
-
if (typeof pos != "number") {
|
1889
|
-
throw new TypeError("argument index is not number");
|
1890
|
-
}
|
1891
|
-
if (typeof context != "object") {
|
1892
|
-
throw new TypeError("argument context is not an object");
|
1893
|
-
}
|
1894
|
-
|
1895
|
-
this.callArgAts.push(pos);
|
1896
|
-
this.callbackArguments.push([]);
|
1897
|
-
this.callbackContexts.push(context);
|
1898
|
-
this.callArgProps.push(undefined);
|
1899
|
-
|
1900
|
-
return this;
|
1901
|
-
},
|
1902
|
-
|
1903
|
-
callsArgWith: function callsArgWith(pos) {
|
1904
|
-
if (typeof pos != "number") {
|
1905
|
-
throw new TypeError("argument index is not number");
|
1906
|
-
}
|
1907
|
-
|
1908
|
-
this.callArgAts.push(pos);
|
1909
|
-
this.callbackArguments.push(slice.call(arguments, 1));
|
1910
|
-
this.callbackContexts.push(undefined);
|
1911
|
-
this.callArgProps.push(undefined);
|
1912
|
-
|
1913
|
-
return this;
|
1914
|
-
},
|
1915
|
-
|
1916
|
-
callsArgOnWith: function callsArgWith(pos, context) {
|
1917
|
-
if (typeof pos != "number") {
|
1918
|
-
throw new TypeError("argument index is not number");
|
1919
|
-
}
|
1920
|
-
if (typeof context != "object") {
|
1921
|
-
throw new TypeError("argument context is not an object");
|
2285
|
+
onCall: function(index) {
|
2286
|
+
if (!this.behaviors[index]) {
|
2287
|
+
this.behaviors[index] = sinon.behavior.create(this);
|
1922
2288
|
}
|
1923
2289
|
|
1924
|
-
this.
|
1925
|
-
this.callbackArguments.push(slice.call(arguments, 2));
|
1926
|
-
this.callbackContexts.push(context);
|
1927
|
-
this.callArgProps.push(undefined);
|
1928
|
-
|
1929
|
-
return this;
|
1930
|
-
},
|
1931
|
-
|
1932
|
-
yields: function () {
|
1933
|
-
this.callArgAts.push(-1);
|
1934
|
-
this.callbackArguments.push(slice.call(arguments, 0));
|
1935
|
-
this.callbackContexts.push(undefined);
|
1936
|
-
this.callArgProps.push(undefined);
|
1937
|
-
|
1938
|
-
return this;
|
2290
|
+
return this.behaviors[index];
|
1939
2291
|
},
|
1940
2292
|
|
1941
|
-
|
1942
|
-
|
1943
|
-
throw new TypeError("argument context is not an object");
|
1944
|
-
}
|
1945
|
-
|
1946
|
-
this.callArgAts.push(-1);
|
1947
|
-
this.callbackArguments.push(slice.call(arguments, 1));
|
1948
|
-
this.callbackContexts.push(context);
|
1949
|
-
this.callArgProps.push(undefined);
|
1950
|
-
|
1951
|
-
return this;
|
2293
|
+
onFirstCall: function() {
|
2294
|
+
return this.onCall(0);
|
1952
2295
|
},
|
1953
2296
|
|
1954
|
-
|
1955
|
-
this.
|
1956
|
-
this.callbackArguments.push(slice.call(arguments, 1));
|
1957
|
-
this.callbackContexts.push(undefined);
|
1958
|
-
this.callArgProps.push(prop);
|
1959
|
-
|
1960
|
-
return this;
|
2297
|
+
onSecondCall: function() {
|
2298
|
+
return this.onCall(1);
|
1961
2299
|
},
|
1962
2300
|
|
1963
|
-
|
1964
|
-
|
1965
|
-
throw new TypeError("argument context is not an object");
|
1966
|
-
}
|
1967
|
-
|
1968
|
-
this.callArgAts.push(-1);
|
1969
|
-
this.callbackArguments.push(slice.call(arguments, 2));
|
1970
|
-
this.callbackContexts.push(context);
|
1971
|
-
this.callArgProps.push(prop);
|
1972
|
-
|
1973
|
-
return this;
|
2301
|
+
onThirdCall: function() {
|
2302
|
+
return this.onCall(2);
|
1974
2303
|
}
|
1975
2304
|
};
|
1976
2305
|
|
1977
|
-
|
1978
|
-
|
1979
|
-
|
1980
|
-
|
1981
|
-
method
|
1982
|
-
|
1983
|
-
proto[method
|
1984
|
-
return function
|
1985
|
-
this.
|
1986
|
-
|
2306
|
+
for (var method in sinon.behavior) {
|
2307
|
+
if (sinon.behavior.hasOwnProperty(method) &&
|
2308
|
+
!proto.hasOwnProperty(method) &&
|
2309
|
+
method != 'create' &&
|
2310
|
+
method != 'withArgs' &&
|
2311
|
+
method != 'invoke') {
|
2312
|
+
proto[method] = (function(behaviorMethod) {
|
2313
|
+
return function() {
|
2314
|
+
this.defaultBehavior = this.defaultBehavior || sinon.behavior.create(this);
|
2315
|
+
this.defaultBehavior[behaviorMethod].apply(this.defaultBehavior, arguments);
|
2316
|
+
return this;
|
1987
2317
|
};
|
1988
|
-
}
|
2318
|
+
}(method));
|
1989
2319
|
}
|
1990
2320
|
}
|
1991
2321
|
|
1992
2322
|
return proto;
|
1993
|
-
|
1994
2323
|
}()));
|
1995
2324
|
|
1996
2325
|
if (commonJSModule) {
|
@@ -2016,8 +2345,9 @@ if (!this.sinon && commonJSModule) {
|
|
2016
2345
|
*/
|
2017
2346
|
|
2018
2347
|
(function (sinon) {
|
2019
|
-
var commonJSModule = typeof module
|
2348
|
+
var commonJSModule = typeof module !== 'undefined' && module.exports;
|
2020
2349
|
var push = [].push;
|
2350
|
+
var match;
|
2021
2351
|
|
2022
2352
|
if (!sinon && commonJSModule) {
|
2023
2353
|
sinon = require("../sinon");
|
@@ -2027,6 +2357,12 @@ if (!this.sinon && commonJSModule) {
|
|
2027
2357
|
return;
|
2028
2358
|
}
|
2029
2359
|
|
2360
|
+
match = sinon.match;
|
2361
|
+
|
2362
|
+
if (!match && commonJSModule) {
|
2363
|
+
match = require("./match");
|
2364
|
+
}
|
2365
|
+
|
2030
2366
|
function mock(object) {
|
2031
2367
|
if (!object) {
|
2032
2368
|
return sinon.expectation.create("Anonymous mock");
|
@@ -2207,6 +2543,14 @@ if (!this.sinon && commonJSModule) {
|
|
2207
2543
|
return expectation.callCount == expectation.maxCalls;
|
2208
2544
|
}
|
2209
2545
|
|
2546
|
+
function verifyMatcher(possibleMatcher, arg){
|
2547
|
+
if (match && match.isMatcher(possibleMatcher)) {
|
2548
|
+
return possibleMatcher.test(arg);
|
2549
|
+
} else {
|
2550
|
+
return true;
|
2551
|
+
}
|
2552
|
+
}
|
2553
|
+
|
2210
2554
|
return {
|
2211
2555
|
minCalls: 1,
|
2212
2556
|
maxCalls: 1,
|
@@ -2316,6 +2660,12 @@ if (!this.sinon && commonJSModule) {
|
|
2316
2660
|
}
|
2317
2661
|
|
2318
2662
|
for (var i = 0, l = this.expectedArguments.length; i < l; i += 1) {
|
2663
|
+
|
2664
|
+
if (!verifyMatcher(this.expectedArguments[i],args[i])) {
|
2665
|
+
sinon.expectation.fail(this.method + " received wrong arguments " + sinon.format(args) +
|
2666
|
+
", didn't match " + this.expectedArguments.toString());
|
2667
|
+
}
|
2668
|
+
|
2319
2669
|
if (!sinon.deepEqual(this.expectedArguments[i], args[i])) {
|
2320
2670
|
sinon.expectation.fail(this.method + " received wrong arguments " + sinon.format(args) +
|
2321
2671
|
", expected " + sinon.format(this.expectedArguments));
|
@@ -2348,6 +2698,10 @@ if (!this.sinon && commonJSModule) {
|
|
2348
2698
|
}
|
2349
2699
|
|
2350
2700
|
for (var i = 0, l = this.expectedArguments.length; i < l; i += 1) {
|
2701
|
+
if (!verifyMatcher(this.expectedArguments[i],args[i])) {
|
2702
|
+
return false;
|
2703
|
+
}
|
2704
|
+
|
2351
2705
|
if (!sinon.deepEqual(this.expectedArguments[i], args[i])) {
|
2352
2706
|
return false;
|
2353
2707
|
}
|
@@ -2441,7 +2795,7 @@ if (!this.sinon && commonJSModule) {
|
|
2441
2795
|
*/
|
2442
2796
|
|
2443
2797
|
(function (sinon) {
|
2444
|
-
var commonJSModule = typeof module
|
2798
|
+
var commonJSModule = typeof module !== 'undefined' && module.exports;
|
2445
2799
|
var push = [].push;
|
2446
2800
|
var hasOwnProperty = Object.prototype.hasOwnProperty;
|
2447
2801
|
|
@@ -2609,6 +2963,10 @@ if (typeof sinon == "undefined") {
|
|
2609
2963
|
throw new Error("Function requires at least 1 parameter");
|
2610
2964
|
}
|
2611
2965
|
|
2966
|
+
if (typeof args[0] === "undefined") {
|
2967
|
+
throw new Error("Callback must be provided to timer calls");
|
2968
|
+
}
|
2969
|
+
|
2612
2970
|
var toId = id++;
|
2613
2971
|
var delay = args[1] || 0;
|
2614
2972
|
|
@@ -2710,6 +3068,16 @@ if (typeof sinon == "undefined") {
|
|
2710
3068
|
this.clearTimeout(timerId);
|
2711
3069
|
},
|
2712
3070
|
|
3071
|
+
setImmediate: function setImmediate(callback) {
|
3072
|
+
var passThruArgs = Array.prototype.slice.call(arguments, 1);
|
3073
|
+
|
3074
|
+
return addTimer.call(this, [callback, 0].concat(passThruArgs), false);
|
3075
|
+
},
|
3076
|
+
|
3077
|
+
clearImmediate: function clearImmediate(timerId) {
|
3078
|
+
this.clearTimeout(timerId);
|
3079
|
+
},
|
3080
|
+
|
2713
3081
|
tick: function tick(ms) {
|
2714
3082
|
ms = typeof ms == "number" ? ms : parseTime(ms);
|
2715
3083
|
var tickFrom = this.now, tickTo = this.now + ms, previous = this.now;
|
@@ -2740,7 +3108,7 @@ if (typeof sinon == "undefined") {
|
|
2740
3108
|
},
|
2741
3109
|
|
2742
3110
|
firstTimerInRange: function (from, to) {
|
2743
|
-
var timer, smallest, originalTimer;
|
3111
|
+
var timer, smallest = null, originalTimer;
|
2744
3112
|
|
2745
3113
|
for (var id in this.timeouts) {
|
2746
3114
|
if (this.timeouts.hasOwnProperty(id)) {
|
@@ -2748,7 +3116,7 @@ if (typeof sinon == "undefined") {
|
|
2748
3116
|
continue;
|
2749
3117
|
}
|
2750
3118
|
|
2751
|
-
if (
|
3119
|
+
if (smallest === null || this.timeouts[id].callAt < smallest) {
|
2752
3120
|
originalTimer = this.timeouts[id];
|
2753
3121
|
smallest = this.timeouts[id].callAt;
|
2754
3122
|
|
@@ -2854,21 +3222,39 @@ if (typeof sinon == "undefined") {
|
|
2854
3222
|
target.parse = source.parse;
|
2855
3223
|
target.UTC = source.UTC;
|
2856
3224
|
target.prototype.toUTCString = source.prototype.toUTCString;
|
3225
|
+
|
3226
|
+
for (var prop in source) {
|
3227
|
+
if (source.hasOwnProperty(prop)) {
|
3228
|
+
target[prop] = source[prop];
|
3229
|
+
}
|
3230
|
+
}
|
3231
|
+
|
2857
3232
|
return target;
|
2858
3233
|
}
|
2859
3234
|
|
2860
3235
|
var methods = ["Date", "setTimeout", "setInterval",
|
2861
3236
|
"clearTimeout", "clearInterval"];
|
2862
3237
|
|
3238
|
+
if (typeof global.setImmediate !== "undefined") {
|
3239
|
+
methods.push("setImmediate");
|
3240
|
+
}
|
3241
|
+
|
3242
|
+
if (typeof global.clearImmediate !== "undefined") {
|
3243
|
+
methods.push("clearImmediate");
|
3244
|
+
}
|
3245
|
+
|
2863
3246
|
function restore() {
|
2864
3247
|
var method;
|
2865
3248
|
|
2866
3249
|
for (var i = 0, l = this.methods.length; i < l; i++) {
|
2867
3250
|
method = this.methods[i];
|
3251
|
+
|
2868
3252
|
if (global[method].hadOwnProperty) {
|
2869
3253
|
global[method] = this["_" + method];
|
2870
3254
|
} else {
|
2871
|
-
|
3255
|
+
try {
|
3256
|
+
delete global[method];
|
3257
|
+
} catch (e) {}
|
2872
3258
|
}
|
2873
3259
|
}
|
2874
3260
|
|
@@ -2919,12 +3305,14 @@ if (typeof sinon == "undefined") {
|
|
2919
3305
|
sinon.timers = {
|
2920
3306
|
setTimeout: setTimeout,
|
2921
3307
|
clearTimeout: clearTimeout,
|
3308
|
+
setImmediate: (typeof setImmediate !== "undefined" ? setImmediate : undefined),
|
3309
|
+
clearImmediate: (typeof clearImmediate !== "undefined" ? clearImmediate: undefined),
|
2922
3310
|
setInterval: setInterval,
|
2923
3311
|
clearInterval: clearInterval,
|
2924
3312
|
Date: Date
|
2925
3313
|
};
|
2926
3314
|
|
2927
|
-
if (typeof module
|
3315
|
+
if (typeof module !== 'undefined' && module.exports) {
|
2928
3316
|
module.exports = sinon;
|
2929
3317
|
}
|
2930
3318
|
|
@@ -2969,14 +3357,33 @@ if (typeof sinon == "undefined") {
|
|
2969
3357
|
}
|
2970
3358
|
};
|
2971
3359
|
|
3360
|
+
sinon.ProgressEvent = function ProgressEvent(type, progressEventRaw, target) {
|
3361
|
+
this.initEvent(type, false, false, target);
|
3362
|
+
this.loaded = progressEventRaw.loaded || null;
|
3363
|
+
this.total = progressEventRaw.total || null;
|
3364
|
+
};
|
3365
|
+
|
3366
|
+
sinon.ProgressEvent.prototype = new sinon.Event();
|
3367
|
+
|
3368
|
+
sinon.ProgressEvent.prototype.constructor = sinon.ProgressEvent;
|
3369
|
+
|
3370
|
+
sinon.CustomEvent = function CustomEvent(type, customData, target) {
|
3371
|
+
this.initEvent(type, false, false, target);
|
3372
|
+
this.detail = customData.detail || null;
|
3373
|
+
};
|
3374
|
+
|
3375
|
+
sinon.CustomEvent.prototype = new sinon.Event();
|
3376
|
+
|
3377
|
+
sinon.CustomEvent.prototype.constructor = sinon.CustomEvent;
|
3378
|
+
|
2972
3379
|
sinon.EventTarget = {
|
2973
|
-
addEventListener: function addEventListener(event, listener
|
3380
|
+
addEventListener: function addEventListener(event, listener) {
|
2974
3381
|
this.eventListeners = this.eventListeners || {};
|
2975
3382
|
this.eventListeners[event] = this.eventListeners[event] || [];
|
2976
3383
|
push.call(this.eventListeners[event], listener);
|
2977
3384
|
},
|
2978
3385
|
|
2979
|
-
removeEventListener: function removeEventListener(event, listener
|
3386
|
+
removeEventListener: function removeEventListener(event, listener) {
|
2980
3387
|
var listeners = this.eventListeners && this.eventListeners[event] || [];
|
2981
3388
|
|
2982
3389
|
for (var i = 0, l = listeners.length; i < l; ++i) {
|
@@ -3018,13 +3425,15 @@ if (typeof sinon == "undefined") {
|
|
3018
3425
|
* Copyright (c) 2010-2013 Christian Johansen
|
3019
3426
|
*/
|
3020
3427
|
|
3021
|
-
if (typeof sinon == "undefined") {
|
3022
|
-
this.sinon = {};
|
3023
|
-
}
|
3024
|
-
sinon.xhr = { XMLHttpRequest: this.XMLHttpRequest };
|
3025
|
-
|
3026
3428
|
// wrapper for global
|
3027
3429
|
(function(global) {
|
3430
|
+
if (typeof sinon === "undefined") {
|
3431
|
+
global.sinon = {};
|
3432
|
+
}
|
3433
|
+
|
3434
|
+
var supportsProgress = typeof ProgressEvent !== "undefined";
|
3435
|
+
var supportsCustomEvent = typeof CustomEvent !== "undefined";
|
3436
|
+
sinon.xhr = { XMLHttpRequest: global.XMLHttpRequest };
|
3028
3437
|
var xhr = sinon.xhr;
|
3029
3438
|
xhr.GlobalXMLHttpRequest = global.XMLHttpRequest;
|
3030
3439
|
xhr.GlobalActiveXObject = global.ActiveXObject;
|
@@ -3032,6 +3441,7 @@ sinon.xhr = { XMLHttpRequest: this.XMLHttpRequest };
|
|
3032
3441
|
xhr.supportsXHR = typeof xhr.GlobalXMLHttpRequest != "undefined";
|
3033
3442
|
xhr.workingXHR = xhr.supportsXHR ? xhr.GlobalXMLHttpRequest : xhr.supportsActiveX
|
3034
3443
|
? function() { return new xhr.GlobalActiveXObject("MSXML2.XMLHTTP.3.0") } : false;
|
3444
|
+
xhr.supportsCORS = 'withCredentials' in (new sinon.xhr.GlobalXMLHttpRequest());
|
3035
3445
|
|
3036
3446
|
/*jsl:ignore*/
|
3037
3447
|
var unsafeHeaders = {
|
@@ -3062,6 +3472,11 @@ sinon.xhr = { XMLHttpRequest: this.XMLHttpRequest };
|
|
3062
3472
|
this.requestBody = null;
|
3063
3473
|
this.status = 0;
|
3064
3474
|
this.statusText = "";
|
3475
|
+
this.upload = new UploadProgress();
|
3476
|
+
if (sinon.xhr.supportsCORS) {
|
3477
|
+
this.withCredentials = false;
|
3478
|
+
}
|
3479
|
+
|
3065
3480
|
|
3066
3481
|
var xhr = this;
|
3067
3482
|
var events = ["loadstart", "load", "abort", "loadend"];
|
@@ -3071,7 +3486,7 @@ sinon.xhr = { XMLHttpRequest: this.XMLHttpRequest };
|
|
3071
3486
|
var listener = xhr["on" + eventName];
|
3072
3487
|
|
3073
3488
|
if (listener && typeof listener == "function") {
|
3074
|
-
listener(event);
|
3489
|
+
listener.call(this, event);
|
3075
3490
|
}
|
3076
3491
|
});
|
3077
3492
|
}
|
@@ -3085,6 +3500,41 @@ sinon.xhr = { XMLHttpRequest: this.XMLHttpRequest };
|
|
3085
3500
|
}
|
3086
3501
|
}
|
3087
3502
|
|
3503
|
+
// An upload object is created for each
|
3504
|
+
// FakeXMLHttpRequest and allows upload
|
3505
|
+
// events to be simulated using uploadProgress
|
3506
|
+
// and uploadError.
|
3507
|
+
function UploadProgress() {
|
3508
|
+
this.eventListeners = {
|
3509
|
+
"progress": [],
|
3510
|
+
"load": [],
|
3511
|
+
"abort": [],
|
3512
|
+
"error": []
|
3513
|
+
}
|
3514
|
+
}
|
3515
|
+
|
3516
|
+
UploadProgress.prototype.addEventListener = function(event, listener) {
|
3517
|
+
this.eventListeners[event].push(listener);
|
3518
|
+
};
|
3519
|
+
|
3520
|
+
UploadProgress.prototype.removeEventListener = function(event, listener) {
|
3521
|
+
var listeners = this.eventListeners[event] || [];
|
3522
|
+
|
3523
|
+
for (var i = 0, l = listeners.length; i < l; ++i) {
|
3524
|
+
if (listeners[i] == listener) {
|
3525
|
+
return listeners.splice(i, 1);
|
3526
|
+
}
|
3527
|
+
}
|
3528
|
+
};
|
3529
|
+
|
3530
|
+
UploadProgress.prototype.dispatchEvent = function(event) {
|
3531
|
+
var listeners = this.eventListeners[event.type] || [];
|
3532
|
+
|
3533
|
+
for (var i = 0, listener; (listener = listeners[i]) != null; i++) {
|
3534
|
+
listener(event);
|
3535
|
+
}
|
3536
|
+
};
|
3537
|
+
|
3088
3538
|
function verifyState(xhr) {
|
3089
3539
|
if (xhr.readyState !== FakeXMLHttpRequest.OPENED) {
|
3090
3540
|
throw new Error("INVALID_STATE_ERR");
|
@@ -3106,7 +3556,7 @@ sinon.xhr = { XMLHttpRequest: this.XMLHttpRequest };
|
|
3106
3556
|
function some(collection, callback) {
|
3107
3557
|
for (var index = 0; index < collection.length; index++) {
|
3108
3558
|
if(callback(collection[index]) === true) return true;
|
3109
|
-
}
|
3559
|
+
}
|
3110
3560
|
return false;
|
3111
3561
|
}
|
3112
3562
|
// largest arity in XHR is 5 - XHR#open
|
@@ -3118,7 +3568,7 @@ sinon.xhr = { XMLHttpRequest: this.XMLHttpRequest };
|
|
3118
3568
|
case 3: return obj[method](args[0],args[1],args[2]);
|
3119
3569
|
case 4: return obj[method](args[0],args[1],args[2],args[3]);
|
3120
3570
|
case 5: return obj[method](args[0],args[1],args[2],args[3],args[4]);
|
3121
|
-
}
|
3571
|
+
}
|
3122
3572
|
};
|
3123
3573
|
|
3124
3574
|
FakeXMLHttpRequest.filters = [];
|
@@ -3157,7 +3607,7 @@ sinon.xhr = { XMLHttpRequest: this.XMLHttpRequest };
|
|
3157
3607
|
if(xhr.readyState === FakeXMLHttpRequest.DONE) {
|
3158
3608
|
copyAttrs(["responseXML"]);
|
3159
3609
|
}
|
3160
|
-
if(fakeXhr.onreadystatechange) fakeXhr.onreadystatechange.call(fakeXhr);
|
3610
|
+
if(fakeXhr.onreadystatechange) fakeXhr.onreadystatechange.call(fakeXhr, { target: fakeXhr });
|
3161
3611
|
};
|
3162
3612
|
if(xhr.addEventListener) {
|
3163
3613
|
for(var event in fakeXhr.eventListeners) {
|
@@ -3175,6 +3625,12 @@ sinon.xhr = { XMLHttpRequest: this.XMLHttpRequest };
|
|
3175
3625
|
};
|
3176
3626
|
FakeXMLHttpRequest.useFilters = false;
|
3177
3627
|
|
3628
|
+
function verifyRequestOpened(xhr) {
|
3629
|
+
if (xhr.readyState != FakeXMLHttpRequest.OPENED) {
|
3630
|
+
throw new Error("INVALID_STATE_ERR - " + xhr.readyState);
|
3631
|
+
}
|
3632
|
+
}
|
3633
|
+
|
3178
3634
|
function verifyRequestSent(xhr) {
|
3179
3635
|
if (xhr.readyState == FakeXMLHttpRequest.DONE) {
|
3180
3636
|
throw new Error("Request done");
|
@@ -3238,6 +3694,10 @@ sinon.xhr = { XMLHttpRequest: this.XMLHttpRequest };
|
|
3238
3694
|
case FakeXMLHttpRequest.DONE:
|
3239
3695
|
this.dispatchEvent(new sinon.Event("load", false, false, this));
|
3240
3696
|
this.dispatchEvent(new sinon.Event("loadend", false, false, this));
|
3697
|
+
this.upload.dispatchEvent(new sinon.Event("load", false, false, this));
|
3698
|
+
if (supportsProgress) {
|
3699
|
+
this.upload.dispatchEvent(new sinon.ProgressEvent('progress', {loaded: 100, total: 100}));
|
3700
|
+
}
|
3241
3701
|
break;
|
3242
3702
|
}
|
3243
3703
|
},
|
@@ -3258,6 +3718,7 @@ sinon.xhr = { XMLHttpRequest: this.XMLHttpRequest };
|
|
3258
3718
|
|
3259
3719
|
// Helps testing
|
3260
3720
|
setResponseHeaders: function setResponseHeaders(headers) {
|
3721
|
+
verifyRequestOpened(this);
|
3261
3722
|
this.responseHeaders = {};
|
3262
3723
|
|
3263
3724
|
for (var header in headers) {
|
@@ -3313,6 +3774,9 @@ sinon.xhr = { XMLHttpRequest: this.XMLHttpRequest };
|
|
3313
3774
|
this.readyState = sinon.FakeXMLHttpRequest.UNSENT;
|
3314
3775
|
|
3315
3776
|
this.dispatchEvent(new sinon.Event("abort", false, false, this));
|
3777
|
+
|
3778
|
+
this.upload.dispatchEvent(new sinon.Event("abort", false, false, this));
|
3779
|
+
|
3316
3780
|
if (typeof this.onerror === "function") {
|
3317
3781
|
this.onerror();
|
3318
3782
|
}
|
@@ -3392,14 +3856,22 @@ sinon.xhr = { XMLHttpRequest: this.XMLHttpRequest };
|
|
3392
3856
|
},
|
3393
3857
|
|
3394
3858
|
respond: function respond(status, headers, body) {
|
3395
|
-
this.setResponseHeaders(headers || {});
|
3396
3859
|
this.status = typeof status == "number" ? status : 200;
|
3397
3860
|
this.statusText = FakeXMLHttpRequest.statusCodes[this.status];
|
3861
|
+
this.setResponseHeaders(headers || {});
|
3398
3862
|
this.setResponseBody(body || "");
|
3399
|
-
|
3400
|
-
|
3863
|
+
},
|
3864
|
+
|
3865
|
+
uploadProgress: function uploadProgress(progressEventRaw) {
|
3866
|
+
if (supportsProgress) {
|
3867
|
+
this.upload.dispatchEvent(new sinon.ProgressEvent("progress", progressEventRaw));
|
3401
3868
|
}
|
3869
|
+
},
|
3402
3870
|
|
3871
|
+
uploadError: function uploadError(error) {
|
3872
|
+
if (supportsCustomEvent) {
|
3873
|
+
this.upload.dispatchEvent(new sinon.CustomEvent("error", {"detail": error}));
|
3874
|
+
}
|
3403
3875
|
}
|
3404
3876
|
});
|
3405
3877
|
|
@@ -3506,9 +3978,10 @@ sinon.xhr = { XMLHttpRequest: this.XMLHttpRequest };
|
|
3506
3978
|
};
|
3507
3979
|
|
3508
3980
|
sinon.FakeXMLHttpRequest = FakeXMLHttpRequest;
|
3509
|
-
})(this);
|
3510
3981
|
|
3511
|
-
|
3982
|
+
})(typeof global === "object" ? global : this);
|
3983
|
+
|
3984
|
+
if (typeof module !== 'undefined' && module.exports) {
|
3512
3985
|
module.exports = sinon;
|
3513
3986
|
}
|
3514
3987
|
|
@@ -3570,7 +4043,6 @@ sinon.fakeServer = (function () {
|
|
3570
4043
|
}
|
3571
4044
|
|
3572
4045
|
function match(response, request) {
|
3573
|
-
var requestMethod = this.getHTTPMethod(request);
|
3574
4046
|
var requestUrl = request.url;
|
3575
4047
|
|
3576
4048
|
if (!/^https?:\/\//.test(requestUrl) || rCurrLoc.test(requestUrl)) {
|
@@ -3580,7 +4052,7 @@ sinon.fakeServer = (function () {
|
|
3580
4052
|
if (matchOne(response, this.getHTTPMethod(request), requestUrl)) {
|
3581
4053
|
if (typeof response.response == "function") {
|
3582
4054
|
var ru = response.url;
|
3583
|
-
var args = [request].concat(
|
4055
|
+
var args = [request].concat(ru && typeof ru.exec == "function" ? ru.exec(requestUrl).slice(1) : []);
|
3584
4056
|
return response.response.apply(response, args);
|
3585
4057
|
}
|
3586
4058
|
|
@@ -3618,16 +4090,16 @@ sinon.fakeServer = (function () {
|
|
3618
4090
|
|
3619
4091
|
xhrObj.onSend = function () {
|
3620
4092
|
server.handleRequest(this);
|
3621
|
-
};
|
3622
4093
|
|
3623
|
-
|
3624
|
-
|
3625
|
-
|
3626
|
-
|
3627
|
-
|
4094
|
+
if (server.autoRespond && !server.responding) {
|
4095
|
+
setTimeout(function () {
|
4096
|
+
server.responding = false;
|
4097
|
+
server.respond();
|
4098
|
+
}, server.autoRespondAfter || 10);
|
3628
4099
|
|
3629
|
-
|
3630
|
-
|
4100
|
+
server.responding = true;
|
4101
|
+
}
|
4102
|
+
};
|
3631
4103
|
},
|
3632
4104
|
|
3633
4105
|
getHTTPMethod: function getHTTPMethod(request) {
|
@@ -3680,9 +4152,10 @@ sinon.fakeServer = (function () {
|
|
3680
4152
|
respond: function respond() {
|
3681
4153
|
if (arguments.length > 0) this.respondWith.apply(this, arguments);
|
3682
4154
|
var queue = this.queue || [];
|
4155
|
+
var requests = queue.splice(0);
|
3683
4156
|
var request;
|
3684
4157
|
|
3685
|
-
while(request =
|
4158
|
+
while(request = requests.shift()) {
|
3686
4159
|
this.processRequest(request);
|
3687
4160
|
}
|
3688
4161
|
},
|
@@ -3696,7 +4169,7 @@ sinon.fakeServer = (function () {
|
|
3696
4169
|
var response = this.response || [404, {}, ""];
|
3697
4170
|
|
3698
4171
|
if (this.responses) {
|
3699
|
-
for (var
|
4172
|
+
for (var l = this.responses.length, i = l - 1; i >= 0; i--) {
|
3700
4173
|
if (match.call(this, this.responses[i], request)) {
|
3701
4174
|
response = this.responses[i].response;
|
3702
4175
|
break;
|
@@ -3720,7 +4193,7 @@ sinon.fakeServer = (function () {
|
|
3720
4193
|
};
|
3721
4194
|
}());
|
3722
4195
|
|
3723
|
-
if (typeof module
|
4196
|
+
if (typeof module !== 'undefined' && module.exports) {
|
3724
4197
|
module.exports = sinon;
|
3725
4198
|
}
|
3726
4199
|
|
@@ -3825,7 +4298,7 @@ if (typeof module == "object" && typeof require == "function") {
|
|
3825
4298
|
* Copyright (c) 2010-2013 Christian Johansen
|
3826
4299
|
*/
|
3827
4300
|
|
3828
|
-
if (typeof module
|
4301
|
+
if (typeof module !== 'undefined' && module.exports) {
|
3829
4302
|
var sinon = require("../sinon");
|
3830
4303
|
sinon.extend(sinon, require("./util/fake_timers"));
|
3831
4304
|
}
|
@@ -3838,8 +4311,9 @@ if (typeof module == "object" && typeof require == "function") {
|
|
3838
4311
|
return;
|
3839
4312
|
}
|
3840
4313
|
|
3841
|
-
if (config.injectInto) {
|
4314
|
+
if (config.injectInto && !(key in config.injectInto)) {
|
3842
4315
|
config.injectInto[key] = value;
|
4316
|
+
sandbox.injectedKeys.push(key);
|
3843
4317
|
} else {
|
3844
4318
|
push.call(sandbox.args, value);
|
3845
4319
|
}
|
@@ -3902,6 +4376,20 @@ if (typeof module == "object" && typeof require == "function") {
|
|
3902
4376
|
return obj;
|
3903
4377
|
},
|
3904
4378
|
|
4379
|
+
restore: function () {
|
4380
|
+
sinon.collection.restore.apply(this, arguments);
|
4381
|
+
this.restoreContext();
|
4382
|
+
},
|
4383
|
+
|
4384
|
+
restoreContext: function () {
|
4385
|
+
if (this.injectedKeys) {
|
4386
|
+
for (var i = 0, j = this.injectedKeys.length; i < j; i++) {
|
4387
|
+
delete this.injectInto[this.injectedKeys[i]];
|
4388
|
+
}
|
4389
|
+
this.injectedKeys = [];
|
4390
|
+
}
|
4391
|
+
},
|
4392
|
+
|
3905
4393
|
create: function (config) {
|
3906
4394
|
if (!config) {
|
3907
4395
|
return sinon.create(sinon.sandbox);
|
@@ -3909,6 +4397,8 @@ if (typeof module == "object" && typeof require == "function") {
|
|
3909
4397
|
|
3910
4398
|
var sandbox = prepareSandboxFromConfig(config);
|
3911
4399
|
sandbox.args = sandbox.args || [];
|
4400
|
+
sandbox.injectedKeys = [];
|
4401
|
+
sandbox.injectInto = config.injectInto;
|
3912
4402
|
var prop, value, exposed = sandbox.inject({});
|
3913
4403
|
|
3914
4404
|
if (config.properties) {
|
@@ -3927,7 +4417,7 @@ if (typeof module == "object" && typeof require == "function") {
|
|
3927
4417
|
|
3928
4418
|
sinon.sandbox.useFakeXMLHttpRequest = sinon.sandbox.useFakeServer;
|
3929
4419
|
|
3930
|
-
if (typeof module
|
4420
|
+
if (typeof module !== 'undefined' && module.exports) {
|
3931
4421
|
module.exports = sinon.sandbox;
|
3932
4422
|
}
|
3933
4423
|
}());
|
@@ -3950,7 +4440,7 @@ if (typeof module == "object" && typeof require == "function") {
|
|
3950
4440
|
*/
|
3951
4441
|
|
3952
4442
|
(function (sinon) {
|
3953
|
-
var commonJSModule = typeof module
|
4443
|
+
var commonJSModule = typeof module !== 'undefined' && module.exports;
|
3954
4444
|
|
3955
4445
|
if (!sinon && commonJSModule) {
|
3956
4446
|
sinon = require("../sinon");
|
@@ -4023,7 +4513,7 @@ if (typeof module == "object" && typeof require == "function") {
|
|
4023
4513
|
*/
|
4024
4514
|
|
4025
4515
|
(function (sinon) {
|
4026
|
-
var commonJSModule = typeof module
|
4516
|
+
var commonJSModule = typeof module !== 'undefined' && module.exports;
|
4027
4517
|
|
4028
4518
|
if (!sinon && commonJSModule) {
|
4029
4519
|
sinon = require("../sinon");
|
@@ -4120,7 +4610,7 @@ if (typeof module == "object" && typeof require == "function") {
|
|
4120
4610
|
*/
|
4121
4611
|
|
4122
4612
|
(function (sinon, global) {
|
4123
|
-
var commonJSModule = typeof module
|
4613
|
+
var commonJSModule = typeof module !== "undefined" && module.exports;
|
4124
4614
|
var slice = Array.prototype.slice;
|
4125
4615
|
var assert;
|
4126
4616
|
|
@@ -4188,7 +4678,7 @@ if (typeof module == "object" && typeof require == "function") {
|
|
4188
4678
|
function exposedName(prefix, prop) {
|
4189
4679
|
return !prefix || /^fail/.test(prop) ? prop :
|
4190
4680
|
prefix + prop.slice(0, 1).toUpperCase() + prop.slice(1);
|
4191
|
-
}
|
4681
|
+
}
|
4192
4682
|
|
4193
4683
|
assert = {
|
4194
4684
|
failException: "AssertError",
|
@@ -4256,6 +4746,20 @@ if (typeof module == "object" && typeof require == "function") {
|
|
4256
4746
|
}
|
4257
4747
|
|
4258
4748
|
return target;
|
4749
|
+
},
|
4750
|
+
|
4751
|
+
match: function match(actual, expectation) {
|
4752
|
+
var matcher = sinon.match(expectation);
|
4753
|
+
if (matcher.test(actual)) {
|
4754
|
+
assert.pass("match");
|
4755
|
+
} else {
|
4756
|
+
var formatted = [
|
4757
|
+
"expected value to match",
|
4758
|
+
" expected = " + sinon.format(expectation),
|
4759
|
+
" actual = " + sinon.format(actual)
|
4760
|
+
]
|
4761
|
+
failAssertion(this, formatted.join("\n"));
|
4762
|
+
}
|
4259
4763
|
}
|
4260
4764
|
};
|
4261
4765
|
|
@@ -4287,4 +4791,4 @@ if (typeof module == "object" && typeof require == "function") {
|
|
4287
4791
|
}
|
4288
4792
|
}(typeof sinon == "object" && sinon || null, typeof window != "undefined" ? window : (typeof self != "undefined") ? self : global));
|
4289
4793
|
|
4290
|
-
return sinon;}.call(typeof window != 'undefined' && window || {}));
|
4794
|
+
return sinon;}.call(typeof window != 'undefined' && window || {}));
|