visionmedia-jspec 2.0.0 → 2.0.1
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.
- data/History.rdoc +5 -0
- data/bin/jspec +1 -1
- data/jspec.gemspec +4 -4
- data/lib/jspec.js +56 -43
- data/spec/spec.js +23 -0
- metadata +3 -3
data/History.rdoc
CHANGED
data/bin/jspec
CHANGED
data/jspec.gemspec
CHANGED
@@ -2,11 +2,11 @@
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |s|
|
4
4
|
s.name = %q{jspec}
|
5
|
-
s.version = "2.0.
|
5
|
+
s.version = "2.0.1"
|
6
6
|
|
7
7
|
s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
|
8
8
|
s.authors = ["TJ Holowaychuk"]
|
9
|
-
s.date = %q{2009-
|
9
|
+
s.date = %q{2009-05-01}
|
10
10
|
s.default_executable = %q{jspec}
|
11
11
|
s.description = %q{JavaScript BDD Testing Framework}
|
12
12
|
s.email = %q{tj@vision-media.ca}
|
@@ -18,12 +18,12 @@ Gem::Specification.new do |s|
|
|
18
18
|
s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Jspec", "--main", "README.rdoc"]
|
19
19
|
s.require_paths = ["lib"]
|
20
20
|
s.rubyforge_project = %q{jspec}
|
21
|
-
s.rubygems_version = %q{1.3.
|
21
|
+
s.rubygems_version = %q{1.3.2}
|
22
22
|
s.summary = %q{JavaScript BDD Testing Framework}
|
23
23
|
|
24
24
|
if s.respond_to? :specification_version then
|
25
25
|
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
26
|
-
s.specification_version =
|
26
|
+
s.specification_version = 3
|
27
27
|
|
28
28
|
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
29
29
|
s.add_runtime_dependency(%q<visionmedia-commander>, [">= 3.2.9"])
|
data/lib/jspec.js
CHANGED
@@ -5,7 +5,7 @@
|
|
5
5
|
|
6
6
|
var JSpec = {
|
7
7
|
|
8
|
-
version : '2.0.
|
8
|
+
version : '2.0.1',
|
9
9
|
suites : [],
|
10
10
|
allSuites : [],
|
11
11
|
matchers : {},
|
@@ -81,13 +81,13 @@
|
|
81
81
|
*/
|
82
82
|
|
83
83
|
DOM : function(results, options) {
|
84
|
-
id = option('reportToId') || 'jspec'
|
85
|
-
report = document.getElementById(id)
|
86
|
-
failuresOnly = option('failuresOnly')
|
87
|
-
classes = results.stats.failures ? 'has-failures' : ''
|
84
|
+
var id = option('reportToId') || 'jspec'
|
85
|
+
var report = document.getElementById(id)
|
86
|
+
var failuresOnly = option('failuresOnly')
|
87
|
+
var classes = results.stats.failures ? 'has-failures' : ''
|
88
88
|
if (!report) throw 'JSpec requires the element #' + id + ' to output its reports'
|
89
89
|
|
90
|
-
markup =
|
90
|
+
var markup =
|
91
91
|
'<div id="jspec-report" class="' + classes + '"><div class="heading"> \
|
92
92
|
<span class="passes">Passes: <em>' + results.stats.passes + '</em></span> \
|
93
93
|
<span class="failures">Failures: <em>' + results.stats.failures + '</em></span> \
|
@@ -101,7 +101,7 @@
|
|
101
101
|
}
|
102
102
|
|
103
103
|
renderSuite = function(suite) {
|
104
|
-
displaySuite = failuresOnly ? suite.ran && !suite.passed() : suite.ran
|
104
|
+
var displaySuite = failuresOnly ? suite.ran && !suite.passed() : suite.ran
|
105
105
|
if (displaySuite && suite.hasSpecs()) {
|
106
106
|
markup += '<tr class="description"><td colspan="2">' + suite.description + '</td></tr>'
|
107
107
|
each(suite.specs, function(i, spec){
|
@@ -150,7 +150,7 @@
|
|
150
150
|
if (displaySuite && suite.hasSpecs()) {
|
151
151
|
puts(color(' ' + suite.description, 'bold'))
|
152
152
|
each(suite.specs, function(spec){
|
153
|
-
assertionsGraph = inject(spec.assertions, '', function(graph, assertion){
|
153
|
+
var assertionsGraph = inject(spec.assertions, '', function(graph, assertion){
|
154
154
|
return graph + color('.', assertion.passed ? 'green' : 'red')
|
155
155
|
})
|
156
156
|
if (spec.requiresImplementation())
|
@@ -189,7 +189,7 @@
|
|
189
189
|
if (suite.ran) {
|
190
190
|
console.group(suite.description)
|
191
191
|
each(suite.specs, function(spec){
|
192
|
-
assertionCount = spec.assertions.length + ':'
|
192
|
+
var assertionCount = spec.assertions.length + ':'
|
193
193
|
if (spec.requiresImplementation())
|
194
194
|
console.warn(spec.description)
|
195
195
|
else if (spec.passed())
|
@@ -233,9 +233,9 @@
|
|
233
233
|
run : function() {
|
234
234
|
// TODO: remove unshifting of expected
|
235
235
|
expected.unshift(actual == null ? null : actual.valueOf())
|
236
|
-
this.result = matcher.match.apply(
|
236
|
+
this.result = matcher.match.apply(this, expected)
|
237
237
|
this.passed = negate ? !this.result : this.result
|
238
|
-
if (!this.passed) this.message = matcher.message(actual, expected, negate, matcher.name)
|
238
|
+
if (!this.passed) this.message = matcher.message.call(this, actual, expected, negate, matcher.name)
|
239
239
|
return this
|
240
240
|
}
|
241
241
|
})
|
@@ -330,8 +330,9 @@
|
|
330
330
|
// Run the assertion
|
331
331
|
|
332
332
|
run : function() {
|
333
|
-
methodString = 'expected ' + object.toString() + '.' + method + '()'
|
334
|
-
|
333
|
+
var methodString = 'expected ' + object.toString() + '.' + method + '()'
|
334
|
+
|
335
|
+
function times(n) {
|
335
336
|
return n > 2 ? n + ' times' : { 1 : 'once', 2 : 'twice' }[n]
|
336
337
|
}
|
337
338
|
|
@@ -340,12 +341,12 @@
|
|
340
341
|
', but ' + (this.calls.length == 0 ? ' was not called' : ' was called ' + times(this.calls.length))
|
341
342
|
|
342
343
|
if (this.expectedResult && this.anyResultsFail())
|
343
|
-
this.message = methodString + ' to return ' +
|
344
|
-
' but got ' +
|
344
|
+
this.message = methodString + ' to return ' + puts(this.expectedResult) +
|
345
|
+
' but got ' + puts(this.failingResult())
|
345
346
|
|
346
347
|
if (this.expectedArgs && this.anyArgsFail())
|
347
|
-
this.message = methodString + ' to be called with ' +
|
348
|
-
' but was called with ' +
|
348
|
+
this.message = methodString + ' to be called with ' + puts.apply(this, this.expectedArgs) +
|
349
|
+
' but was called with ' + puts.apply(this, this.failingArgs())
|
349
350
|
|
350
351
|
if (!this.message.length)
|
351
352
|
this.passed = true
|
@@ -376,7 +377,7 @@
|
|
376
377
|
// Add a spec to the suite
|
377
378
|
|
378
379
|
addSpec : function(description, body) {
|
379
|
-
spec = new JSpec.Spec(description, body)
|
380
|
+
var spec = new JSpec.Spec(description, body)
|
380
381
|
this.specs.push(spec)
|
381
382
|
JSpec.stats.specs++ // TODO: abstract
|
382
383
|
spec.suite = this
|
@@ -391,7 +392,7 @@
|
|
391
392
|
// Add a nested suite
|
392
393
|
|
393
394
|
addSuite : function(description, body) {
|
394
|
-
suite = new JSpec.Suite(description, body)
|
395
|
+
var suite = new JSpec.Suite(description, body)
|
395
396
|
JSpec.allSuites.push(suite)
|
396
397
|
suite.name = suite.description
|
397
398
|
suite.description = this.description + ' ' + suite.description
|
@@ -554,7 +555,7 @@
|
|
554
555
|
|
555
556
|
shareBehaviorsOf : function(description) {
|
556
557
|
if (suite = this.findSuite(description)) this.copySpecs(suite, this.currentSuite)
|
557
|
-
else throw 'failed to share behaviors. ' +
|
558
|
+
else throw 'failed to share behaviors. ' + puts(description) + ' is not a valid Suite name'
|
558
559
|
},
|
559
560
|
|
560
561
|
/**
|
@@ -581,7 +582,7 @@
|
|
581
582
|
*/
|
582
583
|
|
583
584
|
argumentsToArray : function(arguments, offset) {
|
584
|
-
args = []
|
585
|
+
var args = []
|
585
586
|
for (i = 0; i < arguments.length; i++) args.push(arguments[i])
|
586
587
|
return args.slice(offset || 0)
|
587
588
|
},
|
@@ -616,10 +617,10 @@
|
|
616
617
|
*/
|
617
618
|
|
618
619
|
defaultMatcherMessage : function(actual, expected, negate, name) {
|
619
|
-
return 'expected ' +
|
620
|
+
return 'expected ' + puts(actual) + ' to ' +
|
620
621
|
(negate ? 'not ' : '') +
|
621
622
|
name.replace(/_/g, ' ') +
|
622
|
-
' ' +
|
623
|
+
' ' + puts.apply(this, expected.slice(1))
|
623
624
|
},
|
624
625
|
|
625
626
|
/**
|
@@ -730,10 +731,10 @@
|
|
730
731
|
* @api public
|
731
732
|
*/
|
732
733
|
|
733
|
-
|
734
|
+
puts : function(object) {
|
734
735
|
if (arguments.length > 1) {
|
735
736
|
return map(argumentsToArray(arguments), function(arg){
|
736
|
-
return
|
737
|
+
return puts(arg)
|
737
738
|
}).join(', ')
|
738
739
|
}
|
739
740
|
if (object === undefined) return ''
|
@@ -741,7 +742,7 @@
|
|
741
742
|
if (object === true) return 'true'
|
742
743
|
if (object === false) return 'false'
|
743
744
|
if (object.an_instance_of) return 'an instance of ' + object.an_instance_of.name
|
744
|
-
if (object.jquery && object.selector.length > 0) return 'selector ' +
|
745
|
+
if (object.jquery && object.selector.length > 0) return 'selector ' + puts(object.selector) + ''
|
745
746
|
if (object.jquery) return escape(object.html())
|
746
747
|
if (object.nodeName) return escape(object.outerHTML)
|
747
748
|
switch (object.constructor) {
|
@@ -749,11 +750,11 @@
|
|
749
750
|
case Number: return object
|
750
751
|
case Array :
|
751
752
|
return inject(object, '[', function(b, v){
|
752
|
-
return b + ', ' +
|
753
|
+
return b + ', ' + puts(v)
|
753
754
|
}).replace('[,', '[') + ' ]'
|
754
755
|
case Object:
|
755
756
|
return inject(object, '{', function(b, k, v) {
|
756
|
-
return b + ', ' +
|
757
|
+
return b + ', ' + puts(k) + ' : ' + puts(v)
|
757
758
|
}).replace('{,', '{') + ' }'
|
758
759
|
default:
|
759
760
|
return escape(object.toString())
|
@@ -794,7 +795,7 @@
|
|
794
795
|
*/
|
795
796
|
|
796
797
|
does : function(actual, matcher, expected) {
|
797
|
-
assertion = new JSpec.Assertion(JSpec.matchers[matcher], actual, argumentsToArray(arguments, 2))
|
798
|
+
var assertion = new JSpec.Assertion(JSpec.matchers[matcher], actual, argumentsToArray(arguments, 2))
|
798
799
|
return assertion.run().result
|
799
800
|
},
|
800
801
|
|
@@ -812,7 +813,7 @@
|
|
812
813
|
|
813
814
|
expect : function(actual) {
|
814
815
|
assert = function(matcher, args, negate) {
|
815
|
-
expected = []
|
816
|
+
var expected = []
|
816
817
|
for (i = 1; i < args.length; i++) expected.push(args[i])
|
817
818
|
assertion = new JSpec.Assertion(matcher, actual, expected, negate)
|
818
819
|
if (matcher.defer) assertion.run()
|
@@ -1000,7 +1001,7 @@
|
|
1000
1001
|
*/
|
1001
1002
|
|
1002
1003
|
describe : function(description, body) {
|
1003
|
-
suite = new JSpec.Suite(description, body)
|
1004
|
+
var suite = new JSpec.Suite(description, body)
|
1004
1005
|
this.allSuites.push(suite)
|
1005
1006
|
this.suites.push(suite)
|
1006
1007
|
},
|
@@ -1027,10 +1028,10 @@
|
|
1027
1028
|
*/
|
1028
1029
|
|
1029
1030
|
evalBody : function(body, errorMessage) {
|
1030
|
-
dsl = this.DSL || this.DSLs.snake
|
1031
|
-
matchers = this.matchers
|
1032
|
-
context = this.context || this.defaultContext
|
1033
|
-
contents = this.contentsOf(body)
|
1031
|
+
var dsl = this.DSL || this.DSLs.snake
|
1032
|
+
var matchers = this.matchers
|
1033
|
+
var context = this.context || this.defaultContext
|
1034
|
+
var contents = this.contentsOf(body)
|
1034
1035
|
try { eval('with (dsl){ with (context) { with (matchers) { ' + contents + ' }}}') }
|
1035
1036
|
catch(e) { error(errorMessage, e) }
|
1036
1037
|
},
|
@@ -1067,7 +1068,7 @@
|
|
1067
1068
|
*/
|
1068
1069
|
|
1069
1070
|
range : function(start, end) {
|
1070
|
-
current = parseInt(start), end = parseInt(end), values = [current]
|
1071
|
+
var current = parseInt(start), end = parseInt(end), values = [current]
|
1071
1072
|
if (end > current) while (++current <= end) values.push(current)
|
1072
1073
|
else while (--current >= end) values.push(current)
|
1073
1074
|
return '[' + values + ']'
|
@@ -1212,7 +1213,7 @@
|
|
1212
1213
|
*/
|
1213
1214
|
|
1214
1215
|
query : function(key, queryString) {
|
1215
|
-
queryString = (queryString || (main.location ? main.location.search : null) || '').substring(1)
|
1216
|
+
var queryString = (queryString || (main.location ? main.location.search : null) || '').substring(1)
|
1216
1217
|
return inject(queryString.split('&'), null, function(value, pair){
|
1217
1218
|
parts = pair.split('=')
|
1218
1219
|
return parts[0] == key ? parts[1].replace(/%20|\+/gmi, ' ') : value
|
@@ -1241,7 +1242,7 @@
|
|
1241
1242
|
*/
|
1242
1243
|
|
1243
1244
|
post : function(url, data) {
|
1244
|
-
request = this.xhr()
|
1245
|
+
var request = this.xhr()
|
1245
1246
|
request.open('POST', url, false)
|
1246
1247
|
request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded')
|
1247
1248
|
request.send(data)
|
@@ -1294,7 +1295,7 @@
|
|
1294
1295
|
|
1295
1296
|
load : function(file) {
|
1296
1297
|
if (this.hasXhr()) {
|
1297
|
-
request = this.xhr()
|
1298
|
+
var request = this.xhr()
|
1298
1299
|
request.open('GET', file, false)
|
1299
1300
|
request.send(null)
|
1300
1301
|
if (request.readyState == 4) return request.responseText
|
@@ -1322,7 +1323,6 @@
|
|
1322
1323
|
// --- Utility functions
|
1323
1324
|
|
1324
1325
|
var main = this
|
1325
|
-
var puts = main.print
|
1326
1326
|
var map = JSpec.map
|
1327
1327
|
var any = JSpec.any
|
1328
1328
|
var find = JSpec.any
|
@@ -1336,7 +1336,7 @@
|
|
1336
1336
|
var error = JSpec.error
|
1337
1337
|
var escape = JSpec.escape
|
1338
1338
|
var extend = JSpec.extend
|
1339
|
-
var
|
1339
|
+
var puts = JSpec.puts
|
1340
1340
|
var hash = JSpec.hash
|
1341
1341
|
var query = JSpec.query
|
1342
1342
|
var strip = JSpec.strip
|
@@ -1407,9 +1407,10 @@
|
|
1407
1407
|
return true
|
1408
1408
|
},
|
1409
1409
|
|
1410
|
-
throw_error : function(actual, expected) {
|
1410
|
+
throw_error : { match : function(actual, expected) {
|
1411
1411
|
try { actual() }
|
1412
1412
|
catch (e) {
|
1413
|
+
this.e = e
|
1413
1414
|
if (expected == undefined) return true
|
1414
1415
|
switch (expected.constructor) {
|
1415
1416
|
case RegExp : return expected.test(e)
|
@@ -1417,7 +1418,19 @@
|
|
1417
1418
|
case String : return expected == e.toString()
|
1418
1419
|
}
|
1419
1420
|
}
|
1420
|
-
},
|
1421
|
+
}, message : function(actual, expected, negate) {
|
1422
|
+
// TODO: fix when expected is ONLY expected values
|
1423
|
+
expected = (function(){
|
1424
|
+
if (expected[1] == undefined) return 'exception'
|
1425
|
+
switch (expected[1].constructor) {
|
1426
|
+
case RegExp : return 'exception matching ' + puts(expected[1])
|
1427
|
+
case Function : return 'instance of ' + expected[1].name
|
1428
|
+
case String : return 'exception of ' + puts(expected[1])
|
1429
|
+
}
|
1430
|
+
})()
|
1431
|
+
return 'expected ' + (negate ? 'no ' : 'an ' ) + expected +
|
1432
|
+
' to be thrown, but ' + (this.e ? 'got ' + puts(this.e) : 'nothing was')
|
1433
|
+
}},
|
1421
1434
|
|
1422
1435
|
have : function(actual, length, property) {
|
1423
1436
|
return actual[property].length == length
|
data/spec/spec.js
CHANGED
@@ -41,6 +41,29 @@ describe 'Negative specs'
|
|
41
41
|
-{ throw 'foo' }.should.not.throw_error
|
42
42
|
end
|
43
43
|
|
44
|
+
it 'should fail saying which error has been thrown'
|
45
|
+
-{ throw 'foo' }.should.throw_error 'bar'
|
46
|
+
end
|
47
|
+
|
48
|
+
it 'should fail saying no error was thrown'
|
49
|
+
-{ }.should.throw_error 'foo'
|
50
|
+
end
|
51
|
+
|
52
|
+
it 'should fail saying no error matching was thrown'
|
53
|
+
-{ throw 'bar' }.should.throw_error(/foo/)
|
54
|
+
end
|
55
|
+
|
56
|
+
it 'should fail saying no error matching foo should be thrown'
|
57
|
+
-{ throw 'foo' }.should.not.throw_error(/foo/)
|
58
|
+
end
|
59
|
+
|
60
|
+
it 'should fail with constructor name'
|
61
|
+
function Foo(){}
|
62
|
+
function Bar(){}
|
63
|
+
Bar.prototype.toString = function(){ return 'Bar error: oh no' }
|
64
|
+
-{ throw new Bar }.should.throw_error Foo
|
65
|
+
end
|
66
|
+
|
44
67
|
it 'should fail with message of first failure'
|
45
68
|
true.should.be_true
|
46
69
|
'bar'.should.match(/foo/gm)
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: visionmedia-jspec
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.0.
|
4
|
+
version: 2.0.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- TJ Holowaychuk
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-
|
12
|
+
date: 2009-05-01 00:00:00 -07:00
|
13
13
|
default_executable: jspec
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -114,7 +114,7 @@ requirements: []
|
|
114
114
|
rubyforge_project: jspec
|
115
115
|
rubygems_version: 1.2.0
|
116
116
|
signing_key:
|
117
|
-
specification_version:
|
117
|
+
specification_version: 3
|
118
118
|
summary: JavaScript BDD Testing Framework
|
119
119
|
test_files: []
|
120
120
|
|