mspec 1.5.9 → 1.5.10

Sign up to get free protection for your applications and to get access to all the features.
Files changed (52) hide show
  1. data/Rakefile +1 -1
  2. data/lib/mspec/commands/mspec-ci.rb +5 -1
  3. data/lib/mspec/commands/mspec-run.rb +8 -5
  4. data/lib/mspec/guards/background.rb +2 -0
  5. data/lib/mspec/guards/bug.rb +5 -1
  6. data/lib/mspec/guards/compliance.rb +10 -0
  7. data/lib/mspec/guards/conflict.rb +2 -0
  8. data/lib/mspec/guards/endian.rb +4 -0
  9. data/lib/mspec/guards/extensions.rb +2 -0
  10. data/lib/mspec/guards/guard.rb +49 -25
  11. data/lib/mspec/guards/noncompliance.rb +2 -0
  12. data/lib/mspec/guards/platform.rb +5 -0
  13. data/lib/mspec/guards/quarantine.rb +2 -0
  14. data/lib/mspec/guards/runner.rb +4 -0
  15. data/lib/mspec/guards/superuser.rb +2 -0
  16. data/lib/mspec/guards/support.rb +2 -0
  17. data/lib/mspec/guards/tty.rb +2 -0
  18. data/lib/mspec/guards/version.rb +3 -0
  19. data/lib/mspec/matchers.rb +1 -0
  20. data/lib/mspec/matchers/have_constant.rb +30 -0
  21. data/lib/mspec/matchers/method.rb +4 -3
  22. data/lib/mspec/matchers/stringsymboladapter.rb +8 -0
  23. data/lib/mspec/runner/actions/tally.rb +13 -3
  24. data/lib/mspec/runner/context.rb +8 -1
  25. data/lib/mspec/runner/mspec.rb +16 -0
  26. data/lib/mspec/utils/options.rb +10 -3
  27. data/lib/mspec/version.rb +1 -1
  28. data/spec/guards/background_spec.rb +15 -0
  29. data/spec/guards/bug_spec.rb +28 -10
  30. data/spec/guards/compliance_spec.rb +54 -0
  31. data/spec/guards/conflict_spec.rb +19 -0
  32. data/spec/guards/endian_spec.rb +26 -0
  33. data/spec/guards/extensions_spec.rb +20 -0
  34. data/spec/guards/guard_spec.rb +69 -52
  35. data/spec/guards/noncompliance_spec.rb +20 -0
  36. data/spec/guards/platform_spec.rb +26 -0
  37. data/spec/guards/quarantine_spec.rb +16 -0
  38. data/spec/guards/runner_spec.rb +26 -0
  39. data/spec/guards/superuser_spec.rb +13 -0
  40. data/spec/guards/support_spec.rb +20 -0
  41. data/spec/guards/tty_spec.rb +16 -0
  42. data/spec/guards/version_spec.rb +13 -0
  43. data/spec/matchers/have_constant_spec.rb +37 -0
  44. data/spec/matchers/stringsymboladapter_spec.rb +40 -0
  45. data/spec/runner/actions/tagpurge_spec.rb +1 -0
  46. data/spec/runner/actions/tally_spec.rb +64 -0
  47. data/spec/runner/context_spec.rb +24 -11
  48. data/spec/runner/formatters/html_spec.rb +1 -0
  49. data/spec/runner/mspec_spec.rb +31 -0
  50. data/spec/utils/options_spec.rb +59 -0
  51. metadata +6 -3
  52. data/spec/matchers/method_spec.rb +0 -36
@@ -1,10 +1,11 @@
1
- require 'mspec/utils/version'
1
+ require 'mspec/matchers/stringsymboladapter'
2
2
 
3
3
  class MethodMatcher
4
+ include StringSymbolAdapter
5
+
4
6
  def initialize(method, include_super=true)
5
7
  @include_super = include_super
6
- version = SpecVersion.new(RUBY_VERSION) <=> "1.9"
7
- @method = version < 0 ? method.to_s : method
8
+ @method = convert_name method
8
9
  end
9
10
 
10
11
  def matches?(mod)
@@ -0,0 +1,8 @@
1
+ require 'mspec/utils/version'
2
+
3
+ module StringSymbolAdapter
4
+ def convert_name(name)
5
+ version = SpecVersion.new(RUBY_VERSION) <=> "1.9"
6
+ version < 0 ? name.to_s : name
7
+ end
8
+ end
@@ -1,8 +1,8 @@
1
1
  class Tally
2
- attr_accessor :files, :examples, :expectations, :failures, :errors
2
+ attr_accessor :files, :examples, :expectations, :failures, :errors, :guards
3
3
 
4
4
  def initialize
5
- @files = @examples = @expectations = @failures = @errors = 0
5
+ @files = @examples = @expectations = @failures = @errors = @guards = 0
6
6
  end
7
7
 
8
8
  def files!(add=1)
@@ -25,6 +25,10 @@ class Tally
25
25
  @errors += add
26
26
  end
27
27
 
28
+ def guards!(add=1)
29
+ @guards += add
30
+ end
31
+
28
32
  def file
29
33
  pluralize files, "file"
30
34
  end
@@ -45,8 +49,14 @@ class Tally
45
49
  pluralize errors, "error"
46
50
  end
47
51
 
52
+ def guard
53
+ pluralize guards, "guard"
54
+ end
55
+
48
56
  def format
49
- [ file, example, expectation, failure, error ].join(", ")
57
+ results = [ file, example, expectation, failure, error ]
58
+ results << guard if [:report, :report_on, :verify].any? { |m| MSpec.mode? m }
59
+ results.join(", ")
50
60
  end
51
61
 
52
62
  alias_method :to_s, :format
@@ -79,18 +79,23 @@ class ContextState
79
79
 
80
80
  # Records before(:each) and before(:all) blocks.
81
81
  def before(what, &block)
82
+ return if MSpec.guarded?
82
83
  block ? @before[what].push(block) : @before[what]
83
84
  end
84
85
 
85
86
  # Records after(:each) and after(:all) blocks.
86
87
  def after(what, &block)
88
+ return if MSpec.guarded?
87
89
  block ? @after[what].unshift(block) : @after[what]
88
90
  end
89
91
 
90
92
  # Creates an ExampleState instance for the block and stores it
91
93
  # in a list of examples to evaluate unless the example is filtered.
92
94
  def it(desc, &block)
93
- @examples << ExampleState.new(self, desc, block)
95
+ example = ExampleState.new(self, desc, block)
96
+ MSpec.actions :add, example
97
+ return if MSpec.guarded?
98
+ @examples << example
94
99
  end
95
100
 
96
101
  # Evaluates the block and resets the toplevel +ContextState+ to #parent.
@@ -108,6 +113,8 @@ class ContextState
108
113
  # Injects the before/after blocks and examples from the shared
109
114
  # describe block into this +ContextState+ instance.
110
115
  def it_should_behave_like(desc)
116
+ return if MSpec.guarded?
117
+
111
118
  unless state = MSpec.retrieve_shared(desc)
112
119
  raise Exception, "Unable to find shared 'describe' for #{desc}"
113
120
  end
@@ -20,6 +20,7 @@ module MSpec
20
20
  @current = nil
21
21
  @modes = []
22
22
  @shared = {}
23
+ @guarded = []
23
24
  @exception = nil
24
25
  @randomize = nil
25
26
  @expectation = nil
@@ -74,6 +75,20 @@ module MSpec
74
75
  end
75
76
  end
76
77
 
78
+ # Guards can be nested, so a stack is necessary to know when we have
79
+ # exited the toplevel guard.
80
+ def self.guard
81
+ @guarded << true
82
+ end
83
+
84
+ def self.unguard
85
+ @guarded.pop
86
+ end
87
+
88
+ def self.guarded?
89
+ not @guarded.empty?
90
+ end
91
+
77
92
  # Sets the toplevel ContextState to +state+.
78
93
  def self.register_current(state)
79
94
  store :current, state
@@ -161,6 +176,7 @@ module MSpec
161
176
  # :load before a spec file is loaded
162
177
  # :enter before a describe block is run
163
178
  # :before before a single spec is run
179
+ # :add while a describe block is adding examples to run later
164
180
  # :expectation before a 'should', 'should_receive', etc.
165
181
  # :example after an example block is run, passed the block
166
182
  # :exception after an exception is rescued
@@ -360,6 +360,9 @@ class MSpecOptions
360
360
  on("--unguarded", "Turn off all guards") do
361
361
  MSpec.register_mode :unguarded
362
362
  end
363
+ on("--no-ruby_bug", "Turn off the ruby_bug guard") do
364
+ MSpec.register_mode :no_ruby_bug
365
+ end
363
366
  end
364
367
 
365
368
  def randomize
@@ -401,13 +404,17 @@ class MSpecOptions
401
404
  end
402
405
 
403
406
  def verify
404
- on("-Y", "--verify",
405
- "Verify that guarded specs pass and fail as expected") do
406
- MSpec.register_mode :verify
407
+ on("--report-on", "GUARD", "Report specs guarded by GUARD") do |g|
408
+ MSpec.register_mode :report_on
409
+ SpecGuard.guards << g.to_sym
407
410
  end
408
411
  on("-O", "--report", "Report guarded specs") do
409
412
  MSpec.register_mode :report
410
413
  end
414
+ on("-Y", "--verify",
415
+ "Verify that guarded specs pass and fail as expected") do
416
+ MSpec.register_mode :verify
417
+ end
411
418
  end
412
419
 
413
420
  def action_filters
data/lib/mspec/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  require 'mspec/utils/version'
2
2
 
3
3
  module MSpec
4
- VERSION = SpecVersion.new "1.5.9"
4
+ VERSION = SpecVersion.new "1.5.10"
5
5
  end
@@ -5,6 +5,9 @@ describe Object, "#process_is_foreground" do
5
5
  before :each do
6
6
  MSpec.clear_modes
7
7
  ScratchPad.clear
8
+
9
+ @guard = BackgroundGuard.new
10
+ BackgroundGuard.stub!(:new).and_return(@guard)
8
11
  end
9
12
 
10
13
  it "yields if MSpec.mode?(:background) is false" do
@@ -18,4 +21,16 @@ describe Object, "#process_is_foreground" do
18
21
  process_is_foreground { ScratchPad.record :yield }
19
22
  ScratchPad.recorded.should_not == :yield
20
23
  end
24
+
25
+ it "sets the name of the guard to :process_is_foreground" do
26
+ process_is_foreground { ScratchPad.record :yield }
27
+ @guard.name.should == :process_is_foreground
28
+ end
29
+
30
+ it "calls #unregister even when an exception is raised in the guard block" do
31
+ @guard.should_receive(:unregister)
32
+ lambda do
33
+ process_is_foreground { raise Exception }
34
+ end.should raise_error(Exception)
35
+ end
21
36
  end
@@ -46,6 +46,12 @@ describe BugGuard, "#match? when #implementation? is 'ruby'" do
46
46
  BugGuard.new("#1", "1.8").match?.should == true
47
47
  BugGuard.new("#1", "1.8.6").match?.should == true
48
48
  end
49
+
50
+ it "returns false when MSpec.mode?(:no_ruby_bug) is true" do
51
+ MSpec.should_receive(:mode?).with(:no_ruby_bug).twice.and_return(:true)
52
+ BugGuard.new("#1", "1.8.5").match?.should == false
53
+ BugGuard.new("#1", "1.8").match?.should == false
54
+ end
49
55
  end
50
56
 
51
57
  describe BugGuard, "#match? when #implementation? is not 'ruby'" do
@@ -87,6 +93,13 @@ describe BugGuard, "#match? when #implementation? is not 'ruby'" do
87
93
  BugGuard.new("#1", "1.8.7").match?.should == false
88
94
  BugGuard.new("#1", "1.8.6.115").match?.should == false
89
95
  end
96
+
97
+ it "returns false when MSpec.mode?(:no_ruby_bug) is true" do
98
+ MSpec.should_receive(:mode?).with(:no_ruby_bug).any_number_of_times.and_return(:true)
99
+ BugGuard.new("#1", "1.8.6").match?.should == false
100
+ BugGuard.new("#1", "1.8.6.114").match?.should == false
101
+ BugGuard.new("#1", "1.8.6.115").match?.should == false
102
+ end
90
103
  end
91
104
 
92
105
  describe Object, "#ruby_bug" do
@@ -98,25 +111,30 @@ describe Object, "#ruby_bug" do
98
111
 
99
112
  it "yields when #match? returns false" do
100
113
  @guard.stub!(:match?).and_return(false)
101
- ruby_bug { ScratchPad.record :yield }
114
+ ruby_bug("#1234", "1.8.6") { ScratchPad.record :yield }
102
115
  ScratchPad.recorded.should == :yield
103
116
  end
104
117
 
105
118
  it "does not yield when #match? returns true" do
106
119
  @guard.stub!(:match?).and_return(true)
107
- ruby_bug { ScratchPad.record :yield }
120
+ ruby_bug("#1234", "1.8.6") { ScratchPad.record :yield }
108
121
  ScratchPad.recorded.should_not == :yield
109
122
  end
110
123
 
111
- it "accepts an optional String identifying the bug tracker number" do
112
- @guard.stub!(:match?).and_return(false)
113
- ruby_bug("#1234") { ScratchPad.record :yield }
114
- ScratchPad.recorded.should == :yield
124
+ it "requires a bug tracker number and a version number" do
125
+ lambda { ruby_bug { } }.should raise_error(ArgumentError)
126
+ lambda { ruby_bug("#1234") { } }.should raise_error(ArgumentError)
115
127
  end
116
128
 
117
- it "accepts an optional String identifying the version number" do
118
- @guard.stub!(:match?).and_return(false)
119
- ruby_bug("#1234", "1.8.6") { ScratchPad.record :yield }
120
- ScratchPad.recorded.should == :yield
129
+ it "sets the name of the guard to :ruby_bug" do
130
+ ruby_bug("#1234", "1.8.6") { }
131
+ @guard.name.should == :ruby_bug
132
+ end
133
+
134
+ it "calls #unregister even when an exception is raised in the guard block" do
135
+ @guard.should_receive(:unregister)
136
+ lambda do
137
+ ruby_bug("", "") { raise Exception }
138
+ end.should raise_error(Exception)
121
139
  end
122
140
  end
@@ -21,6 +21,14 @@ describe Object, "#compliant_on" do
21
21
  ScratchPad.clear
22
22
  end
23
23
 
24
+ it "raises an Exception when passed :ruby" do
25
+ Object.const_set :RUBY_NAME, "jruby"
26
+ lambda {
27
+ compliant_on(:ruby) { ScratchPad.record :yield }
28
+ }.should raise_error(Exception)
29
+ ScratchPad.recorded.should_not == :yield
30
+ end
31
+
24
32
  it "does not yield when #standard? and #implementation? return false" do
25
33
  Object.const_set :RUBY_NAME, "jruby"
26
34
  compliant_on(:rubinius, :ironruby) { ScratchPad.record :yield }
@@ -46,6 +54,25 @@ describe Object, "#compliant_on" do
46
54
  end
47
55
  end
48
56
 
57
+ describe Object, "#compliant_on" do
58
+ before :each do
59
+ @guard = CompliantOnGuard.new :any
60
+ CompliantOnGuard.stub!(:new).and_return(@guard)
61
+ end
62
+
63
+ it "sets the name of the guard to :compliant_on" do
64
+ compliant_on(:rubinius) { }
65
+ @guard.name.should == :compliant_on
66
+ end
67
+
68
+ it "calls #unregister even when an exception is raised in the guard block" do
69
+ @guard.should_receive(:unregister)
70
+ lambda do
71
+ compliant_on(:rubinius) { raise Exception }
72
+ end.should raise_error(Exception)
73
+ end
74
+ end
75
+
49
76
  describe Object, "#not_compliant_on" do
50
77
  before :all do
51
78
  @verbose = $VERBOSE
@@ -66,6 +93,14 @@ describe Object, "#not_compliant_on" do
66
93
  ScratchPad.clear
67
94
  end
68
95
 
96
+ it "raises an Exception when passed :ruby" do
97
+ Object.const_set :RUBY_NAME, "jruby"
98
+ lambda {
99
+ not_compliant_on(:ruby) { ScratchPad.record :yield }
100
+ }.should raise_error(Exception)
101
+ ScratchPad.recorded.should_not == :yield
102
+ end
103
+
69
104
  it "yields when #standard? returns true" do
70
105
  Object.const_set :RUBY_NAME, "ruby"
71
106
  not_compliant_on(:rubinius) { ScratchPad.record :yield }
@@ -84,3 +119,22 @@ describe Object, "#not_compliant_on" do
84
119
  ScratchPad.recorded.should == :yield
85
120
  end
86
121
  end
122
+
123
+ describe Object, "#not_compliant_on" do
124
+ before :each do
125
+ @guard = NotCompliantOnGuard.new :any
126
+ NotCompliantOnGuard.stub!(:new).and_return(@guard)
127
+ end
128
+
129
+ it "sets the name of the guard to :not_compliant_on" do
130
+ not_compliant_on(:rubinius) { }
131
+ @guard.name.should == :not_compliant_on
132
+ end
133
+
134
+ it "calls #unregister even when an exception is raised in the guard block" do
135
+ @guard.should_receive(:unregister)
136
+ lambda do
137
+ not_compliant_on(:rubinius) { raise Exception }
138
+ end.should raise_error(Exception)
139
+ end
140
+ end
@@ -18,3 +18,22 @@ describe Object, "#conflicts_with" do
18
18
  ScratchPad.recorded.should == :yield
19
19
  end
20
20
  end
21
+
22
+ describe Object, "#conflicts_with" do
23
+ before :each do
24
+ @guard = ConflictsGuard.new
25
+ ConflictsGuard.stub!(:new).and_return(@guard)
26
+ end
27
+
28
+ it "sets the name of the guard to :conflicts_with" do
29
+ conflicts_with(:AClass, :BClass) { }
30
+ @guard.name.should == :conflicts_with
31
+ end
32
+
33
+ it "calls #unregister even when an exception is raised in the guard block" do
34
+ @guard.should_receive(:unregister)
35
+ lambda do
36
+ conflicts_with(:AClass, :BClass) { raise Exception }
37
+ end.should raise_error(Exception)
38
+ end
39
+ end
@@ -19,6 +19,19 @@ describe Object, "#big_endian" do
19
19
  big_endian { ScratchPad.record :yield }
20
20
  ScratchPad.recorded.should_not == :yield
21
21
  end
22
+
23
+ it "sets the name of the guard to :big_endian" do
24
+ big_endian { }
25
+ @guard.name.should == :big_endian
26
+ end
27
+
28
+ it "calls #unregister even when an exception is raised in the guard block" do
29
+ @guard.stub!(:pattern).and_return([1])
30
+ @guard.should_receive(:unregister)
31
+ lambda do
32
+ big_endian { raise Exception }
33
+ end.should raise_error(Exception)
34
+ end
22
35
  end
23
36
 
24
37
  describe Object, "#little_endian" do
@@ -39,4 +52,17 @@ describe Object, "#little_endian" do
39
52
  little_endian { ScratchPad.record :yield }
40
53
  ScratchPad.recorded.should_not == :yield
41
54
  end
55
+
56
+ it "sets the name of the guard to :little_endian" do
57
+ little_endian { }
58
+ @guard.name.should == :little_endian
59
+ end
60
+
61
+ it "calls #unregister even when an exception is raised in the guard block" do
62
+ @guard.stub!(:pattern).and_return([0])
63
+ @guard.should_receive(:unregister)
64
+ lambda do
65
+ little_endian { raise Exception }
66
+ end.should raise_error(Exception)
67
+ end
42
68
  end
@@ -47,3 +47,23 @@ describe Object, "#extended_on" do
47
47
  ScratchPad.recorded.should == :yield
48
48
  end
49
49
  end
50
+
51
+ describe Object, "#extended_on" do
52
+ before :each do
53
+ @guard = ExtensionsGuard.new
54
+ ExtensionsGuard.stub!(:new).and_return(@guard)
55
+ end
56
+
57
+ it "sets the name of the guard to :extended_on" do
58
+ extended_on(:rubinius) { }
59
+ @guard.name.should == :extended_on
60
+ end
61
+
62
+ it "calls #unregister even when an exception is raised in the guard block" do
63
+ @guard.should_receive(:match?).and_return(true)
64
+ @guard.should_receive(:unregister)
65
+ lambda do
66
+ extended_on(:rubinius) { raise Exception }
67
+ end.should raise_error(Exception)
68
+ end
69
+ end
@@ -3,42 +3,6 @@ require 'mspec/utils/ruby_name'
3
3
  require 'mspec/guards/guard'
4
4
  require 'rbconfig'
5
5
 
6
- describe SpecGuard, ".register" do
7
- before :each do
8
- @tally = mock("tally")
9
- @tally.stub!(:register)
10
- TallyAction.stub!(:new).and_return(@tally)
11
- SpecGuard.instance_variable_set(:@registered, nil)
12
- end
13
-
14
- it "creates a new TallyAction if one does not exist" do
15
- TallyAction.should_receive(:new).and_return(@tally)
16
- @tally.should_receive(:register)
17
- SpecGuard.register
18
- SpecGuard.register
19
- end
20
-
21
- it "registers itself with MSpec :finish actions" do
22
- MSpec.should_receive(:register).with(:finish, SpecGuard)
23
- SpecGuard.register
24
- end
25
- end
26
-
27
- describe SpecGuard, ".unregister" do
28
- before :each do
29
- @tally = mock("tally")
30
- @tally.stub!(:register)
31
- TallyAction.stub!(:new).and_return(@tally)
32
- SpecGuard.instance_variable_set(:@registered, nil)
33
- end
34
-
35
- it "unregisters its tally action" do
36
- @tally.should_receive(:unregister)
37
- SpecGuard.register
38
- SpecGuard.unregister
39
- end
40
- end
41
-
42
6
  describe SpecGuard, ".ruby_version" do
43
7
  before :all do
44
8
  @ruby_version = Object.const_get :RUBY_VERSION
@@ -116,6 +80,12 @@ describe SpecGuard, "#yield?" do
116
80
  @guard = SpecGuard.new
117
81
  end
118
82
 
83
+ after :each do
84
+ MSpec.unregister :add, @guard
85
+ MSpec.clear_modes
86
+ SpecGuard.clear_guards
87
+ end
88
+
119
89
  it "returns true if MSpec.mode?(:unguarded) is true" do
120
90
  MSpec.register_mode :unguarded
121
91
  @guard.yield?.should == true
@@ -141,6 +111,14 @@ describe SpecGuard, "#yield?" do
141
111
  @guard.yield?(true).should == true
142
112
  end
143
113
 
114
+ it "returns true if MSpec.mode?(:report_on) is true and SpecGuards.guards contains the named guard" do
115
+ MSpec.register_mode :report_on
116
+ SpecGuard.guards << :guard_name
117
+ @guard.yield?.should == false
118
+ @guard.name = :guard_name
119
+ @guard.yield?.should == true
120
+ end
121
+
144
122
  it "returns #match? if neither report nor verify mode are true" do
145
123
  @guard.stub!(:match?).and_return(false)
146
124
  @guard.yield?.should == false
@@ -430,30 +408,69 @@ end
430
408
 
431
409
  describe SpecGuard, "#unregister" do
432
410
  before :each do
433
- @tally = mock("tally")
434
- @tally.stub!(:register)
435
- TallyAction.stub!(:new).and_return(@tally)
436
411
  MSpec.stub!(:unregister)
437
412
  @guard = SpecGuard.new
438
-
439
- SpecGuard.instance_variable_set(:@registered, nil)
440
- SpecGuard.register
441
413
  end
442
414
 
443
- it "unregisters from MSpec :exclude actions" do
444
- MSpec.should_receive(:unregister).with(:exclude, @guard)
445
- @tally.should_receive(:unregister)
415
+ it "unregisters from MSpec :add actions" do
416
+ MSpec.should_receive(:unregister).with(:add, @guard)
446
417
  @guard.unregister
447
418
  end
419
+ end
448
420
 
449
- it "unregisters from MSpec :after actions" do
450
- MSpec.should_receive(:unregister).with(:after, @guard)
451
- @tally.should_receive(:unregister)
452
- @guard.unregister
421
+ describe SpecGuard, "#record" do
422
+ after :each do
423
+ SpecGuard.clear
453
424
  end
454
425
 
455
- it "invokes the class's unregister method" do
456
- SpecGuard.should_receive(:unregister)
457
- @guard.unregister
426
+ it "saves the name of the guarded spec under the name of the guard" do
427
+ guard = SpecGuard.new "a", "1.8"..."1.9"
428
+ guard.name = :named_guard
429
+ guard.record "SomeClass#action returns true"
430
+ SpecGuard.report.should == {
431
+ 'named_guard a, 1.8...1.9' => ["SomeClass#action returns true"]
432
+ }
433
+ end
434
+ end
435
+
436
+ describe SpecGuard, ".guards" do
437
+ it "returns an Array" do
438
+ SpecGuard.guards.should be_kind_of(Array)
439
+ end
440
+ end
441
+
442
+ describe SpecGuard, ".clear_guards" do
443
+ it "resets the array to empty" do
444
+ SpecGuard.guards << :guard
445
+ SpecGuard.guards.should == [:guard]
446
+ SpecGuard.clear_guards
447
+ SpecGuard.guards.should == []
448
+ end
449
+ end
450
+
451
+ describe SpecGuard, ".finish" do
452
+ before :each do
453
+ $stdout = @out = IOStub.new
454
+ end
455
+
456
+ after :each do
457
+ $stdout = STDOUT
458
+ SpecGuard.clear
459
+ end
460
+
461
+ it "prints the descriptions of the guarded specs" do
462
+ guard = SpecGuard.new "a", "1.8"..."1.9"
463
+ guard.name = :named_guard
464
+ guard.record "SomeClass#action returns true"
465
+ guard.record "SomeClass#reverse returns false"
466
+ SpecGuard.finish
467
+ $stdout.should == %[
468
+
469
+ 2 specs omitted by guard: named_guard a, 1.8...1.9:
470
+
471
+ SomeClass#action returns true
472
+ SomeClass#reverse returns false
473
+
474
+ ]
458
475
  end
459
476
  end