visionmedia-jspec 1.1.7 → 2.0.0

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/server/browsers.rb CHANGED
@@ -9,16 +9,8 @@ module JSpec
9
9
  self.class.to_s.split('::').last
10
10
  end
11
11
 
12
- class Firefox < self
13
- end
14
-
15
- class Safari < self
16
- end
17
-
18
- class Opera < self
19
- end
20
-
21
- class MSIE < self
22
- end
12
+ class Firefox < self; end
13
+ class Safari < self; end
14
+ class Opera < self; end
23
15
  end
24
16
  end
data/server/server.rb CHANGED
@@ -37,16 +37,7 @@ module JSpec
37
37
  end
38
38
 
39
39
  def display_results browser, failures, passes
40
- puts '%s - failures %s passes %s' % [bold(browser), red(failures), green(passes)]
41
- require 'rubygems'
42
- require 'growl'
43
- if failures.to_i > 0
44
- notify_error "failed #{failures} assertion(s)", :title => browser
45
- else
46
- notify_ok "passed #{passes} assertion(s)", :title => browser
47
- end
48
- rescue
49
- # Do nothing
40
+ puts '%-14s - passes: %s failures: %s' % [bold(browser), green(passes), red(failures)]
50
41
  end
51
42
 
52
43
  def browser string
@@ -76,9 +67,7 @@ module JSpec
76
67
 
77
68
  def when_finished &block
78
69
  Thread.new {
79
- while responses.length < browsers.length
80
- sleep 0.1
81
- end
70
+ sleep 0.1 while responses.length < browsers.length
82
71
  yield
83
72
  }
84
73
  end
data/spec/server.html CHANGED
@@ -3,12 +3,15 @@
3
3
  <script src="jquery-1.3.1.js"></script>
4
4
  <script src="jspec.js"></script>
5
5
  <script src="jspec.jquery.js"></script>
6
+ <script src="spec.grammar-less.js"></script>
6
7
  <script>
7
8
  function runSuites() {
8
9
  JSpec
9
10
  .exec('spec.grammar.js')
10
- .exec('spec.core.js')
11
- .exec('spec.core.dom.js')
11
+ .exec('spec.js')
12
+ .exec('spec.matchers.js')
13
+ .exec('spec.utils.js')
14
+ .exec('spec.shared-behaviors.js')
12
15
  .exec('spec.jquery.js')
13
16
  .run()
14
17
  .reportToServer()
@@ -0,0 +1,34 @@
1
+
2
+ JSpec.describe('Grammar-less', function(){
3
+ before(function(){
4
+ n = 1
5
+ })
6
+
7
+ it('should work', function(){
8
+ expect(true).to(be, true)
9
+ expect(n).to(equal, 1)
10
+ })
11
+
12
+ describe('with nested describes', function(){
13
+ before(function(){
14
+ hits = []
15
+ })
16
+
17
+ before_each(function(){
18
+ n++
19
+ hits.push('before_each')
20
+ })
21
+
22
+ it('should work', function(){
23
+ expect(true).not_to(be, false)
24
+ expect(n).to(eql, 2)
25
+ expect(hits).to(eql, ['before_each'])
26
+ })
27
+
28
+ it('should work again', function(){
29
+ expect(n).to(eql, 3)
30
+ expect(hits).to(eql, ['before_each', 'before_each'])
31
+ })
32
+ })
33
+
34
+ })
data/spec/spec.grammar.js CHANGED
@@ -1,6 +1,6 @@
1
1
 
2
2
  describe 'Grammar'
3
-
3
+
4
4
  it 'should allow "it" spec literal'
5
5
  true.should.be_true
6
6
  end
@@ -29,9 +29,16 @@ describe 'Grammar'
29
29
  end
30
30
 
31
31
  it 'should allow grammar-less assertions'
32
- expect(true).to('be', true)
33
- expect([1,2,3]).to('include', 1, 2, 3)
34
- expect(true).not_to('be', false)
32
+ expect(true).to(be, true)
33
+ expect([1,2,3]).to(include, 1, 2, 3)
34
+ expect(true).not_to(be, false)
35
+ end
36
+
37
+ it 'should allow multi-line expect() assertions'
38
+ expect(' \
39
+ foo \
40
+ bar \
41
+ ').to(include, 'foo', 'bar')
35
42
  end
36
43
 
37
44
  it 'should allow commenting out of conversions'
@@ -39,11 +46,6 @@ describe 'Grammar'
39
46
  // foo.should.not.eql 'bar'
40
47
  end
41
48
 
42
- it 'should allow . this. literal'
43
- this.foo = 'bar'
44
- .foo.should.eql 'bar'
45
- end
46
-
47
49
  it 'should allow inclusive range literal n..n'
48
50
  1..5.should.eql [1,2,3,4,5]
49
51
  3..4.should.eql [3,4]
@@ -70,10 +72,6 @@ describe 'Grammar'
70
72
  true.should.be_true
71
73
  end
72
74
 
73
- it 'should still allow literal javascript outside of blocks'
74
- n.should.eql 10
75
- end
76
-
77
75
  describe 'nested again'
78
76
  it 'should still work'
79
77
  true.should.be_true
@@ -82,10 +80,9 @@ describe 'Grammar'
82
80
  end
83
81
 
84
82
  describe 'before / after blocks'
85
- var n, o, hits = []
86
-
87
83
  before
88
84
  n = 1
85
+ hits = []
89
86
  hits.push('before')
90
87
  end
91
88
 
@@ -108,7 +105,7 @@ describe 'Grammar'
108
105
  describe 'with nested describe'
109
106
  it 'should be accessable'
110
107
  n.should.eql 1
111
- hits.should.eql ['before', 'before']
108
+ hits.should.eql ['before']
112
109
  end
113
110
  end
114
111
  end
@@ -162,6 +159,20 @@ describe 'Grammar'
162
159
  hits.should.eql ['before_each', 'after_each', 'before_each', 'after_each', 'before_each', 'after_each', 'before_each', 'after_each', 'before_each', 'before_each']
163
160
  end
164
161
  end
162
+
163
+ describe 'with multiple hooks'
164
+ before_each
165
+ hits = []
166
+ end
167
+
168
+ before_each
169
+ hits.push('before_each')
170
+ end
171
+
172
+ it 'should work'
173
+ hits.should.eql ['before_each']
174
+ end
175
+ end
165
176
  end
166
177
  end
167
178
 
data/spec/spec.html CHANGED
@@ -4,12 +4,15 @@
4
4
  <script src="jquery-1.3.1.js"></script>
5
5
  <script src="../lib/jspec.js"></script>
6
6
  <script src="../lib/jspec.jquery.js"></script>
7
+ <script src="spec.grammar-less.js"></script>
7
8
  <script>
8
9
  function runSuites() {
9
10
  JSpec
10
11
  .exec('spec.grammar.js')
11
- .exec('spec.core.js')
12
- .exec('spec.core.dom.js')
12
+ .exec('spec.js')
13
+ .exec('spec.matchers.js')
14
+ .exec('spec.utils.js')
15
+ .exec('spec.shared-behaviors.js')
13
16
  .exec('spec.jquery.js')
14
17
  .run()
15
18
  .report()
@@ -18,7 +21,7 @@
18
21
  </head>
19
22
  <body class="jspec" onLoad="runSuites();">
20
23
  <div id="jspec-top"><h2 id="jspec-title">JSpec <em><script>document.write(JSpec.version)</script></em></h2></div>
21
- <div id="jspec"></div>
24
+ <div id="jspec"><div class="loading"></div></div>
22
25
  <div id="jspec-bottom"></div>
23
26
  </body>
24
27
  </html>
data/spec/spec.jquery.js CHANGED
@@ -1,17 +1,13 @@
1
1
 
2
2
  describe 'jQuery'
3
- describe 'helpers'
3
+ describe 'sandbox'
4
4
  before
5
- .dom = this.sandbox()
5
+ dom = sandbox()
6
6
  end
7
-
8
- it 'should add elements to a sandbox'
9
- .dom.prepend('<em>test</em>').should.have_text 'test'
10
- end
11
-
12
- it 'should retain visibility within a sandbox'
13
- .dom.children('em').hide().should.be_hidden
14
- .dom.children('em').show().should.be_visible
7
+
8
+ it 'should provide an empty DOM sandbox'
9
+ dom.prepend('<em>test</em>')
10
+ dom.should.have_text 'test'
15
11
  end
16
12
  end
17
13
 
@@ -42,71 +38,73 @@ describe 'jQuery'
42
38
  <strong>test</strong> \
43
39
  <strong>test</strong> \
44
40
  </p>'
45
- .elem = $(html)
41
+ elem = $(html)
46
42
  end
47
43
 
48
44
  it 'should fail with pretty print of element'
49
- .elem.should.not.have_tag 'label'
45
+ elem.should.not.have_tag 'label'
50
46
  end
51
47
 
52
48
  describe 'have_tag / have_one'
53
49
  it 'should check if a single child is present'
54
- .elem.should.have_tag 'label'
55
- .elem.should.have_tag 'em'
56
- .elem.should.have_one 'label'
57
- .elem.should.not.have_tag 'input'
50
+ elem.should.have_tag 'label'
51
+ elem.should.have_tag 'em'
52
+ elem.should.have_one 'label'
53
+ elem.should.not.have_tag 'input'
58
54
  end
59
55
  end
60
56
 
61
57
  describe 'have_tags / have_many'
62
58
  it 'should check if more than one child is present'
63
- .elem.should.have_tags 'option'
64
- .elem.should.have_many 'option'
65
- .elem.should.not.have_many 'label'
59
+ elem.should.have_tags 'option'
60
+ elem.should.have_many 'option'
61
+ elem.should.not.have_many 'label'
66
62
  end
67
63
  end
68
64
 
69
65
  describe 'have_child'
70
66
  it 'should check if a direct child is present'
71
- .elem.should.have_child 'label'
72
- .elem.should.not.have_child 'em'
67
+ elem.should.have_child 'label'
68
+ elem.should.not.have_child 'em'
73
69
  end
74
70
  end
75
71
 
76
72
  describe 'have_children'
77
73
  it 'should check if more than one direct children are present'
78
- .elem.should.have_children 'strong'
79
- .elem.should.not.have_children 'select'
74
+ elem.should.have_children 'strong'
75
+ elem.should.not.have_children 'select'
80
76
  end
81
77
  end
82
78
 
83
79
  describe 'have_text'
84
80
  it 'should check for plain text'
85
- .elem.children('label').should.have_text 'Save?'
81
+ elem.children('label').should.have_text 'Save?'
86
82
  end
87
83
  end
88
84
 
89
85
  describe 'have_value'
90
86
  it 'should check if an element has the given value'
91
- .elem.find('option').get(1).should.have_value '1'
87
+ elem.find('option').get(1).should.have_value '1'
92
88
  end
93
89
  end
94
90
 
95
91
  describe 'have_class'
96
92
  it 'should check if an element has the given class'
97
- .elem.children('select').should.have_class 'save'
93
+ elem.children('select').should.have_class 'save'
98
94
  end
99
95
  end
100
96
 
101
97
  describe 'have_classes'
102
98
  it 'should check if an element has the classes given'
103
- .elem.children('select').should.have_classes 'save', 'form-select'
99
+ elem.children('select').should.have_classes 'save', 'form-select'
100
+ elem.children('select').should.not.have_classes 'save', 'foo'
101
+ elem.children('select').should.not.have_classes 'foo', 'save'
104
102
  end
105
103
  end
106
104
 
107
105
  describe 'be_visible'
108
106
  it 'should check that an element is not hidden or set to display of none'
109
- .element('#jspec-report').should.be_visible
107
+ element('#jspec-report').should.be_visible
110
108
  '#jspec-report'.should.be_visible
111
109
  '<input style="visibility: hidden;"/>'.should.not.be_visible
112
110
  '<input style="display: none;"/>'.should.not.be_visible
@@ -149,18 +147,18 @@ describe 'jQuery'
149
147
 
150
148
  describe 'have_attr'
151
149
  before_each
152
- .elem = '<input type="button" title="some foo" value="Foo" />'
150
+ elem = '<input type="button" title="some foo" value="Foo" />'
153
151
  end
154
152
 
155
153
  it 'should check that an element has the given attribute'
156
- .elem.should.have_attr 'title'
157
- .elem.should.not_have_attr 'rawr'
154
+ elem.should.have_attr 'title'
155
+ elem.should.not_have_attr 'rawr'
158
156
  end
159
157
 
160
158
  it 'should check that the given attribute has a specific value'
161
- .elem.should.have_attr 'title', 'some foo'
162
- .elem.should.not.have_attr 'some', 'rawr'
163
- .elem.should.not.have_attr 'title', 'bar'
159
+ elem.should.have_attr 'title', 'some foo'
160
+ elem.should.not.have_attr 'some', 'rawr'
161
+ elem.should.not.have_attr 'title', 'bar'
164
162
  end
165
163
  end
166
164
  end
data/spec/spec.js ADDED
@@ -0,0 +1,86 @@
1
+
2
+ describe 'Negative specs'
3
+
4
+ it 'should fail'
5
+ 'test'.should.not_eql 'test'
6
+ end
7
+
8
+ it 'should fail with one faulty assertion'
9
+ 'test'.should.equal 'test'
10
+ 'test'.should.equal 'foo'
11
+ end
12
+
13
+ it 'should fail and print array with square braces'
14
+ [1,2].should.equal [1,3]
15
+ end
16
+
17
+ it 'should fail and print nested array'
18
+ [1, ['foo']].should.equal [1, ['bar', ['whatever', 1.0, { foo : 'bar', bar : { 1 : 2 } }]]]
19
+ end
20
+
21
+ it 'should fail and print html elements'
22
+ elem = document.createElement('a')
23
+ elem.setAttribute('href', 'http://vision-media.ca')
24
+ elem.should.not.eql elem
25
+ end
26
+
27
+ it 'should fail with selector for jQuery objects'
28
+ elem = { jquery : '1.3.1', selector : '.foobar' }
29
+ elem.should.eql 'foo'
30
+ end
31
+
32
+ it 'should fail with negative message'
33
+ '1'.should.not.be_true
34
+ end
35
+
36
+ it 'should fail with positive message'
37
+ false.should.be_true
38
+ end
39
+
40
+ it 'should fail with function body'
41
+ -{ throw 'foo' }.should.not.throw_error
42
+ end
43
+
44
+ it 'should fail with message of first failure'
45
+ true.should.be_true
46
+ 'bar'.should.match(/foo/gm)
47
+ 'bar'.should.include 'foo'
48
+ end
49
+
50
+ it 'should fail with list'
51
+ ['foo', 'bar'].should.include 'foo', 'car'
52
+ end
53
+
54
+ it 'should catch exceptions throw within specs'
55
+ throw new Error('Oh noes!')
56
+ end
57
+
58
+ it 'should catch improper exceptions'
59
+ throw 'oh noes'
60
+ end
61
+
62
+ it 'should catch proper exceptions'
63
+ iDoNotExist.neitherDoI()
64
+ end
65
+
66
+ end
67
+
68
+ describe 'Contexts'
69
+ before
70
+ JSpec.context = { iLike : 'cookies' }
71
+ end
72
+
73
+ after
74
+ JSpec.context = null
75
+ end
76
+
77
+ it 'should be replaceable'
78
+ iLike.should.equal 'cookies'
79
+ end
80
+ end
81
+
82
+ describe 'Misc'
83
+ it 'requires implementation'
84
+ end
85
+ end
86
+
@@ -34,6 +34,11 @@ describe 'Matchers'
34
34
  foo.should.eql foo2
35
35
  foo.should.not.eql bar
36
36
  end
37
+
38
+ it 'should work with constructors'
39
+ Array.should.eql Array
40
+ Array.should.not.eql Object
41
+ end
37
42
  end
38
43
 
39
44
  describe 'equal'
@@ -252,119 +257,122 @@ describe 'Matchers'
252
257
  end
253
258
  end
254
259
 
255
- describe 'should_receive'
256
- it 'should fail when a method is not available'
257
- person = {}
260
+ describe 'receive'
261
+ before_each
262
+ person = { toString : function(){ return 'person' }}
263
+ personWithPets = {
264
+ toString : function(){ return 'personWithPets' },
265
+ getPets : function() { return ['izzy'] },
266
+ addPet : function(name) { return ['izzy', name] },
267
+ addPets : function(a, b) { return ['izzy', a, b] }
268
+ }
269
+ end
270
+
271
+ it 'should fail when the method does not exist'
258
272
  person.should.receive('getPets')
259
273
  end
260
- end
261
-
262
- end
263
-
264
- describe 'Negative specs'
265
-
266
- it 'should fail'
267
- 'test'.should.not_eql 'test'
268
- end
269
-
270
- it 'should fail with one faulty assertion'
271
- 'test'.should.equal 'test'
272
- 'test'.should.equal 'foo'
273
- end
274
-
275
- it 'should fail and print array with square braces'
276
- [1,2].should.equal [1,3]
277
- end
278
-
279
- it 'should fail and print nested array'
280
- [1, ['foo']].should.equal [1, ['bar', ['whatever', 1.0, { foo : 'bar', bar : { 1 : 2 } }]]]
281
- end
282
-
283
- it 'should fail and print html elements'
284
- elem = document.createElement('a')
285
- elem.setAttribute('href', 'http://vision-media.ca')
286
- elem.should.not.eql elem
287
- end
288
-
289
- it 'should fail with selector for jQuery objects'
290
- elem = { jquery : '1.3.1', selector : '.foobar' }
291
- elem.should.eql 'foo'
292
- end
293
-
294
- it 'should fail with negative message'
295
- '1'.should.not.be_true
296
- end
297
-
298
- it 'should fail with positive message'
299
- false.should.be_true
300
- end
301
-
302
- it 'should fail with function body'
303
- -{ rawr }.should.not.throw_error
304
- end
305
-
306
- it 'should fail with message of first failure'
307
- true.should.be_true
308
- 'bar'.should.match(/foo/gm)
309
- 'bar'.should.include 'foo'
310
- end
311
-
312
- it 'should fail with list'
313
- ['foo', 'bar'].should.include 'foo', 'car'
314
- end
315
-
316
- it 'should catch exceptions throw within specs'
317
- throw new Error('Oh noes!')
318
- end
319
-
320
- it 'should catch improper exceptions'
321
- throw 'oh noes'
322
- end
323
-
324
- it 'should catch proper exceptions'
325
- iDoNotExist
326
- end
327
-
328
- end
329
-
330
- describe 'Utility'
331
- describe 'query'
332
- it 'should return a pairs value'
333
- JSpec.query('suite', '?suite=Positive%20specs').should.equal 'Positive specs'
274
+
275
+ it 'should fail when the method is never invoked'
276
+ personWithPets.should.receive('getPets')
334
277
  end
335
278
 
336
- it 'should return null when key is not present'
337
- JSpec.query('foo', '?suite=Positive%20specs').should.be_null
279
+ it 'should pass when the method is invoked'
280
+ personWithPets.should.receive('getPets')
281
+ personWithPets.getPets()
338
282
  end
339
- end
340
-
341
- describe 'strip'
342
- it 'should strip whitespace by default'
343
- JSpec.strip(" foo \n\n").should.equal 'foo'
283
+
284
+ it 'should pass and original method should still return its result'
285
+ personWithPets.should.receive('getPets')
286
+ personWithPets.getPets().should.eql ['izzy']
344
287
  end
345
288
 
346
- it 'should strip the characters passed'
347
- JSpec.strip('[foo]', '\\[\\]').should.equal 'foo'
289
+ it 'should pass when the proper value is returned'
290
+ personWithPets.should.receive('getPets').and_return(['izzy'])
291
+ personWithPets.getPets()
292
+ end
293
+
294
+ it 'should fail when improper value is returned'
295
+ personWithPets.should.receive('getPets').and_return(['niko'])
296
+ personWithPets.getPets()
297
+ end
298
+
299
+ it 'should fail when not invoked the expected number of times'
300
+ personWithPets.should.receive('getPets', 'twice').and_return(['izzy'])
301
+ personWithPets.getPets()
302
+ end
303
+
304
+ it 'should fail when not invoked many times'
305
+ personWithPets.should.receive('getPets', 3).and_return(['izzy'])
306
+ personWithPets.getPets()
307
+ personWithPets.getPets()
308
+ end
309
+
310
+ it 'should pass when invoked the expected number of times'
311
+ personWithPets.should.receive('getPets', 'twice').and_return(['izzy'])
312
+ personWithPets.getPets()
313
+ personWithPets.getPets()
314
+ end
315
+
316
+ it 'should fail when not invoked with specific arguments'
317
+ personWithPets.should.receive('addPet', 'once').with_args('suki')
318
+ personWithPets.addPet('niko')
319
+ end
320
+
321
+ it 'should pass when a method is invoked with specific arguments'
322
+ personWithPets.should.receive('addPet', 'once').with_args('suki')
323
+ personWithPets.addPet('suki')
324
+ end
325
+
326
+ it 'should fail when expecting multiple arguments'
327
+ personWithPets.should.receive('addPets').with_args('suki', 'max')
328
+ personWithPets.addPets('suki')
329
+ end
330
+
331
+ it 'should pass with multiple arguments'
332
+ personWithPets.should.receive('addPets').with_args('suki', 'max')
333
+ personWithPets.addPets('suki', 'max')
334
+ end
335
+
336
+ it 'should pass with arguments and return value'
337
+ personWithPets.should.receive('addPet').with_args('suki').and_return(['izzy', 'suki'])
338
+ personWithPets.addPet('suki')
339
+ end
340
+
341
+ it 'should fail when argument is of the wrong type'
342
+ personWithPets.should.receive('addPet').with_args(an_instance_of(String))
343
+ personWithPets.addPet(['suki'])
344
+ end
345
+
346
+ it 'should pass when argument is the correct type'
347
+ personWithPets.should.receive('addPet').with_args(an_instance_of(String))
348
+ personWithPets.addPet('suki')
349
+ end
350
+
351
+ it 'should fail when return type is incorrect'
352
+ personWithPets.should.receive('addPet').and_return(an_instance_of(String))
353
+ personWithPets.addPet('suki')
354
+ end
355
+
356
+ it 'should pass when return type is correct'
357
+ personWithPets.should.receive('addPet').and_return(an_instance_of(Array))
358
+ personWithPets.addPet('suki')
359
+ end
360
+
361
+ it 'should fail when checking the type of multiple args and return types'
362
+ personWithPets.should.receive('addPets').with_args(an_instance_of(String), an_instance_of(Array)).and_return(an_instance_of(Array))
363
+ personWithPets.addPets('suki', 'max')
364
+ end
365
+
366
+ it 'should pass when checking the type of multiple args and return types'
367
+ personWithPets.should.receive('addPets').with_args(an_instance_of(String), an_instance_of(String)).and_return(an_instance_of(Array))
368
+ personWithPets.addPets('suki', 'max')
369
+ end
370
+
371
+ it 'should pass when checking for method calls to core prototypes'
372
+ array = ['foo', 'bar']
373
+ array.should.receive('toString').and_return('foo,bar')
374
+ 'array: ' + array
348
375
  end
349
376
  end
350
- end
351
-
352
- describe 'Contexts'
353
- before
354
- JSpec.context = { iLike : 'cookies' }
355
- end
356
-
357
- after
358
- JSpec.context = null
359
- end
360
-
361
- it 'should be replacable'
362
- .iLike.should.equal 'cookies'
363
- end
364
- end
365
-
366
- describe 'Misc'
367
- it 'requires implementation'
368
- end
369
- end
370
-
377
+
378
+ end