set_builder 2.0.0.beta2 → 2.0.0.beta3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +6 -6
- data/Rakefile +2 -2
- data/init.rb +1 -1
- data/lib/assets/javascripts/set_builder.js +122 -125
- data/lib/set_builder/constraint.rb +66 -50
- data/lib/set_builder/errors/trait_not_found.rb +3 -0
- data/lib/set_builder/modifier/adverb.rb +4 -4
- data/lib/set_builder/modifier/base.rb +74 -67
- data/lib/set_builder/modifier/verb.rb +1 -16
- data/lib/set_builder/modifier.rb +49 -49
- data/lib/set_builder/modifier_collection.rb +16 -16
- data/lib/set_builder/modifiers/date_preposition.rb +6 -48
- data/lib/set_builder/modifiers/number_preposition.rb +4 -25
- data/lib/set_builder/modifiers/string_preposition.rb +9 -43
- data/lib/set_builder/modifiers.rb +3 -3
- data/lib/set_builder/set.rb +48 -8
- data/lib/set_builder/trait.rb +75 -49
- data/lib/set_builder/traits.rb +13 -4
- data/lib/set_builder/value_map.rb +30 -30
- data/lib/set_builder/version.rb +1 -1
- data/lib/set_builder.rb +8 -7
- data/set_builder.gemspec +4 -2
- data/spec/commands/example_command.rb +2 -2
- data/spec/lib/jspec.css +4 -4
- data/spec/lib/jspec.growl.js +11 -11
- data/spec/lib/jspec.jquery.js +14 -14
- data/spec/lib/jspec.js +210 -210
- data/spec/lib/jspec.nodejs.js +2 -2
- data/spec/lib/jspec.shell.js +11 -11
- data/spec/lib/jspec.timers.js +23 -23
- data/spec/rhino.js +1 -1
- data/spec/server.rb +1 -1
- data/spec/unit/array.spec.js +9 -9
- data/spec/unit/set_builder.spec.js +71 -82
- data/spec/unit/spec.helper.js +1 -0
- data/test/constraint_test.rb +84 -0
- data/test/date_preposition_test.rb +17 -7
- data/test/modifier_test.rb +26 -1
- data/test/set_test.rb +51 -28
- data/test/string_preposition_test.rb +10 -9
- data/test/test_helper.rb +17 -15
- data/test/trait_test.rb +49 -30
- data/test/traits_test.rb +35 -30
- data/test/value_map_test.rb +1 -1
- metadata +37 -15
- data/lib/set_builder/query_builders/string.rb +0 -0
- data/test/inflector_test.rb +0 -27
data/spec/lib/jspec.js
CHANGED
@@ -35,9 +35,9 @@
|
|
35
35
|
*/
|
36
36
|
|
37
37
|
defaultContext : {
|
38
|
-
|
38
|
+
|
39
39
|
/**
|
40
|
-
* Return an object used for proxy assertions.
|
40
|
+
* Return an object used for proxy assertions.
|
41
41
|
* This object is used to indicate that an object
|
42
42
|
* should be an instance of _object_, not the constructor
|
43
43
|
* itself.
|
@@ -46,11 +46,11 @@
|
|
46
46
|
* @return {hash}
|
47
47
|
* @api public
|
48
48
|
*/
|
49
|
-
|
49
|
+
|
50
50
|
an_instance_of : function(constructor) {
|
51
51
|
return { an_instance_of : constructor }
|
52
52
|
},
|
53
|
-
|
53
|
+
|
54
54
|
/**
|
55
55
|
* Load fixture at _path_.
|
56
56
|
*
|
@@ -63,14 +63,14 @@
|
|
63
63
|
* @return {string}
|
64
64
|
* @api public
|
65
65
|
*/
|
66
|
-
|
66
|
+
|
67
67
|
fixture : function(path) {
|
68
68
|
if (JSpec.cache[path]) return JSpec.cache[path]
|
69
|
-
return JSpec.cache[path] =
|
69
|
+
return JSpec.cache[path] =
|
70
70
|
JSpec.tryLoading(JSpec.options.fixturePath + '/' + path) ||
|
71
71
|
JSpec.tryLoading(JSpec.options.fixturePath + '/' + path + '.html')
|
72
72
|
},
|
73
|
-
|
73
|
+
|
74
74
|
/**
|
75
75
|
* Load json fixture at _path_.
|
76
76
|
*
|
@@ -83,7 +83,7 @@
|
|
83
83
|
* @return {object}
|
84
84
|
* @api public
|
85
85
|
*/
|
86
|
-
|
86
|
+
|
87
87
|
json_fixture: function(path) {
|
88
88
|
if (!JSpec.cache['json:' + path])
|
89
89
|
JSpec.cache['json:' + path] =
|
@@ -98,12 +98,12 @@
|
|
98
98
|
},
|
99
99
|
|
100
100
|
// --- Objects
|
101
|
-
|
101
|
+
|
102
102
|
reporters : {
|
103
|
-
|
103
|
+
|
104
104
|
/**
|
105
105
|
* Report to server.
|
106
|
-
*
|
106
|
+
*
|
107
107
|
* Options:
|
108
108
|
* - uri specific uri to report to.
|
109
109
|
* - verbose weither or not to output messages
|
@@ -111,7 +111,7 @@
|
|
111
111
|
*
|
112
112
|
* @api public
|
113
113
|
*/
|
114
|
-
|
114
|
+
|
115
115
|
Server : function(results, options) {
|
116
116
|
var uri = options.uri || 'http://' + window.location.host + '/results'
|
117
117
|
JSpec.post(uri, {
|
@@ -130,7 +130,7 @@
|
|
130
130
|
'fail',
|
131
131
|
assertions: map(spec.assertions, function(assertion){
|
132
132
|
return {
|
133
|
-
passed: assertion.passed
|
133
|
+
passed: assertion.passed
|
134
134
|
}
|
135
135
|
})
|
136
136
|
}
|
@@ -157,14 +157,14 @@
|
|
157
157
|
failuresOnly = option('failuresOnly'),
|
158
158
|
classes = results.stats.failures ? 'has-failures' : ''
|
159
159
|
if (!report) throw 'JSpec requires the element #' + id + ' to output its reports'
|
160
|
-
|
160
|
+
|
161
161
|
function bodyContents(body) {
|
162
162
|
return JSpec.
|
163
163
|
escape(JSpec.contentsOf(body)).
|
164
164
|
replace(/^ */gm, function(a){ return (new Array(Math.round(a.length / 3))).join(' ') }).
|
165
165
|
replace(/\r\n|\r|\n/gm, '<br/>')
|
166
166
|
}
|
167
|
-
|
167
|
+
|
168
168
|
report.innerHTML = '<div id="jspec-report" class="' + classes + '"><div class="heading"> \
|
169
169
|
<span class="passes">Passes: <em>' + results.stats.passes + '</em></span> \
|
170
170
|
<span class="failures">Failures: <em>' + results.stats.failures + '</em></span> \
|
@@ -180,7 +180,7 @@
|
|
180
180
|
(spec.passed() && !failuresOnly) ?
|
181
181
|
'<td class="pass">' + escape(spec.description)+ '</td><td>' + spec.assertionsGraph() + '</td>' :
|
182
182
|
!spec.passed() ?
|
183
|
-
'<td class="fail">' + escape(spec.description) +
|
183
|
+
'<td class="fail">' + escape(spec.description) +
|
184
184
|
map(spec.failures(), function(a){ return '<em>' + escape(a.message) + '</em>' }).join('') +
|
185
185
|
'</td><td>' + spec.assertionsGraph() + '</td>' :
|
186
186
|
'') +
|
@@ -188,23 +188,23 @@
|
|
188
188
|
}).join('') + '</tr>'
|
189
189
|
}).join('') + '</table></div>'
|
190
190
|
},
|
191
|
-
|
191
|
+
|
192
192
|
/**
|
193
193
|
* Terminal reporter.
|
194
194
|
*
|
195
195
|
* @api public
|
196
196
|
*/
|
197
|
-
|
197
|
+
|
198
198
|
Terminal : function(results, options) {
|
199
199
|
var failuresOnly = option('failuresOnly')
|
200
|
-
print(color("\n Passes: ", 'bold') + color(results.stats.passes, 'green') +
|
200
|
+
print(color("\n Passes: ", 'bold') + color(results.stats.passes, 'green') +
|
201
201
|
color(" Failures: ", 'bold') + color(results.stats.failures, 'red') +
|
202
202
|
color(" Duration: ", 'bold') + color(results.duration, 'green') + " ms \n")
|
203
|
-
|
203
|
+
|
204
204
|
function indent(string) {
|
205
205
|
return string.replace(/^(.)/gm, ' $1')
|
206
206
|
}
|
207
|
-
|
207
|
+
|
208
208
|
each(results.allSuites, function(suite) {
|
209
209
|
var displaySuite = failuresOnly ? suite.ran && !suite.passed() : suite.ran
|
210
210
|
if (displaySuite && suite.isExecutable()) {
|
@@ -218,17 +218,17 @@
|
|
218
218
|
else if (spec.passed() && !failuresOnly)
|
219
219
|
print(color(' ' + spec.description, 'green') + assertionsGraph)
|
220
220
|
else if (!spec.passed())
|
221
|
-
print(color(' ' + spec.description, 'red') + assertionsGraph +
|
221
|
+
print(color(' ' + spec.description, 'red') + assertionsGraph +
|
222
222
|
"\n" + indent(map(spec.failures(), function(a){ return a.message }).join("\n")) + "\n")
|
223
223
|
})
|
224
224
|
print("")
|
225
225
|
}
|
226
226
|
})
|
227
|
-
|
227
|
+
|
228
228
|
quit(results.stats.failures)
|
229
229
|
}
|
230
230
|
},
|
231
|
-
|
231
|
+
|
232
232
|
Assertion : function(matcher, actual, expected, negate) {
|
233
233
|
extend(this, {
|
234
234
|
message: '',
|
@@ -237,19 +237,19 @@
|
|
237
237
|
negate: negate,
|
238
238
|
matcher: matcher,
|
239
239
|
expected: expected,
|
240
|
-
|
240
|
+
|
241
241
|
// Report assertion results
|
242
|
-
|
242
|
+
|
243
243
|
report : function() {
|
244
|
-
if (JSpec.assert)
|
244
|
+
if (JSpec.assert)
|
245
245
|
this.passed ? JSpec.stats.passes++ : JSpec.stats.failures++
|
246
246
|
return this
|
247
247
|
},
|
248
|
-
|
248
|
+
|
249
249
|
// Run the assertion
|
250
|
-
|
250
|
+
|
251
251
|
run : function() {
|
252
|
-
// TODO: remove unshifting
|
252
|
+
// TODO: remove unshifting
|
253
253
|
expected.unshift(actual)
|
254
254
|
this.result = matcher.match.apply(this, expected)
|
255
255
|
this.passed = negate ? !this.result : this.result
|
@@ -258,27 +258,27 @@
|
|
258
258
|
}
|
259
259
|
})
|
260
260
|
},
|
261
|
-
|
261
|
+
|
262
262
|
ProxyAssertion : function(object, method, times, negate) {
|
263
263
|
var self = this,
|
264
264
|
old = object[method]
|
265
|
-
|
265
|
+
|
266
266
|
// Proxy
|
267
|
-
|
267
|
+
|
268
268
|
object[method] = function(){
|
269
269
|
var args = toArray(arguments),
|
270
270
|
result = old.apply(object, args)
|
271
271
|
self.calls.push({ args : args, result : result })
|
272
272
|
return result
|
273
273
|
}
|
274
|
-
|
274
|
+
|
275
275
|
// Times
|
276
|
-
|
276
|
+
|
277
277
|
this.times = {
|
278
278
|
once : 1,
|
279
279
|
twice : 2
|
280
280
|
}[times] || times || 1
|
281
|
-
|
281
|
+
|
282
282
|
extend(this, {
|
283
283
|
calls: [],
|
284
284
|
message: '',
|
@@ -287,23 +287,23 @@
|
|
287
287
|
negate: negate,
|
288
288
|
object: object,
|
289
289
|
method: method,
|
290
|
-
|
290
|
+
|
291
291
|
// Proxy return value
|
292
|
-
|
292
|
+
|
293
293
|
and_return : function(result) {
|
294
294
|
this.expectedResult = result
|
295
295
|
return this
|
296
296
|
},
|
297
|
-
|
297
|
+
|
298
298
|
// Proxy arguments passed
|
299
|
-
|
299
|
+
|
300
300
|
with_args : function() {
|
301
301
|
this.expectedArgs = toArray(arguments)
|
302
302
|
return this
|
303
303
|
},
|
304
|
-
|
304
|
+
|
305
305
|
// Check if any calls have failing results
|
306
|
-
|
306
|
+
|
307
307
|
anyResultsFail : function() {
|
308
308
|
return any(this.calls, function(call){
|
309
309
|
return self.expectedResult.an_instance_of ?
|
@@ -311,9 +311,9 @@
|
|
311
311
|
!equal(self.expectedResult, call.result)
|
312
312
|
})
|
313
313
|
},
|
314
|
-
|
314
|
+
|
315
315
|
// Check if any calls have passing results
|
316
|
-
|
316
|
+
|
317
317
|
anyResultsPass : function() {
|
318
318
|
return any(this.calls, function(call){
|
319
319
|
return self.expectedResult.an_instance_of ?
|
@@ -321,21 +321,21 @@
|
|
321
321
|
equal(self.expectedResult, call.result)
|
322
322
|
})
|
323
323
|
},
|
324
|
-
|
324
|
+
|
325
325
|
// Return the passing result
|
326
|
-
|
326
|
+
|
327
327
|
passingResult : function() {
|
328
328
|
return this.anyResultsPass().result
|
329
329
|
},
|
330
330
|
|
331
331
|
// Return the failing result
|
332
|
-
|
332
|
+
|
333
333
|
failingResult : function() {
|
334
334
|
return this.anyResultsFail().result
|
335
335
|
},
|
336
|
-
|
336
|
+
|
337
337
|
// Check if any arguments fail
|
338
|
-
|
338
|
+
|
339
339
|
anyArgsFail : function() {
|
340
340
|
return any(this.calls, function(call){
|
341
341
|
return any(self.expectedArgs, function(i, arg){
|
@@ -343,73 +343,73 @@
|
|
343
343
|
return arg.an_instance_of ?
|
344
344
|
call.args[i].constructor != arg.an_instance_of:
|
345
345
|
!equal(arg, call.args[i])
|
346
|
-
|
346
|
+
|
347
347
|
})
|
348
348
|
})
|
349
349
|
},
|
350
|
-
|
350
|
+
|
351
351
|
// Check if any arguments pass
|
352
|
-
|
352
|
+
|
353
353
|
anyArgsPass : function() {
|
354
354
|
return any(this.calls, function(call){
|
355
355
|
return any(self.expectedArgs, function(i, arg){
|
356
356
|
return arg.an_instance_of ?
|
357
357
|
call.args[i].constructor == arg.an_instance_of:
|
358
358
|
equal(arg, call.args[i])
|
359
|
-
|
359
|
+
|
360
360
|
})
|
361
361
|
})
|
362
362
|
},
|
363
|
-
|
363
|
+
|
364
364
|
// Return the passing args
|
365
|
-
|
365
|
+
|
366
366
|
passingArgs : function() {
|
367
367
|
return this.anyArgsPass().args
|
368
368
|
},
|
369
|
-
|
369
|
+
|
370
370
|
// Return the failing args
|
371
|
-
|
371
|
+
|
372
372
|
failingArgs : function() {
|
373
373
|
return this.anyArgsFail().args
|
374
374
|
},
|
375
|
-
|
375
|
+
|
376
376
|
// Report assertion results
|
377
|
-
|
377
|
+
|
378
378
|
report : function() {
|
379
|
-
if (JSpec.assert)
|
379
|
+
if (JSpec.assert)
|
380
380
|
this.passed ? ++JSpec.stats.passes : ++JSpec.stats.failures
|
381
381
|
return this
|
382
382
|
},
|
383
|
-
|
383
|
+
|
384
384
|
// Run the assertion
|
385
|
-
|
385
|
+
|
386
386
|
run : function() {
|
387
387
|
var methodString = 'expected ' + object.toString() + '.' + method + '()' + (negate ? ' not' : '' )
|
388
|
-
|
388
|
+
|
389
389
|
function times(n) {
|
390
390
|
return n > 2 ? n + ' times' : { 1: 'once', 2: 'twice' }[n]
|
391
391
|
}
|
392
|
-
|
392
|
+
|
393
393
|
if (this.expectedResult != null && (negate ? this.anyResultsPass() : this.anyResultsFail()))
|
394
|
-
this.message = methodString + ' to return ' + puts(this.expectedResult) +
|
395
|
-
' but ' + (negate ? 'it did' : 'got ' + puts(this.failingResult()))
|
394
|
+
this.message = methodString + ' to return ' + puts(this.expectedResult) +
|
395
|
+
' but ' + (negate ? 'it did' : 'got ' + puts(this.failingResult()))
|
396
396
|
|
397
397
|
if (this.expectedArgs && (negate ? !this.expectedResult && this.anyArgsPass() : this.anyArgsFail()))
|
398
398
|
this.message = methodString + ' to be called with ' + puts.apply(this, this.expectedArgs) +
|
399
399
|
' but was' + (negate ? '' : ' called with ' + puts.apply(this, this.failingArgs()))
|
400
400
|
|
401
401
|
if (negate ? !this.expectedResult && !this.expectedArgs && this.calls.length >= this.times : this.calls.length != this.times)
|
402
|
-
this.message = methodString + ' to be called ' + times(this.times) +
|
402
|
+
this.message = methodString + ' to be called ' + times(this.times) +
|
403
403
|
', but ' + (this.calls.length == 0 ? ' was not called' : ' was called ' + times(this.calls.length))
|
404
|
-
|
405
|
-
if (!this.message.length)
|
404
|
+
|
405
|
+
if (!this.message.length)
|
406
406
|
this.passed = true
|
407
|
-
|
407
|
+
|
408
408
|
return this
|
409
409
|
}
|
410
410
|
})
|
411
411
|
},
|
412
|
-
|
412
|
+
|
413
413
|
/**
|
414
414
|
* Specification Suite block object.
|
415
415
|
*
|
@@ -427,11 +427,11 @@
|
|
427
427
|
sharedBehaviors: [],
|
428
428
|
specs: [],
|
429
429
|
ran: false,
|
430
|
-
shared: isShared,
|
431
|
-
hooks: { 'before' : [], 'after' : [],
|
430
|
+
shared: isShared,
|
431
|
+
hooks: { 'before' : [], 'after' : [],
|
432
432
|
'before_each' : [], 'after_each' : [],
|
433
433
|
'before_nested' : [], 'after_nested' : []},
|
434
|
-
|
434
|
+
|
435
435
|
// Add a spec to the suite
|
436
436
|
|
437
437
|
addSpec : function(description, body) {
|
@@ -456,7 +456,7 @@
|
|
456
456
|
},
|
457
457
|
|
458
458
|
// Add a hook to the suite
|
459
|
-
|
459
|
+
|
460
460
|
addHook : function(hook, body) {
|
461
461
|
this.hooks[hook].push(body)
|
462
462
|
},
|
@@ -486,7 +486,7 @@
|
|
486
486
|
// Check if nested suites are present
|
487
487
|
|
488
488
|
hasSuites : function() {
|
489
|
-
return this.suites.length
|
489
|
+
return this.suites.length
|
490
490
|
},
|
491
491
|
|
492
492
|
// Check if this suite has specs
|
@@ -499,7 +499,7 @@
|
|
499
499
|
|
500
500
|
passed : function() {
|
501
501
|
return !any(this.specs, function(spec){
|
502
|
-
return !spec.passed()
|
502
|
+
return !spec.passed()
|
503
503
|
})
|
504
504
|
},
|
505
505
|
|
@@ -512,7 +512,7 @@
|
|
512
512
|
}
|
513
513
|
})
|
514
514
|
},
|
515
|
-
|
515
|
+
|
516
516
|
/**
|
517
517
|
* Specification block object.
|
518
518
|
*
|
@@ -526,29 +526,29 @@
|
|
526
526
|
body: body,
|
527
527
|
description: description,
|
528
528
|
assertions: [],
|
529
|
-
|
529
|
+
|
530
530
|
// Add passing assertion
|
531
|
-
|
531
|
+
|
532
532
|
pass : function(message) {
|
533
533
|
this.assertions.push({ passed: true, message: message })
|
534
534
|
if (JSpec.assert) ++JSpec.stats.passes
|
535
535
|
},
|
536
|
-
|
536
|
+
|
537
537
|
// Add failing assertion
|
538
|
-
|
538
|
+
|
539
539
|
fail : function(message) {
|
540
540
|
this.assertions.push({ passed: false, message: message })
|
541
541
|
if (JSpec.assert) ++JSpec.stats.failures
|
542
542
|
},
|
543
|
-
|
543
|
+
|
544
544
|
// Run deferred assertions
|
545
|
-
|
545
|
+
|
546
546
|
runDeferredAssertions : function() {
|
547
547
|
each(this.assertions, function(assertion){
|
548
548
|
if (assertion.defer) assertion.run().report(), hook('afterAssertion', assertion)
|
549
549
|
})
|
550
550
|
},
|
551
|
-
|
551
|
+
|
552
552
|
// Find first failing assertion
|
553
553
|
|
554
554
|
failure : function() {
|
@@ -586,17 +586,17 @@
|
|
586
586
|
}
|
587
587
|
})
|
588
588
|
},
|
589
|
-
|
589
|
+
|
590
590
|
Module : function(methods) {
|
591
591
|
extend(this, methods)
|
592
592
|
},
|
593
|
-
|
593
|
+
|
594
594
|
JSON : {
|
595
|
-
|
595
|
+
|
596
596
|
/**
|
597
597
|
* Generic sequences.
|
598
598
|
*/
|
599
|
-
|
599
|
+
|
600
600
|
meta : {
|
601
601
|
'\b' : '\\b',
|
602
602
|
'\t' : '\\t',
|
@@ -606,13 +606,13 @@
|
|
606
606
|
'"' : '\\"',
|
607
607
|
'\\' : '\\\\'
|
608
608
|
},
|
609
|
-
|
609
|
+
|
610
610
|
/**
|
611
611
|
* Escapable sequences.
|
612
612
|
*/
|
613
|
-
|
613
|
+
|
614
614
|
escapable : /[\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,
|
615
|
-
|
615
|
+
|
616
616
|
/**
|
617
617
|
* JSON encode _object_.
|
618
618
|
*
|
@@ -620,7 +620,7 @@
|
|
620
620
|
* @return {string}
|
621
621
|
* @api private
|
622
622
|
*/
|
623
|
-
|
623
|
+
|
624
624
|
encode : function(object) {
|
625
625
|
var self = this
|
626
626
|
if (object == undefined || object == null) return 'null'
|
@@ -634,7 +634,7 @@
|
|
634
634
|
'\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4)
|
635
635
|
}) + '"' :
|
636
636
|
'"' + object + '"'
|
637
|
-
case 'object':
|
637
|
+
case 'object':
|
638
638
|
if (object.constructor == Array)
|
639
639
|
return '[' + map(object, function(val){
|
640
640
|
return self.encode(val)
|
@@ -647,9 +647,9 @@
|
|
647
647
|
return 'null'
|
648
648
|
}
|
649
649
|
},
|
650
|
-
|
650
|
+
|
651
651
|
// --- DSLs
|
652
|
-
|
652
|
+
|
653
653
|
DSLs : {
|
654
654
|
snake : {
|
655
655
|
expect : function(actual){
|
@@ -667,15 +667,15 @@
|
|
667
667
|
before : function(body) {
|
668
668
|
return JSpec.currentSuite.addHook('before', body)
|
669
669
|
},
|
670
|
-
|
670
|
+
|
671
671
|
after : function(body) {
|
672
672
|
return JSpec.currentSuite.addHook('after', body)
|
673
673
|
},
|
674
|
-
|
674
|
+
|
675
675
|
before_each : function(body) {
|
676
676
|
return JSpec.currentSuite.addHook('before_each', body)
|
677
677
|
},
|
678
|
-
|
678
|
+
|
679
679
|
after_each : function(body) {
|
680
680
|
return JSpec.currentSuite.addHook('after_each', body)
|
681
681
|
},
|
@@ -687,7 +687,7 @@
|
|
687
687
|
after_nested : function(body){
|
688
688
|
return JSpec.currentSuite.addhook('after_nested', body)
|
689
689
|
},
|
690
|
-
|
690
|
+
|
691
691
|
shared_behaviors_for : function(description, body){
|
692
692
|
return JSpec.currentSuite.addSuite(description, body, true)
|
693
693
|
},
|
@@ -699,7 +699,7 @@
|
|
699
699
|
},
|
700
700
|
|
701
701
|
// --- Methods
|
702
|
-
|
702
|
+
|
703
703
|
/**
|
704
704
|
* Check if _value_ is 'stop'. For use as a
|
705
705
|
* utility callback function.
|
@@ -708,11 +708,11 @@
|
|
708
708
|
* @return {bool}
|
709
709
|
* @api public
|
710
710
|
*/
|
711
|
-
|
711
|
+
|
712
712
|
haveStopped : function(value) {
|
713
713
|
return value === 'stop'
|
714
714
|
},
|
715
|
-
|
715
|
+
|
716
716
|
/**
|
717
717
|
* Include _object_ which may be a hash or Module instance.
|
718
718
|
*
|
@@ -720,7 +720,7 @@
|
|
720
720
|
* @return {JSpec}
|
721
721
|
* @api public
|
722
722
|
*/
|
723
|
-
|
723
|
+
|
724
724
|
include : function(object) {
|
725
725
|
var module = object.constructor == JSpec.Module ? object : new JSpec.Module(object)
|
726
726
|
this.modules.push(module)
|
@@ -735,7 +735,7 @@
|
|
735
735
|
})
|
736
736
|
return this
|
737
737
|
},
|
738
|
-
|
738
|
+
|
739
739
|
/**
|
740
740
|
* Add a module hook _name_, which is immediately
|
741
741
|
* called per module with the _args_ given. An array of
|
@@ -746,7 +746,7 @@
|
|
746
746
|
* @return {array}
|
747
747
|
* @api private
|
748
748
|
*/
|
749
|
-
|
749
|
+
|
750
750
|
hook : function(name, args) {
|
751
751
|
args = toArray(arguments, 1)
|
752
752
|
return inject(JSpec.modules, [], function(results, module){
|
@@ -754,7 +754,7 @@
|
|
754
754
|
results.push(JSpec.evalHook(module, name, args))
|
755
755
|
})
|
756
756
|
},
|
757
|
-
|
757
|
+
|
758
758
|
/**
|
759
759
|
* Eval _module_ hook _name_ with _args_. Evaluates in context
|
760
760
|
* to the module itself, JSpec, and JSpec.context.
|
@@ -765,31 +765,31 @@
|
|
765
765
|
* @return {mixed}
|
766
766
|
* @api private
|
767
767
|
*/
|
768
|
-
|
768
|
+
|
769
769
|
evalHook : function(module, name, args) {
|
770
770
|
hook('evaluatingHookBody', module, name)
|
771
771
|
return module[name].apply(module, args)
|
772
772
|
},
|
773
|
-
|
773
|
+
|
774
774
|
/**
|
775
775
|
* Same as hook() however accepts only one _arg_ which is
|
776
776
|
* considered immutable. This function passes the arg
|
777
777
|
* to the first module, then passes the return value of the last
|
778
|
-
* module called, to the following module.
|
778
|
+
* module called, to the following module.
|
779
779
|
*
|
780
780
|
* @param {string} name
|
781
781
|
* @param {mixed} arg
|
782
782
|
* @return {mixed}
|
783
783
|
* @api private
|
784
784
|
*/
|
785
|
-
|
785
|
+
|
786
786
|
hookImmutable : function(name, arg) {
|
787
787
|
return inject(JSpec.modules, arg, function(result, module){
|
788
788
|
if (typeof module[name] == 'function')
|
789
789
|
return JSpec.evalHook(module, name, [result])
|
790
790
|
})
|
791
791
|
},
|
792
|
-
|
792
|
+
|
793
793
|
/**
|
794
794
|
* Find a shared example suite by its description or name.
|
795
795
|
* First searches parent tree of suites for shared behavior
|
@@ -799,7 +799,7 @@
|
|
799
799
|
* @return {Suite}
|
800
800
|
* @api private
|
801
801
|
*/
|
802
|
-
|
802
|
+
|
803
803
|
findSharedBehavior : function(description) {
|
804
804
|
var behavior
|
805
805
|
return (behavior = JSpec.findLocalSharedBehavior(description))
|
@@ -815,7 +815,7 @@
|
|
815
815
|
* @return {Suite}
|
816
816
|
* @api private
|
817
817
|
*/
|
818
|
-
|
818
|
+
|
819
819
|
findLocalSharedBehavior : function(description) {
|
820
820
|
var behavior,
|
821
821
|
currentSuite = JSpec.currentSuite.suite
|
@@ -834,11 +834,11 @@
|
|
834
834
|
* @return {Suite}
|
835
835
|
* @api private
|
836
836
|
*/
|
837
|
-
|
837
|
+
|
838
838
|
findGlobalSharedBehavior : function(description) {
|
839
839
|
return find(JSpec.suites, JSpec.suiteDescriptionPredicate(description))
|
840
840
|
},
|
841
|
-
|
841
|
+
|
842
842
|
/**
|
843
843
|
* Build a predicate that will match a suite based on name or description
|
844
844
|
*
|
@@ -846,7 +846,7 @@
|
|
846
846
|
* @return {function}
|
847
847
|
* @api private
|
848
848
|
*/
|
849
|
-
|
849
|
+
|
850
850
|
suiteDescriptionPredicate : function(description) {
|
851
851
|
return function(suite){
|
852
852
|
return suite.name === description ||
|
@@ -861,7 +861,7 @@
|
|
861
861
|
* @param {string} description
|
862
862
|
* @api public
|
863
863
|
*/
|
864
|
-
|
864
|
+
|
865
865
|
shareBehaviorsOf : function(description) {
|
866
866
|
var suite = JSpec.findSharedBehavior(description)
|
867
867
|
if (suite)
|
@@ -869,8 +869,8 @@
|
|
869
869
|
else
|
870
870
|
throw new Error("failed to find shared behaviors named `" + description + "'")
|
871
871
|
},
|
872
|
-
|
873
|
-
|
872
|
+
|
873
|
+
|
874
874
|
/**
|
875
875
|
* Convert arguments to an array.
|
876
876
|
*
|
@@ -879,11 +879,11 @@
|
|
879
879
|
* @return {array}
|
880
880
|
* @api public
|
881
881
|
*/
|
882
|
-
|
882
|
+
|
883
883
|
toArray : function(arguments, offset) {
|
884
884
|
return Array.prototype.slice.call(arguments, offset || 0)
|
885
885
|
},
|
886
|
-
|
886
|
+
|
887
887
|
/**
|
888
888
|
* Return ANSI-escaped colored string.
|
889
889
|
*
|
@@ -892,7 +892,7 @@
|
|
892
892
|
* @return {string}
|
893
893
|
* @api public
|
894
894
|
*/
|
895
|
-
|
895
|
+
|
896
896
|
color : function(string, color) {
|
897
897
|
if (option('disableColors')) {
|
898
898
|
return string
|
@@ -910,22 +910,22 @@
|
|
910
910
|
}[color] + 'm' + string + "\u001B[0m"
|
911
911
|
}
|
912
912
|
},
|
913
|
-
|
913
|
+
|
914
914
|
/**
|
915
915
|
* Default matcher message callback.
|
916
916
|
*
|
917
917
|
* @api private
|
918
918
|
*/
|
919
|
-
|
919
|
+
|
920
920
|
defaultMatcherMessage : function(actual, expected, negate, name) {
|
921
|
-
return 'expected ' + puts(actual) + ' to ' +
|
922
|
-
(negate ? 'not ' : '') +
|
921
|
+
return 'expected ' + puts(actual) + ' to ' +
|
922
|
+
(negate ? 'not ' : '') +
|
923
923
|
name.replace(/_/g, ' ') +
|
924
924
|
' ' + (expected.length > 1 ?
|
925
925
|
puts.apply(this, expected.slice(1)) :
|
926
926
|
'')
|
927
927
|
},
|
928
|
-
|
928
|
+
|
929
929
|
/**
|
930
930
|
* Normalize a matcher message.
|
931
931
|
*
|
@@ -936,45 +936,45 @@
|
|
936
936
|
* @return {hash}
|
937
937
|
* @api public
|
938
938
|
*/
|
939
|
-
|
939
|
+
|
940
940
|
normalizeMatcherMessage : function(matcher) {
|
941
|
-
if (typeof matcher.message != 'function')
|
941
|
+
if (typeof matcher.message != 'function')
|
942
942
|
matcher.message = this.defaultMatcherMessage
|
943
943
|
return matcher
|
944
944
|
},
|
945
|
-
|
945
|
+
|
946
946
|
/**
|
947
947
|
* Normalize a matcher body
|
948
|
-
*
|
948
|
+
*
|
949
949
|
* This process allows the following conversions until
|
950
950
|
* the matcher is in its final normalized hash state.
|
951
951
|
*
|
952
952
|
* - '==' becomes 'actual == expected'
|
953
953
|
* - 'actual == expected' becomes 'return actual == expected'
|
954
|
-
* - function(actual, expected) { return actual == expected } becomes
|
954
|
+
* - function(actual, expected) { return actual == expected } becomes
|
955
955
|
* { match : function(actual, expected) { return actual == expected }}
|
956
956
|
*
|
957
957
|
* @param {mixed} body
|
958
958
|
* @return {hash}
|
959
959
|
* @api public
|
960
960
|
*/
|
961
|
-
|
961
|
+
|
962
962
|
normalizeMatcherBody : function(body) {
|
963
963
|
var captures
|
964
964
|
switch (body.constructor) {
|
965
965
|
case String:
|
966
966
|
if (captures = body.match(/^alias (\w+)/)) return JSpec.matchers[last(captures)]
|
967
967
|
if (body.length < 4) body = 'actual ' + body + ' expected'
|
968
|
-
return { match: function(actual, expected) { return eval(body) }}
|
969
|
-
|
968
|
+
return { match: function(actual, expected) { return eval(body) }}
|
969
|
+
|
970
970
|
case Function:
|
971
971
|
return { match: body }
|
972
|
-
|
972
|
+
|
973
973
|
default:
|
974
974
|
return body
|
975
975
|
}
|
976
976
|
},
|
977
|
-
|
977
|
+
|
978
978
|
/**
|
979
979
|
* Get option value. This method first checks if
|
980
980
|
* the option key has been set via the query string,
|
@@ -984,12 +984,12 @@
|
|
984
984
|
* @return {mixed}
|
985
985
|
* @api public
|
986
986
|
*/
|
987
|
-
|
987
|
+
|
988
988
|
option : function(key) {
|
989
989
|
return (value = query(key)) !== null ? value :
|
990
990
|
JSpec.options[key] || null
|
991
991
|
},
|
992
|
-
|
992
|
+
|
993
993
|
/**
|
994
994
|
* Check if object _a_, is equal to object _b_.
|
995
995
|
*
|
@@ -998,7 +998,7 @@
|
|
998
998
|
* @return {bool}
|
999
999
|
* @api private
|
1000
1000
|
*/
|
1001
|
-
|
1001
|
+
|
1002
1002
|
equal: function(a, b) {
|
1003
1003
|
if (typeof a != typeof b) return
|
1004
1004
|
if (a === b) return true
|
@@ -1057,14 +1057,14 @@
|
|
1057
1057
|
if (object.nodeName && object.outerHTML) return object.outerHTML
|
1058
1058
|
if (object.nodeName) return document.createElement('div').appendChild(object).parentNode.innerHTML
|
1059
1059
|
switch (object.constructor) {
|
1060
|
-
case Function: return object.name || object
|
1061
|
-
case String:
|
1060
|
+
case Function: return object.name || object
|
1061
|
+
case String:
|
1062
1062
|
return '"' + object
|
1063
1063
|
.replace(/"/g, '\\"')
|
1064
1064
|
.replace(/\n/g, '\\n')
|
1065
1065
|
.replace(/\t/g, '\\t')
|
1066
1066
|
+ '"'
|
1067
|
-
case Array:
|
1067
|
+
case Array:
|
1068
1068
|
return inject(object, '[', function(b, v){
|
1069
1069
|
return b + ', ' + puts(v)
|
1070
1070
|
}).replace('[,', '[') + ' ]'
|
@@ -1074,7 +1074,7 @@
|
|
1074
1074
|
if (k == '__hit__') return b
|
1075
1075
|
return b + ', ' + k + ': ' + (v && v.__hit__ ? '<circular reference>' : puts(v))
|
1076
1076
|
}).replace('{,', '{') + ' }'
|
1077
|
-
default:
|
1077
|
+
default:
|
1078
1078
|
return object.toString()
|
1079
1079
|
}
|
1080
1080
|
},
|
@@ -1114,12 +1114,12 @@
|
|
1114
1114
|
.replace(/>/gmi, '>')
|
1115
1115
|
.replace(/</gmi, '<')
|
1116
1116
|
},
|
1117
|
-
|
1117
|
+
|
1118
1118
|
/**
|
1119
1119
|
* Perform an assertion without reporting.
|
1120
1120
|
*
|
1121
1121
|
* This method is primarily used for internal
|
1122
|
-
* matchers in order retain DRYness. May be invoked
|
1122
|
+
* matchers in order retain DRYness. May be invoked
|
1123
1123
|
* like below:
|
1124
1124
|
*
|
1125
1125
|
* does('foo', 'eql', 'foo')
|
@@ -1134,7 +1134,7 @@
|
|
1134
1134
|
* @return {mixed}
|
1135
1135
|
* @api private
|
1136
1136
|
*/
|
1137
|
-
|
1137
|
+
|
1138
1138
|
does : function(actual, matcher, expected) {
|
1139
1139
|
var assertion = new JSpec.Assertion(JSpec.matchers[matcher], actual, toArray(arguments, 2))
|
1140
1140
|
return assertion.run().result
|
@@ -1155,22 +1155,22 @@
|
|
1155
1155
|
expect : function(actual) {
|
1156
1156
|
function assert(matcher, args, negate) {
|
1157
1157
|
var expected = toArray(args, 1)
|
1158
|
-
matcher.negate = negate
|
1158
|
+
matcher.negate = negate
|
1159
1159
|
var assertion = new JSpec.Assertion(matcher, actual, expected, negate)
|
1160
1160
|
hook('beforeAssertion', assertion)
|
1161
1161
|
if (matcher.defer) assertion.run()
|
1162
1162
|
else JSpec.currentSpec.assertions.push(assertion.run().report()), hook('afterAssertion', assertion)
|
1163
1163
|
return assertion.result
|
1164
1164
|
}
|
1165
|
-
|
1165
|
+
|
1166
1166
|
function to(matcher) {
|
1167
1167
|
return assert(matcher, arguments, false)
|
1168
1168
|
}
|
1169
|
-
|
1169
|
+
|
1170
1170
|
function not_to(matcher) {
|
1171
1171
|
return assert(matcher, arguments, true)
|
1172
1172
|
}
|
1173
|
-
|
1173
|
+
|
1174
1174
|
return {
|
1175
1175
|
to : to,
|
1176
1176
|
should : to,
|
@@ -1193,7 +1193,7 @@
|
|
1193
1193
|
replace(new RegExp('[' + (chars || '\\s') + ']*$'), '').
|
1194
1194
|
replace(new RegExp('^[' + (chars || '\\s') + ']*'), '')
|
1195
1195
|
},
|
1196
|
-
|
1196
|
+
|
1197
1197
|
/**
|
1198
1198
|
* Call an iterator callback with arguments a, or b
|
1199
1199
|
* depending on the arity of the callback.
|
@@ -1204,11 +1204,11 @@
|
|
1204
1204
|
* @return {mixed}
|
1205
1205
|
* @api private
|
1206
1206
|
*/
|
1207
|
-
|
1207
|
+
|
1208
1208
|
callIterator : function(callback, a, b) {
|
1209
1209
|
return callback.length == 1 ? callback(b) : callback(a, b)
|
1210
1210
|
},
|
1211
|
-
|
1211
|
+
|
1212
1212
|
/**
|
1213
1213
|
* Extend an object with another.
|
1214
1214
|
*
|
@@ -1216,13 +1216,13 @@
|
|
1216
1216
|
* @param {object} other
|
1217
1217
|
* @api public
|
1218
1218
|
*/
|
1219
|
-
|
1219
|
+
|
1220
1220
|
extend : function(object, other) {
|
1221
1221
|
each(other, function(property, value){
|
1222
1222
|
object[property] = value
|
1223
1223
|
})
|
1224
1224
|
},
|
1225
|
-
|
1225
|
+
|
1226
1226
|
/**
|
1227
1227
|
* Iterate an object, invoking the given callback.
|
1228
1228
|
*
|
@@ -1237,7 +1237,7 @@
|
|
1237
1237
|
for (var i = 0, len = object.length; i < len; ++i)
|
1238
1238
|
callIterator(callback, i, object[i])
|
1239
1239
|
else
|
1240
|
-
for (var key in object)
|
1240
|
+
for (var key in object)
|
1241
1241
|
if (object.hasOwnProperty(key))
|
1242
1242
|
callIterator(callback, key, object[key])
|
1243
1243
|
},
|
@@ -1261,7 +1261,7 @@
|
|
1261
1261
|
})
|
1262
1262
|
return memo
|
1263
1263
|
},
|
1264
|
-
|
1264
|
+
|
1265
1265
|
/**
|
1266
1266
|
* Destub _object_'s _method_. When no _method_ is passed
|
1267
1267
|
* all stubbed methods are destubbed. When no arguments
|
@@ -1272,7 +1272,7 @@
|
|
1272
1272
|
* @param {string} method
|
1273
1273
|
* @api public
|
1274
1274
|
*/
|
1275
|
-
|
1275
|
+
|
1276
1276
|
destub : function(object, method) {
|
1277
1277
|
var captures
|
1278
1278
|
if (method) {
|
@@ -1293,9 +1293,9 @@
|
|
1293
1293
|
while (JSpec.stubbed.length)
|
1294
1294
|
destub(JSpec.stubbed.shift())
|
1295
1295
|
},
|
1296
|
-
|
1296
|
+
|
1297
1297
|
/**
|
1298
|
-
* Stub _object_'s _method_.
|
1298
|
+
* Stub _object_'s _method_.
|
1299
1299
|
*
|
1300
1300
|
* stub(foo, 'toString').and_return('bar')
|
1301
1301
|
*
|
@@ -1304,10 +1304,10 @@
|
|
1304
1304
|
* @return {hash}
|
1305
1305
|
* @api public
|
1306
1306
|
*/
|
1307
|
-
|
1307
|
+
|
1308
1308
|
stub : function(object, method) {
|
1309
1309
|
hook('stubbing', object, method)
|
1310
|
-
|
1310
|
+
|
1311
1311
|
//unbind any stub already present on this method
|
1312
1312
|
JSpec.destub(object, method);
|
1313
1313
|
JSpec.stubbed.push(object)
|
@@ -1322,7 +1322,7 @@
|
|
1322
1322
|
}
|
1323
1323
|
}
|
1324
1324
|
},
|
1325
|
-
|
1325
|
+
|
1326
1326
|
/**
|
1327
1327
|
* Map callback return values.
|
1328
1328
|
*
|
@@ -1337,7 +1337,7 @@
|
|
1337
1337
|
memo.push(callIterator(callback, key, value))
|
1338
1338
|
})
|
1339
1339
|
},
|
1340
|
-
|
1340
|
+
|
1341
1341
|
/**
|
1342
1342
|
* Returns the first matching expression or null.
|
1343
1343
|
*
|
@@ -1346,14 +1346,14 @@
|
|
1346
1346
|
* @return {mixed}
|
1347
1347
|
* @api public
|
1348
1348
|
*/
|
1349
|
-
|
1349
|
+
|
1350
1350
|
any : function(object, callback) {
|
1351
1351
|
return inject(object, null, function(state, key, value){
|
1352
1352
|
if (state == undefined)
|
1353
1353
|
return callIterator(callback, key, value) ? value : state
|
1354
1354
|
})
|
1355
1355
|
},
|
1356
|
-
|
1356
|
+
|
1357
1357
|
/**
|
1358
1358
|
* Returns an array of values collected when the callback
|
1359
1359
|
* given evaluates to true.
|
@@ -1363,7 +1363,7 @@
|
|
1363
1363
|
* @return {array}
|
1364
1364
|
* @api public
|
1365
1365
|
*/
|
1366
|
-
|
1366
|
+
|
1367
1367
|
select : function(object, callback) {
|
1368
1368
|
return inject(object, [], function(selected, key, value){
|
1369
1369
|
if (callIterator(callback, key, value))
|
@@ -1380,10 +1380,10 @@
|
|
1380
1380
|
|
1381
1381
|
addMatchers : function(matchers) {
|
1382
1382
|
each(matchers, function(name, body){
|
1383
|
-
JSpec.addMatcher(name, body)
|
1383
|
+
JSpec.addMatcher(name, body)
|
1384
1384
|
})
|
1385
1385
|
},
|
1386
|
-
|
1386
|
+
|
1387
1387
|
/**
|
1388
1388
|
* Define a matcher.
|
1389
1389
|
*
|
@@ -1391,7 +1391,7 @@
|
|
1391
1391
|
* @param {hash, function, string} body
|
1392
1392
|
* @api public
|
1393
1393
|
*/
|
1394
|
-
|
1394
|
+
|
1395
1395
|
addMatcher : function(name, body) {
|
1396
1396
|
hook('addingMatcher', name, body)
|
1397
1397
|
if (name.indexOf(' ') != -1) {
|
@@ -1404,7 +1404,7 @@
|
|
1404
1404
|
this.matchers[name] = this.normalizeMatcherMessage(this.normalizeMatcherBody(body))
|
1405
1405
|
this.matchers[name].name = name
|
1406
1406
|
},
|
1407
|
-
|
1407
|
+
|
1408
1408
|
/**
|
1409
1409
|
* Add a root suite to JSpec.
|
1410
1410
|
*
|
@@ -1412,14 +1412,14 @@
|
|
1412
1412
|
* @param {body} function
|
1413
1413
|
* @api public
|
1414
1414
|
*/
|
1415
|
-
|
1415
|
+
|
1416
1416
|
describe : function(description, body) {
|
1417
1417
|
var suite = new JSpec.Suite(description, body, false)
|
1418
1418
|
hook('addingSuite', suite)
|
1419
1419
|
this.allSuites.push(suite)
|
1420
1420
|
this.suites.push(suite)
|
1421
1421
|
},
|
1422
|
-
|
1422
|
+
|
1423
1423
|
/**
|
1424
1424
|
* Add a shared example suite to JSpec.
|
1425
1425
|
*
|
@@ -1427,7 +1427,7 @@
|
|
1427
1427
|
* @param {body} function
|
1428
1428
|
* @api public
|
1429
1429
|
*/
|
1430
|
-
|
1430
|
+
|
1431
1431
|
shared_behaviors_for : function(description, body) {
|
1432
1432
|
var suite = new JSpec.Suite(description, body, true)
|
1433
1433
|
hook('addingSuite', suite)
|
@@ -1442,7 +1442,7 @@
|
|
1442
1442
|
* @return {string}
|
1443
1443
|
* @api public
|
1444
1444
|
*/
|
1445
|
-
|
1445
|
+
|
1446
1446
|
contentsOf : function(body) {
|
1447
1447
|
return body.toString().match(/^[^\{]*{((.*\n*)*)}/m)[1]
|
1448
1448
|
},
|
@@ -1511,7 +1511,7 @@
|
|
1511
1511
|
},
|
1512
1512
|
|
1513
1513
|
/**
|
1514
|
-
* Report on the results.
|
1514
|
+
* Report on the results.
|
1515
1515
|
*
|
1516
1516
|
* @api public
|
1517
1517
|
*/
|
@@ -1538,7 +1538,7 @@
|
|
1538
1538
|
each(this.suites, function(suite) { JSpec.runSuite(suite) })
|
1539
1539
|
return this
|
1540
1540
|
},
|
1541
|
-
|
1541
|
+
|
1542
1542
|
/**
|
1543
1543
|
* Run a suite.
|
1544
1544
|
*
|
@@ -1569,25 +1569,25 @@
|
|
1569
1569
|
this.stats.suitesFinished++
|
1570
1570
|
}
|
1571
1571
|
},
|
1572
|
-
|
1572
|
+
|
1573
1573
|
/**
|
1574
1574
|
* Report a failure for the current spec.
|
1575
1575
|
*
|
1576
1576
|
* @param {string} message
|
1577
1577
|
* @api public
|
1578
1578
|
*/
|
1579
|
-
|
1579
|
+
|
1580
1580
|
fail : function(message) {
|
1581
1581
|
JSpec.currentSpec.fail(message)
|
1582
1582
|
},
|
1583
|
-
|
1583
|
+
|
1584
1584
|
/**
|
1585
1585
|
* Report a passing assertion for the current spec.
|
1586
1586
|
*
|
1587
1587
|
* @param {string} message
|
1588
1588
|
* @api public
|
1589
1589
|
*/
|
1590
|
-
|
1590
|
+
|
1591
1591
|
pass : function(message) {
|
1592
1592
|
JSpec.currentSpec.pass(message)
|
1593
1593
|
},
|
@@ -1650,7 +1650,7 @@
|
|
1650
1650
|
* @param {string} data
|
1651
1651
|
* @api private
|
1652
1652
|
*/
|
1653
|
-
|
1653
|
+
|
1654
1654
|
post : function(uri, data) {
|
1655
1655
|
if (any(hook('posting', uri, data), haveStopped)) return
|
1656
1656
|
var request = this.xhr()
|
@@ -1669,18 +1669,18 @@
|
|
1669
1669
|
* @return {XMLHttpRequest, ActiveXObject}
|
1670
1670
|
* @api private
|
1671
1671
|
*/
|
1672
|
-
|
1672
|
+
|
1673
1673
|
xhr : function() {
|
1674
1674
|
return this.ieXhr() || new JSpec.request
|
1675
1675
|
},
|
1676
|
-
|
1676
|
+
|
1677
1677
|
/**
|
1678
1678
|
* Return Microsoft piece of crap ActiveXObject.
|
1679
1679
|
*
|
1680
1680
|
* @return {ActiveXObject}
|
1681
1681
|
* @api public
|
1682
1682
|
*/
|
1683
|
-
|
1683
|
+
|
1684
1684
|
ieXhr : function() {
|
1685
1685
|
function object(str) {
|
1686
1686
|
try { return new ActiveXObject(str) } catch(e) {}
|
@@ -1690,18 +1690,18 @@
|
|
1690
1690
|
object('Msxml2.XMLHTTP') ||
|
1691
1691
|
object('Microsoft.XMLHTTP')
|
1692
1692
|
},
|
1693
|
-
|
1693
|
+
|
1694
1694
|
/**
|
1695
1695
|
* Check for HTTP request support.
|
1696
1696
|
*
|
1697
1697
|
* @return {bool}
|
1698
1698
|
* @api private
|
1699
1699
|
*/
|
1700
|
-
|
1700
|
+
|
1701
1701
|
hasXhr : function() {
|
1702
1702
|
return JSpec.request || 'ActiveXObject' in main
|
1703
1703
|
},
|
1704
|
-
|
1704
|
+
|
1705
1705
|
/**
|
1706
1706
|
* Try loading _file_ returning the contents
|
1707
1707
|
* string or null. Chain to locate / read a file.
|
@@ -1710,7 +1710,7 @@
|
|
1710
1710
|
* @return {string}
|
1711
1711
|
* @api public
|
1712
1712
|
*/
|
1713
|
-
|
1713
|
+
|
1714
1714
|
tryLoading : function(file) {
|
1715
1715
|
try { return JSpec.load(file) } catch (e) {}
|
1716
1716
|
},
|
@@ -1732,9 +1732,9 @@
|
|
1732
1732
|
var request = this.xhr()
|
1733
1733
|
request.open('GET', file, false)
|
1734
1734
|
request.send(null)
|
1735
|
-
if (request.readyState == 4 &&
|
1736
|
-
(request.status == 0 ||
|
1737
|
-
request.status.toString().charAt(0) == 2))
|
1735
|
+
if (request.readyState == 4 &&
|
1736
|
+
(request.status == 0 ||
|
1737
|
+
request.status.toString().charAt(0) == 2))
|
1738
1738
|
return request.responseText
|
1739
1739
|
}
|
1740
1740
|
else
|
@@ -1755,9 +1755,9 @@
|
|
1755
1755
|
return this
|
1756
1756
|
}
|
1757
1757
|
}
|
1758
|
-
|
1758
|
+
|
1759
1759
|
// --- Node.js support
|
1760
|
-
|
1760
|
+
|
1761
1761
|
if (typeof GLOBAL === 'object' && typeof exports === 'object') {
|
1762
1762
|
var fs = require('fs')
|
1763
1763
|
quit = process.exit
|
@@ -1772,7 +1772,7 @@
|
|
1772
1772
|
if (typeof Johnson === 'object') {
|
1773
1773
|
quit = function () {}
|
1774
1774
|
}
|
1775
|
-
|
1775
|
+
|
1776
1776
|
// --- Utility functions
|
1777
1777
|
|
1778
1778
|
var main = this,
|
@@ -1805,13 +1805,13 @@
|
|
1805
1805
|
have_length : "actual.length == expected",
|
1806
1806
|
be_within : "actual >= expected[0] && actual <= last(expected)",
|
1807
1807
|
have_length_within : "actual.length >= expected[0] && actual.length <= last(expected)",
|
1808
|
-
|
1808
|
+
|
1809
1809
|
receive : { defer : true, match : function(actual, method, times) {
|
1810
1810
|
var proxy = new JSpec.ProxyAssertion(actual, method, times, this.negate)
|
1811
1811
|
JSpec.currentSpec.assertions.push(proxy)
|
1812
1812
|
return proxy
|
1813
1813
|
}},
|
1814
|
-
|
1814
|
+
|
1815
1815
|
be_empty : function(actual) {
|
1816
1816
|
if (actual.constructor == Object && actual.length == undefined)
|
1817
1817
|
for (var key in actual)
|
@@ -1823,18 +1823,18 @@
|
|
1823
1823
|
for (var state = true, i = 1; i < arguments.length; i++) {
|
1824
1824
|
var arg = arguments[i]
|
1825
1825
|
switch (actual.constructor) {
|
1826
|
-
case String:
|
1826
|
+
case String:
|
1827
1827
|
case Number:
|
1828
1828
|
case RegExp:
|
1829
1829
|
case Function:
|
1830
1830
|
state = actual.toString().indexOf(arg) !== -1
|
1831
1831
|
break
|
1832
|
-
|
1832
|
+
|
1833
1833
|
case Object:
|
1834
1834
|
state = arg in actual
|
1835
1835
|
break
|
1836
|
-
|
1837
|
-
case Array:
|
1836
|
+
|
1837
|
+
case Array:
|
1838
1838
|
state = any(actual, function(value){ return equal(value, arg) })
|
1839
1839
|
break
|
1840
1840
|
}
|
@@ -1872,31 +1872,31 @@
|
|
1872
1872
|
return 'expected ' + exception + (negate ? ' not ' : '' ) +
|
1873
1873
|
' to be thrown, but ' + (this.e ? 'got ' + puts(this.e) : 'nothing was')
|
1874
1874
|
}},
|
1875
|
-
|
1875
|
+
|
1876
1876
|
have : function(actual, length, property) {
|
1877
1877
|
return actual[property] == null ? false : actual[property].length == length
|
1878
1878
|
},
|
1879
|
-
|
1879
|
+
|
1880
1880
|
have_at_least : function(actual, length, property) {
|
1881
1881
|
return actual[property] == null ? (length === 0) : actual[property].length >= length
|
1882
1882
|
},
|
1883
|
-
|
1883
|
+
|
1884
1884
|
have_at_most :function(actual, length, property) {
|
1885
1885
|
return actual[property] == null || actual[property].length <= length
|
1886
1886
|
},
|
1887
|
-
|
1887
|
+
|
1888
1888
|
have_within : function(actual, range, property) {
|
1889
1889
|
var length = actual[property] == undefined ? 0 : actual[property].length
|
1890
1890
|
return length >= range.shift() && length <= range.pop()
|
1891
1891
|
},
|
1892
|
-
|
1892
|
+
|
1893
1893
|
have_prop : function(actual, property, value) {
|
1894
1894
|
var actualVal = actual[property], actualType = typeof actualVal
|
1895
1895
|
return (actualType == 'function' || actualType == 'undefined') ? false :
|
1896
1896
|
typeof value === 'undefined' ||
|
1897
1897
|
does(actual[property],'eql',value)
|
1898
1898
|
},
|
1899
|
-
|
1899
|
+
|
1900
1900
|
have_property : function(actual, property, value) {
|
1901
1901
|
var actualVal = actual[property], actualType = typeof actualVal
|
1902
1902
|
return (actualType == 'function' || actualType == 'undefined') ? false :
|
@@ -1904,5 +1904,5 @@
|
|
1904
1904
|
value === actualVal
|
1905
1905
|
}
|
1906
1906
|
})
|
1907
|
-
|
1907
|
+
|
1908
1908
|
})()
|